ff91368081d1b5e234702f1b1da463081a1946cd
[vuplus_dvbapp] / lib / gui / ewidgetdesktop.cpp
1 #include <lib/gui/ewidgetdesktop.h>
2 #include <lib/gui/ewidget.h>
3
4 void eWidgetDesktop::addRootWidget(eWidget *root, int top)
5 {
6         assert(!root->m_desktop);
7         if (!top)
8                 m_root.push_back(root);
9         else
10                 m_root.push_front(root);
11         root->m_desktop = this;
12 }
13
14 void eWidgetDesktop::removeRootWidget(eWidget *root)
15 {
16         m_root.remove(root);
17 }
18
19 void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible)
20 {
21                 /* start with our clip region, clipped with the parent's */
22         if (widget->m_vis & eWidget::wVisShow)
23         {
24                 widget->m_visible_region = widget->m_clip_region;
25                 widget->m_visible_region.moveBy(widget->position());
26                 widget->m_visible_region &= parent_visible; // in parent space!
27                         /* TODO: check transparency here! */
28                         /* remove everything this widget will contain from parent's visible list */
29                 parent_visible -= widget->m_visible_region; // will remove child regions too!
30
31                         /* now prepare for recursing to childs */
32                 widget->m_visible_region.moveBy(-widget->position());            // now in local space
33         } else
34                 widget->m_visible_region = gRegion();
35
36         widget->m_visible_with_childs = widget->m_visible_region;
37         
38         for (ePtrList<eWidget>::iterator i(widget->m_childs.begin()); i != widget->m_childs.end(); ++i)
39                 calcWidgetClipRegion(*i, widget->m_visible_region);
40 }
41
42 void eWidgetDesktop::recalcClipRegions()
43 {
44         gRegion screen = gRegion(eRect(ePoint(0, 0), m_screen_size));
45         
46         for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
47                 calcWidgetClipRegion(*i, screen);
48 //      dumpRegion(screen);
49 }
50
51 void eWidgetDesktop::invalidate(const gRegion &region)
52 {
53         m_dirty_region |= region;
54 }
55
56 void eWidgetDesktop::paint()
57 {
58         gPainter painter(m_dc);
59                 /* walk all root windows. */
60         for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
61                 i->doPaint(painter, m_dirty_region);
62         m_dirty_region = gRegion();
63 }
64
65 void eWidgetDesktop::setDC(gDC *dc)
66 {
67         m_dc = dc;
68 }
69
70 eWidgetDesktop::eWidgetDesktop(eSize size): m_screen_size(size)
71 {
72 }
73
74 eWidgetDesktop::~eWidgetDesktop()
75 {
76 }
77