1 #include <lib/base/eerror.h>
2 #include <lib/gdi/esize.h>
3 #include <lib/gui/ewindow.h>
4 #include <lib/gui/ewindowstyle.h>
5 #include <lib/gui/ewindowstyleskinned.h>
7 DEFINE_REF(eWindowStyleSkinned);
9 eWindowStyleSkinned::eWindowStyleSkinned()
11 m_background_color = gRGB(0x808080);
14 void eWindowStyleSkinned::handleNewSize(eWindow *wnd, eSize &size, eSize &offset)
16 // eDebug("handle new size: %d x %d", size.width(), size.height());
19 size.width() + m_border[bsWindow].m_border_left + m_border[bsWindow].m_border_right,
20 size.height() + m_border[bsWindow].m_border_top + m_border[bsWindow].m_border_bottom
23 offset = eSize(-m_border[bsWindow].m_border_left, -m_border[bsWindow].m_border_top);
25 eWidget *child = wnd->child();
27 wnd->m_clip_region = eRect(ePoint(0, 0), size);
29 child->move(ePoint(m_border[bsWindow].m_border_left, m_border[bsWindow].m_border_top));
30 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));
33 void eWindowStyleSkinned::paintWindowDecoration(eWindow *wnd, gPainter &painter, const std::string &title)
35 drawBorder(painter, eRect(ePoint(0, 0), wnd->size()), m_border[bsWindow], bpAll);
38 void eWindowStyleSkinned::paintBackground(gPainter &painter, const ePoint &offset, const eSize &size)
40 painter.setBackgroundColor(m_background_color);
44 void eWindowStyleSkinned::setStyle(gPainter &painter, int what)
49 painter.setForegroundColor(gColor(0x1F));
51 case styleListboxSelected:
52 painter.setForegroundColor(gColor(0x1F));
53 painter.setBackgroundColor(gColor(0x1A));
55 case styleListboxNormal:
56 painter.setForegroundColor(gColor(0x1C));
57 painter.setBackgroundColor(m_background_color);
59 case styleListboxMarked:
60 painter.setForegroundColor(gColor(0x2F));
61 painter.setBackgroundColor(gColor(0x2A));
66 void eWindowStyleSkinned::drawFrame(gPainter &painter, const eRect &frame, int what)
74 case frameListboxEntry:
78 eWarning("invalid frame style %d", what);
81 drawBorder(painter, frame, m_border[bs], bpAll);
84 void eWindowStyleSkinned::drawBorder(gPainter &painter, const eRect &pos, struct borderSet &border, int what)
86 int x = pos.left(), xm = pos.right();
89 &tl = border.m_pixmap[bpiTopLeft],
90 &t = border.m_pixmap[bpiTop],
91 &tr = border.m_pixmap[bpiTopRight],
92 &l = border.m_pixmap[bpiLeft],
93 &r = border.m_pixmap[bpiRight],
94 &bl = border.m_pixmap[bpiBottomLeft],
95 &b = border.m_pixmap[bpiBottom],
96 &br = border.m_pixmap[bpiBottomRight];
100 painter.blit(tl, ePoint(x, pos.top()));
101 x += tl->size().width();
106 xm -= tr->size().width();
107 painter.blit(tr, ePoint(xm, pos.top()), pos);
114 painter.blit(t, ePoint(x, pos.top()), eRect(x, pos.top(), xm - x, pos.height()));
115 x += t->size().width();
124 painter.blit(bl, ePoint(pos.left(), pos.bottom()-bl->size().height()));
125 x += bl->size().width();
130 xm -= br->size().width();
131 painter.blit(br, ePoint(xm, pos.bottom()-br->size().height()), eRect(x, pos.bottom()-br->size().height(), pos.width() - x, bl->size().height()));
138 painter.blit(b, ePoint(x, pos.bottom()-b->size().height()), eRect(x, pos.bottom()-b->size().height(), xm - x, pos.height()));
139 x += b->size().width();
145 y = tl->size().height();
149 int ym = pos.bottom();
151 ym -= bl->size().height();
157 painter.blit(l, ePoint(pos.left(), y), eRect(pos.left(), y, pos.width(), ym - y));
158 y += l->size().height();
165 y = tr->size().height();
171 ym -= br->size().height();
177 painter.blit(r, ePoint(pos.right() - r->size().width(), y), eRect(pos.right()-r->size().width(), y, r->size().width(), ym - y));
178 y += r->size().height();
183 RESULT eWindowStyleSkinned::getFont(int what, ePtr<gFont> &fnt)
189 fnt = new gFont("Arial", 12);
192 fnt = new gFont("Arial", 20);
195 fnt = new gFont("Arial", 25);
203 void eWindowStyleSkinned::setPixmap(int bs, int bp, gPixmap &pixmap)
205 if ((bs >= bsMax) || (bs < 0))
209 for (int b = 1; b < bpMax; b <<= 1, ++i)
212 m_border[bs].m_pixmap[i] = &pixmap;
215 /* recalc border sizes */
216 m_border[bs].m_border_top = 0;
217 m_border[bs].m_border_left = 0;
218 m_border[bs].m_border_bottom = 0;
219 m_border[bs].m_border_right = 0;
221 for (int i = 0; i < 3; ++i)
222 if (m_border[bs].m_pixmap[i])
223 if (m_border[bs].m_border_top < m_border[bs].m_pixmap[i]->size().height())
224 m_border[bs].m_border_top = m_border[bs].m_pixmap[i]->size().height();
225 for (int i = 6; i < 9; ++i)
226 if (m_border[bs].m_pixmap[i])
227 if (m_border[bs].m_border_bottom < m_border[bs].m_pixmap[i]->size().height())
228 m_border[bs].m_border_bottom = m_border[bs].m_pixmap[i]->size().height();
229 for (int i = 0; i < 9; i += 3)
230 if (m_border[bs].m_pixmap[i])
231 if (m_border[bs].m_border_left < m_border[bs].m_pixmap[i]->size().width())
232 m_border[bs].m_border_left = m_border[bs].m_pixmap[i]->size().width();
233 for (int i = 2; i < 9; i += 3)
234 if (m_border[bs].m_pixmap[i])
235 if (m_border[bs].m_border_right < m_border[bs].m_pixmap[i]->size().width())
236 m_border[bs].m_border_right = m_border[bs].m_pixmap[i]->size().width();
237 eDebug("recalced border size for %d: %d:%d %d:%d",
239 m_border[bs].m_border_left, m_border[bs].m_border_top,
240 m_border[bs].m_border_right, m_border[bs].m_border_bottom);
243 void eWindowStyleSkinned::setDefaultBackgroundColor(const gRGB &back)
245 m_background_color = back;
246 eDebug("set default background color!");