33 if (!ignore_non_serialized_data)
51 if (!ignore_non_serialized_data)
65 const ProgramInfo &other,
bool ignore_non_serialized_data)
69 if (!ignore_non_serialized_data)
97 bool showrerecord,
uint star_range,
98 uint date_format)
const
101 progMap[
"title"] = (
m_title ==
"Default (Template)") ?
102 QObject::tr(
"Default (Template)") :
m_title;
103 progMap[
"category"] = (
m_category ==
"Default") ?
315 LOG(VB_GENERAL, LOG_ERR,
"Theme is missing critical theme elements.");
325 "rec_type|titlesubtitle|progpriority");
352 for (
int i = 0; i < actions.size() && !handled; i++)
354 const QString&
action = actions[i];
361 else if (
action ==
"RANKDEC")
365 else if (
action ==
"ESCAPE")
481 else if (
action ==
"MENU")
485 else if (
action ==
"CUSTOMEDIT")
490 else if (
action ==
"DELETE")
495 else if (
action ==
"UPCOMING")
518 QString label = tr(
"Options");
521 auto *menuPopup =
new MythDialogBox(label, popupStack,
"menuPopup");
523 if (menuPopup->Create())
525 menuPopup->SetReturnEvent(
this,
"menu");
527 menuPopup->AddButton(tr(
"Increase Priority"));
528 menuPopup->AddButton(tr(
"Decrease Priority"));
529 menuPopup->AddButton(tr(
"Sort"),
nullptr,
true);
530 menuPopup->AddButton(tr(
"Program Details"));
531 menuPopup->AddButton(tr(
"Upcoming"));
532 menuPopup->AddButton(tr(
"Custom Edit"));
533 menuPopup->AddButton(tr(
"Delete Rule"));
534 menuPopup->AddButton(tr(
"New Template"));
546 QString label = tr(
"Sort Options");
549 auto *menuPopup =
new MythDialogBox(label, popupStack,
"menuPopup");
551 if (menuPopup->Create())
553 menuPopup->SetReturnEvent(
this,
"sortmenu");
555 menuPopup->AddButton(tr(
"Reverse Sort Order"));
556 menuPopup->AddButton(tr(
"Sort By Title"));
557 menuPopup->AddButton(tr(
"Sort By Priority"));
558 menuPopup->AddButton(tr(
"Sort By Type"));
559 menuPopup->AddButton(tr(
"Sort By Count"));
560 menuPopup->AddButton(tr(
"Sort By Record Count"));
561 menuPopup->AddButton(tr(
"Sort By Last Recorded"));
562 menuPopup->AddButton(tr(
"Sort By Average Delay"));
578 QString resultid = dce->GetId();
579 QString resulttext = dce->GetResultText();
580 int buttonnum = dce->GetResult();
582 if (resultid ==
"menu")
584 if (resulttext == tr(
"Increase Priority"))
588 else if (resulttext == tr(
"Decrease Priority"))
592 else if (resulttext == tr(
"Sort"))
596 else if (resulttext == tr(
"Program Details"))
600 else if (resulttext == tr(
"Upcoming"))
605 else if (resulttext == tr(
"Custom Edit"))
610 else if (resulttext == tr(
"Delete Rule"))
615 else if (resulttext == tr(
"New Template"))
620 tr(
"Template Name"));
621 if (textInput->Create())
623 textInput->SetReturnEvent(
this,
"templatecat");
628 else if (resultid ==
"sortmenu")
630 if (resulttext == tr(
"Reverse Sort Order"))
635 else if (resulttext == tr(
"Sort By Title"))
648 else if (resulttext == tr(
"Sort By Priority"))
661 else if (resulttext == tr(
"Sort By Type"))
674 else if (resulttext == tr(
"Sort By Count"))
687 else if (resulttext == tr(
"Sort By Record Count"))
700 else if (resulttext == tr(
"Sort By Last Recorded"))
713 else if (resulttext == tr(
"Sort By Average Delay"))
727 else if (resultid ==
"deleterule")
737 if (record->Delete() && item)
740 LOG(VB_GENERAL, LOG_ERR,
741 "Failed to delete recording rule");
746 else if (resultid ==
"templatecat")
767 record->m_recordID = pgRecInfo->GetRecordingRuleID();
769 record->LoadByProgram(pgRecInfo);
773 if (schededit->Create())
787 category = category.trimmed();
788 if (category.isEmpty())
792 QMap<int, ProgramRecPriorityInfo>::Iterator it;
798 Qt::CaseInsensitive) == 0)
809 record->MakeTemplate(category);
813 if (schededit->Create())
835 if (!pgRecInfo || recid != pgRecInfo->
getRecordID())
869 query.
prepare(
"SELECT recpriority, type, inactive "
871 "WHERE recordid = :RECORDID");
877 else if (query.
next())
879 int recPriority = query.
value(0).toInt();
880 int rectype = query.
value(1).toInt();
881 int inactive = query.
value(2).toInt();
912 pgRecInfo->GetCategory()
913 .compare(
"Default", Qt::CaseInsensitive) == 0))
919 record->m_recordID = pgRecInfo->GetRecordingRuleID();
926 QString message = tr(
"Delete '%1' %2 rule?")
927 .arg(record->m_title,
toString(pgRecInfo->GetRecordingRuleType()));
932 okPopup->SetReturnEvent(
this,
"deleterule");
933 okPopup->SetData(QVariant::fromValue(record));
935 if (okPopup->Create())
952 query.
prepare(
"SELECT inactive "
954 "WHERE recordid = :RECID");
955 query.
bindValue(
":RECID", pgRecInfo->GetRecordingRuleID());
962 else if (query.
next())
964 int inactive = query.
value(0).toInt();
971 "SET inactive = :INACTIVE "
972 "WHERE recordid = :RECID");
974 query.
bindValue(
":RECID", pgRecInfo->GetRecordingRuleID());
979 "Update recording schedule inactive query", query);
984 QString(
"DeactivateRule %1 %2")
985 .arg(pgRecInfo->GetRecordingRuleID())
986 .arg(pgRecInfo->GetTitle()));
1006 if (tempRecPriority > -100 && tempRecPriority < 100)
1008 pgRecInfo->m_recPriority = tempRecPriority;
1018 int progRecPriority = pgRecInfo->GetRecordingPriority();
1020 item->
SetText(QString::number(progRecPriority),
"progpriority");
1021 item->
SetText(QString::number(progRecPriority),
"recpriority");
1025 item->
SetText(QString::number(progRecPriority),
"recpriorityB");
1029 item->
SetText(QString::number(progRecPriority),
"finalpriority");
1038 QMap<int, ProgramRecPriorityInfo>::Iterator it;
1055 std::vector<ProgramInfo *> recordinglist;
1061 for (
auto & pgiter : recordinglist)
1070 pgiter->GetRecordingPriority();
1080 result.
prepare(
"SELECT recordid, title, chanid, starttime, startdate, "
1081 "type, inactive, last_record, avg_delay, profile, "
1082 "recgroup, storagegroup "
1091 while (result.
next()) {
1092 uint recordid = result.
value(0).toUInt();
1098 int inactive = result.
value(6).toInt();
1100 int avgd = result.
value(8).toInt();
1102 QString recordingGroup = result.
value(10).toString();
1103 QString storageGroup = result.
value(11).toString();
1107 QMap<int, ProgramRecPriorityInfo>::Iterator it;
1148 for (
auto *program : schedList)
1151 const uint recordid = (*program).GetRecordingRuleID();
1186 QMap<int, ProgramRecPriorityInfo>::Iterator pit;
1240 std::vector<ProgramRecPriorityInfo*>::iterator it;
1246 QVariant::fromValue(progInfo));
1257 item->DisplayState(
rating,
"ratingstate");
1280 progInfo->
ToMap(infoMap);
1281 item->SetTextFromMap(infoMap, state);
1295 matchInfo = QString(
"%1 %2")
1302 matchInfo = tr(
"Recording %1 of %2")
1307 subtitle = QString(
"(%1) %2").arg(matchInfo, subtitle);
1308 item->SetText(subtitle,
"scheduleinfo", state);
1310 item->SetText(QString::number(progRecPriority),
"progpriority", state);
1311 item->SetText(QString::number(progRecPriority),
"finalpriority", state);
1313 item->SetText(QString::number(progRecPriority),
"recpriority", state);
1314 item->SetText(QString::number(progRecPriority),
"recpriorityB", state);
1319 item->SetText(tempDateTime,
"lastrecorded", state);
1323 item->SetText(tempDate,
"lastrecordeddate", state);
1326 item->SetText(tempTime,
"lastrecordedtime", state);
1337 channame = tr(
"Any");
1338 channum = tr(
"Any");
1339 callsign = tr(
"Any");
1341 item->SetText(channame,
"channel", state);
1342 item->SetText(channum,
"channum", state);
1343 item->SetText(callsign,
"callsign", state);
1349 item->SetText(
profile,
"recordingprofile", state);
1352 item->DisplayState(state,
"status");
1363 if (norecordingText)
1383 if (pgRecInfo->m_subtitle !=
"(null)" &&
1388 subtitle = pgRecInfo->m_subtitle;
1394 matchInfo = QString(
"%1 %2")
1395 .arg(
m_listMatch[pgRecInfo->GetRecordingRuleID()])
1397 pgRecInfo->GetRecordingRuleType()));
1401 matchInfo = tr(
"Recording %1 of %2")
1402 .arg(
m_recMatch[pgRecInfo->GetRecordingRuleID()])
1403 .arg(
m_listMatch[pgRecInfo->GetRecordingRuleID()]);
1406 subtitle = QString(
"(%1) %2").arg(matchInfo, subtitle);
1409 pgRecInfo->ToMap(infoMap);
1449 QString channame = pgRecInfo->m_chanName;
1450 QString channum = pgRecInfo->m_chanStr;
1451 QString callsign = pgRecInfo->m_chanSign;
1455 !(pgRecInfo->GetRecordingRule()->m_filter & 1024) &&
1456 pgRecInfo->GetRecordingRule()->m_searchType !=
kManualSearch)
1458 channame = tr(
"Any");
1459 channum = tr(
"Any");
1460 callsign = tr(
"Any");
1472 QString
profile = pgRecInfo->m_profile;
1490 QMap<int, ProgramRecPriorityInfo>::iterator it;
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
static const Type kEventType
QSqlQuery wrapper that fetches a DB connection from the connection pool.
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
QVariant value(int i) const
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Dialog asking for user confirmation.
void SaveSetting(const QString &key, int newValue)
int GetNumSetting(const QString &key, int defaultval=0)
bool GetBoolSetting(const QString &key, bool defaultval=false)
static void DBError(const QString &where, const MSqlQuery &query)
Basic menu dialog, message and a list of options.
MythScreenStack * GetMainStack()
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
MythScreenStack * GetStack(const QString &Stackname)
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
void LoadInBackground(const QString &message="")
void BuildFocusList(void)
MythUIType * GetFocusWidget(void) const
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
Dialog prompting the user to enter a text string.
virtual void SetTextFromMap(const InfoMap &infoMap)
All purpose text widget, displays a text string.
virtual void SetText(const QString &text)
virtual void SetVisible(bool visible)
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
ProgramAvgDelaySort(bool reverse)
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
ProgramCountSort(bool reverse)
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
Holds information on recordings and videos.
float GetStars(void) const
uint GetRecordingRuleID(void) const
void SetTitle(const QString &t, const QString &st=nullptr)
void SetRecordingRuleType(RecordingType type)
QString GetSortSubtitle(void) const
void SetCategory(const QString &cat)
void SetRecordingRuleID(uint id)
QString GetSortTitle(void) const
int GetRecordingPriority(void) 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 SetRecordingPriority(int priority)
RecStatus::Type GetRecordingStatus(void) const
QString GetSubtitle(void) const
QString GetCategory(void) const
void SetSubtitle(const QString &st, const QString &sst=nullptr)
RecordingType GetRecordingRuleType(void) const
ProgramLastRecordSort(bool reverse)
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
ProgramRecCountSort(bool reverse)
void clear(void) override
virtual void clone(const ProgramRecPriorityInfo &other, bool ignore_non_serialized_data=false)
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...
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
ProgramRecPrioritySort(bool reverse)
MythUIText * m_schedInfoText
ProgramInfo * GetCurrentProgram(void) const override
MythUIText * m_chanNameText
void saveRecPriority(void)
QMap< int, int > m_origRecPriorityData
void updateInfo(MythUIButtonListItem *item)
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
void edit(MythUIButtonListItem *item) const
void Load(void) override
Load data which will ultimately be displayed on-screen or used to determine what appears on-screen (S...
MythUIText * m_lastRecordedTimeText
std::vector< ProgramRecPriorityInfo * > m_sortedProgram
void changeRecPriority(int howMuch)
ProgramRecPriority(MythScreenStack *parent, const QString &name)
QMap< int, int > m_nowMatch
MythUIText * m_callSignText
MythUIText * m_recPriorityBText
MythUIButtonList * m_programList
QMap< int, int > m_conMatch
QMap< int, int > m_listMatch
MythUIText * m_finalPriorityText
void Init(void) override
Used after calling Load() to assign data to widgets and other UI initilisation which is prohibited in...
void newTemplate(QString category)
void customEvent(QEvent *event) override
MythUIText * m_lastRecordedDateText
MythUIText * m_chanNumText
MythUIText * m_lastRecordedText
void scheduleChanged(int recid)
MythUIText * m_recPriorityText
QMap< int, ProgramRecPriorityInfo > m_programData
bool Create(void) override
QMap< int, int > m_recMatch
ProgramRecPriorityInfo * m_currentItem
void RemoveItemFromList(MythUIButtonListItem *item)
void SortList(ProgramRecPriorityInfo *newCurrentItem=nullptr)
MythUIText * m_recProfileText
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
ProgramRecTypeSort(bool reverse)
static QString toString(RecStatus::Type recstatus, uint id)
Converts "recstatus" into a short (unreadable) string.
Holds information on a TV Program one might wish to record.
static QString GetRecgroupString(uint recGroupID)
Temporary helper during transition from string to ID.
void clear(void) override
RecordingRule * GetRecordingRule(void)
Returns the "record" field, creating it if necessary.
int getRecordID(void)
Returns a record id, creating "record" it if necessary.
void ApplyRecordRecPriorityChange(int newrecpriority)
Sets recording priority of "record", creating "record" if it does not exist.
virtual void clone(const RecordingInfo &other, bool ignore_non_serialized_data=false)
Copies important fields from other RecordingInfo.
Internal representation of a recording rule, mirrors the record table.
RecSearchType m_searchType
int m_recordID
Unique Recording Rule ID.
bool m_isInactive
Recording rule is enabled?
bool Load(bool asTemplate=false)
Load a single rule from the recorded table.
virtual void ShowDetails(void) const
Show the Program Details screen.
void customEvent(QEvent *event) override
virtual void EditCustom(void)
Creates a dialog for creating a custom recording rule.
virtual void ShowUpcoming(void) const
Show the upcoming recordings for this title.
Construct a recording schedule.
void ruleSaved(int ruleId)
void ruleDeleted(int ruleId)
static void ReschedulePlace(const QString &why)
bool operator()(const ProgramRecPriorityInfo *a, const ProgramRecPriorityInfo *b) const
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
MythMainWindow * GetMythMainWindow(void)
QHash< QString, QString > InfoMap
QDateTime as_utc(const QDateTime &old_dt)
Returns copy of QDateTime with TimeSpec set to UTC.
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
@ kDateTimeFull
Default local time.
@ kSimplify
Do Today/Yesterday/Tomorrow transform.
@ kDateFull
Default local time.
@ kTime
Default local time.
@ kAddYear
Add year to string if not included.
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
MBASE_PUBLIC std::strong_ordering 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 | .
def rating(profile, smoonURL, gate)
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
void RemoteGetAllScheduledRecordings(std::vector< ProgramInfo * > &scheduledlist)
int RecTypePrecedence(RecordingType rectype)
Converts a RecordingType to a simple integer so it's specificity can be compared to another.