aboutsummaryrefslogtreecommitdiff
path: root/lib/gui
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2004-10-01 13:21:35 +0000
committerFelix Domke <tmbinc@elitedvb.net>2004-10-01 13:21:35 +0000
commitddc3964ed95d01e72229dc9af968a327cd84e56c (patch)
tree93e6694c639db3d188f5b2868f6b2b2951d21d60 /lib/gui
parent1aeefd997cc362c3b37c1587c5f08891b35c3a75 (diff)
downloadenigma2-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.cpp20
-rw-r--r--lib/gui/ebutton.h17
-rw-r--r--lib/gui/elabel.cpp39
-rw-r--r--lib/gui/elabel.h21
-rw-r--r--lib/gui/ewidget.cpp167
-rw-r--r--lib/gui/ewidget.h66
-rw-r--r--lib/gui/ewidgetdesktop.cpp72
-rw-r--r--lib/gui/ewidgetdesktop.h29
-rw-r--r--lib/gui/ewindow.cpp46
-rw-r--r--lib/gui/ewindow.h28
-rw-r--r--lib/gui/ewindowstyle.cpp23
-rw-r--r--lib/gui/ewindowstyle.h24
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 &region);
+
+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 &region)
+{
+ 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, &region, &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 &region = 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 &region);
+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 &region)
+{
+ 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 &region);
+ 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