don't crash when no left/right border pixmap defined
[enigma2.git] / lib / gui / eslider.cpp
1 #include <lib/gui/eslider.h>
2
3 eSlider::eSlider(eWidget *parent)
4         :eWidget(parent), m_have_border_color(false), m_start(0), m_orientation(orHorizontal), m_border_width(0)
5 {
6 }
7
8 void eSlider::setPixmap(gPixmap *pixmap)
9 {
10         m_pixmap = pixmap;
11         event(evtChangedSlider);
12 }
13
14 void eSlider::setBorderWidth(int pixel)
15 {
16         m_border_width=pixel;
17         invalidate();
18 }
19
20 void eSlider::setBorderColor(const gRGB &color)
21 {
22         m_border_color=color;
23         m_have_border_color=true;
24         invalidate();
25 }
26
27 int eSlider::event(int event, void *data, void *data2)
28 {
29         switch (event)
30         {
31         case evtPaint:
32         {
33                 ePtr<eWindowStyle> style;
34
35                 eSize s(size());
36                 getStyle(style);
37                         /* paint background */
38                 eWidget::event(evtPaint, data, data2);
39
40                 gPainter &painter = *(gPainter*)data2;
41
42                 style->setStyle(painter, eWindowStyle::styleLabel); // TODO - own style
43                 
44                 if (!m_pixmap)
45                         painter.fill(m_currently_filled);
46                 else
47                         painter.blit(m_pixmap, ePoint(0, 0), m_currently_filled.extends, isTransparent() ? gPainter::BT_ALPHATEST : 0);
48
49 // border
50                 if (m_have_border_color)
51                         painter.setForegroundColor(m_border_color);
52                 painter.fill(eRect(0, 0, s.width(), m_border_width));
53                 painter.fill(eRect(0, m_border_width, m_border_width, s.height()-m_border_width));
54                 painter.fill(eRect(m_border_width, s.height()-m_border_width, s.width()-m_border_width, m_border_width));
55                 painter.fill(eRect(s.width()-m_border_width, m_border_width, m_border_width, s.height()-m_border_width));
56
57                 return 0;
58         }
59         case evtChangedSlider:
60         {
61                 int num_pix = 0, start_pix = 0;
62                 gRegion old_currently_filled = m_currently_filled;
63
64                 int pixsize = (m_orientation == orHorizontal) ? size().width() : size().height();
65
66                 if (m_min < m_max)
67                 {
68                         num_pix = pixsize * (m_value - m_start) / (m_max - m_min);
69                         start_pix = pixsize * m_start / (m_max - m_min);
70                 }
71                 
72                 if  (start_pix < 0)
73                 {
74                         num_pix += start_pix;
75                         start_pix = 0;
76                 }
77                 
78                 if (num_pix < 0)
79                         num_pix = 0;
80
81                 if (m_orientation == orHorizontal)
82                         m_currently_filled = eRect(start_pix, 0, num_pix, pixsize);
83                 else
84                         m_currently_filled = eRect(0, start_pix, pixsize, num_pix);
85
86                         // redraw what *was* filled before and now isn't.
87                 invalidate(m_currently_filled - old_currently_filled);
88                         // redraw what wasn't filled before and is now.
89                 invalidate(old_currently_filled - m_currently_filled);
90                 
91                 return 0;
92         }
93         default:
94                 return eWidget::event(event, data, data2);
95         }
96 }
97
98 void eSlider::setValue(int value)
99 {
100         m_value = value;
101         event(evtChangedSlider);
102 }
103
104 void eSlider::setStartEnd(int start, int end)
105 {
106         m_value = end;
107         m_start = start;
108         event(evtChangedSlider);
109 }
110
111 void eSlider::setOrientation(int orientation)
112 {
113         m_orientation = orientation;
114         event(evtChangedSlider);
115 }
116
117 void eSlider::setRange(int min, int max)
118 {
119         m_min = min;
120         m_max = max;
121         event(evtChangedSlider);
122 }