diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2004-10-01 13:21:35 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2004-10-01 13:21:35 +0000 |
| commit | ddc3964ed95d01e72229dc9af968a327cd84e56c (patch) | |
| tree | 93e6694c639db3d188f5b2868f6b2b2951d21d60 /lib/gui/ewidget.cpp | |
| parent | 1aeefd997cc362c3b37c1587c5f08891b35c3a75 (diff) | |
| download | enigma2-ddc3964ed95d01e72229dc9af968a327cd84e56c.tar.gz enigma2-ddc3964ed95d01e72229dc9af968a327cd84e56c.zip | |
- add python, missing gui
- remove console (needs to be rewritten anyway)
- eString -> std::string
Diffstat (limited to 'lib/gui/ewidget.cpp')
| -rw-r--r-- | lib/gui/ewidget.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/lib/gui/ewidget.cpp b/lib/gui/ewidget.cpp new file mode 100644 index 00000000..89fbfe95 --- /dev/null +++ b/lib/gui/ewidget.cpp @@ -0,0 +1,167 @@ +#include <lib/gui/ewidget.h> +#include <lib/gui/ewidgetdesktop.h> + +extern void dumpRegion(const gRegion ®ion); + +eWidget::eWidget(eWidget *parent): m_parent(parent) +{ + m_vis = 0; + m_desktop = 0; + + if (parent) + m_vis = wVisShow; + + if (parent) + parent->m_childs.push_back(this); +} + +void eWidget::move(ePoint pos) +{ + m_position = pos; + + event(evtChangedPosition); +} + +void eWidget::resize(eSize size) +{ + event(evtWillChangeSize, &size); + event(evtChangedSize); +} + +void eWidget::invalidate(const gRegion ®ion) +{ + gRegion res = /* region & */ m_visible_with_childs; + if (res.empty()) + return; + + eWidget *root = this; + ePoint abspos = position(); + while (root && !root->m_desktop) + { + root = root->m_parent; + assert(root); + abspos += root->position(); + } + + res.moveBy(abspos); +// eDebug("region to invalidate:"); +// dumpRegion(res); + root->m_desktop->invalidate(res); +} + +void eWidget::show() +{ + if (m_vis & wVisShow) + return; + + m_vis |= wVisShow; + + /* TODO: optimize here to only recalc what's required. possibly merge with hide. */ + eWidget *root = this; + ePoint abspos = position(); + while (root && !root->m_desktop) + { + root = root->m_parent; + assert(root); + abspos += root->position(); + } + + root->m_desktop->recalcClipRegions(); + + gRegion abs = m_visible_with_childs; + abs.moveBy(abspos); + root->m_desktop->invalidate(abs); +} + +void eWidget::hide() +{ + m_vis &= ~wVisShow; + + /* TODO: optimize here to only recalc what's required. possibly merge with show. */ + eWidget *root = this; + ePoint abspos = position(); + while (root && !root->m_desktop) + { + root = root->m_parent; + abspos += root->position(); + } + assert(root->m_desktop); + + gRegion abs = m_visible_with_childs; + abs.moveBy(abspos); + + root->m_desktop->recalcClipRegions(); + root->m_desktop->invalidate(abs); +} + +void eWidget::destruct() +{ + if (m_parent) + m_parent->m_childs.remove(this); + delete this; +} + +eWidget::~eWidget() +{ + /* destroy all childs */ + ePtrList<eWidget>::iterator i(m_childs.begin()); + while (i != m_childs.end()) + { + delete *i; + i = m_childs.erase(i); + } +} + +void eWidget::doPaint(gPainter &painter, const gRegion &r) +{ + if (m_visible_with_childs.empty()) + return; + + gRegion region = r; + /* we were in parent's space, now we are in local space */ + region.moveBy(-position()); + + painter.moveOffset(position()); + /* walk all childs */ + for (ePtrList<eWidget>::iterator i(m_childs.begin()); i != m_childs.end(); ++i) + i->doPaint(painter, region); + + /* check if there's anything for us to paint */ + region &= m_visible_region; + + painter.resetClip(region); + event(evtPaint, ®ion, &painter); + + painter.moveOffset(-position()); +} + +int eWidget::event(int event, void *data, void *data2) +{ + switch (event) + { + case evtPaint: + { + static int counter = 0x18; + gPainter &painter = *(gPainter*)data2; +// eDebug("eWidget::evtPaint %d", counter); +// dumpRegion(*(gRegion*)data); + painter.setBackgroundColor(gColor(++counter)); + painter.clear(); + break; + } + case evtKey: + break; + case evtWillChangeSize: + m_size = *static_cast<eSize*>(data); + break; + case evtChangedSize: + { + m_clip_region = gRegion(eRect(ePoint(0, 0), m_size)); + break; + } + default: + return -1; + } + return 0; +} + |
