Go to the documentation of this file.
30 if (!ignore_non_serialized_data)
48 if (!ignore_non_serialized_data)
62 const ProgramInfo &other,
bool ignore_non_serialized_data)
66 if (!ignore_non_serialized_data)
94 bool showrerecord,
uint star_range,
95 uint date_format)
const
98 progMap[
"title"] = (
m_title ==
"Default (Template)") ?
99 QObject::tr(
"Default (Template)") :
m_title;
100 progMap[
"category"] = (
m_category ==
"Default") ?
133 if (finalA != finalB)
136 return finalA < finalB;
137 return finalA > finalB;
146 return typeA > typeB;
147 return typeA < typeB;
172 if (finalA != finalB)
175 return finalA < finalB;
176 return finalA > finalB;
185 return typeA > typeB;
186 return typeA < typeB;
214 return (typeA > typeB);
215 return (typeA < typeB);
221 if (finalA != finalB)
224 return finalA < finalB;
225 return finalA > finalB;
252 if (countA != countB)
255 return countA < countB;
256 return countA > countB;
259 if (recCountA != recCountB)
262 return recCountA < recCountB;
263 return recCountA > recCountB;
294 if (recCountA != recCountB)
297 return recCountA < recCountB;
298 return recCountA > recCountB;
301 if (countA != countB)
304 return countA < countB;
305 return countA > countB;
334 if (lastRecA != lastRecB)
337 return lastRecA < lastRecB;
338 return lastRecA > lastRecB;
421 LOG(VB_GENERAL, LOG_ERR,
"Theme is missing critical theme elements.");
431 "rec_type|titlesubtitle|progpriority");
458 for (
int i = 0; i < actions.size() && !handled; i++)
460 QString
action = actions[i];
465 else if (
action ==
"RANKDEC")
467 else if (
action ==
"ESCAPE")
571 else if (
action ==
"MENU")
575 else if (
action ==
"CUSTOMEDIT")
580 else if (
action ==
"DELETE")
585 else if (
action ==
"UPCOMING")
604 QString label = tr(
"Options");
607 auto *menuPopup =
new MythDialogBox(label, popupStack,
"menuPopup");
609 if (menuPopup->Create())
611 menuPopup->SetReturnEvent(
this,
"menu");
613 menuPopup->AddButton(tr(
"Increase Priority"));
614 menuPopup->AddButton(tr(
"Decrease Priority"));
615 menuPopup->AddButton(tr(
"Sort"),
nullptr,
true);
616 menuPopup->AddButton(tr(
"Program Details"));
617 menuPopup->AddButton(tr(
"Upcoming"));
618 menuPopup->AddButton(tr(
"Custom Edit"));
619 menuPopup->AddButton(tr(
"Delete Rule"));
620 menuPopup->AddButton(tr(
"New Template"));
632 QString label = tr(
"Sort Options");
635 auto *menuPopup =
new MythDialogBox(label, popupStack,
"menuPopup");
637 if (menuPopup->Create())
639 menuPopup->SetReturnEvent(
this,
"sortmenu");
641 menuPopup->AddButton(tr(
"Reverse Sort Order"));
642 menuPopup->AddButton(tr(
"Sort By Title"));
643 menuPopup->AddButton(tr(
"Sort By Priority"));
644 menuPopup->AddButton(tr(
"Sort By Type"));
645 menuPopup->AddButton(tr(
"Sort By Count"));
646 menuPopup->AddButton(tr(
"Sort By Record Count"));
647 menuPopup->AddButton(tr(
"Sort By Last Recorded"));
648 menuPopup->AddButton(tr(
"Sort By Average Delay"));
664 QString resultid = dce->GetId();
665 QString resulttext = dce->GetResultText();
666 int buttonnum = dce->GetResult();
668 if (resultid ==
"menu")
670 if (resulttext == tr(
"Increase Priority"))
674 else if (resulttext == tr(
"Decrease Priority"))
678 else if (resulttext == tr(
"Sort"))
682 else if (resulttext == tr(
"Program Details"))
686 else if (resulttext == tr(
"Upcoming"))
691 else if (resulttext == tr(
"Custom Edit"))
696 else if (resulttext == tr(
"Delete Rule"))
701 else if (resulttext == tr(
"New Template"))
706 tr(
"Template Name"));
707 if (textInput->Create())
709 textInput->SetReturnEvent(
this,
"templatecat");
714 else if (resultid ==
"sortmenu")
716 if (resulttext == tr(
"Reverse Sort Order"))
721 else if (resulttext == tr(
"Sort By Title"))
732 else if (resulttext == tr(
"Sort By Priority"))
743 else if (resulttext == tr(
"Sort By Type"))
754 else if (resulttext == tr(
"Sort By Count"))
767 else if (resulttext == tr(
"Sort By Record Count"))
778 else if (resulttext == tr(
"Sort By Last Recorded"))
789 else if (resulttext == tr(
"Sort By Average Delay"))
801 else if (resultid ==
"deleterule")
811 if (record->Delete() && item)
814 LOG(VB_GENERAL, LOG_ERR,
815 "Failed to delete recording rule");
820 else if (resultid ==
"templatecat")
839 record->m_recordID = pgRecInfo->GetRecordingRuleID();
841 record->LoadByProgram(pgRecInfo);
845 if (schededit->Create())
857 category = category.trimmed();
858 if (category.isEmpty())
862 QMap<int, ProgramRecPriorityInfo>::Iterator it;
868 Qt::CaseInsensitive) == 0)
879 record->MakeTemplate(category);
883 if (schededit->Create())
903 if (!pgRecInfo || recid != pgRecInfo->
getRecordID())
937 query.
prepare(
"SELECT recpriority, type, inactive "
939 "WHERE recordid = :RECORDID");
945 else if (query.
next())
947 int recPriority = query.
value(0).toInt();
948 int rectype = query.
value(1).toInt();
949 int inactive = query.
value(2).toInt();
980 pgRecInfo->GetCategory()
981 .compare(
"Default", Qt::CaseInsensitive) == 0))
987 record->m_recordID = pgRecInfo->GetRecordingRuleID();
994 QString message = tr(
"Delete '%1' %2 rule?")
995 .arg(record->m_title,
toString(pgRecInfo->GetRecordingRuleType()));
1000 okPopup->SetReturnEvent(
this,
"deleterule");
1001 okPopup->SetData(QVariant::fromValue(record));
1003 if (okPopup->Create())
1020 query.
prepare(
"SELECT inactive "
1022 "WHERE recordid = :RECID");
1023 query.
bindValue(
":RECID", pgRecInfo->GetRecordingRuleID());
1030 else if (query.
next())
1032 int inactive = query.
value(0).toInt();
1038 query.
prepare(
"UPDATE record "
1039 "SET inactive = :INACTIVE "
1040 "WHERE recordid = :RECID");
1042 query.
bindValue(
":RECID", pgRecInfo->GetRecordingRuleID());
1047 "Update recording schedule inactive query", query);
1052 QString(
"DeactivateRule %1 %2")
1053 .arg(pgRecInfo->GetRecordingRuleID())
1054 .arg(pgRecInfo->GetTitle()));
1074 if (tempRecPriority > -100 && tempRecPriority < 100)
1076 pgRecInfo->m_recPriority = tempRecPriority;
1084 int progRecPriority = pgRecInfo->GetRecordingPriority();
1086 item->
SetText(QString::number(progRecPriority),
"progpriority");
1087 item->
SetText(QString::number(progRecPriority),
"recpriority");
1091 item->
SetText(QString::number(progRecPriority),
"recpriorityB");
1095 item->
SetText(QString::number(progRecPriority),
"finalpriority");
1104 QMap<int, ProgramRecPriorityInfo>::Iterator it;
1121 std::vector<ProgramInfo *> recordinglist;
1127 for (
auto & pgiter : recordinglist)
1136 pgiter->GetRecordingPriority();
1146 result.
prepare(
"SELECT recordid, title, chanid, starttime, startdate, "
1147 "type, inactive, last_record, avg_delay, profile, "
1148 "recgroup, storagegroup "
1155 else if (result.
next())
1159 uint recordid = result.
value(0).toUInt();
1165 int inactive = result.
value(6).toInt();
1167 int avgd = result.
value(8).toInt();
1169 QString recordingGroup = result.
value(10).toString();
1170 QString storageGroup = result.
value(11).toString();
1174 QMap<int, ProgramRecPriorityInfo>::Iterator it;
1202 }
while (result.
next());
1216 for (
auto *program : schedList)
1219 const uint recordid = (*program).GetRecordingRuleID();
1248 QMap<int, ProgramRecPriorityInfo>::Iterator pit;
1302 std::vector<ProgramRecPriorityInfo*>::iterator it;
1308 QVariant::fromValue(progInfo));
1319 item->DisplayState(
rating,
"ratingstate");
1340 progInfo->
ToMap(infoMap);
1341 item->SetTextFromMap(infoMap, state);
1355 matchInfo = QString(
"%1 %2")
1362 matchInfo = tr(
"Recording %1 of %2")
1367 subtitle = QString(
"(%1) %2").arg(matchInfo, subtitle);
1368 item->SetText(subtitle,
"scheduleinfo", state);
1370 item->SetText(QString::number(progRecPriority),
"progpriority", state);
1371 item->SetText(QString::number(progRecPriority),
"finalpriority", state);
1373 item->SetText(QString::number(progRecPriority),
"recpriority", state);
1374 item->SetText(QString::number(progRecPriority),
"recpriorityB", state);
1379 item->SetText(tempDateTime,
"lastrecorded", state);
1383 item->SetText(tempDate,
"lastrecordeddate", state);
1386 item->SetText(tempTime,
"lastrecordedtime", state);
1397 channame = tr(
"Any");
1398 channum = tr(
"Any");
1399 callsign = tr(
"Any");
1401 item->SetText(channame,
"channel", state);
1402 item->SetText(channum,
"channum", state);
1403 item->SetText(callsign,
"callsign", state);
1409 item->SetText(
profile,
"recordingprofile", state);
1412 item->DisplayState(state,
"status");
1423 if (norecordingText)
1443 if (pgRecInfo->m_subtitle !=
"(null)" &&
1448 subtitle = pgRecInfo->m_subtitle;
1454 matchInfo = QString(
"%1 %2")
1455 .arg(
m_listMatch[pgRecInfo->GetRecordingRuleID()])
1457 pgRecInfo->GetRecordingRuleType()));
1461 matchInfo = tr(
"Recording %1 of %2")
1462 .arg(
m_recMatch[pgRecInfo->GetRecordingRuleID()])
1463 .arg(
m_listMatch[pgRecInfo->GetRecordingRuleID()]);
1466 subtitle = QString(
"(%1) %2").arg(matchInfo, subtitle);
1469 pgRecInfo->ToMap(infoMap);
1509 QString channame = pgRecInfo->m_chanName;
1510 QString channum = pgRecInfo->m_chanStr;
1511 QString callsign = pgRecInfo->m_chanSign;
1515 !(pgRecInfo->GetRecordingRule()->m_filter & 1024) &&
1516 pgRecInfo->GetRecordingRule()->m_searchType !=
kManualSearch)
1518 channame = tr(
"Any");
1519 channum = tr(
"Any");
1520 callsign = tr(
"Any");
1532 QString
profile = pgRecInfo->m_profile;
1550 QMap<int, ProgramRecPriorityInfo>::iterator it;
QString GetSortTitle(void) const
void LoadInBackground(const QString &message="")
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
MythScreenStack * GetMainStack()
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
MythUIText * m_recPriorityBText
MythUIText * m_chanNumText
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
MythUIText * m_finalPriorityText
void clear(void) override
bool Create(void) override
void SetCategory(const QString &cat)
QDateTime as_utc(const QDateTime &old_dt)
Returns copy of QDateTime with TimeSpec set to UTC.
void updateInfo(MythUIButtonListItem *item)
void customEvent(QEvent *event) override
ProgramRecPrioritySort(bool reverse)
ProgramRecPriorityInfo * m_currentItem
ProgramInfo * GetCurrentProgram(void) const override
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
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 saveRecPriority(void)
ProgramRecTypeSort(bool reverse)
MythUIText * m_recProfileText
QVariant value(int i) const
QString GetCategory(void) const
Internal representation of a recording rule, mirrors the record table.
ProgramCountSort(bool reverse)
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void Load(void) override
Load data which will ultimately be displayed on-screen or used to determine what appears on-screen (S...
void changeRecPriority(int howMuch)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
void ruleSaved(int ruleId)
MythUIText * m_recPriorityText
bool m_isInactive
Recording rule is enabled?
int GetRecordingPriority(void) const
int getRecordID(void)
Returns a record id, creating "record" it if necessary.
MythUIText * m_lastRecordedTimeText
virtual void ShowDetails(void) const
Show the Program Details screen.
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
MythUIType * GetFocusWidget(void) const
QHash< QString, QString > InfoMap
MythUIText * m_lastRecordedText
bool Load(bool asTemplate=false)
Load a single rule from the recorded table.
void SetSubtitle(const QString &st, const QString &sst=nullptr)
QString toString(MarkTypes type)
void newTemplate(QString category)
virtual void EditCustom(void)
Creates a dialog for creating a custom recording rule.
RecStatus::Type GetRecordingStatus(void) const
ProgramRecPriority(MythScreenStack *parent, const QString &name)
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
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 SetRecordingRuleType(RecordingType type)
Basic menu dialog, message and a list of options.
static QString GetRecgroupString(uint recGroupID)
Temporary helper during transition from string to ID.
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
void ruleDeleted(int ruleId)
static void DBError(const QString &where, const MSqlQuery &query)
QMap< int, int > m_listMatch
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 | .
QMap< int, int > m_origRecPriorityData
MythUIText * m_chanNameText
void ToMap(InfoMap &progMap, bool showrerecord=false, uint star_range=10, uint date_format=0) const override
Converts ProgramInfo into QString QHash containing each field in ProgramInfo converted into localized...
RecSearchType m_searchType
QMap< int, int > m_recMatch
virtual void SetTextFromMap(const InfoMap &infoMap)
ProgramLastRecordSort(bool reverse)
void SetRecordingPriority(int priority)
QMap< int, ProgramRecPriorityInfo > m_programData
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...
ProgramAvgDelaySort(bool reverse)
void SetTitle(const QString &t, const QString &st=nullptr)
MythUIText * m_callSignText
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
void customEvent(QEvent *event) override
int GetNumSetting(const QString &key, int defaultval=0)
MythUIText * m_schedInfoText
QString GetSortSubtitle(void) const
MythUIButtonList * m_programList
static void ReschedulePlace(const QString &why)
std::vector< ProgramRecPriorityInfo * > m_sortedProgram
void RemoveItemFromList(MythUIButtonListItem *item)
@ kSimplify
Do Today/Yesterday/Tomorrow transform.
void scheduleChanged(int recid)
bool GetBoolSetting(const QString &key, bool defaultval=false)
void ApplyRecordRecPriorityChange(int newrecpriority)
Sets recording priority of "record", creating "record" if it does not exist.
RecordingType GetRecordingRuleType(void) const
virtual void clone(const RecordingInfo &other, bool ignore_non_serialized_data=false)
Copies important fields from other RecordingInfo.
Holds information on recordings and videos.
All purpose text widget, displays a text string.
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
int m_recordID
Unique Recording Rule ID.
void SortList(ProgramRecPriorityInfo *newCurrentItem=nullptr)
@ kAddYear
Add year to string if not included.
Dialog asking for user confirmation. Ok and optional Cancel button.
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
void RemoteGetAllScheduledRecordings(std::vector< ProgramInfo * > &scheduledlist)
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
void clear(void) override
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
virtual void SetText(const QString &text)
virtual void SetVisible(bool visible)
virtual void ShowUpcoming(void) const
Show the upcoming recordings for this title.
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
MythMainWindow * GetMythMainWindow(void)
QMap< int, int > m_conMatch
MythScreenStack * GetStack(const QString &Stackname)
@ kDateFull
Default local time.
int RecTypePrecedence(RecordingType rectype)
Converts a RecordingType to a simple integer so it's specificity can be compared to another.
void Init(void) override
Used after calling Load() to assign data to widgets and other UI initilisation which is prohibited in...
void SetRecordingRuleID(uint id)
@ kDateTimeFull
Default local time.
static QString toString(Type recstatus, uint id)
Converts "recstatus" into a short (unreadable) string.
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
Dialog prompting the user to enter a text string.
void SaveSetting(const QString &key, int newValue)
@ kTime
Default local time.
RecordingRule * GetRecordingRule(void)
Returns the "record" field, creating it if necessary.
uint GetRecordingRuleID(void) const
void edit(MythUIButtonListItem *item) const
ProgramRecCountSort(bool reverse)
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Construct a recording schedule.
MythUIText * m_lastRecordedDateText
virtual void clone(const ProgramRecPriorityInfo &other, bool ignore_non_serialized_data=false)
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
QMap< int, int > m_nowMatch
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
QString GetSubtitle(void) const
float GetStars(void) const