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 | |
| 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')
| -rw-r--r-- | lib/gui/ebutton.cpp | 20 | ||||
| -rw-r--r-- | lib/gui/ebutton.h | 17 | ||||
| -rw-r--r-- | lib/gui/elabel.cpp | 39 | ||||
| -rw-r--r-- | lib/gui/elabel.h | 21 | ||||
| -rw-r--r-- | lib/gui/ewidget.cpp | 167 | ||||
| -rw-r--r-- | lib/gui/ewidget.h | 66 | ||||
| -rw-r--r-- | lib/gui/ewidgetdesktop.cpp | 72 | ||||
| -rw-r--r-- | lib/gui/ewidgetdesktop.h | 29 | ||||
| -rw-r--r-- | lib/gui/ewindow.cpp | 46 | ||||
| -rw-r--r-- | lib/gui/ewindow.h | 28 | ||||
| -rw-r--r-- | lib/gui/ewindowstyle.cpp | 23 | ||||
| -rw-r--r-- | lib/gui/ewindowstyle.h | 24 |
12 files changed, 552 insertions, 0 deletions
diff --git a/lib/gui/ebutton.cpp b/lib/gui/ebutton.cpp new file mode 100644 index 00000000..5c136abd --- /dev/null +++ b/lib/gui/ebutton.cpp @@ -0,0 +1,20 @@ +#include <lib/gui/ebutton.h> + +eButton::eButton(eWidget *parent): eLabel(parent) +{ +} + +void eButton::push() +{ + selected(); +} + +int eButton::event(int event, void *data, void *data2) +{ + switch (event) + { + default: + break; + } + return eLabel::event(event, data, data2); +} diff --git a/lib/gui/ebutton.h b/lib/gui/ebutton.h new file mode 100644 index 00000000..31c9cb3c --- /dev/null +++ b/lib/gui/ebutton.h @@ -0,0 +1,17 @@ +#ifndef __lib_gui_ebutton_h +#define __lib_gui_ebutton_h + +#include <lib/gui/elabel.h> + +class eButton: public eLabel +{ +public: + eButton(eWidget *parent); + Signal0<void> selected; + + void push(); +protected: + int event(int event, void *data=0, void *data2=0); +}; + +#endif diff --git a/lib/gui/elabel.cpp b/lib/gui/elabel.cpp new file mode 100644 index 00000000..f133b661 --- /dev/null +++ b/lib/gui/elabel.cpp @@ -0,0 +1,39 @@ +#include <lib/gui/elabel.h> + +eLabel::eLabel(eWidget *parent): eWidget(parent) +{ + +} + +int eLabel::event(int event, void *data, void *data2) +{ + switch (event) + { + case evtPaint: + { + gPainter &painter = *(gPainter*)data2; + ePtr<gFont> fnt = new gFont("Arial", 70); + painter.setFont(fnt); + painter.setBackgroundColor(gColor(0x10)); + painter.setForegroundColor(gColor(0x1f)); + painter.clear(); + painter.setBackgroundColor(gColor(0x1f)); + painter.setForegroundColor(gColor(0x10)); + painter.renderText(eRect(0, 0, size().width(), size().height()), m_text); + return 0; + } + case evtChangedText: + invalidate(); + return 0; + default: + return eWidget::event(event, data, data2); + } +} + +void eLabel::setText(const std::string &string) +{ + if (m_text == string) + return; + m_text = string; + event(evtChangedText); +} diff --git a/lib/gui/elabel.h b/lib/gui/elabel.h new file mode 100644 index 00000000..b1f7c2cf --- /dev/null +++ b/lib/gui/elabel.h @@ -0,0 +1,21 @@ +#ifndef __lib_gui_elabel_h +#define __lib_gui_elabel_h + +#include <lib/gui/ewidget.h> + +class eLabel: public eWidget +{ +public: + eLabel(eWidget *parent); + void setText(const std::string &string); +protected: + int event(int event, void *data=0, void *data2=0); +private: + enum eLabelEvent + { + evtChangedText = evtUserWidget + }; + std::string m_text; +}; + +#endif 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; +} + diff --git a/lib/gui/ewidget.h b/lib/gui/ewidget.h new file mode 100644 index 00000000..a551b8a3 --- /dev/null +++ b/lib/gui/ewidget.h @@ -0,0 +1,66 @@ +#ifndef __lib_gui_ewidget_h +#define __lib_gui_ewidget_h + +#include <lib/gdi/grc.h> /* for gRegion */ +#include <lib/base/eptrlist.h> /* for eSmartPtrList */ + +class eWidget +{ + friend class eWidgetDesktop; +public: + eWidget(eWidget *parent); + + void move(ePoint pos); + void resize(eSize size); + + ePoint position() const { return m_position; } + eSize size() const { return m_size; } + + void invalidate(const gRegion ®ion = gRegion::invalidRegion()); + + void show(); + void hide(); + + void destruct(); +private: + eWidgetDesktop *m_desktop; + + enum { + wVisShow = 1, + wVisTransparent = 2, + }; + + int m_vis; + + ePtrList<eWidget> m_childs; + eWidget *m_parent; + ePoint m_position; + eSize m_size; + + + void doPaint(gPainter &painter, const gRegion ®ion); +protected: + virtual ~eWidget(); +public: + + // all in local space! + gRegion m_clip_region, m_visible_region, m_visible_with_childs; + + enum eWidgetEvent + { + evtPaint, + evtKey, + evtChangedPosition, + evtChangedSize, + + evtWillShow, + evtWillHide, + evtWillChangePosition, /* new size is eRect *data */ + evtWillChangeSize, + + evtUserWidget, + }; + virtual int event(int event, void *data = 0, void *data2 = 0); +}; + +#endif diff --git a/lib/gui/ewidgetdesktop.cpp b/lib/gui/ewidgetdesktop.cpp new file mode 100644 index 00000000..10c92b71 --- /dev/null +++ b/lib/gui/ewidgetdesktop.cpp @@ -0,0 +1,72 @@ +#include <lib/gui/ewidgetdesktop.h> +#include <lib/gui/ewidget.h> + +void eWidgetDesktop::addRootWidget(eWidget *root, int top) +{ + assert(!root->m_desktop); + if (!top) + m_root.push_back(root); + else + m_root.push_front(root); + root->m_desktop = this; +} + +void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible) +{ + /* start with our clip region, clipped with the parent's */ + if (widget->m_vis & eWidget::wVisShow) + { + widget->m_visible_region = widget->m_clip_region; + widget->m_visible_region.moveBy(widget->position()); + widget->m_visible_region &= parent_visible; // in parent space! + /* TODO: check transparency here! */ + /* remove everything this widget will contain from parent's visible list */ + parent_visible -= widget->m_visible_region; // will remove child regions too! + + /* now prepare for recursing to childs */ + widget->m_visible_region.moveBy(-widget->position()); // now in local space + } else + widget->m_visible_region = gRegion(); + + widget->m_visible_with_childs = widget->m_visible_region; + + for (ePtrList<eWidget>::iterator i(widget->m_childs.begin()); i != widget->m_childs.end(); ++i) + calcWidgetClipRegion(*i, widget->m_visible_region); +} + +void eWidgetDesktop::recalcClipRegions() +{ + gRegion screen = gRegion(eRect(ePoint(0, 0), m_screen_size)); + + for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i) + calcWidgetClipRegion(*i, screen); +// dumpRegion(screen); +} + +void eWidgetDesktop::invalidate(const gRegion ®ion) +{ + m_dirty_region |= region; +} + +void eWidgetDesktop::paint() +{ + gPainter painter(m_dc); + /* walk all root windows. */ + for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i) + i->doPaint(painter, m_dirty_region); + m_dirty_region = gRegion(); +} + +void eWidgetDesktop::setDC(gDC *dc) +{ + m_dc = dc; +} + +eWidgetDesktop::eWidgetDesktop(eSize size): m_screen_size(size) +{ +} + +eWidgetDesktop::~eWidgetDesktop() +{ +} + diff --git a/lib/gui/ewidgetdesktop.h b/lib/gui/ewidgetdesktop.h new file mode 100644 index 00000000..197693f8 --- /dev/null +++ b/lib/gui/ewidgetdesktop.h @@ -0,0 +1,29 @@ +#ifndef __lib_gui_ewidgetdesktop_h +#define __lib_gui_ewidgetdesktop_h + +#include <lib/gdi/grc.h> +#include <lib/base/eptrlist.h> + +class eWidget; + +class eWidgetDesktop +{ +public: // weil debug + eSize m_screen_size; + gRegion m_dirty_region; + ePtr<gDC> m_dc; +public: + eWidgetDesktop(eSize screen); + ~eWidgetDesktop(); + void addRootWidget(eWidget *root, int top); + void recalcClipRegions(); + + void invalidate(const gRegion ®ion); + void paint(); + void setDC(gDC *dc); +private: + ePtrList<eWidget> m_root; + void calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible); +}; + +#endif diff --git a/lib/gui/ewindow.cpp b/lib/gui/ewindow.cpp new file mode 100644 index 00000000..1afee2ee --- /dev/null +++ b/lib/gui/ewindow.cpp @@ -0,0 +1,46 @@ +#include <lib/gui/ewindow.h> +#include <lib/gui/ewidgetdesktop.h> + +#include <lib/gui/ewindowstyle.h> + +eWindow::eWindow(eWidgetDesktop *desktop): eWidget(0) +{ + m_child = new eWidget(this); + desktop->addRootWidget(this, 0); + + m_style = new eWindowStyleSimple(); +} + +void eWindow::setTitle(const std::string &string) +{ + if (m_title == string) + return; + m_title = string; + event(evtTitleChanged); +} + +int eWindow::event(int event, void *data, void *data2) +{ + switch (event) + { + case evtWillChangeSize: + { + const eSize &new_size = *static_cast<eSize*>(data); + eDebug("eWindow::evtWillChangeSize to %d %d", new_size.width(), new_size.height()); + if (m_style) + m_style->handleNewSize(this, new_size); + break; + } + case evtPaint: + { + gPainter &painter = *static_cast<gPainter*>(data2); + painter.setBackgroundColor(gColor(0x18)); + painter.clear(); + break; + } + default: + break; + } + return eWidget::event(event, data, data2); +} + diff --git a/lib/gui/ewindow.h b/lib/gui/ewindow.h new file mode 100644 index 00000000..671a0079 --- /dev/null +++ b/lib/gui/ewindow.h @@ -0,0 +1,28 @@ +#ifndef __lib_gui_ewindow_h +#define __lib_gui_ewindow_h + +#include <lib/gui/ewidget.h> +#include <lib/gui/ewindowstyle.h> + +class eWidgetDesktop; + +class eWindow: public eWidget +{ + friend class eWindowStyle; +public: + eWindow(eWidgetDesktop *desktop); + void setTitle(const std::string &string); + eWidget *child() { return m_child; } +protected: + enum eWindowEvents + { + evtTitleChanged = evtUserWidget, + }; + int event(int event, void *data=0, void *data2=0); +private: + std::string m_title; + eWidget *m_child; + ePtr<eWindowStyle> m_style; +}; + +#endif diff --git a/lib/gui/ewindowstyle.cpp b/lib/gui/ewindowstyle.cpp new file mode 100644 index 00000000..932a3102 --- /dev/null +++ b/lib/gui/ewindowstyle.cpp @@ -0,0 +1,23 @@ +#include <lib/base/eerror.h> +#include <lib/gdi/esize.h> +#include <lib/gui/ewindow.h> +#include <lib/gui/ewindowstyle.h> + +DEFINE_REF(eWindowStyleSimple); + +eWindowStyleSimple::eWindowStyleSimple() +{ + m_border_left = m_border_right = m_border_top = m_border_bottom = 10; +} + +void eWindowStyleSimple::handleNewSize(eWindow *wnd, const eSize &size) +{ + eDebug("handle new size: %d x %d", size.width(), size.height()); + + eWidget *child = wnd->child(); + + wnd->m_clip_region = eRect(ePoint(0, 0), size); + + child->move(ePoint(m_border_left, m_border_top)); + child->resize(eSize(size.width() - m_border_left - m_border_right, size.height() - m_border_top - m_border_bottom)); +} diff --git a/lib/gui/ewindowstyle.h b/lib/gui/ewindowstyle.h new file mode 100644 index 00000000..02f155af --- /dev/null +++ b/lib/gui/ewindowstyle.h @@ -0,0 +1,24 @@ +#ifndef __lib_gui_ewindowstyle_h +#define __lib_gui_ewindowstyle_h + +class eWindow; +class eSize; + +#include <lib/base/object.h> + +class eWindowStyle: public iObject +{ +public: + virtual void handleNewSize(eWindow *wnd, const eSize &size) = 0; +}; + +class eWindowStyleSimple: public eWindowStyle +{ + DECLARE_REF; +public: + eWindowStyleSimple(); + void handleNewSize(eWindow *wnd, const eSize &size); + int m_border_top, m_border_left, m_border_right, m_border_bottom; +}; + +#endif |
