X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2FCanvasWidget.cxx;h=fc21d0c93cb1acfed2abd64a6061a129e2aa9a7f;hb=02a5261797998841e2c3d8580385e68a5d319929;hp=8c8ea3158eab2c9bbbc2456a6be2be7f55bf5eb3;hpb=28f2779c4b09841e9ddae1a1ed1f46ea686e6143;p=flightgear.git diff --git a/src/GUI/CanvasWidget.cxx b/src/GUI/CanvasWidget.cxx index 8c8ea3158..fc21d0c93 100644 --- a/src/GUI/CanvasWidget.cxx +++ b/src/GUI/CanvasWidget.cxx @@ -1,9 +1,20 @@ -/* - * CanvasWidget.cxx - * - * Created on: 03.07.2012 - * Author: tom - */ +// Airports forward declarations +// +// Copyright (C) 2012 Thomas Geymayer +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #ifdef HAVE_CONFIG_H # include @@ -18,6 +29,9 @@ #include #include +SGPropertyNode_ptr CanvasWidget::_time, + CanvasWidget::_view_height; + //------------------------------------------------------------------------------ CanvasWidget::CanvasWidget( int x, int y, int width, int height, @@ -25,10 +39,10 @@ CanvasWidget::CanvasWidget( int x, int y, const std::string& module ): puObject(x, y, width, height), _canvas_mgr( dynamic_cast(globals->get_subsystem("Canvas")) ), - _tex_id(0), - _no_tex_cnt(0), _last_x(0), - _last_y(0) + _last_y(0), + // automatically resize viewport of canvas if no size is given + _auto_viewport( !props->hasChild("view") ) { if( !_canvas_mgr ) { @@ -55,11 +69,6 @@ CanvasWidget::CanvasWidget( int x, int y, 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 ) @@ -86,14 +95,17 @@ CanvasWidget::CanvasWidget( int x, int y, CanvasWidget::~CanvasWidget() { if( _canvas ) - // TODO check if really not in use anymore - _canvas->getProps() - ->getParent() - ->removeChild( _canvas->getProps()->getName(), - _canvas->getProps()->getIndex(), - false ); + _canvas->destroy(); } +// 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) { @@ -105,11 +117,21 @@ void CanvasWidget::doHit(int button, int updown, int x, int y) namespace sc = simgear::canvas; sc::MouseEventPtr event(new sc::MouseEvent); - event->pos.set(x - abox.min[0], y - abox.min[1]); - event->delta.set(x - _last_x, y - _last_y); - _last_x = x; - _last_y = y; + if( !_time ) + _time = globals->get_props()->getNode("/sim/time/elapsed-sec"); + event->time = _time->getDoubleValue(); + + 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 ); + + _last_x = event->getScreenX(); + _last_y = event->getScreenY(); switch( button ) { @@ -158,14 +180,6 @@ void CanvasWidget::doHit(int button, int updown, int x, int y) } _canvas->handleMouseEvent(event); - - _mouse_x->setIntValue(x - abox.min[0]); - _mouse_y->setIntValue(abox.max[1] - y); - - if( updown == PU_DRAG ) - _mouse_drag->setIntValue(button); - else if( updown == PU_DOWN ) - _mouse_down->setIntValue(button); } //------------------------------------------------------------------------------ @@ -179,41 +193,18 @@ void CanvasWidget::setSize(int w, int h) { puObject::setSize(w, h); - _canvas->getProps()->setIntValue("view[0]", w); - _canvas->getProps()->setIntValue("view[1]", h); + if( _auto_viewport ) + { + _canvas->getProps()->setIntValue("view[0]", w); + _canvas->getProps()->setIntValue("view[1]", h); + } } //------------------------------------------------------------------------------ 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]);