32 if (!ignore_non_serialized_data)
50 if (!ignore_non_serialized_data)
64 const ProgramInfo &other,
bool ignore_non_serialized_data)
68 if (!ignore_non_serialized_data)
96 bool showrerecord,
uint star_range,
97 uint date_format)
const
100 progMap[
"title"] = (
m_title ==
"Default (Template)") ?
101 QObject::tr(
"Default (Template)") :
m_title;
102 progMap[
"category"] = (
m_category ==
"Default") ?
311 LOG(VB_GENERAL, LOG_ERR,
"Theme is missing critical theme elements.");
321 "rec_type|titlesubtitle|progpriority");
348 for (
int i = 0; i < actions.size() && !handled; i++)
350 const QString&
action = actions[i];
355 else if (
action ==
"RANKDEC")
357 else if (
action ==
"ESCAPE")
473 else if (
action ==
"MENU")
477 else if (
action ==
"CUSTOMEDIT")
482 else if (
action ==
"DELETE")
487 else if (
action ==
"UPCOMING")
510 QString label = tr(
"Options");
513 auto *menuPopup =
new MythDialogBox(label, popupStack,
"menuPopup");
515 if (menuPopup->Create())
517 menuPopup->SetReturnEvent(
this,
"menu");
519 menuPopup->AddButton(tr(
"Increase Priority"));
520 menuPopup->AddButton(tr(
"Decrease Priority"));
521 menuPopup->AddButton(tr(
"Sort"),
nullptr,
true);
522 menuPopup->AddButton(tr(
"Program Details"));
523 menuPopup->AddButton(tr(
"Upcoming"));
524 menuPopup->AddButton(tr(
"Custom Edit"));
525 menuPopup->AddButton(tr(
"Delete Rule"));
526 menuPopup->AddButton(tr(
"New Template"));
538 QString label = tr(
"Sort Options");
541 auto *menuPopup =
new MythDialogBox(label, popupStack,
"menuPopup");
543 if (menuPopup->Create())
545 menuPopup->SetReturnEvent(
this,
"sortmenu");
547 menuPopup->AddButton(tr(
"Reverse Sort Order"));
548 menuPopup->AddButton(tr(
"Sort By Title"));
549 menuPopup->AddButton(tr(
"Sort By Priority"));
550 menuPopup->AddButton(tr(
"Sort By Type"));
551 menuPopup->AddButton(tr(
"Sort By Count"));
552 menuPopup->AddButton(tr(
"Sort By Record Count"));
553 menuPopup->AddButton(tr(
"Sort By Last Recorded"));
554 menuPopup->AddButton(tr(
"Sort By Average Delay"));
570 QString resultid = dce->GetId();
571 QString resulttext = dce->GetResultText();
572 int buttonnum = dce->GetResult();
574 if (resultid ==
"menu")
576 if (resulttext == tr(
"Increase Priority"))
580 else if (resulttext == tr(
"Decrease Priority"))
584 else if (resulttext == tr(
"Sort"))
588 else if (resulttext == tr(
"Program Details"))
592 else if (resulttext == tr(
"Upcoming"))
597 else if (resulttext == tr(
"Custom Edit"))
602 else if (resulttext == tr(
"Delete Rule"))
607 else if (resulttext == tr(
"New Template"))
612 tr(
"Template Name"));
613 if (textInput->Create())
615 textInput->SetReturnEvent(
this,
"templatecat");
620 else if (resultid ==
"sortmenu")
622 if (resulttext == tr(
"Reverse Sort Order"))
627 else if (resulttext == tr(
"Sort By Title"))
640 else if (resulttext == tr(
"Sort By Priority"))
653 else if (resulttext == tr(
"Sort By Type"))
666 else if (resulttext == tr(
"Sort By Count"))
679 else if (resulttext == tr(
"Sort By Record Count"))
692 else if (resulttext == tr(
"Sort By Last Recorded"))
705 else if (resulttext == tr(
"Sort By Average Delay"))
719 else if (resultid ==
"deleterule")
729 if (record->Delete() && item)
732 LOG(VB_GENERAL, LOG_ERR,
733 "Failed to delete recording rule");
738 else if (resultid ==
"templatecat")
759 record->m_recordID = pgRecInfo->GetRecordingRuleID();
761 record->LoadByProgram(pgRecInfo);
765 if (schededit->Create())
779 category = category.trimmed();
780 if (category.isEmpty())
784 QMap<int, ProgramRecPriorityInfo>::Iterator it;
790 Qt::CaseInsensitive) == 0)
801 record->MakeTemplate(category);
805 if (schededit->Create())
827 if (!pgRecInfo || recid != pgRecInfo->
getRecordID())
861 query.
prepare(
"SELECT recpriority, type, inactive "
863 "WHERE recordid = :RECORDID");
869 else if (query.
next())
871 int recPriority = query.
value(0).toInt();
872 int rectype = query.
value(1).toInt();
873 int inactive = query.
value(2).toInt();
904 pgRecInfo->GetCategory()
905 .compare(
"Default", Qt::CaseInsensitive) == 0))
911 record->m_recordID = pgRecInfo->GetRecordingRuleID();
918 QString message = tr(
"Delete '%1' %2 rule?")
919 .arg(record->m_title,
toString(pgRecInfo->GetRecordingRuleType()));
924 okPopup->SetReturnEvent(
this,
"deleterule");
925 okPopup->SetData(QVariant::fromValue(record));
927 if (okPopup->Create())
944 query.
prepare(
"SELECT inactive "
946 "WHERE recordid = :RECID");
947 query.
bindValue(
":RECID", pgRecInfo->GetRecordingRuleID());
954 else if (query.
next())
956 int inactive = query.
value(0).toInt();
963 "SET inactive = :INACTIVE "
964 "WHERE recordid = :RECID");
966 query.
bindValue(
":RECID", pgRecInfo->GetRecordingRuleID());
971 "Update recording schedule inactive query", query);
976 QString(
"DeactivateRule %1 %2")
977 .arg(pgRecInfo->GetRecordingRuleID())
978 .arg(pgRecInfo->GetTitle()));
998 if (tempRecPriority > -100 && tempRecPriority < 100)
1000 pgRecInfo->m_recPriority = tempRecPriority;
1008 int progRecPriority = pgRecInfo->GetRecordingPriority();
1010 item->
SetText(QString::number(progRecPriority),
"progpriority");
1011 item->
SetText(QString::number(progRecPriority),
"recpriority");
1015 item->
SetText(QString::number(progRecPriority),
"recpriorityB");
1019 item->
SetText(QString::number(progRecPriority),
"finalpriority");
1028 QMap<int, ProgramRecPriorityInfo>::Iterator it;
1045 std::vector<ProgramInfo *> recordinglist;
1051 for (
auto & pgiter : recordinglist)
1060 pgiter->GetRecordingPriority();
1070 result.
prepare(
"SELECT recordid, title, chanid, starttime, startdate, "
1071 "type, inactive, last_record, avg_delay, profile, "
1072 "recgroup, storagegroup "
1081 while (result.
next()) {
1082 uint recordid = result.
value(0).toUInt();
1088 int inactive = result.
value(6).toInt();
1090 int avgd = result.
value(8).toInt();
1092 QString recordingGroup = result.
value(10).toString();
1093 QString storageGroup = result.
value(11).toString();
1097 QMap<int, ProgramRecPriorityInfo>::Iterator it;
1138 for (
auto *program : schedList)
1141 const uint recordid = (*program).GetRecordingRuleID();
1170 QMap<int, ProgramRecPriorityInfo>::Iterator pit;
1224 std::vector<ProgramRecPriorityInfo*>::iterator it;
1230 QVariant::fromValue(progInfo));
1241 item->DisplayState(
rating,
"ratingstate");
1264 progInfo->
ToMap(infoMap);
1265 item->SetTextFromMap(infoMap, state);
1279 matchInfo = QString(
"%1 %2")
1286 matchInfo = tr(
"Recording %1 of %2")
1291 subtitle = QString(
"(%1) %2").arg(matchInfo, subtitle);
1292 item->SetText(subtitle,
"scheduleinfo", state);
1294 item->SetText(QString::number(progRecPriority),
"progpriority", state);
1295 item->SetText(QString::number(progRecPriority),
"finalpriority", state);
1297 item->SetText(QString::number(progRecPriority),
"recpriority", state);
1298 item->SetText(QString::number(progRecPriority),
"recpriorityB", state);
1303 item->SetText(tempDateTime,
"lastrecorded", state);
1307 item->SetText(tempDate,
"lastrecordeddate", state);
1310 item->SetText(tempTime,
"lastrecordedtime", state);
1321 channame = tr(
"Any");
1322 channum = tr(
"Any");
1323 callsign = tr(
"Any");
1325 item->SetText(channame,
"channel", state);
1326 item->SetText(channum,
"channum", state);
1327 item->SetText(callsign,
"callsign", state);
1333 item->SetText(
profile,
"recordingprofile", state);
1336 item->DisplayState(state,
"status");
1347 if (norecordingText)
1367 if (pgRecInfo->m_subtitle !=
"(null)" &&
1372 subtitle = pgRecInfo->m_subtitle;
1378 matchInfo = QString(
"%1 %2")
1379 .arg(
m_listMatch[pgRecInfo->GetRecordingRuleID()])
1381 pgRecInfo->GetRecordingRuleType()));
1385 matchInfo = tr(
"Recording %1 of %2")
1386 .arg(
m_recMatch[pgRecInfo->GetRecordingRuleID()])
1387 .arg(
m_listMatch[pgRecInfo->GetRecordingRuleID()]);
1390 subtitle = QString(
"(%1) %2").arg(matchInfo, subtitle);
1393 pgRecInfo->ToMap(infoMap);
1433 QString channame = pgRecInfo->m_chanName;
1434 QString channum = pgRecInfo->m_chanStr;
1435 QString callsign = pgRecInfo->m_chanSign;
1439 !(pgRecInfo->GetRecordingRule()->m_filter & 1024) &&
1440 pgRecInfo->GetRecordingRule()->m_searchType !=
kManualSearch)
1442 channame = tr(
"Any");
1443 channum = tr(
"Any");
1444 callsign = tr(
"Any");
1456 QString
profile = pgRecInfo->m_profile;
1474 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.
int ternary_compare(const QDateTime &a, const QDateTime &b)
balanced ternary (three way) comparison This is equivalent to C++20's operator <=>.
#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 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 | .
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.