00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <iostream>
00016 #include <unistd.h>
00017 #include <cstdlib>
00018
00019
00020 #include <qdatetime.h>
00021 #include <qpainter.h>
00022 #include <qdir.h>
00023 #include <qtimer.h>
00024 #include <qprocess.h>
00025 #include <qapplication.h>
00026
00027
00028 #include "mythtv/mythcontext.h"
00029 #include "mythtv/mythdbcon.h"
00030
00031
00032 #include "zmconsole.h"
00033 #include "zmclient.h"
00034
00035 const int STATUS_UPDATE_TIME = 1000 * 10;
00036 const int TIME_UPDATE_TIME = 1000 * 1;
00037
00038 ZMConsole::ZMConsole(MythMainWindow *parent,
00039 const QString &window_name, const QString &theme_filename,
00040 const char *name)
00041 :MythThemedDialog(parent, window_name, theme_filename, name)
00042 {
00043 m_monitorListSize = 0;
00044 m_currentMonitor = 0;
00045 wireUpTheme();
00046
00047 m_monitorList = NULL;
00048
00049 m_timeFormat = gContext->GetSetting("TimeFormat", "h:mm AP");
00050
00051 m_timeTimer = new QTimer(this);
00052 connect(m_timeTimer, SIGNAL(timeout()), this,
00053 SLOT(updateTime()));
00054 m_timeTimer->start(TIME_UPDATE_TIME);
00055
00056 m_updateTimer = new QTimer(this);
00057 connect(m_updateTimer, SIGNAL(timeout()), this,
00058 SLOT(updateStatus()));
00059 m_updateTimer->start(100);
00060
00061 m_functionList = new vector<QString>;
00062 m_functionList->push_back(FUNCTION_NONE);
00063 m_functionList->push_back(FUNCTION_MONITOR);
00064 m_functionList->push_back(FUNCTION_MODECT);
00065 m_functionList->push_back(FUNCTION_RECORD);
00066 m_functionList->push_back(FUNCTION_MOCORD);
00067 m_functionList->push_back(FUNCTION_MODECT);
00068
00069 updateTime();
00070 }
00071
00072 ZMConsole::~ZMConsole()
00073 {
00074 delete m_timeTimer;
00075
00076 if (m_monitorList)
00077 delete m_monitorList;
00078
00079 if (m_functionList)
00080 delete m_functionList;
00081 }
00082
00083 void ZMConsole::updateTime(void)
00084 {
00085 QString s = QTime::currentTime().toString(m_timeFormat);
00086
00087 if (s != m_time_text->GetText())
00088 m_time_text->SetText(s);
00089
00090 s = QDateTime::currentDateTime().toString("dddd\ndd MMM yyyy");
00091
00092 if (s != m_date_text->GetText())
00093 m_date_text->SetText(s);
00094 }
00095
00096 void ZMConsole::updateStatus()
00097 {
00098 m_updateTimer->stop();
00099 getDaemonStatus();
00100 getMonitorStatus();
00101 m_updateTimer->start(STATUS_UPDATE_TIME);
00102 }
00103
00104 void ZMConsole::getDaemonStatus(void)
00105 {
00106 if (class ZMClient *zm = ZMClient::get())
00107 {
00108 zm->getServerStatus(m_daemonStatus, m_cpuStat, m_diskStat);
00109
00110 if (m_daemonStatus.left(7) == "running")
00111 {
00112 m_status_text->SetText(tr("Running"));
00113 m_status_text->SetFont(m_runningFont);
00114 }
00115 else
00116 {
00117 m_status_text->SetText(tr("Stopped"));
00118 m_status_text->SetFont(m_stoppedFont);
00119 }
00120
00121 m_load_text->SetText("Load: " + m_cpuStat);
00122 m_disk_text->SetText("Disk: " + m_diskStat);
00123 }
00124 }
00125
00126 void ZMConsole::getMonitorStatus(void)
00127 {
00128 if (!m_monitorList)
00129 m_monitorList = new vector<Monitor*>;
00130
00131 if (class ZMClient *zm = ZMClient::get())
00132 {
00133 zm->getMonitorStatus(m_monitorList);
00134 updateMonitorList();
00135 }
00136 }
00137
00138 void ZMConsole::keyPressEvent(QKeyEvent *e)
00139 {
00140 if (!e) return;
00141
00142 bool handled = false;
00143 QStringList actions;
00144 gContext->GetMainWindow()->TranslateKeyPress("Global", e, actions);
00145
00146 for (unsigned int i = 0; i < actions.size() && !handled; i++)
00147 {
00148 QString action = actions[i];
00149 handled = true;
00150
00151 if (action == "UP")
00152 {
00153 if (getCurrentFocusWidget() == m_monitor_list)
00154 {
00155 monitorListUp(false);
00156 }
00157 else
00158 nextPrevWidgetFocus(true);
00159 }
00160 else if (action == "DOWN")
00161 {
00162 if (getCurrentFocusWidget() == m_monitor_list)
00163 {
00164 monitorListDown(false);
00165 }
00166 else
00167 nextPrevWidgetFocus(true);
00168 }
00169 else if (action == "PAGEUP")
00170 {
00171 if (getCurrentFocusWidget() == m_monitor_list)
00172 {
00173 monitorListUp(true);
00174 }
00175 else
00176 nextPrevWidgetFocus(true);
00177 }
00178 else if (action == "PAGEDOWN")
00179 {
00180 if (getCurrentFocusWidget() == m_monitor_list)
00181 {
00182 monitorListDown(true);
00183 }
00184 else
00185 nextPrevWidgetFocus(true);
00186 }
00187 else if (action == "ESCAPE")
00188 {
00189 handled = false;
00190 }
00191 else if (action == "SELECT" || action == "MENU")
00192 {
00193 showEditFunctionPopup();
00194 }
00195 else
00196 handled = false;
00197 }
00198
00199 if (!handled)
00200 MythThemedDialog::keyPressEvent(e);
00201 }
00202
00203 void ZMConsole::showEditFunctionPopup()
00204 {
00205 Monitor *currentMonitor = NULL;
00206
00207 if (m_currentMonitor < (int) m_monitorList->size())
00208 currentMonitor = m_monitorList->at(m_currentMonitor);
00209
00210 MythPopupBox *popup = new MythPopupBox(GetMythMainWindow(), "edit monitor function");
00211
00212 QGridLayout *grid = new QGridLayout(2, 2, (int)(10 * wmult));
00213
00214 QString title;
00215 title = tr("Edit Function - ");
00216 title += currentMonitor->name;
00217
00218 QLabel *label = new QLabel(title, popup);
00219 QFont font = label->font();
00220 font.setPointSize(int (font.pointSize() * 1.8));
00221 font.setBold(true);
00222 label->setFont(font);
00223 label->setPaletteForegroundColor(QColor("white"));
00224 label->setAlignment(Qt::AlignCenter);
00225 label->setBackgroundOrigin(WindowOrigin);
00226 label->setSizePolicy(QSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)));
00227 label->setMinimumWidth((int)(250 * wmult));
00228 label->setMaximumWidth((int)(250 * wmult));
00229 popup->addWidget(label);
00230
00231 label = new QLabel(tr("Function:"), popup);
00232 label->setAlignment(Qt::WordBreak | Qt::AlignLeft);
00233 label->setBackgroundOrigin(ParentOrigin);
00234 label->setPaletteForegroundColor(Qt::white);
00235 grid->addWidget(label, 0, 0, Qt::AlignLeft);
00236
00237 MythComboBox *functions = new MythComboBox(false, popup);
00238 grid->addWidget(functions, 0, 1, Qt::AlignLeft);
00239
00240 label = new QLabel(tr("Enable:"), popup);
00241 label->setAlignment(Qt::WordBreak | Qt::AlignLeft);
00242 label->setBackgroundOrigin(ParentOrigin);
00243 label->setPaletteForegroundColor(Qt::white);
00244 grid->addWidget(label, 1, 0, Qt::AlignLeft);
00245
00246 MythCheckBox *enable = new MythCheckBox(popup);
00247 grid->addWidget(enable, 1, 1, Qt::AlignLeft);
00248
00249
00250 int selectedFunction = 0;
00251 for (int i = 0; i < (int) m_functionList->size(); i++)
00252 {
00253 functions->insertItem(m_functionList->at(i));
00254 if (m_functionList->at(i) == currentMonitor->function)
00255 selectedFunction = i;
00256 }
00257
00258
00259 functions->setCurrentItem(selectedFunction);
00260 enable->setChecked(currentMonitor->enabled);
00261
00262 functions->setFocus();
00263
00264 popup->addLayout(grid, 0);
00265
00266 popup->addButton(tr("OK"), popup, SLOT(accept()));
00267 popup->addButton(tr("Cancel"), popup, SLOT(reject()));
00268
00269 DialogCode res = popup->ExecPopup();
00270
00271 if (kDialogCodeAccepted == res)
00272 setMonitorFunction(functions->currentText(), enable->isChecked());
00273
00274 popup->deleteLater();
00275 }
00276
00277 UITextType* ZMConsole::getTextType(QString name)
00278 {
00279 UITextType* type = getUITextType(name);
00280
00281 if (!type)
00282 {
00283 cout << "ERROR: Failed to find '" << name << "' UI element in theme file\n"
00284 << "Bailing out!" << endl;
00285 exit(0);
00286 }
00287
00288 return type;
00289 }
00290
00291 void ZMConsole::wireUpTheme()
00292 {
00293 m_status_text = getTextType("status_text");
00294 m_time_text = getTextType("time_text");
00295 m_date_text = getTextType("date_text");
00296 m_load_text = getTextType("load_text");
00297 m_disk_text = getTextType("disk_text");
00298
00299 m_runningFont = getFont("running");
00300 m_stoppedFont = getFont("stopped");
00301
00302
00303 m_monitor_list = (UIListType*) getUIObject("monitor_list");
00304 if (m_monitor_list)
00305 {
00306 m_monitorListSize = m_monitor_list->GetItems();
00307 m_monitor_list->SetItemCurrent(0);
00308 }
00309
00310 buildFocusList();
00311 assignFirstFocus();
00312 }
00313
00314 void ZMConsole::updateMonitorList()
00315 {
00316 QString tmptitle;
00317 if (m_monitor_list)
00318 {
00319 m_monitor_list->ResetList();
00320 if (m_monitor_list->isFocused())
00321 m_monitor_list->SetActive(true);
00322
00323 int skip;
00324 if ((int)m_monitorList->size() <= m_monitorListSize ||
00325 m_currentMonitor <= m_monitorListSize / 2)
00326 skip = 0;
00327 else if (m_currentMonitor >= (int)m_monitorList->size() -
00328 m_monitorListSize + m_monitorListSize / 2)
00329 skip = m_monitorList->size() - m_monitorListSize;
00330 else
00331 skip = m_currentMonitor - m_monitorListSize / 2;
00332 m_monitor_list->SetUpArrow(skip > 0);
00333 m_monitor_list->SetDownArrow(skip + m_monitorListSize < (int)m_monitorList->size());
00334
00335 int i;
00336 for (i = 0; i < m_monitorListSize; i++)
00337 {
00338 if (i + skip >= (int)m_monitorList->size())
00339 break;
00340
00341 Monitor *monitor = m_monitorList->at(i + skip);
00342
00343 m_monitor_list->SetItemText(i, 1, monitor->name);
00344 m_monitor_list->SetItemText(i, 2, monitor->zmcStatus);
00345 m_monitor_list->SetItemText(i, 3, monitor->zmaStatus);
00346 m_monitor_list->SetItemText(i, 4, QString::number(monitor->events));
00347
00348 if (i + skip == m_currentMonitor)
00349 m_monitor_list->SetItemCurrent(i);
00350 }
00351
00352 m_monitor_list->refresh();
00353 }
00354 }
00355
00356 void ZMConsole::monitorListDown(bool page)
00357 {
00358 if (m_currentMonitor < (int)m_monitorList->size() - 1)
00359 {
00360 m_currentMonitor += (page ? m_monitorListSize : 1);
00361 if (m_currentMonitor > (int)m_monitorList->size() - 1)
00362 m_currentMonitor = m_monitorList->size() - 1;
00363
00364 updateMonitorList();
00365 }
00366 }
00367
00368 void ZMConsole::monitorListUp(bool page)
00369 {
00370 if (m_currentMonitor > 0)
00371 {
00372 m_currentMonitor -= (page ? m_monitorListSize : 1);
00373 if (m_currentMonitor < 0)
00374 m_currentMonitor = 0;
00375
00376 updateMonitorList();
00377 }
00378 }
00379
00380 void ZMConsole::setMonitorFunction(const QString &function, const int enabled)
00381 {
00382 Monitor *currentMonitor = NULL;
00383
00384 if (m_currentMonitor < (int) m_monitorList->size())
00385 currentMonitor = m_monitorList->at(m_currentMonitor);
00386
00387 if (currentMonitor == NULL)
00388 {
00389 VERBOSE(VB_IMPORTANT, "Monitor not found error");
00390 return;
00391 }
00392
00393 VERBOSE(VB_GENERAL, "Monitor id : " + QString::number(currentMonitor->id) +
00394 " function change " + currentMonitor->function + " -> " + function +
00395 ", enable value " + QString::number(currentMonitor->enabled) + " -> " +
00396 QString::number(enabled));
00397
00398 if (currentMonitor->function == function && currentMonitor->enabled == enabled)
00399 {
00400 VERBOSE(VB_IMPORTANT, "Monitor Function/Enable values not changed so not updating.");
00401 return;
00402 }
00403
00404 if (class ZMClient *zm = ZMClient::get())
00405 zm->setMonitorFunction(currentMonitor->id, function, enabled);
00406
00407 updateStatus();
00408 }