]> git.mxchange.org Git - flightgear.git/commitdiff
Base canvas::Window on simgear::canvas::Image
authorThomas Geymayer <tomgey@gmail.com>
Sat, 8 Jun 2013 09:33:53 +0000 (11:33 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Sat, 8 Jun 2013 09:33:53 +0000 (11:33 +0200)
src/Canvas/gui_mgr.cxx
src/Canvas/window.cxx
src/Canvas/window.hxx

index 5ea1d8166b7949a74e832ecf52d4b7da4f4ec597..77ae16bdeb77aa4aea5e1bc894f6cd159513df73 100644 (file)
@@ -92,19 +92,6 @@ class WindowPlacement:
     simgear::canvas::CanvasWeakPtr _canvas;
 };
 
-/**
- * Store pointer to window as user data
- */
-class WindowUserData:
-  public osg::Referenced
-{
-  public:
-    canvas::WindowWeakPtr window;
-    WindowUserData(canvas::WindowPtr window):
-      window(window)
-    {}
-};
-
 //------------------------------------------------------------------------------
 typedef boost::shared_ptr<canvas::Window> WindowPtr;
 WindowPtr windowFactory(SGPropertyNode* node)
@@ -240,7 +227,7 @@ void GUIMgr::elementCreated(simgear::PropertyBasedElementPtr element)
       _transform->addChild(layer);
     }
   }
-  window->getGroup()->setUserData(new WindowUserData(window));
+
   layer->addChild(window->getGroup());
 }
 
@@ -345,8 +332,13 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea)
     {
       assert(layer->getChild(j)->getUserData());
       canvas::WindowPtr window =
-        static_cast<WindowUserData*>(layer->getChild(j)->getUserData())
-          ->window.lock();
+        boost::static_pointer_cast<canvas::Window>
+        (
+          static_cast<sc::Element::OSGUserData*>
+          (
+            layer->getChild(j)->getUserData()
+          )->element
+        );
 
       if( !window->isCapturingEvents() || !window->isVisible() )
         continue;
@@ -463,7 +455,7 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea)
         move_event->client_pos -= toOsg(last_mouse_over->getPosition());
         move_event->local_pos = move_event->client_pos;
 
-        last_mouse_over->handleMouseEvent(move_event);
+        last_mouse_over->handleEvent(move_event);
       }
       _last_mouse_over = window_at_cursor;
       event->type = sc::Event::MOUSE_MOVE;
@@ -488,7 +480,7 @@ bool GUIMgr::handleMouse(const osgGA::GUIEventAdapter& ea)
   {
     event->client_pos -= toOsg(target_window->getPosition());
     event->local_pos = event->client_pos;
-    return target_window->handleMouseEvent(event);
+    return target_window->handleEvent(event);
   }
   else
     return false;
index b4249702450d438472d576a68d7448e344986ea0..3b5556a19a6cd129a74df9511438ac604cda61bd 100644 (file)
@@ -33,9 +33,8 @@ namespace canvas
 
   //----------------------------------------------------------------------------
   Window::Window(SGPropertyNode* node):
-    PropertyBasedElement(node),
+    Image(sc::CanvasPtr(), node),
     _attributes_dirty(0),
-    _image(sc::CanvasPtr(), node),
     _resizable(false),
     _capture_events(true),
     _resize_top(node, "resize-top"),
@@ -44,8 +43,6 @@ namespace canvas
     _resize_left(node, "resize-left"),
     _resize_status(node, "resize-status")
   {
-    _image.removeListener();
-
     node->setFloatValue("source/right", 1);
     node->setFloatValue("source/bottom", 1);
     node->setBoolValue("source/normalized", true);
@@ -67,7 +64,7 @@ namespace canvas
       _attributes_dirty &= ~DECORATION;
     }
 
-    _image.update(delta_time_sec);
+    Image::update(delta_time_sec);
   }
 
   //----------------------------------------------------------------------------
@@ -95,37 +92,19 @@ namespace canvas
     }
 
     if( !handled )
-      _image.valueChanged(node);
-  }
-
-  //----------------------------------------------------------------------------
-  void Window::childAdded(SGPropertyNode* parent, SGPropertyNode* child)
-  {
-    _image.childAdded(parent, child);
-  }
-
-  //----------------------------------------------------------------------------
-  void Window::childRemoved(SGPropertyNode* parent, SGPropertyNode* child)
-  {
-    _image.childRemoved(parent, child);
+      Image::valueChanged(node);
   }
 
   //----------------------------------------------------------------------------
   osg::Group* Window::getGroup()
   {
-    return _image.getMatrixTransform();
-  }
-
-  //----------------------------------------------------------------------------
-  const SGRect<float>& Window::getRegion() const
-  {
-    return _image.getRegion();
+    return getMatrixTransform();
   }
 
   //----------------------------------------------------------------------------
   const SGVec2<float> Window::getPosition() const
   {
-    const osg::Matrix& m = _image.getMatrixTransform()->getMatrix();
+    const osg::Matrix& m = getMatrixTransform()->getMatrix();
     return SGVec2<float>( m(3, 0), m(3, 1) );
   }
 
