diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2005-04-15 18:00:24 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2005-04-15 18:00:24 +0000 |
| commit | 44433f650cd3e5f9f66253b74d194fcb01578595 (patch) | |
| tree | c67ea0df64ff9bfdd500abd4a641a7aae7450a84 /lib/gui/ewindowstyleskinned.cpp | |
| parent | 77c45c9d2cabd3c1dc028c41d26573ac62147a34 (diff) | |
| download | enigma2-44433f650cd3e5f9f66253b74d194fcb01578595.tar.gz enigma2-44433f650cd3e5f9f66253b74d194fcb01578595.zip | |
- sdl is now default output
- added skinned window style
- added background colors
- some RGB color support (but still not how i like it)
- some minor bugfixes
Diffstat (limited to 'lib/gui/ewindowstyleskinned.cpp')
| -rw-r--r-- | lib/gui/ewindowstyleskinned.cpp | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/lib/gui/ewindowstyleskinned.cpp b/lib/gui/ewindowstyleskinned.cpp new file mode 100644 index 00000000..a3152e5f --- /dev/null +++ b/lib/gui/ewindowstyleskinned.cpp @@ -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!"); +} + |
