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