00001
00002
00003 #include <QKeyEvent>
00004 #include <QFile>
00005 #include <QTextStream>
00006
00007
00008 #include "mythcorecontext.h"
00009 #include "mythdialogbox.h"
00010 #include "recordingrule.h"
00011 #include "mythdb.h"
00012 #include "mythuihelper.h"
00013 #include "mythmainwindow.h"
00014
00015 #include "progdetails.h"
00016 #include <mythmiscutil.h>
00017
00018
00019 #define LASTPAGE 2
00020
00021 ProgDetails::ProgDetails(MythScreenStack *parent, const ProgramInfo *progInfo) :
00022 MythScreenType (parent, "progdetails"),
00023 m_progInfo(*progInfo), m_browser(NULL),
00024 m_currentPage(0)
00025 {
00026 }
00027
00028 bool ProgDetails::Create(void)
00029 {
00030 bool foundtheme = false;
00031
00032
00033 foundtheme = LoadWindowFromXML("schedule-ui.xml", "progdetails", this);
00034
00035 if (!foundtheme)
00036 return false;
00037
00038 bool err = false;
00039 UIUtilE::Assign(this, m_browser, "browser", &err);
00040
00041 if (err)
00042 {
00043 LOG(VB_GENERAL, LOG_ERR, "Cannot load screen 'progdetails'");
00044 return false;
00045 }
00046
00047 BuildFocusList();
00048
00049 SetFocusWidget(m_browser);
00050
00051 float zoom = gCoreContext->GetSetting("ProgDetailsZoom", "1.0").toFloat();
00052 m_browser->SetZoom(zoom);
00053
00054 return true;
00055 }
00056
00057 QString ProgDetails::getRatings(bool recorded, uint chanid, QDateTime startts)
00058 {
00059 QString table = (recorded) ? "recordedrating" : "programrating";
00060 QString sel = QString(
00061 "SELECT system, rating FROM %1 "
00062 "WHERE chanid = :CHANID "
00063 "AND starttime = :STARTTIME").arg(table);
00064
00065 MSqlQuery query(MSqlQuery::InitCon());
00066 query.prepare(sel);
00067 query.bindValue(":CHANID", chanid);
00068 query.bindValue(":STARTTIME", startts);
00069
00070 if (!query.exec() || !query.isActive())
00071 {
00072 MythDB::DBError("ProgDetails::getRatings", query);
00073 return "";
00074 }
00075
00076 QMap<QString,QString> main_ratings;
00077 QString advisory;
00078 while (query.next())
00079 {
00080 if (query.value(0).toString().toLower() == "advisory")
00081 {
00082 advisory += query.value(1).toString() + ", ";
00083 continue;
00084 }
00085 main_ratings[query.value(0).toString()] = query.value(1).toString();
00086 }
00087
00088 advisory = advisory.left(advisory.length() - 2);
00089
00090 if (main_ratings.empty())
00091 return advisory;
00092
00093 if (!advisory.isEmpty())
00094 advisory = ": " + advisory;
00095
00096 if (main_ratings.size() == 1)
00097 {
00098 return *main_ratings.begin() + advisory;
00099 }
00100
00101 QString ratings;
00102 QMap<QString,QString>::const_iterator it;
00103 for (it = main_ratings.begin(); it != main_ratings.end(); ++it)
00104 {
00105 ratings += it.key() + ": " + *it + ", ";
00106 }
00107
00108 return ratings + "Advisory" + advisory;
00109 }
00110
00111 void ProgDetails::Init()
00112 {
00113 updatePage();
00114 }
00115
00116 ProgDetails::~ProgDetails(void)
00117 {
00118 float zoom = m_browser->GetZoom();
00119 gCoreContext->SaveSetting("ProgDetailsZoom", QString().setNum(zoom));
00120 }
00121
00122 bool ProgDetails::keyPressEvent(QKeyEvent *event)
00123 {
00124 if (GetFocusWidget() && GetFocusWidget()->keyPressEvent(event))
00125 return true;
00126
00127 bool handled = false;
00128 QStringList actions;
00129 handled = GetMythMainWindow()->TranslateKeyPress("Global", event, actions);
00130
00131 for (int i = 0; i < actions.size() && !handled; i++)
00132 {
00133 QString action = actions[i];
00134 handled = true;
00135
00136 if (action == "INFO")
00137 {
00138 m_currentPage++;
00139 if (m_currentPage >= LASTPAGE)
00140 m_currentPage = 0;
00141
00142 updatePage();
00143 }
00144 else if (action == "MENU")
00145 showMenu();
00146 else
00147 handled = false;
00148 }
00149
00150 if (!handled && MythScreenType::keyPressEvent(event))
00151 handled = true;
00152
00153 return handled;
00154 }
00155
00156 void ProgDetails::updatePage(void)
00157 {
00158 if (m_page[m_currentPage].isEmpty())
00159 loadPage();
00160
00161 m_browser->SetHtml(m_page[m_currentPage]);
00162 }
00163
00164 void ProgDetails::addItem(const QString &key, const QString &title, const QString &data)
00165 {
00166 QString escapedKey = "%" + key + "%";
00167
00168 if (data.isEmpty())
00169 {
00170 removeItem(key);
00171 return;
00172 }
00173
00174
00175 for (int x = 0; x < m_html.size(); x++)
00176 {
00177 QString s = m_html[x];
00178 if (s.contains(escapedKey))
00179 {
00180
00181 s.replace("%" + key + "_LABEL%", title);
00182
00183 s.replace(escapedKey, data);
00184 m_html[x] = s;
00185 }
00186 }
00187 }
00188
00189 void ProgDetails::removeItem(const QString &key)
00190 {
00191
00192 for (int x = 0; x < m_html.size(); x++)
00193 {
00194 QString s = m_html[x];
00195 if (s.contains("%" + key + "%"))
00196 {
00197 m_html.removeAll(s);
00198 return;
00199 }
00200 }
00201 }
00202
00203 void ProgDetails::loadPage(void)
00204 {
00205 loadHTML();
00206
00207 MSqlQuery query(MSqlQuery::InitCon());
00208 QString category_type, showtype, year, epinum, rating, colorcode,
00209 title_pronounce;
00210 float stars = 0.0;
00211 int partnumber = 0, parttotal = 0;
00212 int audioprop = 0, videoprop = 0, subtype = 0, generic = 0;
00213 bool recorded = false;
00214
00215 RecordingRule* record = NULL;
00216 if (m_progInfo.GetRecordingRuleID())
00217 {
00218 record = new RecordingRule();
00219 record->LoadByProgram(&m_progInfo);
00220 }
00221
00222 if (m_progInfo.GetFilesize())
00223 recorded = true;
00224
00225 if (m_progInfo.GetScheduledEndTime() != m_progInfo.GetScheduledStartTime())
00226 {
00227 QString ptable = "program";
00228 if (recorded)
00229 ptable = "recordedprogram";
00230
00231 query.prepare(QString("SELECT category_type, airdate, stars,"
00232 " partnumber, parttotal, audioprop+0, videoprop+0,"
00233 " subtitletypes+0, syndicatedepisodenumber, generic,"
00234 " showtype, colorcode, title_pronounce"
00235 " FROM %1 WHERE chanid = :CHANID AND"
00236 " starttime = :STARTTIME ;").arg(ptable));
00237
00238 query.bindValue(":CHANID", m_progInfo.GetChanID());
00239 query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime());
00240
00241 if (query.exec() && query.next())
00242 {
00243 category_type = query.value(0).toString();
00244 year = query.value(1).toString();
00245 stars = query.value(2).toDouble();
00246 partnumber = query.value(3).toInt();
00247 parttotal = query.value(4).toInt();
00248 audioprop = query.value(5).toInt();
00249 videoprop = query.value(6).toInt();
00250 subtype = query.value(7).toInt();
00251 epinum = query.value(8).toString();
00252 generic = query.value(9).toInt();
00253 showtype = query.value(10).toString();
00254 colorcode = query.value(11).toString();
00255 title_pronounce = query.value(12).toString();
00256 }
00257 else if (!query.isActive())
00258 MythDB::DBError("ProgDetails", query);
00259
00260 rating = getRatings(
00261 recorded, m_progInfo.GetChanID(),
00262 m_progInfo.GetScheduledStartTime());
00263 }
00264
00265 if (category_type.isEmpty() && !m_progInfo.GetProgramID().isEmpty())
00266 {
00267 QString prefix = m_progInfo.GetProgramID().left(2);
00268
00269 if (prefix == "MV")
00270 category_type = "movie";
00271 else if (prefix == "EP")
00272 category_type = "series";
00273 else if (prefix == "SP")
00274 category_type = "sports";
00275 else if (prefix == "SH")
00276 category_type = "tvshow";
00277 }
00278
00279 addItem("TITLE", tr("Title"),
00280 m_progInfo.toString(ProgramInfo::kTitleSubtitle, " - "));
00281
00282 addItem("TITLE_PRONOUNCE", tr("Title Pronounce"), title_pronounce);
00283
00284 QString s = m_progInfo.GetDescription();
00285
00286 QString attr;
00287
00288 if (partnumber > 0)
00289 attr += QString(tr("Part %1 of %2, ")).arg(partnumber).arg(parttotal);
00290
00291 if (!rating.isEmpty() && rating != "NR")
00292 attr += rating + ", ";
00293 if (category_type == "movie")
00294 {
00295 if (!year.isEmpty())
00296 attr += year + ", ";
00297
00298 if (stars > 0.0)
00299 attr += tr("%n star(s)", "", (int) (stars * 4.0)) + ", ";
00300 }
00301 if (!colorcode.isEmpty())
00302 attr += colorcode + ", ";
00303
00304 if (audioprop & AUD_MONO)
00305 attr += tr("Mono") + ", ";
00306 if (audioprop & AUD_STEREO)
00307 attr += tr("Stereo") + ", ";
00308 if (audioprop & AUD_SURROUND)
00309 attr += tr("Surround Sound") + ", ";
00310 if (audioprop & AUD_DOLBY)
00311 attr += tr("Dolby Sound") + ", ";
00312 if (audioprop & AUD_HARDHEAR)
00313 attr += tr("Audio for Hearing Impaired") + ", ";
00314 if (audioprop & AUD_VISUALIMPAIR)
00315 attr += tr("Audio for Visually Impaired") + ", ";
00316
00317 if (videoprop & VID_HDTV)
00318 attr += tr("HDTV") + ", ";
00319 if (videoprop & VID_WIDESCREEN)
00320 attr += tr("Widescreen") + ", ";
00321 if (videoprop & VID_AVC)
00322 attr += tr("AVC/H.264") + ", ";
00323 if (videoprop & VID_720)
00324 attr += tr("720p Resolution") + ", ";
00325 if (videoprop & VID_1080)
00326 attr += tr("1080i/p Resolution") + ", ";
00327
00328 if (subtype & SUB_HARDHEAR)
00329 attr += tr("CC","Closed Captioned") + ", ";
00330 if (subtype & SUB_NORMAL)
00331 attr += tr("Subtitles Available") + ", ";
00332 if (subtype & SUB_ONSCREEN)
00333 attr += tr("Subtitled") + ", ";
00334 if (subtype & SUB_SIGNED)
00335 attr += tr("Deaf Signing") + ", ";
00336
00337 if (generic && category_type == "series")
00338 attr += tr("Unidentified Episode") + ", ";
00339 else if (m_progInfo.IsRepeat())
00340 attr += tr("Repeat") + ", ";
00341
00342 if (!attr.isEmpty())
00343 {
00344 attr.truncate(attr.lastIndexOf(','));
00345 s += " (" + attr + ")";
00346 }
00347
00348 addItem("DESCRIPTION", tr("Description"), s);
00349
00350 s.clear();
00351 if (!m_progInfo.GetCategory().isEmpty())
00352 {
00353 s = m_progInfo.GetCategory();
00354
00355 query.prepare("SELECT genre FROM programgenres "
00356 "WHERE chanid = :CHANID AND starttime = :STARTTIME "
00357 "AND relevance > 0 ORDER BY relevance;");
00358
00359 query.bindValue(":CHANID", m_progInfo.GetChanID());
00360 query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime());
00361
00362 if (query.exec())
00363 {
00364 while (query.next())
00365 s += ", " + query.value(0).toString();
00366 }
00367 }
00368 addItem("CATEGORY", tr("Category"), s);
00369
00370 s.clear();
00371 if (!category_type.isEmpty())
00372 {
00373 s = category_type;
00374 if (!m_progInfo.GetSeriesID().isEmpty())
00375 s += " (" + m_progInfo.GetSeriesID() + ")";
00376 if (!showtype.isEmpty())
00377 s += " " + showtype;
00378 }
00379 addItem("CATEGORY_TYPE", tr("Type", "category_type"), s);
00380
00381 addItem("EPISODE", tr("Episode Number"), epinum);
00382
00383 s.clear();
00384 if (m_progInfo.GetOriginalAirDate().isValid() &&
00385 category_type != "movie")
00386 {
00387 s = MythDateToString(m_progInfo.GetOriginalAirDate(), kDateFull | kAddYear);
00388 }
00389 addItem("ORIGINAL_AIRDATE", tr("Original Airdate"), s);
00390
00391 addItem("PROGRAMID", tr("Program ID"), m_progInfo.GetProgramID());
00392
00393 QString actors, directors, producers, execProducers;
00394 QString writers, guestStars, hosts, adapters;
00395 QString presenters, commentators, guests;
00396
00397 if (m_progInfo.GetScheduledEndTime() != m_progInfo.GetScheduledStartTime())
00398 {
00399 if (recorded)
00400 query.prepare("SELECT role,people.name FROM recordedcredits"
00401 " AS credits"
00402 " LEFT JOIN people ON credits.person = people.person"
00403 " WHERE credits.chanid = :CHANID"
00404 " AND credits.starttime = :STARTTIME"
00405 " ORDER BY role;");
00406 else
00407 query.prepare("SELECT role,people.name FROM credits"
00408 " LEFT JOIN people ON credits.person = people.person"
00409 " WHERE credits.chanid = :CHANID"
00410 " AND credits.starttime = :STARTTIME"
00411 " ORDER BY role;");
00412 query.bindValue(":CHANID", m_progInfo.GetChanID());
00413 query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime());
00414
00415 if (query.exec() && query.size() > 0)
00416 {
00417 QStringList plist;
00418 QString rstr, role, pname;
00419
00420 while(query.next())
00421 {
00422 role = query.value(0).toString();
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438 pname = QString::fromUtf8(query.value(1)
00439 .toByteArray().constData());
00440
00441 if (rstr != role)
00442 {
00443 if (rstr == "actor")
00444 actors = plist.join(", ");
00445 else if (rstr == "director")
00446 directors = plist.join(", ");
00447 else if (rstr == "producer")
00448 producers = plist.join(", ");
00449 else if (rstr == "executive_producer")
00450 execProducers = plist.join(", ");
00451 else if (rstr == "writer")
00452 writers = plist.join(", ");
00453 else if (rstr == "guest_star")
00454 guestStars = plist.join(", ");
00455 else if (rstr == "host")
00456 hosts = plist.join(", ");
00457 else if (rstr == "adapter")
00458 adapters = plist.join(", ");
00459 else if (rstr == "presenter")
00460 presenters = plist.join(", ");
00461 else if (rstr == "commentator")
00462 commentators = plist.join(", ");
00463 else if (rstr == "guest")
00464 guests = plist.join(", ");
00465
00466 rstr = role;
00467 plist.clear();
00468 }
00469
00470 plist.append(pname);
00471 }
00472 if (rstr == "actor")
00473 actors = plist.join(", ");
00474 else if (rstr == "director")
00475 directors = plist.join(", ");
00476 else if (rstr == "producer")
00477 producers = plist.join(", ");
00478 else if (rstr == "executive_producer")
00479 execProducers = plist.join(", ");
00480 else if (rstr == "writer")
00481 writers = plist.join(", ");
00482 else if (rstr == "guest_star")
00483 guestStars = plist.join(", ");
00484 else if (rstr == "host")
00485 hosts = plist.join(", ");
00486 else if (rstr == "adapter")
00487 adapters = plist.join(", ");
00488 else if (rstr == "presenter")
00489 presenters = plist.join(", ");
00490 else if (rstr == "commentator")
00491 commentators = plist.join(", ");
00492 else if (rstr == "guest")
00493 guests = plist.join(", ");
00494 }
00495 }
00496 addItem("ACTORS", tr("Actors"), actors);
00497 addItem("DIRECTOR", tr("Director"), directors);
00498 addItem("PRODUCER", tr("Producer"), producers);
00499 addItem("EXECUTIVE_PRODUCER", tr("Executive Producer"), execProducers);
00500 addItem("WRITER", tr("Writer"), writers);
00501 addItem("GUEST_STAR", tr("Guest Star"), guestStars);
00502 addItem("HOST", tr("Host"), hosts);
00503 addItem("ADAPTER", tr("Adapter"), adapters);
00504 addItem("PRESENTER", tr("Presenter"), presenters);
00505 addItem("COMMENTATOR", tr("Commentator"), commentators);
00506 addItem("GUEST", tr("Guest"), guests);
00507
00508
00509
00510 QDateTime statusDate;
00511 if (m_progInfo.GetRecordingStatus() == rsWillRecord)
00512 statusDate = m_progInfo.GetScheduledStartTime();
00513
00514 RecordingType rectype = kSingleRecord;
00515 RecStatusType recstatus = m_progInfo.GetRecordingStatus();
00516
00517 if (recstatus == rsPreviousRecording || recstatus == rsNeverRecord ||
00518 recstatus == rsUnknown)
00519 {
00520 query.prepare("SELECT recstatus, starttime "
00521 "FROM oldrecorded WHERE duplicate > 0 AND "
00522 "future = 0 AND "
00523 "((programid <> '' AND programid = :PROGRAMID) OR "
00524 " (title <> '' AND title = :TITLE AND "
00525 " subtitle <> '' AND subtitle = :SUBTITLE AND "
00526 " description <> '' AND description = :DECRIPTION));");
00527
00528 query.bindValue(":PROGRAMID", m_progInfo.GetProgramID());
00529 query.bindValue(":TITLE", m_progInfo.GetTitle());
00530 query.bindValue(":SUBTITLE", m_progInfo.GetSubtitle());
00531 query.bindValue(":DECRIPTION", m_progInfo.GetDescription());
00532
00533 if (!query.exec())
00534 {
00535 MythDB::DBError("showDetails", query);
00536 }
00537 else if (query.next())
00538 {
00539 if (recstatus == rsUnknown)
00540 recstatus = RecStatusType(query.value(0).toInt());
00541
00542 if (recstatus == rsPreviousRecording ||
00543 recstatus == rsNeverRecord ||
00544 recstatus == rsRecorded)
00545 {
00546 statusDate = query.value(1).toDateTime();
00547 }
00548 }
00549 }
00550
00551 if (recstatus == rsUnknown)
00552 {
00553 if (recorded)
00554 {
00555 recstatus = rsRecorded;
00556 statusDate = m_progInfo.GetScheduledStartTime();
00557 }
00558 else
00559 {
00560
00561 rectype = m_progInfo.GetRecordingRuleType();
00562 }
00563 }
00564
00565 s = toString(recstatus, rectype);
00566
00567 if (statusDate.isValid())
00568 s += " " + MythDateTimeToString(statusDate, kDateFull | kAddYear);
00569
00570 addItem("MYTHTV_STATUS", QString("MythTV " + tr("Status")), s);
00571
00572 QString recordingRule;
00573 QString lastRecorded;
00574 QString nextRecording;
00575 QString averageTimeShift;
00576 QString watchListScore;
00577 QString watchListStatus;
00578 QString searchPhrase;
00579
00580 if (m_progInfo.GetRecordingRuleID())
00581 {
00582 recordingRule = QString("%1, ").arg(m_progInfo.GetRecordingRuleID());
00583 if (m_progInfo.GetRecordingRuleType() != kNotRecording)
00584 recordingRule += toString(m_progInfo.GetRecordingRuleType());
00585 if (!(record->m_title.isEmpty()))
00586 recordingRule += QString(" \"%2\"").arg(record->m_title);
00587
00588 query.prepare("SELECT last_record, next_record, avg_delay "
00589 "FROM record WHERE recordid = :RECORDID");
00590 query.bindValue(":RECORDID", m_progInfo.GetRecordingRuleID());
00591
00592 if (query.exec() && query.next())
00593 {
00594 if (query.value(0).toDateTime().isValid())
00595 lastRecorded = MythDateTimeToString(query.value(0).toDateTime(),
00596 kDateFull | kAddYear);
00597 if (query.value(1).toDateTime().isValid())
00598 nextRecording = MythDateTimeToString(query.value(1).toDateTime(),
00599 kDateFull | kAddYear);
00600 if (query.value(2).toInt() > 0)
00601 averageTimeShift = tr("%n hour(s)", "",
00602 query.value(2).toInt());
00603 }
00604 if (recorded)
00605 {
00606 if (m_progInfo.GetRecordingPriority2() > 0)
00607 watchListScore =
00608 QString::number(m_progInfo.GetRecordingPriority2());
00609
00610 if (m_progInfo.GetRecordingPriority2() < 0)
00611 {
00612 switch (m_progInfo.GetRecordingPriority2())
00613 {
00614 case wlExpireOff:
00615 watchListStatus = tr("Auto-expire off");
00616 break;
00617 case wlWatched:
00618 watchListStatus = tr("Marked as 'watched'");
00619 break;
00620 case wlEarlier:
00621 watchListStatus = tr("Not the earliest episode");
00622 break;
00623 case wlDeleted:
00624 watchListStatus = tr("Recently deleted episode");
00625 break;
00626 }
00627 }
00628 }
00629 if (record->m_searchType != kManualSearch &&
00630 record->m_description != m_progInfo.GetDescription())
00631 {
00632 searchPhrase = record->m_description
00633 .replace("<", "<").replace(">", ">").replace("\n", " ");
00634 }
00635 }
00636 addItem("RECORDING_RULE", tr("Recording Rule"), recordingRule);
00637 addItem("LAST_RECORDED", tr("Last Recorded"), lastRecorded);
00638 addItem("NEXT_RECORDING", tr("Next Recording"), nextRecording);
00639 addItem("AVERAGE_TIME_SHIFT", tr("Average Time Shift"), averageTimeShift);
00640 addItem("WATCH_LIST_SCORE", tr("Watch List Score"), watchListScore);
00641 addItem("WATCH_LIST_STATUS", tr("Watch List Status"), watchListStatus);
00642 addItem("SEARCH_PHRASE", tr("Search Phrase"), searchPhrase);
00643
00644 s.clear();
00645 if (m_progInfo.GetFindID())
00646 {
00647 QDate fdate(1970, 1, 1);
00648 fdate = fdate.addDays((int)m_progInfo.GetFindID() - 719528);
00649 s = QString("%1 (%2)").arg(m_progInfo.GetFindID())
00650 .arg(MythDateToString(fdate, kDateFull | kAddYear));
00651 }
00652 addItem("FINDID", tr("Find ID"), s);
00653
00654 QString recordingHost;
00655 QString recordedFilename;
00656 QString recordedFileSize;
00657 QString recordingGroup;
00658 QString storageGroup;
00659 QString playbackGroup;
00660 QString recordingProfile;
00661
00662 if (recorded)
00663 {
00664 recordingHost = m_progInfo.GetHostname();
00665 recordedFilename = m_progInfo.GetBasename();
00666 recordedFileSize = QString("%1 ")
00667 .arg(m_progInfo.GetFilesize()/((double)(1<<30)),0,'f',2);
00668 recordedFileSize += tr("GB", "GigaBytes");
00669
00670 query.prepare("SELECT profile FROM recorded"
00671 " WHERE chanid = :CHANID"
00672 " AND starttime = :STARTTIME;");
00673 query.bindValue(":CHANID", m_progInfo.GetChanID());
00674 query.bindValue(":STARTTIME", m_progInfo.GetRecordingStartTime());
00675
00676 if (query.exec() && query.next())
00677 {
00678 recordingProfile = m_progInfo.i18n(query.value(0).toString());
00679 }
00680 recordingGroup = m_progInfo.i18n(m_progInfo.GetRecordingGroup());
00681 storageGroup = m_progInfo.i18n(m_progInfo.GetStorageGroup());
00682 playbackGroup = m_progInfo.i18n(m_progInfo.GetPlaybackGroup());
00683 }
00684 else if (m_progInfo.GetRecordingRuleID())
00685 {
00686 recordingProfile = record->m_recProfile;
00687 }
00688 addItem("RECORDING_HOST", tr("Recording Host"), recordingHost);
00689 addItem("RECORDED_FILE_NAME", tr("Recorded File Name"), recordedFilename);
00690 addItem("RECORDED_FILE_SIZE", tr("Recorded File Size"), recordedFileSize);
00691 addItem("RECORDING_PROFILE", tr("Recording Profile"), recordingProfile);
00692 addItem("RECORDING_GROUP", tr("Recording Group"), recordingGroup);
00693 addItem("STORAGE_GROUP", tr("Storage Group"), storageGroup);
00694 addItem("PLAYBACK_GROUP", tr("Playback Group"), playbackGroup);
00695
00696 m_page[m_currentPage] = m_html.join("\n");
00697
00698 delete record;
00699 }
00700
00701 bool ProgDetails::loadHTML(void)
00702 {
00703 m_html.clear();
00704
00705 QString filename = QString("htmls/progdetails_page%1.html").arg(m_currentPage + 1);
00706 if (!GetMythUI()->FindThemeFile(filename))
00707 return false;
00708
00709 QFile file(QLatin1String(qPrintable(filename)));
00710
00711 if (!file.exists())
00712 return false;
00713
00714 if (file.open( QIODevice::ReadOnly ))
00715 {
00716 QTextStream stream(&file);
00717
00718 while ( !stream.atEnd() )
00719 {
00720 m_html.append(stream.readLine());
00721 }
00722 file.close();
00723 }
00724 else
00725 return false;
00726
00727 return true;
00728 }
00729
00730 void ProgDetails::showMenu(void)
00731 {
00732 QString label = tr("Options");
00733
00734 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
00735 MythDialogBox *menuPopup = new MythDialogBox(label, popupStack, "menuPopup");
00736
00737 if (menuPopup->Create())
00738 {
00739 menuPopup->SetReturnEvent(this, "menu");
00740
00741 menuPopup->AddButton(tr("Zoom In"));
00742 menuPopup->AddButton(tr("Zoom Out"));
00743 menuPopup->AddButton(tr("Switch Page"));
00744
00745 popupStack->AddScreen(menuPopup);
00746 }
00747 else
00748 {
00749 delete menuPopup;
00750 }
00751 }
00752
00753 void ProgDetails::customEvent(QEvent *event)
00754 {
00755 if (event->type() == DialogCompletionEvent::kEventType)
00756 {
00757 DialogCompletionEvent *dce = (DialogCompletionEvent*)(event);
00758
00759 QString resultid = dce->GetId();
00760 QString resulttext = dce->GetResultText();
00761
00762 if (resultid == "menu")
00763 {
00764 if (resulttext == tr("Zoom Out"))
00765 m_browser->ZoomOut();
00766 else if (resulttext == tr("Zoom In"))
00767 m_browser->ZoomIn();
00768 else if (resulttext == tr("Switch Page"))
00769 {
00770 m_currentPage++;
00771 if (m_currentPage >= LASTPAGE)
00772 m_currentPage = 0;
00773
00774 updatePage();
00775 }
00776 }
00777 }
00778 }