00001
00002
00003 #include <QApplication>
00004 #include <QSqlError>
00005
00006
00007
00008 #include <mythdb.h>
00009 #include <mythprogressdialog.h>
00010
00011
00012 #include "weatherScreen.h"
00013 #include "weatherSource.h"
00014 #include "sourceManager.h"
00015 #include "weatherSetup.h"
00016
00017 #define GLBL_SCREEN 0
00018 #define SCREEN_SETUP_SCREEN 1
00019 #define SRC_SCREEN 2
00020
00021 GlobalSetup::GlobalSetup(MythScreenStack *parent, const QString &name)
00022 : MythScreenType(parent, name),
00023 m_backgroundCheckbox(NULL), m_timeoutSpinbox(NULL),
00024 m_timeout(0), m_hold_timeout(0),
00025 m_finishButton(NULL)
00026 {
00027 }
00028
00029 GlobalSetup::~GlobalSetup()
00030 {
00031 }
00032
00033 bool GlobalSetup::Create()
00034 {
00035 bool foundtheme = false;
00036
00037
00038 foundtheme = LoadWindowFromXML("weather-ui.xml", "global-setup", this);
00039
00040 if (!foundtheme)
00041 return false;
00042
00043 m_timeoutSpinbox = dynamic_cast<MythUISpinBox *> (GetChild("timeout_spinbox"));
00044
00045 m_backgroundCheckbox = dynamic_cast<MythUICheckBox *> (GetChild("backgroundcheck"));
00046 m_finishButton = dynamic_cast<MythUIButton *> (GetChild("finishbutton"));
00047
00048 if (!m_timeoutSpinbox || !m_finishButton || !m_backgroundCheckbox)
00049 {
00050 LOG(VB_GENERAL, LOG_ERR, "Theme is missing required elements.");
00051 return false;
00052 }
00053
00054 BuildFocusList();
00055
00056 m_finishButton->SetText(tr("Finish"));
00057 connect(m_finishButton, SIGNAL(Clicked()), this, SLOT(saveData()));
00058
00059 loadData();
00060
00061 return true;
00062 }
00063
00064 void GlobalSetup::loadData()
00065 {
00066 int setting = gCoreContext->GetNumSetting("weatherbackgroundfetch", 0);
00067 if (setting == 1)
00068 m_backgroundCheckbox->SetCheckState(MythUIStateType::Full);
00069
00070 m_timeout = gCoreContext->GetNumSetting("weatherTimeout", 10);
00071 m_timeoutSpinbox->SetRange(5, 120, 5);
00072 m_timeoutSpinbox->SetValue(m_timeout);
00073 }
00074
00075 void GlobalSetup::saveData()
00076 {
00077 int timeout = m_timeoutSpinbox->GetIntValue();
00078 gCoreContext->SaveSetting("weatherTimeout", timeout);
00079
00080 int checkstate = 0;
00081 if (m_backgroundCheckbox->GetCheckState() == MythUIStateType::Full)
00082 checkstate = 1;
00083 gCoreContext->SaveSetting("weatherbackgroundfetch", checkstate);
00084 Close();
00085 }
00086
00088
00089 ScreenSetup::ScreenSetup(MythScreenStack *parent, const QString &name,
00090 SourceManager *srcman)
00091 : MythScreenType(parent, name),
00092 m_sourceManager(srcman ? srcman : new SourceManager()),
00093 m_createdSrcMan(srcman ? false : true),
00094 m_helpText(NULL), m_activeList(NULL),
00095 m_inactiveList(NULL), m_finishButton(NULL)
00096 {
00097 m_sourceManager->clearSources();
00098 m_sourceManager->findScripts();
00099 }
00100
00101 ScreenSetup::~ScreenSetup()
00102 {
00103 if (m_createdSrcMan)
00104 {
00105 if (m_sourceManager)
00106 delete m_sourceManager;
00107 }
00108 else
00109 {
00110 m_sourceManager->clearSources();
00111 m_sourceManager->findScriptsDB();
00112 m_sourceManager->setupSources();
00113 }
00114
00115
00116 for (int i=0; i < m_inactiveList->GetCount(); i++)
00117 {
00118 MythUIButtonListItem *item = m_inactiveList->GetItemAt(i);
00119 if (item->GetData().isValid())
00120 delete qVariantValue<ScreenListInfo *>(item->GetData());
00121 }
00122
00123
00124 for (int i=0; i < m_activeList->GetCount(); i++)
00125 {
00126 MythUIButtonListItem *item = m_activeList->GetItemAt(i);
00127 if (item->GetData().isValid())
00128 delete qVariantValue<ScreenListInfo *>(item->GetData());
00129 }
00130 }
00131
00132 bool ScreenSetup::Create()
00133 {
00134 bool foundtheme = false;
00135
00136
00137 foundtheme = LoadWindowFromXML("weather-ui.xml", "screen-setup", this);
00138
00139 if (!foundtheme)
00140 return false;
00141
00142 m_helpText = dynamic_cast<MythUIText *> (GetChild("helptxt"));
00143
00144 m_activeList = dynamic_cast<MythUIButtonList *> (GetChild("activelist"));
00145 m_inactiveList = dynamic_cast<MythUIButtonList *> (GetChild("inactivelist"));
00146
00147 m_finishButton = dynamic_cast<MythUIButton *> (GetChild("finishbutton"));
00148
00149 MythUIText *activeheader = dynamic_cast<MythUIText *> (GetChild("activehdr"));
00150 if (activeheader)
00151 activeheader->SetText(tr("Active Screens"));
00152
00153 MythUIText *inactiveheader = dynamic_cast<MythUIText *> (GetChild("inactivehdr"));
00154 if (inactiveheader)
00155 inactiveheader->SetText(tr("Inactive Screens"));
00156
00157 if (!m_activeList || !m_inactiveList || !m_finishButton || !m_helpText)
00158 {
00159 LOG(VB_GENERAL, LOG_ERR, "Theme is missing required elements.");
00160 return false;
00161 }
00162
00163 BuildFocusList();
00164
00165 connect(m_activeList, SIGNAL(itemSelected(MythUIButtonListItem *)),
00166 this, SLOT(updateHelpText()));
00167 connect(m_activeList, SIGNAL(itemClicked(MythUIButtonListItem *)),
00168 this, SLOT(doListSelect(MythUIButtonListItem *)));
00169 connect(m_inactiveList, SIGNAL(itemSelected(MythUIButtonListItem *)),
00170 this, SLOT(updateHelpText()));
00171 connect(m_inactiveList, SIGNAL(itemClicked(MythUIButtonListItem *)),
00172 this, SLOT(doListSelect(MythUIButtonListItem *)));
00173
00174 SetFocusWidget(m_inactiveList);
00175
00176 m_finishButton->SetText(tr("Finish"));
00177 connect(m_finishButton, SIGNAL(Clicked()), this, SLOT(saveData()));
00178
00179 loadData();
00180
00181 return true;
00182 }
00183
00184 bool ScreenSetup::keyPressEvent(QKeyEvent *event)
00185 {
00186 if (GetFocusWidget() && GetFocusWidget()->keyPressEvent(event))
00187 return true;
00188
00189 bool handled = false;
00190 QStringList actions;
00191 handled = GetMythMainWindow()->TranslateKeyPress("Weather", event, actions);
00192
00193 for (int i = 0; i < actions.size() && !handled; i++)
00194 {
00195 QString action = actions[i];
00196 handled = true;
00197
00198 if (action == "DELETE")
00199 {
00200 if (GetFocusWidget() == m_activeList)
00201 deleteScreen();
00202 }
00203 else
00204 handled = false;
00205 }
00206
00207 if (!handled && MythScreenType::keyPressEvent(event))
00208 handled = true;
00209
00210 return handled;
00211 }
00212
00213 void ScreenSetup::updateHelpText()
00214 {
00215 MythUIType *list = GetFocusWidget();
00216 QString text;
00217 if (!list)
00218 return;
00219
00220 if (list == m_inactiveList)
00221 {
00222
00223 MythUIButtonListItem *item = m_inactiveList->GetItemCurrent();
00224 if (!item)
00225 return;
00226
00227 ScreenListInfo *si = qVariantValue<ScreenListInfo *>(item->GetData());
00228 if (!si)
00229 return;
00230
00231 QStringList sources = si->sources;
00232
00233 text = tr("Add desired screen to the Active Screens list "
00234 "by pressing SELECT.") + "\n";
00235 text += si->title + "\n";
00236 text += QString("%1: %2").arg(tr("Sources"))
00237 .arg(sources.join(", "));
00238 }
00239 else if (list == m_activeList)
00240 {
00241 MythUIButtonListItem *item = m_activeList->GetItemCurrent();
00242 if (!item)
00243 return;
00244
00245 ScreenListInfo *si = qVariantValue<ScreenListInfo *>(item->GetData());
00246 if (!si)
00247 return;
00248
00249 text += si->title + "\n";
00250 if (si->hasUnits)
00251 {
00252 text += tr("Units: ");
00253 text += (ENG_UNITS == si->units) ?
00254 tr("English Units") : tr("SI Units");
00255 text += " ";
00256 }
00257 if (!si->multiLoc && !si->types.empty())
00258 {
00259 TypeListInfo ti = *si->types.begin();
00260 text += tr("Location: ");
00261 text += (ti.location.isEmpty()) ? tr("Not Defined") : ti.location;
00262 text += "\n";
00263 text += tr("Source: " );
00264 text += (ti.src) ? ti.src->name : tr("Not Defined");
00265 text += "\n";
00266 }
00267 text += "\n" + tr("Press SELECT to ");
00268 if (!si->multiLoc)
00269 text += tr("change location; ");
00270 if (si->hasUnits)
00271 text += tr("change units; ");
00272 text += tr("move screen up or down; or remove screen.");
00273 }
00274
00275 m_helpText->SetText(text);
00276 }
00277
00278 void ScreenSetup::loadData()
00279 {
00280 ScreenListInfo *si;
00281
00282 QStringList types;
00283
00284 ScreenListMap screenListMap = loadScreens();
00285
00286
00287 ScreenListMap::const_iterator i = screenListMap.constBegin();
00288 while (i != screenListMap.constEnd())
00289 {
00290
00291 si = &screenListMap[i.key()];
00292 types = si->dataTypes;
00293 si->units = ENG_UNITS;
00294
00295 QStringList type_strs;
00296 for (int typei = 0; typei < types.size(); ++typei)
00297 {
00298 TypeListInfo ti(types[typei]);
00299 si->types.insert(types[typei], ti);
00300 type_strs << types[typei];
00301 }
00302
00303 QList<ScriptInfo *> scriptList;
00304
00305
00306 if (m_sourceManager->findPossibleSources(type_strs, scriptList))
00307 {
00308 ScriptInfo *script;
00309 for (int x = 0; x < scriptList.size(); x++)
00310 {
00311 script = scriptList.at(x);
00312 si->sources.append(script->name);
00313 }
00314 MythUIButtonListItem *item =
00315 new MythUIButtonListItem(m_inactiveList, si->title);
00316 item->SetData(qVariantFromValue(new ScreenListInfo(*si)));
00317 }
00318
00319 ++i;
00320 }
00321
00322 QMap<long, ScreenListInfo*> active_screens;
00323
00324 MSqlQuery db(MSqlQuery::InitCon());
00325 QString query = "SELECT weatherscreens.container, weatherscreens.units, "
00326 "weatherdatalayout.dataitem, weatherdatalayout.location, "
00327 "weathersourcesettings.source_name, weatherscreens.draworder "
00328 "FROM weatherscreens, weatherdatalayout, weathersourcesettings "
00329 "WHERE weatherscreens.hostname = :HOST "
00330 "AND weatherscreens.screen_id = weatherdatalayout.weatherscreens_screen_id "
00331 "AND weathersourcesettings.sourceid = weatherdatalayout.weathersourcesettings_sourceid "
00332 "ORDER BY weatherscreens.draworder;";
00333 db.prepare(query);
00334 db.bindValue(":HOST", gCoreContext->GetHostName());
00335 if (!db.exec())
00336 {
00337 LOG(VB_GENERAL, LOG_ERR, db.lastError().text());
00338 return;
00339 }
00340
00341
00342 while (db.next())
00343 {
00344 QString name = db.value(0).toString();
00345 units_t units = db.value(1).toUInt();
00346 QString dataitem = db.value(2).toString();
00347 QString location = db.value(3).toString();
00348 QString src = db.value(4).toString();
00349 uint draworder = db.value(5).toUInt();
00350
00351 types = screenListMap[name].dataTypes;
00352
00353 TypeListInfo ti(dataitem, location,
00354 m_sourceManager->getSourceByName(src));
00355
00356 if (active_screens.find(draworder) == active_screens.end())
00357 {
00358 si = new ScreenListInfo(screenListMap[name]);
00359
00360 si->types.clear();
00361 si->units = units;
00362
00363 MythUIButtonListItem *item =
00364 new MythUIButtonListItem(m_activeList, si->title);
00365
00366
00367
00368 for (QStringList::Iterator type_i = types.begin();
00369 type_i != types.end(); ++type_i )
00370 {
00371 if (*type_i == dataitem)
00372 si->types.insert(dataitem, ti);
00373 }
00374
00375 item->SetData(qVariantFromValue(si));
00376 active_screens.insert(draworder, si);
00377 }
00378 else
00379 {
00380 si = active_screens[draworder];
00381 for (QStringList::Iterator type_i = types.begin();
00382 type_i != types.end(); ++type_i )
00383 {
00384 if (*type_i == dataitem)
00385 {
00386 si->types.insert(dataitem, ti);
00387 }
00388 }
00389 }
00390 }
00391 }
00392
00393 void ScreenSetup::saveData()
00394 {
00395 if (m_activeList->GetCount() <= 0)
00396 {
00397 LOG(VB_GENERAL, LOG_ERR,
00398 "No Active Screens are defined. Nothing Saved.");
00399 return;
00400 }
00401
00402
00403 QStringList notDefined;
00404
00405 for (int i=0; i < m_activeList->GetCount(); i++)
00406 {
00407 MythUIButtonListItem *item = m_activeList->GetItemAt(i);
00408 ScreenListInfo *si = qVariantValue<ScreenListInfo *>(item->GetData());
00409 TypeListMap::iterator it = si->types.begin();
00410 for (; it != si->types.end(); ++it)
00411 {
00412 if ((*it).src)
00413 continue;
00414
00415 notDefined << (*it).name;
00416 LOG(VB_GENERAL, LOG_ERR, QString("Not defined %1").arg((*it).name));
00417 }
00418 }
00419
00420 if (!notDefined.empty())
00421 {
00422 LOG(VB_GENERAL, LOG_ERR, "A Selected screen has data items with no "
00423 "sources defined.");
00424 return;
00425 }
00426
00427 MSqlQuery db(MSqlQuery::InitCon());
00428 MSqlQuery db2(MSqlQuery::InitCon());
00429 QString query = "DELETE FROM weatherscreens WHERE hostname=:HOST";
00430 db.prepare(query);
00431 db.bindValue(":HOST", gCoreContext->GetHostName());
00432 if (!db.exec())
00433 MythDB::DBError("ScreenSetup::saveData - delete weatherscreens", db);
00434
00435 query = "INSERT into weatherscreens (draworder, container, units, hostname) "
00436 "VALUES (:DRAW, :CONT, :UNITS, :HOST);";
00437 db.prepare(query);
00438
00439 int draworder = 0;
00440 for (int i=0; i < m_activeList->GetCount(); i++)
00441 {
00442 MythUIButtonListItem *item = m_activeList->GetItemAt(i);
00443 ScreenListInfo *si = qVariantValue<ScreenListInfo *>(item->GetData());
00444 db.bindValue(":DRAW", draworder);
00445 db.bindValue(":CONT", si->name);
00446 db.bindValue(":UNITS", si->units);
00447 db.bindValue(":HOST", gCoreContext->GetHostName());
00448 if (db.exec())
00449 {
00450
00451 QString query2 = "SELECT screen_id FROM weatherscreens "
00452 "WHERE draworder = :DRAW AND hostname = :HOST;";
00453 db2.prepare(query2);
00454 db2.bindValue(":DRAW", draworder);
00455 db2.bindValue(":HOST", gCoreContext->GetHostName());
00456 if (!db2.exec())
00457 {
00458 LOG(VB_GENERAL, LOG_ERR, db2.executedQuery());
00459 LOG(VB_GENERAL, LOG_ERR, db2.lastError().text());
00460 return;
00461 }
00462
00463 db2.next();
00464 int screen_id = db2.value(0).toInt();
00465
00466 query2 = "INSERT INTO weatherdatalayout (location, dataitem, "
00467 "weatherscreens_screen_id, weathersourcesettings_sourceid) "
00468 "VALUES (:LOC, :ITEM, :SCREENID, :SRCID);";
00469 db2.prepare(query2);
00470 TypeListMap::iterator it = si->types.begin();
00471 for (; it != si->types.end(); ++it)
00472 {
00473 db2.bindValue(":LOC", (*it).location);
00474 db2.bindValue(":ITEM", (*it).name);
00475 db2.bindValue(":SCREENID", screen_id);
00476 db2.bindValue(":SRCID", (*it).src->id);
00477 if (!db2.exec())
00478 {
00479 LOG(VB_GENERAL, LOG_ERR, db2.executedQuery());
00480 LOG(VB_GENERAL, LOG_ERR, db2.lastError().text());
00481 return;
00482 }
00483 }
00484 }
00485 else
00486 {
00487 LOG(VB_GENERAL, LOG_ERR, db.executedQuery());
00488 LOG(VB_GENERAL, LOG_ERR, db.lastError().text());
00489 return;
00490 }
00491
00492 ++draworder;
00493 }
00494
00495 Close();
00496 }
00497
00498 void ScreenSetup::doListSelect(MythUIButtonListItem *selected)
00499 {
00500 if (!selected)
00501 return;
00502
00503 QString txt = selected->GetText();
00504 if (GetFocusWidget() == m_activeList)
00505 {
00506 ScreenListInfo *si = qVariantValue<ScreenListInfo *>(selected->GetData());
00507
00508 QString label = tr("Manipulate Screen");
00509
00510 MythScreenStack *popupStack =
00511 GetMythMainWindow()->GetStack("popup stack");
00512
00513 MythDialogBox *menuPopup = new MythDialogBox(label, popupStack,
00514 "screensetupmenupopup");
00515
00516 if (menuPopup->Create())
00517 {
00518 popupStack->AddScreen(menuPopup);
00519
00520 menuPopup->SetReturnEvent(this, "options");
00521
00522 menuPopup->AddButton(tr("Move Up"), qVariantFromValue(selected));
00523 menuPopup->AddButton(tr("Move Down"), qVariantFromValue(selected));
00524 menuPopup->AddButton(tr("Remove"), qVariantFromValue(selected));
00525 menuPopup->AddButton(tr("Change Location"), qVariantFromValue(selected));
00526 if (si->hasUnits)
00527 menuPopup->AddButton(tr("Change Units"), qVariantFromValue(selected));
00528 menuPopup->AddButton(tr("Cancel"), qVariantFromValue(selected));
00529 }
00530 else
00531 {
00532 delete menuPopup;
00533 }
00534
00535 }
00536 else if (GetFocusWidget() == m_inactiveList)
00537 {
00538 ScreenListInfo *si = qVariantValue<ScreenListInfo *>(selected->GetData());
00539 QStringList type_strs;
00540
00541 TypeListMap::iterator it = si->types.begin();
00542 TypeListMap types;
00543 for (; it != si->types.end(); ++it)
00544 {
00545 types.insert(it.key(), TypeListInfo(*it));
00546 type_strs << it.key();
00547 }
00548 bool hasUnits = si->hasUnits;
00549
00550 QList<ScriptInfo *> tmp;
00551 if (m_sourceManager->findPossibleSources(type_strs, tmp))
00552 {
00553 if (!m_inactiveList->GetCount())
00554 {
00555
00556 NextPrevWidgetFocus(true);
00557 }
00558 if (hasUnits)
00559 showUnitsPopup(selected->GetText(), si);
00560 else
00561 doLocationDialog(si);
00562 }
00563 else
00564 LOG(VB_GENERAL, LOG_ERR, "Screen cannot be used, not all required "
00565 "data is supplied by existing sources");
00566 }
00567 }
00568
00569 void ScreenSetup::doLocationDialog(ScreenListInfo *si)
00570 {
00571 MythScreenStack *mainStack =
00572 GetMythMainWindow()->GetMainStack();
00573
00574 LocationDialog *locdialog = new LocationDialog(mainStack, "locationdialog",
00575 this, si, m_sourceManager);
00576
00577 if (locdialog->Create())
00578 mainStack->AddScreen(locdialog);
00579 else
00580 delete locdialog;
00581 }
00582
00583 void ScreenSetup::showUnitsPopup(const QString &name, ScreenListInfo *si)
00584 {
00585 if (!si)
00586 return;
00587
00588 QString label = QString("%1 %2").arg(name).arg(tr("Change Units"));
00589
00590 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
00591
00592 MythDialogBox *menuPopup = new MythDialogBox(label, popupStack,
00593 "weatherunitspopup");
00594
00595 if (menuPopup->Create())
00596 {
00597 popupStack->AddScreen(menuPopup);
00598
00599 menuPopup->SetReturnEvent(this, "units");
00600
00601 menuPopup->AddButton(tr("English Units"), qVariantFromValue(si));
00602 menuPopup->AddButton(tr("SI Units"), qVariantFromValue(si));
00603 }
00604 else
00605 {
00606 delete menuPopup;
00607 }
00608 }
00609
00610 void ScreenSetup::deleteScreen()
00611 {
00612 MythUIButtonListItem *item = m_activeList->GetItemCurrent();
00613 if (item)
00614 {
00615 if (item->GetData().isValid())
00616 delete qVariantValue<ScreenListInfo *>(item->GetData());
00617
00618 delete item;
00619 }
00620
00621 if (!m_activeList->GetCount())
00622 {
00623 NextPrevWidgetFocus(false);
00624 m_activeList->SetEnabled(false);
00625 }
00626 }
00627
00628 void ScreenSetup::customEvent(QEvent *event)
00629 {
00630 if (event->type() == DialogCompletionEvent::kEventType)
00631 {
00632 DialogCompletionEvent *dce = (DialogCompletionEvent*)(event);
00633
00634 QString resultid = dce->GetId();
00635 int buttonnum = dce->GetResult();
00636
00637 if (resultid == "options")
00638 {
00639 if (buttonnum > -1)
00640 {
00641 MythUIButtonListItem *item =
00642 qVariantValue<MythUIButtonListItem *>(dce->GetData());
00643
00644 ScreenListInfo *si =
00645 qVariantValue<ScreenListInfo *>(item->GetData());
00646
00647 if (buttonnum == 0)
00648 {
00649 m_activeList->MoveItemUpDown(item, true);
00650 }
00651 else if (buttonnum == 1)
00652 {
00653 m_activeList->MoveItemUpDown(item, false);
00654 }
00655 else if (buttonnum == 2)
00656 {
00657 deleteScreen();
00658 }
00659 else if (buttonnum == 3)
00660 {
00661 si->updating = true;
00662 doLocationDialog(si);
00663 }
00664 else if (si->hasUnits && buttonnum == 4)
00665 {
00666 si->updating = true;
00667 showUnitsPopup(item->GetText(), si);
00668 updateHelpText();
00669 }
00670 }
00671 }
00672 else if (resultid == "units")
00673 {
00674 if (buttonnum > -1)
00675 {
00676 ScreenListInfo *si =
00677 qVariantValue<ScreenListInfo *>(dce->GetData());
00678
00679 if (buttonnum == 0)
00680 {
00681 si->units = ENG_UNITS;
00682 }
00683 else if (buttonnum == 1)
00684 {
00685 si->units = SI_UNITS;
00686 }
00687
00688 updateHelpText();
00689
00690 if (si->updating)
00691 si->updating = false;
00692 else
00693 doLocationDialog(si);
00694 }
00695 }
00696 else if (resultid == "location")
00697 {
00698 ScreenListInfo *si =
00699 qVariantValue<ScreenListInfo *>(dce->GetData());
00700
00701 TypeListMap::iterator it = si->types.begin();
00702 for (; it != si->types.end(); ++it)
00703 {
00704 if ((*it).location.isEmpty())
00705 return;
00706 }
00707
00708 if (si->updating)
00709 {
00710 si->updating = false;
00711 MythUIButtonListItem *item = m_activeList->GetItemCurrent();
00712 if (item)
00713 item->SetData(qVariantFromValue(si));
00714 }
00715 else
00716 {
00717 QString txt = si->title; txt.detach();
00718 MythUIButtonListItem *item =
00719 new MythUIButtonListItem(m_activeList, txt);
00720 item->SetData(qVariantFromValue(si));
00721 }
00722
00723 if (m_activeList->GetCount())
00724 m_activeList->SetEnabled(true);
00725 }
00726 }
00727 }
00728
00730
00731 SourceSetup::SourceSetup(MythScreenStack *parent, const QString &name)
00732 : MythScreenType(parent, name)
00733 {
00734 m_sourceList = NULL;
00735 m_updateSpinbox = m_retrieveSpinbox = NULL;
00736 m_finishButton = NULL;
00737 m_sourceText = NULL;
00738 }
00739
00740 SourceSetup::~SourceSetup()
00741 {
00742 for (int i=0; i < m_sourceList->GetCount(); i++)
00743 {
00744 MythUIButtonListItem *item = m_sourceList->GetItemAt(i);
00745 if (item->GetData().isValid())
00746 delete qVariantValue<SourceListInfo *>(item->GetData());
00747 }
00748 }
00749
00750 bool SourceSetup::Create()
00751 {
00752 bool foundtheme = false;
00753
00754
00755 foundtheme = LoadWindowFromXML("weather-ui.xml", "source-setup", this);
00756
00757 if (!foundtheme)
00758 return false;
00759
00760 m_sourceList = dynamic_cast<MythUIButtonList *> (GetChild("srclist"));
00761 m_updateSpinbox = dynamic_cast<MythUISpinBox *> (GetChild("update_spinbox"));
00762 m_retrieveSpinbox = dynamic_cast<MythUISpinBox *> (GetChild("retrieve_spinbox"));
00763 m_finishButton = dynamic_cast<MythUIButton *> (GetChild("finishbutton"));
00764 m_sourceText = dynamic_cast<MythUIText *> (GetChild("srcinfo"));
00765
00766 if (!m_sourceList || !m_updateSpinbox || !m_retrieveSpinbox
00767 || !m_finishButton || !m_sourceText)
00768 {
00769 LOG(VB_GENERAL, LOG_ERR, "Theme is missing required elements.");
00770 return false;
00771 }
00772
00773 BuildFocusList();
00774 SetFocusWidget(m_sourceList);
00775
00776 connect(m_sourceList, SIGNAL(itemSelected(MythUIButtonListItem *)),
00777 SLOT(sourceListItemSelected(MythUIButtonListItem *)));
00778 #if 0
00779 connect(m_sourceList, SIGNAL(TakingFocus()),
00780 this, SLOT(sourceListItemSelected()));
00781 #endif
00782
00783
00784 m_updateSpinbox->SetRange(10, 720, 10);
00785 connect(m_updateSpinbox, SIGNAL(LosingFocus()),
00786 SLOT(updateSpinboxUpdate()));
00787
00788
00789 m_retrieveSpinbox->SetRange(10, 120, 5);
00790 connect(m_retrieveSpinbox, SIGNAL(LosingFocus()),
00791 SLOT(retrieveSpinboxUpdate()));
00792
00793 m_finishButton->SetText(tr("Finish"));
00794 connect(m_finishButton, SIGNAL(Clicked()), SLOT(saveData()));
00795
00796 loadData();
00797
00798 return true;
00799 }
00800
00801 bool SourceSetup::loadData()
00802 {
00803 MSqlQuery db(MSqlQuery::InitCon());
00804 QString query =
00805 "SELECT DISTINCT sourceid, source_name, update_timeout, retrieve_timeout, "
00806 "author, email, version FROM weathersourcesettings, weatherdatalayout "
00807 "WHERE weathersourcesettings.sourceid = weatherdatalayout.weathersourcesettings_sourceid "
00808 "AND hostname=:HOST;";
00809 db.prepare(query);
00810 db.bindValue(":HOST", gCoreContext->GetHostName());
00811 if (!db.exec())
00812 {
00813 LOG(VB_GENERAL, LOG_ERR, db.lastError().text());
00814 return false;
00815 }
00816
00817 if (!db.size())
00818 {
00819 return false;
00820 }
00821
00822 while (db.next())
00823 {
00824 SourceListInfo *si = new SourceListInfo;
00825 si->id = db.value(0).toUInt();
00826 si->name = db.value(1).toString();
00827 si->update_timeout = db.value(2).toUInt() / 60;
00828 si->retrieve_timeout = db.value(3).toUInt();
00829 si->author = db.value(4).toString();
00830 si->email = db.value(5).toString();
00831 si->version = db.value(6).toString();
00832
00833 new MythUIButtonListItem(m_sourceList, si->name, qVariantFromValue(si));
00834 }
00835
00836 return true;
00837 }
00838
00839 void SourceSetup::saveData()
00840 {
00841 MythUIButtonListItem *curritem = m_sourceList->GetItemCurrent();
00842
00843 if (curritem)
00844 {
00845 SourceListInfo *si = qVariantValue<SourceListInfo *>(curritem->GetData());
00846 si->update_timeout = m_updateSpinbox->GetIntValue();
00847 si->retrieve_timeout = m_retrieveSpinbox->GetIntValue();
00848 }
00849
00850 MSqlQuery db(MSqlQuery::InitCon());
00851 QString query = "UPDATE weathersourcesettings "
00852 "SET update_timeout = :UPDATE, retrieve_timeout = :RETRIEVE "
00853 "WHERE sourceid = :ID;";
00854 db.prepare(query);
00855
00856 for (int i=0; i < m_sourceList->GetCount(); i++)
00857 {
00858 MythUIButtonListItem *item = m_sourceList->GetItemAt(i);
00859 SourceListInfo *si = qVariantValue<SourceListInfo *>(item->GetData());
00860 db.bindValue(":ID", si->id);
00861 db.bindValue(":UPDATE", si->update_timeout * 60);
00862 db.bindValue(":RETRIEVE", si->retrieve_timeout);
00863 if (!db.exec())
00864 {
00865 LOG(VB_GENERAL, LOG_ERR, db.lastError().text());
00866 return;
00867 }
00868 }
00869
00870 Close();
00871 }
00872
00873 void SourceSetup::updateSpinboxUpdate()
00874 {
00875 if (m_sourceList->GetItemCurrent())
00876 {
00877 SourceListInfo *si = qVariantValue<SourceListInfo *>
00878 (m_sourceList->GetItemCurrent()->GetData());
00879 si->update_timeout = m_updateSpinbox->GetIntValue();
00880 }
00881 }
00882
00883 void SourceSetup::retrieveSpinboxUpdate()
00884 {
00885 if (m_sourceList->GetItemCurrent())
00886 {
00887 SourceListInfo *si = qVariantValue<SourceListInfo *>
00888 (m_sourceList->GetItemCurrent()->GetData());
00889 si->retrieve_timeout = m_retrieveSpinbox->GetIntValue();
00890 }
00891 }
00892
00893 void SourceSetup::sourceListItemSelected(MythUIButtonListItem *item)
00894 {
00895 if (!item)
00896 item = m_sourceList->GetItemCurrent();
00897
00898 if (!item)
00899 return;
00900
00901 SourceListInfo *si = qVariantValue<SourceListInfo *>(item->GetData());
00902 if (!si)
00903 return;
00904
00905 m_updateSpinbox->SetValue(si->update_timeout);
00906 m_retrieveSpinbox->SetValue(si->retrieve_timeout);
00907 QString txt = tr("Author: ");
00908 txt += si->author;
00909 txt += "\n" + tr("Email: ") + si->email;
00910 txt += "\n" + tr("Version: ") + si->version;
00911 m_sourceText->SetText(txt);
00912 }
00913
00915
00916 LocationDialog::LocationDialog(MythScreenStack *parent, const QString &name,
00917 MythScreenType *retScreen, ScreenListInfo *si,
00918 SourceManager *srcman)
00919 : MythScreenType(parent, name),
00920 m_screenListInfo(new ScreenListInfo(*si)), m_sourceManager(srcman),
00921 m_retScreen(retScreen), m_locationList(NULL),
00922 m_locationEdit(NULL), m_searchButton(NULL),
00923 m_resultsText(NULL), m_sourceText(NULL)
00924 {
00925 TypeListMap::iterator it = si->types.begin();
00926 for (; it != si->types.end(); ++it)
00927 m_types << (*it).name;
00928 m_types.detach();
00929 }
00930
00931 LocationDialog::~LocationDialog()
00932 {
00933 if(m_locationList)
00934 clearResults();
00935
00936 delete m_screenListInfo;
00937 }
00938
00939 bool LocationDialog::Create()
00940 {
00941 bool foundtheme = false;
00942
00943
00944 foundtheme = LoadWindowFromXML("weather-ui.xml", "setup-location", this);
00945
00946 if (!foundtheme)
00947 return false;
00948
00949 m_sourceText = dynamic_cast<MythUIText *> (GetChild("source"));
00950 m_resultsText = dynamic_cast<MythUIText *> (GetChild("numresults"));
00951 m_locationEdit = dynamic_cast<MythUITextEdit *> (GetChild("loc-edit"));
00952 m_locationList = dynamic_cast<MythUIButtonList *> (GetChild("results"));
00953 m_searchButton = dynamic_cast<MythUIButton *> (GetChild("searchbtn"));
00954
00955
00956 if (!m_sourceText || !m_resultsText || !m_locationEdit || !m_locationList
00957 || !m_searchButton)
00958 {
00959 LOG(VB_GENERAL, LOG_ERR, "Theme is missing required elements.");
00960 return false;
00961 }
00962
00963 BuildFocusList();
00964 SetFocusWidget(m_locationEdit);
00965
00966 connect(m_searchButton, SIGNAL(Clicked()), this, SLOT(doSearch()));
00967 m_searchButton->SetText(tr("Search"));
00968 connect(m_locationList, SIGNAL(itemSelected(MythUIButtonListItem *)),
00969 this, SLOT(itemSelected(MythUIButtonListItem *)));
00970 connect(m_locationList, SIGNAL(itemClicked(MythUIButtonListItem *)),
00971 this, SLOT(itemClicked(MythUIButtonListItem *)));
00972
00973 return true;
00974 }
00975
00976 void LocationDialog::doSearch()
00977 {
00978 QString busymessage = tr("Searching...");
00979
00980 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
00981
00982 MythUIBusyDialog *busyPopup = new MythUIBusyDialog(busymessage, popupStack,
00983 "mythweatherbusydialog");
00984
00985 if (busyPopup->Create())
00986 {
00987 popupStack->AddScreen(busyPopup, false);
00988 }
00989 else
00990 {
00991 delete busyPopup;
00992 busyPopup = NULL;
00993 }
00994
00995
00996 QMap<ScriptInfo *, QStringList> result_cache;
00997 int numresults = 0;
00998 clearResults();
00999
01000 QString searchingresults = tr("Searching... Results: %1");
01001
01002 m_resultsText->SetText(searchingresults.arg(0));
01003 qApp->processEvents();
01004
01005 QList<ScriptInfo *> sources;
01006
01007 m_sourceManager->findPossibleSources(m_types, sources);
01008 QString search = m_locationEdit->GetText();
01009 ScriptInfo *si;
01010 for (int x = 0; x < sources.size(); x++)
01011 {
01012 si = sources.at(x);
01013 if (!result_cache.contains(si))
01014 {
01015 QStringList results = m_sourceManager->getLocationList(si, search);
01016 result_cache[si] = results;
01017 numresults += results.size();
01018 m_resultsText->SetText(searchingresults.arg(numresults));
01019 qApp->processEvents();
01020 }
01021 }
01022
01023 for (int i = 0; i < result_cache.keys().size(); ++i)
01024 {
01025 si = result_cache.keys()[i];
01026 QStringList results = result_cache[si];
01027 QString name = si->name;
01028 for (int ii = 0; ii < results.size(); ++ii)
01029 {
01030 QStringList tmp = results[ii].split("::");
01031 QString resultstring = QString("%1 (%2)").arg(tmp[1]).arg(name);
01032 MythUIButtonListItem *item =
01033 new MythUIButtonListItem(m_locationList, resultstring);
01034 ResultListInfo *ri = new ResultListInfo;
01035 ri->idstr = tmp[0];
01036 ri->src = si;
01037 item->SetData(qVariantFromValue(ri));
01038 qApp->processEvents();
01039 }
01040 }
01041
01042 if (busyPopup)
01043 {
01044 busyPopup->Close();
01045 busyPopup = NULL;
01046 }
01047
01048 m_resultsText->SetText(tr("Search Complete. Results: %1").arg(numresults));
01049 if (numresults)
01050 SetFocusWidget(m_locationList);
01051 }
01052
01053 void LocationDialog::clearResults()
01054 {
01055 for (int i=0; i < m_locationList->GetCount(); i++)
01056 {
01057 MythUIButtonListItem *item = m_locationList->GetItemAt(i);
01058 if (item->GetData().isValid())
01059 delete qVariantValue<ResultListInfo *>(item->GetData());
01060 }
01061
01062 m_locationList->Reset();
01063 }
01064
01065 void LocationDialog::itemSelected(MythUIButtonListItem *item)
01066 {
01067 ResultListInfo *ri = qVariantValue<ResultListInfo *>(item->GetData());
01068 if (ri)
01069 m_sourceText->SetText(tr("Source: %1").arg(ri->src->name));
01070 }
01071
01072 void LocationDialog::itemClicked(MythUIButtonListItem *item)
01073 {
01074 ResultListInfo *ri = qVariantValue<ResultListInfo *>(item->GetData());
01075
01076 if (ri)
01077 {
01078 TypeListMap::iterator it = m_screenListInfo->types.begin();
01079 for (; it != m_screenListInfo->types.end(); ++it)
01080 {
01081 (*it).location = ri->idstr;
01082 (*it).location.detach();
01083 (*it).src = ri->src;
01084 }
01085 }
01086
01087 DialogCompletionEvent *dce =
01088 new DialogCompletionEvent("location", 0, "",
01089 qVariantFromValue(new ScreenListInfo(*m_screenListInfo)));
01090 QApplication::postEvent(m_retScreen, dce);
01091
01092 Close();
01093 }