00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <cstdlib>
00017
00018
00019 #include <iostream>
00020 using namespace std;
00021
00022
00023 #include <QKeyEvent>
00024 #include <QTimer>
00025
00026
00027 #include <mythcontext.h>
00028 #include <mythdbcon.h>
00029 #include <mythuihelper.h>
00030 #include <mythmainwindow.h>
00031 #include <mythmiscutil.h>
00032
00033
00034 #include "zmplayer.h"
00035 #include "zmclient.h"
00036
00037 ZMPlayer::ZMPlayer(MythScreenStack *parent, const char *name,
00038 vector<Event *> *eventList, int *currentEvent)
00039 :MythScreenType(parent, name)
00040 {
00041 m_eventList = eventList;
00042 m_currentEvent = currentEvent;
00043
00044 m_frameList = new vector<Frame*>;
00045 m_paused = false;
00046 m_image = NULL;
00047
00048 m_frameTimer = new QTimer(this);
00049 connect(m_frameTimer, SIGNAL(timeout()), this,
00050 SLOT(updateFrame()));
00051
00052 m_fullScreen = false;
00053 }
00054
00055 ZMPlayer::~ZMPlayer()
00056 {
00057 stopPlayer();
00058
00059 m_frameTimer->deleteLater();
00060
00061 if (m_frameList)
00062 delete m_frameList;
00063 }
00064
00065 void ZMPlayer::stopPlayer(void)
00066 {
00067 m_frameTimer->stop();
00068 }
00069
00070 bool ZMPlayer::Create(void)
00071 {
00072 bool foundtheme = false;
00073
00074
00075 foundtheme = LoadWindowFromXML("zoneminder-ui.xml", "zmplayer", this);
00076
00077 if (!foundtheme)
00078 return false;
00079
00080 bool err = false;
00081
00082
00083 UIUtilE::Assign(this, m_frameImage, "framefsimage", &err);
00084 if (m_frameImage)
00085 m_frameImage->SetVisible(false);
00086
00087 UIUtilE::Assign(this, m_frameImage, "frameimage", &err);
00088 UIUtilE::Assign(this, m_noEventsText, "noevents_text", &err);
00089 UIUtilE::Assign(this, m_eventText, "event_text", &err);
00090 UIUtilE::Assign(this, m_cameraText, "camera_text", &err);
00091 UIUtilE::Assign(this, m_frameText, "frame_text", &err);
00092 UIUtilE::Assign(this, m_dateText, "date_text", &err);
00093
00094 UIUtilW::Assign(this, m_playButton, "play_button");
00095 UIUtilW::Assign(this, m_deleteButton, "delete_button");
00096 UIUtilW::Assign(this, m_prevButton, "prev_button");
00097 UIUtilW::Assign(this, m_nextButton, "next_button");
00098
00099 if (err)
00100 {
00101 LOG(VB_GENERAL, LOG_ERR, "Cannot load screen 'zmplayer'");
00102 return false;
00103 }
00104
00105 if (m_playButton)
00106 {
00107 m_playButton->SetText(tr("Pause"));
00108 connect(m_playButton, SIGNAL(Clicked()), this, SLOT(playPressed()));
00109 }
00110
00111 if (m_deleteButton)
00112 {
00113 m_deleteButton->SetText(tr("Delete"));
00114 connect(m_deleteButton, SIGNAL(Clicked()), this, SLOT(deletePressed()));
00115 }
00116
00117 if (m_prevButton)
00118 {
00119 m_prevButton->SetText(tr("Previous"));
00120 connect(m_prevButton, SIGNAL(Clicked()), this, SLOT(prevPressed()));
00121 }
00122
00123 if (m_nextButton)
00124 {
00125 m_nextButton->SetText(tr("Next"));
00126 connect(m_nextButton, SIGNAL(Clicked()), this, SLOT(nextPressed()));
00127 }
00128
00129 BuildFocusList();
00130
00131 SetFocusWidget(m_playButton);
00132
00133 getEventInfo();
00134
00135 return true;
00136 }
00137
00138 void ZMPlayer::getEventInfo()
00139 {
00140 if (m_frameTimer)
00141 m_frameTimer->stop();
00142
00143 if (*m_currentEvent == -1)
00144 {
00145 stopPlayer();
00146
00147 if (m_noEventsText)
00148 m_noEventsText->SetVisible(true);
00149
00150 m_frameImage->SetFilename(QString("mz_black.png"));
00151 m_frameImage->Load();
00152
00153 m_eventText->Reset();
00154 m_cameraText->Reset();
00155 m_frameText->Reset();
00156 m_dateText->Reset();
00157
00158 return;
00159 }
00160 else
00161 {
00162 if (m_noEventsText)
00163 m_noEventsText->SetVisible(false);
00164 }
00165
00166 Event *event = m_eventList->at(*m_currentEvent);
00167 if (!event)
00168 return;
00169
00170 m_curFrame = 0;
00171 m_lastFrame = 0;
00172
00173 m_eventText->SetText(QString(event->eventName + " (%1/%2)")
00174 .arg((*m_currentEvent) + 1)
00175 .arg(m_eventList->size()));
00176 m_cameraText->SetText(event->monitorName);
00177 m_dateText->SetText(MythDateTimeToString(event->startTime, kDateTimeFull | kSimplify));
00178
00179
00180 m_frameList->clear();
00181 if (class ZMClient *zm = ZMClient::get())
00182 {
00183 zm->getFrameList(event->eventID, m_frameList);
00184 m_curFrame = 1;
00185 m_lastFrame = m_frameList->size();
00186 m_frameText->SetText(QString("%1/%2").arg(m_curFrame).arg(m_lastFrame));
00187 getFrame();
00188 }
00189 }
00190
00191 bool ZMPlayer::keyPressEvent(QKeyEvent *event)
00192 {
00193 if (GetFocusWidget()->keyPressEvent(event))
00194 return true;
00195
00196 bool handled = false;
00197 QStringList actions;
00198 handled = GetMythMainWindow()->TranslateKeyPress("TV Playback", event, actions);
00199
00200 for (int i = 0; i < actions.size() && !handled; i++)
00201 {
00202 QString action = actions[i];
00203 handled = true;
00204
00205 if (action == "PAUSE")
00206 {
00207 if (m_playButton)
00208 m_playButton->Push();
00209 }
00210 else if (action == "DELETE")
00211 {
00212 if (m_deleteButton)
00213 m_deleteButton->Push();
00214 }
00215 else if (action == "LEFT")
00216 {
00217 if (m_paused)
00218 {
00219 if (m_curFrame > 1)
00220 m_curFrame--;
00221 getFrame();
00222 }
00223 }
00224 else if (action == "RIGHT")
00225 {
00226 if (m_paused)
00227 {
00228 if (m_curFrame < m_lastFrame)
00229 m_curFrame++;
00230 getFrame();
00231 }
00232 }
00233 else if (action == "PAGEUP")
00234 {
00235 if (m_prevButton)
00236 m_prevButton->Push();
00237 }
00238 else if (action == "PAGEDOWN")
00239 {
00240 if (m_nextButton)
00241 m_nextButton->Push();
00242 }
00243 else if (action == "TOGGLEASPECT" || action == "TOGGLEFILL")
00244 {
00245 if (!m_eventList->empty())
00246 {
00247 stopPlayer();
00248
00249 if (m_fullScreen)
00250 {
00251 m_fullScreen = false;
00252 m_frameImage->SetVisible(false);
00253 m_frameImage = dynamic_cast<MythUIImage *> (GetChild("frameimage"));
00254 m_frameImage->SetVisible(true);
00255 }
00256 else
00257 {
00258 m_fullScreen = true;
00259 m_frameImage->SetVisible(false);
00260 m_frameImage = dynamic_cast<MythUIImage *> (GetChild("framefsimage"));
00261 m_frameImage->SetVisible(true);
00262 }
00263
00264 if (!m_paused)
00265 m_frameTimer->start(1000 / 100);
00266
00267 }
00268 }
00269 else
00270 handled = false;
00271 }
00272
00273 if (!handled && MythScreenType::keyPressEvent(event))
00274 handled = true;
00275
00276 return handled;
00277 }
00278
00279 void ZMPlayer::playPressed()
00280 {
00281 if (m_eventList->empty())
00282 return;
00283
00284 if (m_paused)
00285 {
00286 m_frameTimer->start(1000/25);
00287 m_paused = false;
00288 if (m_playButton)
00289 m_playButton->SetText(tr("Pause"));
00290 }
00291 else
00292 {
00293 m_frameTimer->stop();
00294 m_paused = true;
00295 if (m_playButton)
00296 m_playButton->SetText(tr("Play"));
00297 }
00298 }
00299
00300 void ZMPlayer::deletePressed()
00301 {
00302 if (m_eventList->empty() || *m_currentEvent > (int) m_eventList->size() - 1)
00303 return;
00304
00305 Event *event = m_eventList->at(*m_currentEvent);
00306 if (event)
00307 {
00308 m_frameTimer->stop();
00309
00310 if (class ZMClient *zm = ZMClient::get())
00311 zm->deleteEvent(event->eventID);
00312
00313 m_eventList->erase(m_eventList->begin() + *m_currentEvent);
00314 if (*m_currentEvent > (int)m_eventList->size() - 1)
00315 *m_currentEvent = m_eventList->size() - 1;
00316
00317 getEventInfo();
00318
00319 if (!m_eventList->empty())
00320 {
00321 m_frameTimer->start(1000 / 25);
00322 m_paused = false;
00323 }
00324 }
00325 }
00326
00327 void ZMPlayer::nextPressed()
00328 {
00329 if (m_eventList->empty())
00330 return;
00331
00332 if (*m_currentEvent >= (int) m_eventList->size() - 1)
00333 return;
00334
00335 (*m_currentEvent)++;
00336
00337 getEventInfo();
00338
00339 if (m_paused)
00340 playPressed();
00341 }
00342
00343 void ZMPlayer::prevPressed()
00344 {
00345 if (m_eventList->empty())
00346 return;
00347
00348 if (*m_currentEvent <= 0)
00349 return;
00350
00351 if (*m_currentEvent > (int) m_eventList->size())
00352 *m_currentEvent = m_eventList->size();
00353
00354 (*m_currentEvent)--;
00355
00356 getEventInfo();
00357
00358 if (m_paused)
00359 playPressed();
00360 }
00361
00362 void ZMPlayer::updateFrame(void)
00363 {
00364 if (!m_lastFrame)
00365 return;
00366
00367 m_frameTimer->stop();
00368
00369 m_curFrame++;
00370 if (m_curFrame > m_lastFrame)
00371 {
00372 m_paused = true;
00373 m_curFrame = 0;
00374 if (m_playButton)
00375 m_playButton->SetText(tr("Play"));
00376 return;
00377 }
00378
00379 getFrame();
00380 }
00381
00382 void ZMPlayer::getFrame(void)
00383 {
00384 if (m_eventList->empty())
00385 return;
00386
00387 Event *event = m_eventList->at(*m_currentEvent);
00388 if (event)
00389 {
00390 if (class ZMClient *zm = ZMClient::get())
00391 zm->getEventFrame(event, m_curFrame, &m_image);
00392
00393 if (m_image)
00394 {
00395 m_frameImage->SetImage(m_image);
00396 m_frameText->SetText(QString("%1/%2").arg(m_curFrame).arg(m_lastFrame));
00397 }
00398
00399 if (!m_paused)
00400 {
00401 if (m_curFrame < (int) m_frameList->size())
00402 {
00403 double delta = m_frameList->at(m_curFrame)->delta -
00404 m_frameList->at(m_curFrame - 1)->delta;
00405
00406
00407 if (delta < 0.1)
00408 delta = 0.1;
00409
00410 m_frameTimer->start((int) (1000 * delta));
00411 }
00412 else
00413 m_frameTimer->start(1000 / 100);
00414 }
00415 }
00416 }