fix flags
[enigma2.git] / lib / gui / ewidget.cpp
index ef784997ef7dc9e7ae263bc4b7c2cb18b4b0662d..8a396ad36e09a1d533d25c2da817defc6e8280b0 100644 (file)
@@ -23,6 +23,8 @@ eWidget::eWidget(eWidget *parent): m_animation(this), m_parent(parent ? parent->
 
        m_current_focus = 0;
        m_focus_owner = 0;
+       
+       m_notify_child_on_position_change = 1;
 }
 
 void eWidget::move(ePoint pos)
@@ -38,6 +40,11 @@ void eWidget::move(ePoint pos)
        m_position = pos;
        
        event(evtChangedPosition);
+       
+       if (m_notify_child_on_position_change)
+               for (ePtrList<eWidget>::iterator i(m_childs.begin()); i != m_childs.end(); ++i)
+                       i->event(evtParentChangedPosition);
+               
        recalcClipRegionsWhenVisible();
        
                /* try native move if supported. */
@@ -64,6 +71,11 @@ void eWidget::resize(eSize size)
        
        invalidate();
        event(evtChangedSize);
+
+       if (m_notify_child_on_position_change)
+               for (ePtrList<eWidget>::iterator i(m_childs.begin()); i != m_childs.end(); ++i)
+                       i->event(evtParentChangedPosition); /* position/size is the same here */
+
        recalcClipRegionsWhenVisible(); 
        invalidate();
 }
@@ -193,10 +205,29 @@ void eWidget::setZPosition(int z)
 
 void eWidget::setTransparent(int transp)
 {
-       if (transp)
-               m_vis |= wVisTransparent;
-       else
-               m_vis &=~wVisTransparent;
+       if (isTransparent() != transp)
+       {
+               if (transp)
+                       m_vis |= wVisTransparent;
+               else
+                       m_vis &=~wVisTransparent;
+               recalcClipRegionsWhenVisible();
+       }
+}
+
+ePoint eWidget::getAbsolutePosition()
+{
+       eWidget *root = this;
+       ePoint abspos = position();
+
+       while (root && !root->m_desktop)
+       {
+               root = root->m_parent;
+               assert(root);
+               abspos += root->position();
+       }
+
+       return abspos;
 }
 
 void eWidget::mayKillFocus()
@@ -314,8 +345,13 @@ int eWidget::event(int event, void *data, void *data2)
                        }
                } else
                {
-                       if (m_have_background_color)
-                               painter.setBackgroundColor(m_background_color);
+                       eWidget *w = this;
+                       
+                       while (w && !w->m_have_background_color)
+                               w = w->m_parent;
+
+                       if (w)
+                               painter.setBackgroundColor(w->m_background_color);
                }
                break;
        }
@@ -325,10 +361,12 @@ int eWidget::event(int event, void *data, void *data2)
                m_size = *static_cast<eSize*>(data);
                break;
        case evtChangedSize:
-       {
                m_clip_region = gRegion(eRect(ePoint(0, 0),  m_size));
                break;
-       }
+       case evtParentChangedPosition:
+               for (ePtrList<eWidget>::iterator i(m_childs.begin()); i != m_childs.end(); ++i)
+                       i->event(evtParentChangedPosition);
+               break;
        case evtFocusGot:
                m_focus_owner = (eWidget*)data;
                break;