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