gui: experimental Z order for root widgets
authorFelix Domke <tmbinc@elitedvb.net>
Thu, 22 Dec 2005 02:08:19 +0000 (02:08 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Thu, 22 Dec 2005 02:08:19 +0000 (02:08 +0000)
lib/gui/ewidgetdesktop.cpp
lib/gui/ewidgetdesktop.h
lib/gui/ewindow.cpp
lib/gui/ewindow.h

index 04bc85d9059b7b7edb9d57bf9ec764f8f95e1e7f..223b5c8672b02c906399a94225fb157084ec1fb6 100644 (file)
@@ -5,18 +5,27 @@
 
 extern void dumpRegion(const gRegion &region);
 
-void eWidgetDesktop::addRootWidget(eWidget *root, int top)
+void eWidgetDesktop::addRootWidget(eWidget *root)
 {
        assert(!root->m_desktop);
        
+       int invert_sense = 0;
                /* buffered mode paints back-to-front, while immediate mode is front-to-back. */
        if (m_comp_mode == cmBuffered)
-               top = !top;
+               invert_sense = 1;
+       
+       ePtrList<eWidget>::iterator insert_position = m_root.begin();
+       
+       for (;;)
+       {
+               if ((insert_position == m_root.end()) || (invert_sense ^ (insert_position->m_z_position > root->m_z_position)))
+               {
+                       m_root.insert(insert_position, root);
+                       break;
+               }
+               ++insert_position;
+       }
        
-       if (top)
-               m_root.push_back(root);
-       else
-               m_root.push_front(root);
        root->m_desktop = this;
 
                /* the creation will be postponed. */
index 9fbe1bcb5fc55321f80e89b0f8dee146f2419418..f88efa8823552cec5deb2baaa1870e28c1b8a706 100644 (file)
@@ -33,7 +33,7 @@ class eWidgetDesktop: public Object
 public:
        eWidgetDesktop(eSize screen);
        ~eWidgetDesktop();
-       void addRootWidget(eWidget *root, int top);
+       void addRootWidget(eWidget *root);
        void removeRootWidget(eWidget *root);
        
                /* try to move widget content. */
index 06827a9eede6cefff82df4cd64ef8911c7e33edd..f8984729913c3cfc52365ac334e24240a74390bf 100644 (file)
@@ -6,7 +6,7 @@
 
 #include <lib/gdi/epng.h>
 
-eWindow::eWindow(eWidgetDesktop *desktop): eWidget(0)
+eWindow::eWindow(eWidgetDesktop *desktop, int z): eWidget(0)
 {
        m_flags = 0;
                /* ask style manager for current style */
@@ -22,12 +22,14 @@ eWindow::eWindow(eWidgetDesktop *desktop): eWidget(0)
                style = new eWindowStyleSimple();
        
        setStyle(style);
+       
+       setZPosition(z); /* must be done before addRootWidget */
 
                /* we are the parent for the child window. */
                /* as we are in the constructor, this is thread safe. */
        m_child = this;
        m_child = new eWidget(this);
-       desktop->addRootWidget(this, 0);
+       desktop->addRootWidget(this);
 }
 
 eWindow::~eWindow()
index a5b92eda15cb13fd1cfed19f78cb9f4e83344d35..d36d912401a5e85e739426c3c2d227a2f0e29fb0 100644 (file)
@@ -10,7 +10,7 @@ class eWindow: public eWidget
 {
        friend class eWindowStyle;
 public:
-       eWindow(eWidgetDesktop *desktop);
+       eWindow(eWidgetDesktop *desktop, int z = 0);
        ~eWindow();
        void setTitle(const std::string &string);
        std::string getTitle() const;