- sdl is now default output
[vuplus_dvbapp] / lib / gui / ewindowstyleskinned.cpp
diff --git a/lib/gui/ewindowstyleskinned.cpp b/lib/gui/ewindowstyleskinned.cpp
new file mode 100644 (file)
index 0000000..a3152e5
--- /dev/null
@@ -0,0 +1,248 @@
+#include <lib/base/eerror.h>
+#include <lib/gdi/esize.h>
+#include <lib/gui/ewindow.h>
+#include <lib/gui/ewindowstyle.h>
+#include <lib/gui/ewindowstyleskinned.h>
+
+DEFINE_REF(eWindowStyleSkinned);
+
+eWindowStyleSkinned::eWindowStyleSkinned()
+{
+       m_background_color = gRGB(0x808080);
+}
+
+void eWindowStyleSkinned::handleNewSize(eWindow *wnd, eSize &size, eSize &offset)
+{
+//     eDebug("handle new size: %d x %d", size.width(), size.height());
+       
+       size = eSize(
+                       size.width() + m_border[bsWindow].m_border_left + m_border[bsWindow].m_border_right,
+                       size.height() + m_border[bsWindow].m_border_top + m_border[bsWindow].m_border_bottom
+               );
+       
+       offset = eSize(-m_border[bsWindow].m_border_left, -m_border[bsWindow].m_border_top);
+       
+       eWidget *child = wnd->child();
+       
+       wnd->m_clip_region = eRect(ePoint(0, 0), size);
+       
+       child->move(ePoint(m_border[bsWindow].m_border_left, m_border[bsWindow].m_border_top));
+       child->resize(eSize(size.width() - m_border[bsWindow].m_border_left - m_border[bsWindow].m_border_right, size.height() - m_border[bsWindow].m_border_top - m_border[bsWindow].m_border_bottom));
+}
+
+void eWindowStyleSkinned::paintWindowDecoration(eWindow *wnd, gPainter &painter, const std::string &title)
+{
+       drawBorder(painter, eRect(ePoint(0, 0), wnd->size()), m_border[bsWindow], bpAll);
+}
+
+void eWindowStyleSkinned::paintBackground(gPainter &painter, const ePoint &offset, const eSize &size)
+{
+       painter.setBackgroundColor(m_background_color);
+       painter.clear();
+}
+
+void eWindowStyleSkinned::setStyle(gPainter &painter, int what)
+{
+       switch (what)
+       {
+       case styleLabel:
+               painter.setForegroundColor(gColor(0x1F));
+               break;
+       case styleListboxSelected:
+               painter.setForegroundColor(gColor(0x1F));
+               painter.setBackgroundColor(gColor(0x1A));
+               break;
+       case styleListboxNormal:
+               painter.setForegroundColor(gColor(0x1C));
+               painter.setBackgroundColor(m_background_color);
+               break;
+       case styleListboxMarked:
+               painter.setForegroundColor(gColor(0x2F));
+               painter.setBackgroundColor(gColor(0x2A));
+               break;
+       }
+}
+
+void eWindowStyleSkinned::drawFrame(gPainter &painter, const eRect &frame, int what)
+{
+       int bs;
+       switch (what)
+       {
+       case frameButton:
+               bs = bsButton;
+               break;
+       case frameListboxEntry:
+               bs = bsListboxEntry;
+               break;
+       default:
+               eWarning("invalid frame style %d", what);
+               return;
+       }
+       drawBorder(painter, frame, m_border[bs], bpAll);
+}
+
+void eWindowStyleSkinned::drawBorder(gPainter &painter, const eRect &pos, struct borderSet &border, int what)
+{
+       int x = pos.left(), xm = pos.right();
+       
+       ePtr<gPixmap> 
+               &tl = border.m_pixmap[bpiTopLeft],
+               &t  = border.m_pixmap[bpiTop],
+               &tr = border.m_pixmap[bpiTopRight],
+               &l  = border.m_pixmap[bpiLeft],
+               &r  = border.m_pixmap[bpiRight],
+               &bl = border.m_pixmap[bpiBottomLeft],
+               &b  = border.m_pixmap[bpiBottom],
+               &br = border.m_pixmap[bpiBottomRight];
+       
+       if (tl)
+       {
+               painter.blit(tl, ePoint(x, pos.top()));
+               x += tl->size().width();
+       }
+       
+       if (tr)
+       {
+               xm -= tr->size().width();
+               painter.blit(tr, ePoint(xm, pos.top()), pos);
+       }
+
+       if (t)
+       {
+               while (x < xm)
+               {
+                       painter.blit(t, ePoint(x, pos.top()), eRect(x, pos.top(), xm - x, pos.height()));
+                       x += t->size().width();
+               }
+       }
+       
+       x = pos.left();
+       xm = pos.right();
+       
+       if (bl)
+       {
+               painter.blit(bl, ePoint(pos.left(), pos.bottom()-bl->size().height()));
+               x += bl->size().width();
+       }
+       
+       if (br)
+       {
+               xm -= br->size().width();
+               painter.blit(br, ePoint(xm, pos.bottom()-br->size().height()), eRect(x, pos.bottom()-br->size().height(), pos.width() - x, bl->size().height()));
+       }
+       
+       if (b)
+       {
+               while (x < xm)
+               {
+                       painter.blit(b, ePoint(x, pos.bottom()-b->size().height()), eRect(x, pos.bottom()-b->size().height(), xm - x, pos.height()));
+                       x += b->size().width();
+               }
+       }
+       
+       int y = 0;
+       if (tl)
+               y = tl->size().height();
+       
+       y += pos.top();
+       
+       int ym = pos.bottom();
+       if (bl)
+               ym -= bl->size().height();
+       
+       if (l)
+       {
+               while (y < ym)
+               {
+                       painter.blit(l, ePoint(pos.left(), y), eRect(pos.left(), y, pos.width(), ym - y));
+                       y += l->size().height();
+               }
+       }
+       
+       y = 0;
+       
+       if (tr)
+               y = tr->size().height();
+       
+       y += pos.top();
+       
+       ym = pos.bottom();
+       if (br)
+               ym -= br->size().height();
+       
+       if (r)
+       {
+               while (y < ym)
+               {
+                       painter.blit(r, ePoint(pos.right() - r->size().width(), y), eRect(pos.right()-r->size().width(), y, r->size().width(), ym - y));
+                       y += r->size().height();
+               }
+       }
+}
+
+RESULT eWindowStyleSkinned::getFont(int what, ePtr<gFont> &fnt)
+{
+       fnt = 0;
+       switch (what)
+       {
+       case fontStatic:
+               fnt = new gFont("Arial", 12);
+               break;
+       case fontButton:
+               fnt = new gFont("Arial", 20);
+               break;
+       case fontTitlebar:
+               fnt = new gFont("Arial", 25);
+               break;
+       default:
+               return -1;
+       }
+       return 0;
+}
+
+void eWindowStyleSkinned::setPixmap(int bs, int bp, gPixmap &pixmap)
+{
+       if ((bs >= bsMax) || (bs < 0))
+               return;
+       
+       int i = 0;
+       for (int b = 1; b < bpMax; b <<= 1, ++i)
+       {
+               if (bp & b)
+                       m_border[bs].m_pixmap[i] = &pixmap;
+       }
+       
+               /* recalc border sizes */
+       m_border[bs].m_border_top = 0;
+       m_border[bs].m_border_left = 0;
+       m_border[bs].m_border_bottom = 0;
+       m_border[bs].m_border_right = 0;
+       
+       for (int i = 0; i < 3; ++i)
+               if (m_border[bs].m_pixmap[i])
+                       if (m_border[bs].m_border_top < m_border[bs].m_pixmap[i]->size().height())
+                               m_border[bs].m_border_top = m_border[bs].m_pixmap[i]->size().height();
+       for (int i = 6; i < 9; ++i)
+               if (m_border[bs].m_pixmap[i])
+                       if (m_border[bs].m_border_bottom < m_border[bs].m_pixmap[i]->size().height())
+                               m_border[bs].m_border_bottom = m_border[bs].m_pixmap[i]->size().height();
+       for (int i = 0; i < 9; i += 3)
+               if (m_border[bs].m_pixmap[i])
+                       if (m_border[bs].m_border_left < m_border[bs].m_pixmap[i]->size().width())
+                               m_border[bs].m_border_left = m_border[bs].m_pixmap[i]->size().width();
+       for (int i = 2; i < 9; i += 3)
+               if (m_border[bs].m_pixmap[i])
+                       if (m_border[bs].m_border_right < m_border[bs].m_pixmap[i]->size().width())
+                               m_border[bs].m_border_right = m_border[bs].m_pixmap[i]->size().width();
+       eDebug("recalced border size for %d: %d:%d %d:%d",
+               bs, 
+               m_border[bs].m_border_left, m_border[bs].m_border_top, 
+               m_border[bs].m_border_right, m_border[bs].m_border_bottom); 
+}
+
+void eWindowStyleSkinned::setDefaultBackgroundColor(const gRGB &back)
+{
+       m_background_color = back;
+       eDebug("set default background color!");
+}
+