#include <Scripting/NasalSys.hxx>
#include <simgear/canvas/Canvas.hxx>
+#include <simgear/canvas/MouseEvent.hxx>
+
+SGPropertyNode_ptr CanvasWidget::_time,
+ CanvasWidget::_view_height;
//------------------------------------------------------------------------------
CanvasWidget::CanvasWidget( int x, int y,
const std::string& module ):
puObject(x, y, width, height),
_canvas_mgr( dynamic_cast<CanvasMgr*>(globals->get_subsystem("Canvas")) ),
- _tex_id(0),
- _no_tex_cnt(0)
+ _last_x(0),
+ _last_y(0)
{
if( !_canvas_mgr )
{
cprops->setBoolValue("render-always", true);
cprops->setStringValue( "name",
props->getStringValue("name", "gui-anonymous") );
- SGPropertyNode* input = cprops->getChild("input", 0, true);
- _mouse_x = input->getChild("mouse-x", 0, true);
- _mouse_y = input->getChild("mouse-y", 0, true);
- _mouse_down = input->getChild("mouse-down", 0, true);
- _mouse_drag = input->getChild("mouse-drag", 0, true);
SGPropertyNode *nasal = props->getNode("nasal");
if( !nasal )
false );
}
+// Old versions of PUI are missing this defines...
+#ifndef PU_SCROLL_UP_BUTTON
+# define PU_SCROLL_UP_BUTTON 3
+#endif
+#ifndef PU_SCROLL_DOWN_BUTTON
+# define PU_SCROLL_DOWN_BUTTON 4
+#endif
+
//------------------------------------------------------------------------------
void CanvasWidget::doHit(int button, int updown, int x, int y)
{
if( fgGetKeyModifiers() & (KEYMOD_CTRL | KEYMOD_SHIFT) )
return;
- _mouse_x->setIntValue(x - abox.min[0]);
- _mouse_y->setIntValue(abox.max[1] - y);
+ namespace sc = simgear::canvas;
+ sc::MouseEventPtr event(new sc::MouseEvent);
- if( updown == PU_DRAG )
- _mouse_drag->setIntValue(button);
- else if( updown == PU_DOWN )
- _mouse_down->setIntValue(button);
+ if( !_time )
+ _time = globals->get_props()->getNode("/sim/time/elapsed-sec");
+ event->time = _time->getDoubleValue();
- if( button != active_mouse_button )
- return;
+ if( !_view_height )
+ _view_height = globals->get_props()->getNode("/sim/gui/canvas/size[1]");
+ event->screen_pos.set(x, _view_height->getIntValue() - y);
+
+ event->client_pos.set(x - abox.min[0], abox.max[1] - y);
+ event->delta.set( event->getScreenX() - _last_x,
+ event->getScreenY() - _last_y );
- if (updown == PU_UP)
- puDeactivateWidget();
- else if (updown == PU_DOWN)
- puSetActiveWidget(this, x, y);
+ _last_x = event->getScreenX();
+ _last_y = event->getScreenY();
+
+ switch( button )
+ {
+ case PU_LEFT_BUTTON:
+ event->button = osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON;
+ break;
+ case PU_MIDDLE_BUTTON:
+ event->button = osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON;
+ break;
+ case PU_RIGHT_BUTTON:
+ event->button = osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON;
+ break;
+ case PU_SCROLL_UP_BUTTON:
+ case PU_SCROLL_DOWN_BUTTON:
+ // Only let PU_DOWN trigger a scroll wheel event
+ if( updown != PU_DOWN )
+ return;
+
+ event->type = sc::Event::WHEEL;
+ event->delta.y() = button == PU_SCROLL_UP_BUTTON ? 1 : -1;
+
+ _canvas->handleMouseEvent(event);
+
+ return;
+ default:
+ SG_LOG(SG_INPUT, SG_WARN, "CanvasWidget: Unknown button: " << button);
+ return;
+ }
+
+ switch( updown )
+ {
+ case PU_DOWN:
+ event->type = sc::Event::MOUSE_DOWN;
+ puSetActiveWidget(this, x, y);
+ break;
+ case PU_UP:
+ event->type = sc::Event::MOUSE_UP;
+ puDeactivateWidget();
+ break;
+ case PU_DRAG:
+ event->type = sc::Event::DRAG;
+ break;
+ default:
+ SG_LOG(SG_INPUT, SG_WARN, "CanvasWidget: Unknown updown: " << updown);
+ return;
+ }
+
+ _canvas->handleMouseEvent(event);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void CanvasWidget::draw(int dx, int dy)
{
- if( !_tex_id )
- {
- _tex_id = _canvas_mgr->getCanvasTexId( _canvas->getProps()->getIndex() );
-
- // Normally we should be able to get the texture after one frame. I don't
- // know if there are circumstances where it can take longer, so we don't
- // log a warning message until we have tried a few times.
- if( !_tex_id )
- {
- if( ++_no_tex_cnt == 5 )
- SG_LOG(SG_GENERAL, SG_WARN, "CanvasWidget: failed to get texture!");
- return;
- }
- else
- {
- if( _no_tex_cnt >= 5 )
- SG_LOG
- (
- SG_GENERAL,
- SG_INFO,
- "CanvasWidget: got texture after " << _no_tex_cnt << " tries."
- );
- _no_tex_cnt = 0;
- }
- }
-
glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, _tex_id);
+ glBindTexture(GL_TEXTURE_2D, _canvas_mgr->getCanvasTexId(_canvas));
glBegin( GL_QUADS );
glColor3f(1,1,1);
glTexCoord2f(0,0); glVertex2f(dx + abox.min[0], dy + abox.min[1]);