Go to the documentation of this file.
9 #include <QCoreApplication>
31 #define LOC QString("ProgLister: ")
32 #define LOC_WARN QString("ProgLister, Warning: ")
33 #define LOC_ERR QString("ProgLister, Error: ")
36 QString view, QString extraArg,
37 QDateTime selectedTime) :
40 m_extraArg(
std::move(extraArg)),
42 m_searchTime(m_startTime),
43 m_selectedTime(
std::move(selectedTime)),
44 m_channelOrdering(
gCoreContext->GetSetting(
"ChannelOrdering",
"channum")),
45 m_view(
std::move(view))
50 query.
prepare(
"SELECT COUNT(*) FROM program WHERE stars > 0");
54 if (query.
value(0).toInt() == 0)
80 m_title(
std::move(title)),
82 m_searchTime(m_startTime),
83 m_channelOrdering(
gCoreContext->GetSetting(
"ChannelOrdering",
"channum")),
84 m_view(
"reverse time"),
110 LOG(VB_GENERAL, LOG_ERR,
"Cannot load screen 'programlist'");
142 case plTitle: value = tr(
"Program Listings");
break;
149 case plSQLSearch: value = tr(
"Power Search");
break;
150 case plRecordid: value = tr(
"Rule Search");
break;
151 case plCategory: value = tr(
"Category Search");
break;
152 case plChannel: value = tr(
"Channel Search");
break;
153 case plMovies: value = tr(
"Movie Search");
break;
154 case plTime: value = tr(
"Time Search");
break;
156 default: value = tr(
"Unknown Search");
break;
177 QCoreApplication::postEvent(
this, slce);
195 "TV Frontend", e, actions);
197 bool needUpdate =
false;
198 for (
uint i = 0; i <
uint(actions.size()) && !handled; ++i)
200 QString
action = actions[i];
205 else if (
action ==
"NEXTVIEW")
207 else if (
action ==
"CUSTOMEDIT")
209 else if (
action ==
"EDIT")
211 else if (
action ==
"DELETE")
219 else if (
action ==
"GUIDE")
223 else if (
action ==
"TOGGLERECORD")
270 auto *sortMenu =
new MythMenu(tr(
"Sort Options"),
this,
"sortmenu");
271 sortMenu->AddItem(tr(
"Reverse Sort Order"));
272 sortMenu->AddItem(tr(
"Sort By Title"));
273 sortMenu->AddItem(tr(
"Sort By Time"));
282 menu->AddItem(tr(
"Sort"),
nullptr, sortMenu);
313 if (!menuPopup->Create())
374 if (newview >= 0 && newview == oldview)
382 query.
prepare(
"DELETE FROM keyword "
383 "WHERE phrase = :PHRASE AND searchtype = :TYPE;");
389 "ProgLister::updateKeywordInDB -- delete", query);
397 const QString& qphrase = text;
400 query.
prepare(
"REPLACE INTO keyword (phrase, searchtype)"
401 "VALUES(:PHRASE, :TYPE );");
407 "ProgLister::updateKeywordInDB -- replace", query);
433 case plMovies: msg = tr(
"Select Rating");
break;
434 case plChannel: msg = tr(
"Select Channel");
break;
435 case plCategory: msg = tr(
"Select Category");
break;
438 .arg(tr(
"Select a search stored from"),
439 tr(
"Custom Record"));
break;
481 QString message = tr(
"Start search from date and time");
503 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"No menu");
542 QStringList field = qphrase.split(
':');
543 if (field.size() != 6)
545 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Power search should have 6 fields," +
546 QString(
"\n\t\t\tnot %1 (%2)") .arg(field.size()).arg(qphrase));
550 static const std::array<QString,6> kBindingList
560 static const std::array<QString,6> kOutputList
562 "program.title LIKE :POWERTITLE ",
563 "program.subtitle LIKE :POWERSUB ",
564 "program.description LIKE :POWERDESC ",
565 "program.category_type = :POWERCATTYPE ",
566 "programgenres.genre = :POWERGENRE ",
567 "channel.callsign = :POWERCALLSIGN ",
570 for (
uint i = 0; i < (
uint) field.size(); i++)
572 if (field[i].isEmpty())
579 bindings[kBindingList[i]] =
580 (!kOutputList[i].contains(
"=")) ?
581 QString(
'%') + field[i] + QString(
'%') : field[i];
584 return output.contains(
"programgenres");
611 if (!record->LoadByProgram(pi))
617 QString message = tr(
"Delete '%1' %2 rule?")
623 popupStack, message,
true);
625 okPopup->SetReturnEvent(
this,
"deleterule");
626 okPopup->SetData(QVariant::fromValue(record));
628 if (okPopup->Create())
641 QString message = tr(
"Delete this episode of '%1'?").arg(pi->
GetTitle());
654 "DELETE FROM oldrecorded "
655 "WHERE chanid = :CHANID AND "
656 " starttime = :STARTTIME");
674 QString message = tr(
"Delete all episodes of '%1'?").arg(pi->
GetTitle());
686 query.
prepare(
"DELETE FROM oldrecorded "
687 "WHERE title = :TITLE AND future = 0");
712 message +=
"\n\n\n" + tr(
"NOTE: removing items from this list will not "
713 "delete any recordings.");
715 QString title = tr(
"Previously Recorded");
717 auto *
menu =
new MythMenu(title, message,
this,
"deletemenu");
719 menu->AddItem(tr(
"Allow this episode to re-record"));
721 menu->AddItem(tr(
"Never record this episode"));
722 menu->AddItem(tr(
"Remove this episode from the list"));
723 menu->AddItem(tr(
"Remove all episodes for this title"));
724 menu->AddItem(tr(
"Cancel"));
729 if (menuPopup->Create())
743 0,
true,
"channum, chanid");
746 for (
auto & channel : channels)
750 m_viewList.push_back(QString::number(channel.m_chanId));
759 QDateTime query_starttime =
m_startTime.addSecs(50 -
762 query.
prepare(
"SELECT g1.genre, g2.genre "
764 "JOIN programgenres g1 ON "
765 " program.chanid = g1.chanid AND "
766 " program.starttime = g1.starttime "
767 "LEFT JOIN programgenres g2 ON "
768 " g1.chanid = g2.chanid AND "
769 " g1.starttime = g2.starttime "
770 "WHERE program.endtime > :PGILSTART "
771 "GROUP BY g1.genre, g2.genre;");
772 query.
bindValue(
":PGILSTART", query_starttime);
784 QString genre1 = query.
value(0).toString();
785 if (genre1.isEmpty())
788 if (genre1 != lastGenre1)
795 QString genre2 = query.
value(1).toString();
796 if (genre2.isEmpty() || genre2 == genre1)
799 m_viewList.push_back(genre1 +
":/:" + genre2);
806 query.
prepare(
"SELECT category "
808 "WHERE program.endtime > :PGILSTART "
809 "GROUP BY category");
810 query.
bindValue(
":PGILSTART", query_starttime);
816 QString category = query.
value(0).toString();
817 if (category.isEmpty())
819 category = query.
value(0).toString();
833 query.
prepare(
"SELECT phrase FROM keyword "
834 "WHERE searchtype = :SEARCHTYPE;");
845 QString phrase = QString::fromUtf8(query.
value(0)
846 .toByteArray().constData());
847 if (phrase.isEmpty())
860 const QString& qphrase = view;
863 query2.
prepare(
"REPLACE INTO keyword (phrase, searchtype)"
864 "VALUES(:VIEW, :SEARCHTYPE );");
869 "replace keyword", query2);
921 m_viewList.push_back(QString(
">= %1").arg((10 - 0.5) / 10.0 - 0.001));
923 for (
int i = 9; i > 0; i--)
925 float stars = (i - 0.5 ) / 10.0 - 0.001;
926 m_viewList.push_back(QString(
">= %1").arg(stars));
951 query.
prepare(
"SELECT title FROM record "
952 "WHERE recordid = :RECORDID");
957 QString title = query.
value(0).toString();
965 query.
prepare(
"SELECT rulename FROM customexample "
966 "WHERE search > 0 ORDER BY rulename;");
972 QString rulename = query.
value(0).toString();
973 if (rulename.isEmpty() || rulename.trimmed().isEmpty())
975 rulename = query.
value(0).toString();
1084 bindings[
":PGILSTART"] =
1089 where =
"WHERE channel.deleted IS NULL "
1090 " AND channel.visible > 0 "
1091 " AND program.endtime > :PGILSTART "
1092 " AND (program.title = :PGILPHRASE0 OR "
1093 " (program.seriesid <> '' AND "
1094 " program.seriesid = :PGILPHRASE1)) ";
1095 bindings[
":PGILPHRASE0"] = qphrase;
1100 where =
"LEFT JOIN oldprogram ON "
1101 " oldprogram.oldtitle = program.title "
1102 "WHERE channel.deleted IS NULL "
1103 " AND channel.visible > 0 "
1104 " AND program.endtime > :PGILSTART "
1105 " AND oldprogram.oldtitle IS NULL "
1106 " AND program.manualid = 0 ";
1108 if (qphrase ==
"premieres")
1111 where +=
" ( program.originalairdate = DATE(";
1112 where +=
" CONVERT_TZ(program.starttime, 'Etc/UTC', 'SYSTEM'))";
1113 where +=
" AND (program.category = 'Special' ";
1114 where +=
" OR program.programid LIKE 'EP%0001')) ";
1115 where +=
" OR (program.category_type='movie' ";
1116 where +=
" AND program.stars > 0.5 ";
1117 where +=
" AND program.airdate >= YEAR(NOW()) - 2) ";
1120 else if (qphrase ==
"movies")
1122 where +=
" AND program.category_type = 'movie' ";
1124 else if (qphrase ==
"series")
1126 where +=
" AND program.category_type = 'series' ";
1128 else if (qphrase ==
"specials")
1130 where +=
" AND program.category_type = 'tvshow' ";
1134 where +=
" AND (program.category_type <> 'movie' ";
1135 where +=
" OR program.airdate >= YEAR(NOW()) - 3) ";
1140 where =
"WHERE channel.deleted IS NULL "
1141 " AND channel.visible > 0 "
1142 " AND program.endtime > :PGILSTART "
1143 " AND program.title LIKE :PGILLIKEPHRASE0 ";
1144 bindings[
":PGILLIKEPHRASE0"] = QString(
"%") + qphrase +
'%';
1148 where =
"WHERE channel.deleted IS NULL "
1149 " AND channel.visible > 0 "
1150 " AND program.endtime > :PGILSTART "
1151 " AND (program.title LIKE :PGILLIKEPHRASE1 "
1152 " OR program.subtitle LIKE :PGILLIKEPHRASE2 "
1153 " OR program.description LIKE :PGILLIKEPHRASE3 ) ";
1154 bindings[
":PGILLIKEPHRASE1"] = QString(
"%") + qphrase +
'%';
1155 bindings[
":PGILLIKEPHRASE2"] = QString(
"%") + qphrase +
'%';
1156 bindings[
":PGILLIKEPHRASE3"] = QString(
"%") + qphrase +
'%';
1160 where =
", people, credits "
1161 "WHERE channel.deleted IS NULL "
1162 " AND channel.visible > 0 "
1163 " AND program.endtime > :PGILSTART "
1164 " AND people.name LIKE :PGILPHRASE1 "
1165 " AND credits.person = people.person "
1166 " AND program.chanid = credits.chanid "
1167 " AND program.starttime = credits.starttime";
1168 bindings[
":PGILPHRASE1"] = qphrase;
1177 if (!powerWhere.isEmpty())
1181 where = QString(
"LEFT JOIN programgenres ON "
1182 "program.chanid = programgenres.chanid AND "
1183 "program.starttime = programgenres.starttime ");
1186 where += QString(
"WHERE channel.deleted IS NULL "
1187 " AND channel.visible > 0 "
1188 " AND program.endtime > :PGILSTART "
1189 " AND ( ") + powerWhere +
" ) ";
1196 where = QString(
"WHERE channel.deleted iS NULL "
1197 " AND channel.visible > 0 "
1198 " AND program.endtime > :PGILSTART "
1199 " AND ( %1 ) ").arg(qphrase);
1205 where =
"WHERE channel.deleted IS NULL "
1206 " AND channel.visible > 0 "
1207 " AND program.endtime > :PGILSTART "
1208 " AND channel.chanid = :PGILPHRASE2 ";
1209 bindings[
":PGILPHRASE2"] = qphrase;
1215 where =
"WHERE channel.deleted IS NULL "
1216 " AND channel.visible > 0 "
1217 " AND program.endtime > :PGILSTART "
1218 " AND program.category = :PGILPHRASE3 ";
1219 bindings[
":PGILPHRASE3"] = qphrase;
1223 where =
"JOIN programgenres g ON "
1224 " program.chanid = g.chanid AND "
1225 " program.starttime = g.starttime AND "
1226 " genre = :PGILPHRASE4 "
1227 "WHERE channel.deleted IS NULL "
1228 " AND channel.visible > 0 "
1229 " AND program.endtime > :PGILSTART ";
1230 bindings[
":PGILPHRASE4"] = qphrase;
1234 where =
"JOIN programgenres g1 ON "
1235 " program.chanid = g1.chanid AND "
1236 " program.starttime = g1.starttime AND "
1237 " g1.genre = :GENRE1 "
1238 "JOIN programgenres g2 ON "
1239 " program.chanid = g2.chanid AND "
1240 " program.starttime = g2.starttime AND "
1241 " g2.genre = :GENRE2 "
1242 "WHERE channel.deleted IS NULL "
1243 " AND channel.visible > 0 "
1244 " AND program.endtime > :PGILSTART ";
1251 where =
"WHERE channel.deleted IS NULL "
1252 " AND channel.visible > 0 "
1253 " AND program.endtime > :PGILSTART "
1254 " AND program.category_type = 'movie' "
1255 " AND program.stars " + qphrase +
' ';
1260 searchTime.setTime(QTime(searchTime.time().hour(), 0, 0));
1261 bindings[
":PGILSEARCHTIME1"] = searchTime;
1262 where =
"WHERE channel.deleted IS NULL "
1263 " AND channel.visible > 0 "
1264 " AND program.starttime >= :PGILSEARCHTIME1 ";
1267 where +=
" AND program.starttime < DATE_ADD(:PGILSEARCHTIME2, "
1268 "INTERVAL '1' HOUR) ";
1269 bindings[
":PGILSEARCHTIME2"] = bindings[
":PGILSEARCHTIME1"];
1274 where =
"JOIN recordmatch ON "
1275 " (program.starttime = recordmatch.starttime "
1276 " AND program.chanid = recordmatch.chanid) "
1277 "WHERE channel.deleted IS NULL "
1278 " AND channel.visible > 0 "
1279 " AND program.endtime > :PGILSTART "
1280 " AND recordmatch.recordid = :PGILPHRASE5 ";
1281 bindings[
":PGILPHRASE5"] = qphrase;
1286 query.
prepare(
"SELECT fromclause, whereclause FROM customexample "
1287 "WHERE rulename = :RULENAME;");
1292 QString fromc = query.
value(0).toString();
1293 QString wherec = query.
value(1).toString();
1295 where = QString(
"WHERE channel.deleted IS NULL "
1296 " AND channel.visible > 0 "
1297 " AND program.endtime > :PGILSTART "
1298 " AND ( %1 ) ").arg(wherec);
1299 if (!fromc.isEmpty())
1300 where = fromc +
' ' + where;
1307 where = QString(
"AND ( recordid = %1 OR title = :MTITLE )")
1309 bindings[
":MTITLE"] =
m_title;
1313 where = QString(
"AND title = :MTITLE ");
1314 bindings[
":MTITLE"] =
m_title;
1318 where = QString(
"AND recordid = %1 ").arg(
m_recid);
1326 selected = *selectedP;
1327 selectedP = &selected;
1359 if ((*it)->GetSortTitle() != curtitle)
1361 curtitle = (*it)->GetSortTitle();
1427 pginfo.
ToMap(infoMap);
1472 ProgramInfoSortFn comp {
nullptr };
1483 bool dobreak =
false;
1499 if (item->
GetText(
"is_item_initialized").isNull())
1502 pginfo->
ToMap(infoMap);
1512 QString tempSubTitle = pginfo->GetSubtitle();
1513 if (tempSubTitle.trimmed().isEmpty())
1514 tempSubTitle = pginfo->GetTitle();
1515 item->
SetText(tempSubTitle,
"titlesubtitle", state);
1518 item->
DisplayState(QString::number(pginfo->GetStars(10)),
1524 item->
SetText(
"yes",
"is_item_initialized");
1537 tr(
"%1 of %2",
"Current position in list where %1 is the "
1538 "position, %2 is the total count")
1560 pginfo->ToMap(infoMap);
1566 tr(
"%1 of %2",
"Current position in list where %1 is the "
1567 "position, %2 is the total count")
1577 QString
rating = QString::number(pginfo->GetStars(10));
1584 bool needUpdate =
false;
1590 QString resultid = dce->GetId();
1592 int buttonnum = dce->GetResult();
1594 if (resultid ==
"sortmenu")
1614 else if (resultid ==
"deletemenu")
1640 else if (resultid ==
"deleterule")
1643 if (record && buttonnum > 0 && !record->Delete())
1645 LOG(VB_GENERAL, LOG_ERR,
LOC +
1646 "Failed to delete recording rule");
1658 QString
id = slce->GetId();
1660 if (
id == objectName())
1671 auto *me =
dynamic_cast<MythEvent *
>(event);
1675 const QString& message = me->
Message();
1679 else if (message ==
"SCHEDULE_CHANGE")
QString GetSortTitle(void) const
QMap< QString, QVariant > MSqlBindings
typedef for a map of string -> string bindings for generic queries.
void LoadInBackground(const QString &message="")
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
void Load(void) override
Load data which will ultimately be displayed on-screen or used to determine what appears on-screen (S...
QSqlQuery wrapper that fetches a DB connection from the connection pool.
MythScreenStack * GetMainStack()
static QString toUIState(RecStatus::Type recstatus)
Provide a dialog to quickly find an entry in a list.
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
static Type MythEventMessage
MythUIButtonList * m_progList
bool IsDuplicate(void) const
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
void DeleteOldEpisode(bool ok)
SortBy GetSortBy(void) const
virtual void ResetMap(const InfoMap &infoMap)
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
void customEvent(QEvent *event) override
Holds information on a TV Program one might wish to record.
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
void ForgetHistory(void)
Forget the recording of a program so it will be recorded again.
void MSqlAddMoreBindings(MSqlBindings &output, MSqlBindings &addfrom)
Add the entries in addfrom to the map in output.
This class is used as a container for messages.
QVariant value(int i) const
virtual bool Create(void)
static const QRegularExpression kReLeadingAnd
Internal representation of a recording rule, mirrors the record table.
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void ShowOldRecordedMenu(void)
virtual void ShowGuide(void) const
Show the program guide.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Screen in which all other widgets are contained and rendered.
QStringList m_viewTextList
void SetProgramID(const QString &id)
void SwitchToPreviousView(void)
void ShowDeleteRuleMenu(void)
virtual void ShowDetails(void) const
Show the Program Details screen.
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
const QString & Message() const
VERBOSE_PREAMBLE Most true
void SortList(SortBy sortby, bool reverseSort)
virtual void EditRecording(bool may_watch_now=false)
Creates a dialog for editing the recording status, blocking until user leaves dialog.
virtual void EditScheduled(void)
Creates a dialog for editing the recording schedule.
MythUIType * GetFocusWidget(void) const
void UpdateKeywordInDB(const QString &text, const QString &oldValue)
QHash< QString, QString > InfoMap
static void SortChannels(ChannelInfoList &list, const QString &order, bool eliminate_duplicates=false)
void addListener(QObject *listener)
Add a listener to the observable.
void DeleteOldSeries(bool ok)
static bool plTitleSort(const ProgramInfo *a, const ProgramInfo *b)
void setAutoDelete(bool auto_delete)
ProgramList m_itemListSave
virtual void ShowPrevious(void) const
Show the previous recordings for this recording rule.
friend class PowerSearchPopup
reverse_iterator rend(void)
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
virtual void EditCustom(void)
Creates a dialog for creating a custom recording rule.
RecStatus::Type GetRecordingStatus(void) const
void ShowMenu(void) override
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
void UpdateButtonList(void)
Basic menu dialog, message and a list of options.
static MythThemedMenu * menu
QString GetTitle(void) const
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
QString GetDescription(void) const
void HandleSelected(MythUIButtonListItem *item)
static void DBError(const QString &where, const MSqlQuery &query)
void HandleVisible(MythUIButtonListItem *item)
void FillViewList(const QString &view)
void BuildFocusList(void)
def rating(profile, smoonURL, gate)
MBASE_PUBLIC int naturalCompare(const QString &_a, const QString &_b, Qt::CaseSensitivity caseSensitivity=Qt::CaseSensitive)
This method chops the input a and b into pieces of digits and non-digits (a1.05 becomes a | 1 | .
#define ACTION_CHANNELSEARCH
virtual void SetTextFromMap(const InfoMap &infoMap)
QString toString(Verbosity v=kLongDescription, const QString &sep=":", const QString &grp="\"") const
virtual void ToMap(InfoMap &progMap, bool showrerecord=false, uint star_range=10, uint date_format=0) const
Converts ProgramInfo into QString QHash containing each field in ProgramInfo converted into localized...
void FillItemList(bool restorePosition, bool updateDisp=true)
void SetViewFromTime(QDateTime searchTime)
static void RescheduleCheck(const RecordingInfo &recinfo, const QString &why)
static bool PowerStringToSQL(const QString &qphrase, QString &output, MSqlBindings &bindings)
static ChannelInfoList GetChannels(uint sourceid, bool visible_only, const QString &group_by=QString(), uint channel_groupid=0)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
ProgramInfo * GetCurrentProgram(void) const override
QString GetSortSubtitle(void) const
MythUIText * m_curviewText
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)
void SetViewFromList(const QString &item)
@ kSimplify
Do Today/Yesterday/Tomorrow transform.
Event that can be dispatched from a MythScreenType when it has completed loading.
static bool plPrevTitleSort(const ProgramInfo *a, const ProgramInfo *b)
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
RecordingType GetRecordingRuleType(void) const
Holds information on recordings and videos.
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
MythUIText * m_positionText
Dialog asking for user confirmation. Ok and optional Cancel button.
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
void ShowChooseViewMenu(void)
void ClearCurrentProgramInfo(void)
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
bool LoadFromProgram(ProgramList &destination, const QString &where, const QString &groupBy, const QString &orderBy, const MSqlBindings &bindings, const ProgramList &schedList)
RecSearchType m_searchType
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
static bool plTimeSort(const ProgramInfo *a, const ProgramInfo *b)
virtual void SetText(const QString &text)
virtual void SetVisible(bool visible)
virtual void ShowUpcoming(void) const
Show the upcoming recordings for this title.
virtual void QuickRecord(void)
Create a kSingleRecord or bring up recording dialog.
MythMainWindow * GetMythMainWindow(void)
QString m_channelOrdering
ProgLister(MythScreenStack *parent, ProgListType pltype, QString view, QString extraArg, QDateTime selectedTime=QDateTime())
bool Create(void) override
reverse_iterator rbegin(void)
bool LoadFromOldRecorded(ProgramList &destination, const QString &sql, const MSqlBindings &bindings)
void ShowDeleteOldEpisodeMenu(void)
MythScreenStack * GetStack(const QString &Stackname)
void RestoreSelection(const ProgramInfo *selected, int selectedOffset)
virtual void ShowChannelSearch(void) const
Show the channel search.
QString GetProgramID(void) const
void customEvent(QEvent *event) override
void SwitchToNextView(void)
iterator erase(iterator it)
@ kDateTimeFull
Default local time.
uint GetRecordingRuleID(void) const
void ShowDeleteItemMenu(void)
void ShowDeleteOldSeriesMenu(void)
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
void UpdateDisplay(const ProgramInfo *selected=nullptr)
MythConfirmationDialog * ShowOkPopup(const QString &message, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
void removeListener(QObject *listener)
Remove a listener to the observable.
void CloseBusyPopup(void)
This widget is used for grouping other widgets for display when a particular named state is called....
bool DisplayState(const QString &name)
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
void SetDupHistory(void)
Set the duplicate flag in oldrecorded.
MythUIText * m_messageText
std::vector< ChannelInfo > ChannelInfoList