]> git.vomp.tv Git - vompclient.git/blob - vchannelselect.cc
20 CWFs, fix some snprintf calls
[vompclient.git] / vchannelselect.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP.  If not, see <https://www.gnu.org/licenses/>.
18 */
19
20 #include "vchannelselect.h"
21
22 #include "input.h"
23 #include "message.h"
24 #include "boxstack.h"
25 #include "colour.h"
26 #include "log.h"
27 #include "timers.h"
28 #include "vdr.h"
29 #include "messagequeue.h"
30
31 // this class only works as it does because the remote command
32 // values for the numbers are the numbers themselves !
33
34 VChannelSelect::VChannelSelect(Boxx* v)
35 {
36   parent = v;
37   numGot = 0;
38   ignoreTimer = false;
39
40   numWidth = (int)VDR::getInstance()->getChannelNumberWidth();
41   if (numWidth > 10) numWidth = 10;
42   for (int i = 0; i < numWidth; i++) input[i] = -1;
43
44   setSize((numWidth*10) + 22, 30); // 10 px = width of number chars in font
45   createBuffer();
46   setPosition(80, 60);
47   setBackgroundColour(DrawStyle::VIEWBACKGROUND);
48 }
49
50 VChannelSelect::~VChannelSelect()
51 {
52   Timers::getInstance()->cancelTimer(this, 1);
53 }
54
55 void VChannelSelect::timercall(int /*clientReference*/)
56 {
57   Log::getInstance()->log("VChannelSelect", Log::DEBUG, "Timer call");
58   if (ignoreTimer) return;
59   changeChannel();
60 }
61
62 void VChannelSelect::doInput(int number)
63 {
64   for (int i = numGot - 1; i >= 0; i--)
65   {
66     input[i+1] = input[i];
67   }
68
69   input[0] = number;
70   numGot++;
71 }
72
73 void VChannelSelect::draw()
74 {
75   Boxx::draw();
76
77   // draw numbers
78   char text[2];
79
80   for (int i = 0; i < numWidth; i++)
81   {
82     if (input[i] == -1)
83     {
84       drawText("_", 7 + ((numWidth - 1 - i) * 10), 5, DrawStyle::LIGHTTEXT);
85     }
86     else
87     {
88       sprintf(text, "%i", input[i]);
89       drawText(text, 7 + ((numWidth - 1 - i) * 10), 5, DrawStyle::LIGHTTEXT);
90     }
91   }
92 }
93
94 void VChannelSelect::changeChannel()
95 {
96   ignoreTimer = true;
97   Timers::getInstance()->cancelTimer(this, 1);
98
99   Message* m;
100
101   // Is there valid data? (is any number not-zero)
102   int i = 0;
103   for(i = 0; i < numWidth; i++) if (input[i]) break;
104
105   if (i < numWidth) // There is data
106   {
107     m = new Message();
108     m->from = this;
109     m->to = parent;
110     m->message = Message::CHANNEL_CHANGE;
111     m->parameter = 0;
112
113     for(i = numGot - 1; i >= 0; i--)
114     {
115       m->parameter += input[i] * (ULONG)pow(10., i);
116     }
117
118     MessageQueue::getInstance()->postMessage(m);
119   }
120
121   // Close me
122   m = new Message(); // Delete self
123   m->from = this;
124   m->to = BoxStack::getInstance();
125   m->message = Message::CLOSE_ME;
126   MessageQueue::getInstance()->postMessage(m);
127 }
128
129 int VChannelSelect::handleCommand(int command)
130 {
131   switch(command)
132   {
133     case Input::ZERO:
134     case Input::ONE:
135     case Input::TWO:
136     case Input::THREE:
137     case Input::FOUR:
138     case Input::FIVE:
139     case Input::SIX:
140     case Input::SEVEN:
141     case Input::EIGHT:
142     case Input::NINE:
143     {
144       doInput(command);
145       draw();
146       BoxStack::getInstance()->update(this);
147       if (numGot == numWidth) changeChannel();
148       else Timers::getInstance()->setTimerD(this, 1, 3);
149       return 2;
150     }
151     case Input::OK:
152     {
153       changeChannel();
154       return 2;
155     }
156   }
157
158   // allow command to drop through to other views
159   return 0;
160 }