0adda5db26668e15c7473699202b6f89f5b78b11
[enigma2.git] / lib / gui / epositiongauge.cpp
1 #include <lib/gui/epositiongauge.h>
2 #include <lib/gui/epixmap.h>
3
4 ePositionGauge::ePositionGauge(eWidget *parent)
5         : eWidget(parent)
6 {
7         m_point_widget = new ePixmap(this);
8         m_seek_point_widget = new ePixmap(this);
9         m_point_widget->setAlphatest(1);
10         m_seek_point_widget->setAlphatest(1);
11         m_position = 0;
12         m_length = 0;
13         m_have_foreground_color = 0;
14         m_seek_position = 0;
15 }
16
17 ePositionGauge::~ePositionGauge()
18 {
19         delete m_point_widget;
20         delete m_seek_point_widget;
21 }
22
23 void ePositionGauge::setLength(const pts_t &len)
24 {
25         if (m_length == len)
26                 return;
27         m_length = len;
28         updatePosition();
29         invalidate();
30 }
31
32 void ePositionGauge::setPosition(const pts_t &pos)
33 {
34         if (m_position == pos)
35                 return;
36         m_position = pos;
37         updatePosition();
38 }
39
40 void ePositionGauge::setInColor(const gRGB &color)
41 {
42         invalidate();
43 }
44
45 void ePositionGauge::setPointer(int which, gPixmap *pixmap, const ePoint &center)
46 {
47         if (which == 0)
48         {
49                 m_point_center = center;
50                 m_point_widget->setPixmap(pixmap);
51                 m_point_widget->resize(pixmap->size());
52         } else
53         {
54                 m_seek_point_center = center;
55                 m_seek_point_widget->setPixmap(pixmap);
56                 m_seek_point_widget->resize(pixmap->size());
57         }
58         updatePosition();
59 }
60
61 void ePositionGauge::setInOutList(PyObject *list)
62 {
63         if (!PyList_Check(list))
64                 return;
65         int size = PyList_Size(list);
66         int i;
67         
68         m_cue_entries.clear();
69         
70         for (i=0; i<size; ++i)
71         {
72                 PyObject *tuple = PyList_GetItem(list, i);
73                 if (!PyTuple_Check(tuple))
74                         continue;
75
76                 if (PyTuple_Size(tuple) != 2)
77                         continue;
78
79                 PyObject *ppts = PyTuple_GetItem(tuple, 0), *ptype = PyTuple_GetItem(tuple, 1);
80                 if (!(PyLong_Check(ppts) && PyInt_Check(ptype)))
81                         continue;
82
83                 pts_t pts = PyLong_AsLongLong(ppts);
84                 int type = PyInt_AsLong(ptype);
85                 m_cue_entries.insert(cueEntry(pts, type));
86         }
87         invalidate();
88 }
89
90 int ePositionGauge::event(int event, void *data, void *data2)
91 {
92         switch (event)
93         {
94         case evtPaint:
95         {
96                 ePtr<eWindowStyle> style;
97                 gPainter &painter = *(gPainter*)data2;
98
99                 eSize s(size());
100
101                 getStyle(style);
102                 
103                 eWidget::event(evtPaint, data, data2);
104
105                 style->setStyle(painter, eWindowStyle::styleLabel); // TODO - own style
106 //              painter.fill(eRect(0, 10, s.width(), s.height()-20));
107                 
108                 pts_t in = 0, out = 0;
109                 
110                 std::multiset<cueEntry>::iterator i(m_cue_entries.begin());
111                 
112                 while (1)
113                 {
114                         if (i == m_cue_entries.end())
115                                 out = m_length;
116                         else {
117                                 if (i->what == 0) /* in */
118                                 {
119                                         in = i++->where;
120                                         continue;
121                                 } else if (i->what == 1) /* out */
122                                         out = i++->where;
123                                 else /* mark */
124                                 {
125                                         int xm = scale(i->where);
126                                         painter.setForegroundColor(gRGB(0xFF8080));
127                                         painter.fill(eRect(xm - 2, 0, 4, s.height()));
128                                         i++;
129                                         continue;
130                                 }
131                         }
132                         
133                         if (m_have_foreground_color)
134                         {
135                                 painter.setForegroundColor(gRGB(m_foreground_color));
136                                 int xi = scale(in), xo = scale(out);
137                                 painter.fill(eRect(xi, 10, xo-xi, s.height()-14));
138                         }
139                         
140                         in = m_length;
141                         
142                         if (i == m_cue_entries.end())
143                                 break;
144                 }
145 //              painter.setForegroundColor(gRGB(0x00000000));
146
147                 if (m_have_foreground_color)
148                 {
149                         painter.setForegroundColor(gRGB(0x225b7395));
150                         painter.fill(eRect(s.width() - 2, 2, s.width() - 1, s.height() - 4));
151                         painter.fill(eRect(0, 2, 2, s.height() - 4));
152                 }
153                 
154 #if 0
155 // border
156                 if (m_have_border_color)
157                         painter.setForegroundColor(m_border_color);
158                 painter.fill(eRect(0, 0, s.width(), m_border_width));
159                 painter.fill(eRect(0, m_border_width, m_border_width, s.height()-m_border_width));
160                 painter.fill(eRect(m_border_width, s.height()-m_border_width, s.width()-m_border_width, m_border_width));
161                 painter.fill(eRect(s.width()-m_border_width, m_border_width, m_border_width, s.height()-m_border_width));
162 #endif
163
164                 return 0;
165         }
166         case evtChangedPosition:
167                 return 0;
168         default:
169                 return eWidget::event(event, data, data2);
170         }
171 }
172
173 void ePositionGauge::updatePosition()
174 {
175         m_pos = scale(m_position);
176         m_seek_pos = scale(m_seek_position);
177         int base = (size().height() - 10) / 2;
178         
179         m_point_widget->move(ePoint(m_pos - m_point_center.x(), base - m_point_center.y()));
180         m_seek_point_widget->move(ePoint(m_seek_pos - m_seek_point_center.x(), base - m_seek_point_center.y()));
181 }
182
183 int ePositionGauge::scale(const pts_t &val)
184 {
185         if (!m_length)
186                 return 0;
187
188         int width = size().width();
189
190         return width * val / m_length;
191 }
192
193 void ePositionGauge::setForegroundColor(const gRGB &col)
194 {
195         if ((!m_have_foreground_color) || !(m_foreground_color == col))
196         {
197                 m_foreground_color = col;
198                 m_have_foreground_color = 1;
199                 invalidate();
200         }
201 }
202
203 void ePositionGauge::enableSeekPointer(int enable)
204 {
205         if (enable)
206                 m_seek_point_widget->show();
207         else
208                 m_seek_point_widget->hide();
209 }
210
211 void ePositionGauge::setSeekPosition(const pts_t &pos)
212 {
213         if (m_seek_position == pos)
214                 return;
215         m_seek_position = pos;
216         updatePosition();
217 }