]> git.vomp.tv Git - vompclient.git/blob - vepgsettimer.cc
Translation updates
[vompclient.git] / vepgsettimer.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, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "vepgsettimer.h"
22
23 VEpgSetTimer::VEpgSetTimer(Event* tevent, Channel* tchannel)
24 {
25   viewman = ViewMan::getInstance();
26   vdr = VDR::getInstance();
27   logger = Log::getInstance();
28
29   event = tevent;
30   channel = tchannel;
31
32   create(400, 240);
33   if (Video::getInstance()->getFormat() == Video::PAL)
34   {
35     setScreenPos(150, 170);
36   }
37   else
38   {
39     setScreenPos(140, 140);
40   }
41
42   setBackgroundColour(Colour::VIEWBACKGROUND);
43   setTitleBarOn(1);
44   setTitleBarColour(Colour::TITLEBARBACKGROUND);
45   setBorderOn(true);
46   setTitleText(tr("Set Timer"));
47
48   buttonYes.setSurface(surface);
49   buttonNo.setSurface(surface);
50   buttonYes.setSurfaceOffset(80, 40 + (7 * surface->getFontHeight()));
51   buttonNo.setSurfaceOffset(220, 40 + (7 * surface->getFontHeight()));
52
53   buttonYes.setText(tr("Yes"));
54   buttonNo.setText(tr("No"));
55   buttonYes.setActive(1);
56   selectedOption = YES;
57
58   logger->log("VEPGST", Log::DEBUG, "Title: %s", event->title);
59   logger->log("VEPGST", Log::DEBUG, "Time: %lu", event->time);
60   logger->log("VEPGST", Log::DEBUG, "Duration: %lu", event->duration);
61   logger->log("VEPGST", Log::DEBUG, "Channel: %i", channel->number);
62 }
63
64 VEpgSetTimer::~VEpgSetTimer()
65 {
66 }
67
68 char* VEpgSetTimer::genTimerString()
69 {
70   // Allocate to return
71   char* timerString = new char[1024];
72
73   // Other
74   struct tm* btime;
75   int flags;
76   char dateString[20];
77   char startMargin[10];
78   time_t startTime;
79   char startString[10];
80   char endMargin[10];
81   time_t endTime;
82   char endString[10];
83   char priority[10];
84   char lifetime[10];
85   char* eventTitle;
86
87   flags = 1; // hard coded active timer flag
88
89   btime = localtime((time_t*)&event->time);
90   strftime(dateString, 19, "%Y-%m-%d", btime);
91
92   char* startMarginConfig = vdr->configLoad("Timers", "Start margin");
93   if (startMarginConfig)
94   {
95     strncpy(startMargin, startMarginConfig, 9);
96     delete[] startMarginConfig;
97   }
98   else strcpy(startMargin, "5");
99
100   startTime = event->time - (atoi(startMargin) * 60);
101   btime = localtime(&startTime);
102   strftime(startString, 9, "%H%M", btime);
103
104   char* endMarginConfig = vdr->configLoad("Timers", "End margin");
105   if (endMarginConfig)
106   {
107     strncpy(endMargin, endMarginConfig, 9);
108     delete[] endMarginConfig;
109   }
110   else strcpy(endMargin, "5");
111
112   endTime = event->time + event->duration + (atoi(endMargin) * 60);
113   btime = localtime(&endTime);
114   strftime(endString, 9, "%H%M", btime);
115
116   char* priorityConfig = vdr->configLoad("Timers", "Priority");
117   if (priorityConfig)
118   {
119     strncpy(priority, priorityConfig, 9);
120     delete[] priorityConfig;
121   }
122   else strcpy(priority, "99");
123
124   char* lifetimeConfig = vdr->configLoad("Timers", "Lifetime");
125   if (lifetimeConfig)
126   {
127     strncpy(lifetime, lifetimeConfig, 9);
128     delete[] lifetimeConfig;
129   }
130   else strcpy(lifetime, "99");
131
132   eventTitle = new char[strlen(event->title) + 1];
133   strcpy(eventTitle, event->title);
134   for(UINT i=0; i < strlen(eventTitle); i++) if (eventTitle[i] == ':') eventTitle[i] = '|';
135
136   SNPRINTF(timerString, 1023, "%i:%lu:%s:%s:%s:%s:%s:%s:",
137     flags, channel->number, dateString,
138     startString, endString,
139     priority, lifetime, eventTitle);
140
141   delete[] eventTitle;
142
143   return timerString;
144 }
145
146 void VEpgSetTimer::swap()
147 {
148   if (selectedOption == NO)
149   {
150     selectedOption = YES;
151     buttonYes.setActive(1);
152     buttonNo.setActive(0);
153   }
154   else if (selectedOption == YES)
155   {
156     selectedOption = NO;
157     buttonYes.setActive(0);
158     buttonNo.setActive(1);
159   }
160 }
161
162 void VEpgSetTimer::draw()
163 {
164   View::draw();
165   drawPara(event->title, 10, 40, Colour::LIGHTTEXT);
166   drawText(channel->name, 10, 40 + (2 * surface->getFontHeight()), Colour::LIGHTTEXT);
167
168   char fullString[20];
169   time_t t;
170   struct tm* btime;
171   char timeString[10];
172   btime = localtime((time_t*)&event->time);
173 #ifndef _MSC_VER
174   strftime(timeString, 9, "%0H:%0M - ", btime); // and format it as hh:mm -
175 #else
176    strftime(timeString, 9, "%H:%M - ", btime); // and format it as hh:mm -
177 #endif
178   strcpy(fullString, timeString); // put it in our buffer
179   t = event->time + event->duration; //get programme end time
180   btime = localtime(&t);
181 #ifndef _MSC_VER
182   strftime(timeString, 9, "%0H:%0M", btime); // and format it as hh:mm -
183 #else
184    strftime(timeString, 9, "%H:%M", btime); // and format it as hh:mm -
185 #endif
186
187   strcat(fullString, timeString); // put it in our buffer
188
189   drawText(fullString, 10, 40 + (3 * surface->getFontHeight()), Colour::LIGHTTEXT);
190   drawText(tr("Create this timer?"), 10, 40 + (5 * surface->getFontHeight()), Colour::LIGHTTEXT);
191
192   buttonYes.draw();
193   buttonNo.draw();
194 }
195
196 int VEpgSetTimer::handleCommand(int command)
197 {
198   switch(command)
199   {
200     case Remote::DF_LEFT:
201     case Remote::LEFT:
202     {
203       swap();
204       draw();
205       ViewMan::getInstance()->updateView(this);
206       return 2;
207     }
208     case Remote::DF_RIGHT:
209     case Remote::RIGHT:
210     {
211       swap();
212       draw();
213       ViewMan::getInstance()->updateView(this);
214       return 2;
215     }
216     case Remote::BACK:
217     {
218       return 4;
219     }
220     case Remote::OK:
221     {
222       if (selectedOption != YES) return 4;
223       doit();
224       return 4;
225     }
226   }
227
228   return 1;
229 }
230
231
232 void VEpgSetTimer::doit()
233 {
234   char* timerString = genTimerString();
235   logger->log("VEPGST", Log::DEBUG, "%s", timerString);
236
237   ULONG ret = vdr->setEventTimer(timerString);
238   delete[] timerString;
239
240   if (!vdr->isConnected())
241   {
242     Command::getInstance()->connectionLost();
243   }
244
245   if (ret == 0) logger->log("VEPGST", Log::DEBUG, "Success");
246   else if (ret == 1) logger->log("VEPGST", Log::DEBUG, "Fail: Timer already set for this event");
247   else if (ret == 2) logger->log("VEPGST", Log::DEBUG, "Fail: General failure setting timer");
248
249   VInfo* vi = new VInfo();
250   vi->create(400, 150);
251   vi->setExitable();
252   vi->setBorderOn(1);
253   vi->setTitleBarOn(0);
254
255   if (Video::getInstance()->getFormat() == Video::PAL)
256     vi->setScreenPos(170, 200);
257   else
258     vi->setScreenPos(160, 150);
259
260   if (ret == 0) vi->setOneLiner(tr("Timer set successfully"));
261   else if (ret == 1) vi->setOneLiner(tr("There is already a timer for this event"));
262   else if (ret == 2) vi->setOneLiner(tr("Failure setting timer"));
263   vi->draw();
264
265   Message* m = new Message();
266   m->message = Message::ADD_VIEW;
267   m->to = viewman;
268   m->parameter = (ULONG)vi;
269   Command::getInstance()->postMessageNoLock(m);
270 }
271
272
273 void VEpgSetTimer::processMessage(Message* m)
274 {
275   if (m->message == Message::MOUSE_MOVE)
276   {
277     if (buttonYes.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
278     {
279       buttonNo.setActive(0);
280       selectedOption = YES;
281       draw();
282       ViewMan::getInstance()->updateView(this);
283     }
284     else if (buttonNo.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
285     {
286       buttonYes.setActive(0);
287       selectedOption = NO;
288       draw();
289       ViewMan::getInstance()->updateView(this);
290     }
291   }
292   else if (m->message == Message::MOUSE_LBDOWN)
293   {
294     if (buttonYes.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
295     {
296       ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press
297     }
298     else if (buttonNo.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
299     {
300       ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press
301     }
302     else
303     {
304       //check if press is outside this view! then simulate cancel
305       int x=(m->parameter>>16)-getScreenX();
306       int y=(m->parameter&0xFFFF)-getScreenY();
307       if (x<0 || y <0 || x>getWidth() || y>getHeight())
308       {
309         ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press
310       }
311     }
312   }
313 }