]> git.mxchange.org Git - flightgear.git/blobdiff - src/Canvas/window.cxx
Fix starting on carrier.
[flightgear.git] / src / Canvas / window.cxx
index b4249702450d438472d576a68d7448e344986ea0..012915faf80bbee9d5917093b3ee212b53d3b18f 100644 (file)
@@ -32,10 +32,15 @@ namespace canvas
   namespace sc = simgear::canvas;
 
   //----------------------------------------------------------------------------
-  Window::Window(SGPropertyNode* node):
-    PropertyBasedElement(node),
+  const std::string Window::TYPE_NAME = "window";
+
+  //----------------------------------------------------------------------------
+  Window::Window( const simgear::canvas::CanvasWeakPtr& canvas,
+                  const SGPropertyNode_ptr& node,
+                  const Style& parent_style,
+                  Element* parent ):
+    Image(canvas, node, parent_style, parent),
     _attributes_dirty(0),
-    _image(sc::CanvasPtr(), node),
     _resizable(false),
     _capture_events(true),
     _resize_top(node, "resize-top"),
@@ -44,8 +49,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 +70,7 @@ namespace canvas
       _attributes_dirty &= ~DECORATION;
     }
 
-    _image.update(delta_time_sec);
+    Image::update(delta_time_sec);
   }
 
   //----------------------------------------------------------------------------
@@ -78,9 +81,7 @@ namespace canvas
     {
       handled = true;
       const std::string& name = node->getNameString();
-      if( name == "raise-top" )
-        doRaise(node);
-      else if( name  == "resize" )
+      if( name  == "resize" )
         _resizable = node->getBoolValue();
       else if( name == "update" )
         update(0);
@@ -88,44 +89,27 @@ namespace canvas
         _capture_events = node->getBoolValue();
       else if( name == "decoration-border" )
         parseDecorationBorder(node->getStringValue());
-      else if( boost::starts_with(name, "shadow-") )
+      else if(    boost::starts_with(name, "shadow-")
+               || name == "content-size" )
         _attributes_dirty |= DECORATION;
       else
         handled = false;
     }
 
     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) );
   }
 
@@ -136,16 +120,21 @@ namespace canvas
   }
 
   //----------------------------------------------------------------------------
-  void Window::setCanvas(sc::CanvasPtr canvas)
+  void Window::setCanvasContent(sc::CanvasPtr canvas)
   {
     _canvas_content = canvas;
-    _image.setSrcCanvas(canvas);
+
+    if( _image_content )
+      // Placement within decoration canvas
+      _image_content->setSrcCanvas(canvas);
+    else
+      setSrcCanvas(canvas);
   }
 
   //----------------------------------------------------------------------------
-  sc::CanvasWeakPtr Window::getCanvas() const
+  sc::CanvasWeakPtr Window::getCanvasContent() const
   {
-    return _image.getSrcCanvas();
+    return _canvas_content;
   }
 
   //----------------------------------------------------------------------------
@@ -154,12 +143,6 @@ namespace canvas
     return _canvas_decoration;
   }
 
-  //----------------------------------------------------------------------------
-  bool Window::isVisible() const
-  {
-    return _image.isVisible();
-  }
-
   //----------------------------------------------------------------------------
   bool Window::isResizable() const
   {
@@ -173,13 +156,16 @@ namespace canvas
   }
 
   //----------------------------------------------------------------------------
-  bool Window::handleMouseEvent(const sc::MouseEventPtr& event)
+  void Window::raise()
   {
-    return _image.handleEvent(event);
+    // on writing the z-index the window always is moved to the top of all other
+    // windows with the same z-index.
+    set<int>("z-index", get<int>("z-index", 0));
   }
 
   //----------------------------------------------------------------------------
-  void Window::handleResize(uint8_t mode, const osg::Vec2f& delta)
+  void Window::handleResize( uint8_t mode,
+                             const osg::Vec2f& offset )
   {
     if( mode == NONE )
     {
@@ -196,33 +182,14 @@ namespace canvas
     }
 
     if( mode & BOTTOM )
-      _resize_bottom += delta.y();
+      _resize_bottom = getRegion().b() + offset.y();
     else if( mode & TOP )
-      _resize_top += delta.y();
+      _resize_top = getRegion().t() + offset.y();
 
     if( mode & canvas::Window::RIGHT )
-      _resize_right += delta.x();
+      _resize_right = getRegion().r() + offset.x();
     else if( mode & canvas::Window::LEFT )
-      _resize_left += delta.x();
-  }
-
-  //----------------------------------------------------------------------------
-  void Window::doRaise(SGPropertyNode* node_raise)
-  {
-    if( node_raise && !node_raise->getBoolValue() )
-      return;
-
-    BOOST_FOREACH(osg::Group* parent, getGroup()->getParents())
-    {
-      // Remove window...
-      parent->removeChild(getGroup());
-
-      // ...and add again as topmost window
-      parent->addChild(getGroup());
-    }
-
-    if( node_raise )
-      node_raise->setBoolValue(false);
+      _resize_left = getRegion().l() + offset.x();
   }
 
   //----------------------------------------------------------------------------
@@ -239,21 +206,29 @@ namespace canvas
     if( shadow_radius < 2 )
       shadow_radius = 0;
 
+    sc::CanvasPtr content = _canvas_content.lock();
+    SGRect<int> content_view
+    (
+      0,
+      0,
+      get<int>("content-size[0]", content ? content->getViewWidth()  : 400),
+      get<int>("content-size[1]", content ? content->getViewHeight() : 300)
+    );
+
     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(content);
+      set<int>("size[0]", content_view.width());
+      set<int>("size[1]", content_view.height());
 
       _image_content.reset();
       _image_shadow.reset();
-      _canvas_decoration->destroy();
+      if( _canvas_decoration )
+        _canvas_decoration->destroy();
       _canvas_decoration.reset();
       return;
     }
 
-    sc::CanvasPtr content = _canvas_content.lock();
     if( !_canvas_decoration )
     {
       CanvasMgr* mgr =
@@ -268,7 +243,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");
@@ -286,24 +261,26 @@ namespace canvas
     //      the shadow?
 
     simgear::CSSBorder::Offsets const border =
-      _decoration_border.getAbsOffsets(content->getViewport());
+      _decoration_border.getAbsOffsets(content_view);
 
     int shad2 = 2 * shadow_radius,
-        outer_width  = border.l + content->getViewWidth()  + border.r + shad2,
-        outer_height = border.t + content->getViewHeight() + border.b + shad2;
+        outer_width  = border.l + content_view.width()  + border.r + shad2,
+        outer_height = border.t + content_view.height() + border.b + shad2;
 
     _canvas_decoration->setSizeX( outer_width );
     _canvas_decoration->setSizeY( outer_height );
     _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);
     _image_content->set<int>("y", shadow_radius + border.t);
+    _image_content->set<int>("size[0]", content_view.width());
+    _image_content->set<int>("size[1]", content_view.height());
 
     if( !shadow_radius )
     {