@@ -139,13 +118,13 @@ namespace canvas
   void Window::setCanvas(sc::CanvasPtr canvas)
   {
     _canvas_content = canvas;
-    _image.setSrcCanvas(canvas);
+    setSrcCanvas(canvas);
   }
 
   //----------------------------------------------------------------------------
   sc::CanvasWeakPtr Window::getCanvas() const
   {
-    return _image.getSrcCanvas();
+    return getSrcCanvas();
   }
 
   //----------------------------------------------------------------------------
@@ -154,12 +133,6 @@ namespace canvas
     return _canvas_decoration;
   }
 
-  //----------------------------------------------------------------------------
-  bool Window::isVisible() const
-  {
-    return _image.isVisible();
-  }
-
   //----------------------------------------------------------------------------
   bool Window::isResizable() const
   {
@@ -172,12 +145,6 @@ namespace canvas
     return _capture_events;
   }
 
-  //----------------------------------------------------------------------------
-  bool Window::handleMouseEvent(const sc::MouseEventPtr& event)
-  {
-    return _image.handleEvent(event);
-  }
-
   //----------------------------------------------------------------------------
   void Window::handleResize(uint8_t mode, const osg::Vec2f& delta)
   {
@@ -212,13 +179,17 @@ namespace canvas
     if( node_raise && !node_raise->getBoolValue() )
       return;
 
+    // Keep a reference to ensure the window is not deleted between removing and
+    // adding it back to the scenegraph
+    osg::ref_ptr<osg::Group> window = getGroup();
+
     BOOST_FOREACH(osg::Group* parent, getGroup()->getParents())
     {
       // Remove window...
-      parent->removeChild(getGroup());
+      parent->removeChild(window);
 
       // ...and add again as topmost window
-      parent->addChild(getGroup());
+      parent->addChild(window);
     }
 
     if( node_raise )
@@ -242,9 +213,9 @@ namespace canvas
     if( _decoration_border.isNone() && !shadow_radius )
     {
       sc::CanvasPtr canvas_content = _canvas_content.lock();
-      _image.setSrcCanvas(canvas_content);
-      _image.set<int>("size[0]", canvas_content->getViewWidth());
-      _image.set<int>("size[1]", canvas_content->getViewHeight());
+      setSrcCanvas(canvas_content);
+      set<int>("size[0]", canvas_content->getViewWidth());
+      set<int>("size[1]", canvas_content->getViewHeight());
 
       _image_content.reset();
       _image_shadow.reset();
@@ -268,7 +239,7 @@ namespace canvas
       _canvas_decoration = mgr->createCanvas("window-decoration");
       _canvas_decoration->getProps()
                         ->setStringValue("background", "rgba(0,0,0,0)");
-      _image.setSrcCanvas(_canvas_decoration);
+      setSrcCanvas(_canvas_decoration);
 
       _image_content = _canvas_decoration->getRootGroup()
                                          ->createChild<sc::Image>("content");
@@ -297,9 +268,9 @@ namespace canvas
     _canvas_decoration->setViewWidth( outer_width );
     _canvas_decoration->setViewHeight( outer_height );
 
-    _image.set<int>("size[0]", outer_width - shad2);
-    _image.set<int>("size[1]", outer_height - shad2);
-    _image.set<int>("outset", shadow_radius);
+    set<int>("size[0]", outer_width - shad2);
+    set<int>("size[1]", outer_height - shad2);
+    set<int>("outset", shadow_radius);
 
     assert(_image_content);
     _image_content->set<int>("x", shadow_radius + border.l);
index 21e4844d27e191c0a922ac546bba14e2c96a84e5..9e47c4884e05cc7b6ee3b8f9ca8ef0357339b818 100644 (file)
@@ -31,7 +31,7 @@
 namespace canvas
 {
   class Window:
-    public simgear::PropertyBasedElement
+    public simgear::canvas::Image
   {
     public:
 
@@ -50,11 +50,8 @@ namespace canvas
 
       virtual void update(double delta_time_sec);
       virtual void valueChanged(SGPropertyNode* node);
-      virtual void childAdded(SGPropertyNode* parent, SGPropertyNode* child);
-      virtual void childRemoved(SGPropertyNode* parent, SGPropertyNode* child);
 
       osg::Group* getGroup();
-      const SGRect<float>& getRegion() const;
       const SGVec2<float> getPosition() const;
       const SGRect<float>  getScreenRegion() const;
 
@@ -63,12 +60,9 @@ namespace canvas
 
       simgear::canvas::CanvasPtr getCanvasDecoration();
 
-      bool isVisible() const;
       bool isResizable() const;
       bool isCapturingEvents() const;
 
-      bool handleMouseEvent(const simgear::canvas::MouseEventPtr& event);
-
       void handleResize(uint8_t mode, const osg::Vec2f& delta = osg::Vec2f());
 
       void doRaise(SGPropertyNode* node_raise = 0);
@@ -85,7 +79,6 @@ namespace canvas
       simgear::canvas::CanvasPtr        _canvas_decoration;
       simgear::canvas::CanvasWeakPtr    _canvas_content;
 
-      simgear::canvas::Image    _image;
       simgear::canvas::ImagePtr _image_content,
                                 _image_shadow;