34 if (!ignore_non_serialized_data)
52 if (!ignore_non_serialized_data)
66 const ProgramInfo &other,
bool ignore_non_serialized_data)
70 if (!ignore_non_serialized_data)
98 bool showrerecord,
uint star_range,
99 uint date_format)
const
102 progMap[
"title"] = (
m_title ==
"Default (Template)") ?
103 QObject::tr(
"Default (Template)") :
m_title;
104 progMap[
"category"] = (
m_category ==
"Default") ?
316 LOG(VB_GENERAL, LOG_ERR,
"Theme is missing critical theme elements.");
326 "rec_type|titlesubtitle|progpriority");
353 for (
int i = 0; i < actions.size() && !handled; i++)
355 const QString&
action = actions[i];
362 else if (
action ==
"RANKDEC")
366 else if (
action ==
"ESCAPE")
482 else if (
action ==
"MENU")
486 else if (
action ==
"CUSTOMEDIT")
491 else if (
action ==
"DELETE")
496 else if (
action ==
"UPCOMING")
519 QString label = tr(
"Options");
522 auto *menuPopup =
new MythDialogBox(label, popupStack,
"menuPopup");
524 if (menuPopup->Create())
526 menuPopup->SetReturnEvent(
this,
"menu");
528 menuPopup->AddButton(tr(
"Increase Priority"));
529 menuPopup->AddButton(tr(
"Decrease Priority"));
530 menuPopup->AddButton(tr(
"Sort"),
nullptr,
true);
531 menuPopup->AddButton(tr(
"Program Details"));
532 menuPopup->AddButton(tr(
"Upcoming"));
533 menuPopup->AddButton(tr(
"Custom Edit"));
534 menuPopup->AddButton(tr(
"Delete Rule"));
535 menuPopup->AddButton(tr(
"New Template"));
547 QString label = tr(
"Sort Options");
550 auto *menuPopup =
new MythDialogBox(label, popupStack,
"menuPopup");
552 if (menuPopup->Create())
554 menuPopup->SetReturnEvent(
this,
"sortmenu");
556 menuPopup->AddButton(tr(
"Reverse Sort Order"));
557 menuPopup->AddButton(tr(
"Sort By Title"));
558 menuPopup->AddButton(tr(
"Sort By Priority"));
559 menuPopup->AddButton(tr(
"Sort By Type"));
560 menuPopup->AddButton(tr(
"Sort By Count"));
561 menuPopup->AddButton(tr(
"Sort By Record Count"));
562 menuPopup->AddButton(tr(
"Sort By Last Recorded"));
563 menuPopup->AddButton(tr(
"Sort By Average Delay"));
579 QString resultid = dce->GetId();
580 QString resulttext = dce->GetResultText();
581 int buttonnum = dce->GetResult();
583 if (resultid ==
"menu")
585 if (resulttext == tr(
"Increase Priority"))
589 else if (resulttext == tr(
"Decrease Priority"))
593 else if (resulttext == tr(
"Sort"))
597 else if (resulttext == tr(
"Program Details"))
601 else if (resulttext == tr(
"Upcoming"))
606 else if (resulttext == tr(
"Custom Edit"))
611 else if (resulttext == tr(
"Delete Rule"))
616 else if (resulttext == tr(
"New Template"))
621 tr(
"Template Name"));
622 if (textInput->Create())
624 textInput->SetReturnEvent(
this,
"templatecat");
629 else if (resultid ==
"sortmenu")
631 if (resulttext == tr(
"Reverse Sort Order"))
636 else if (resulttext == tr(
"Sort By Title"))
649 else if (resulttext == tr(
"Sort By Priority"))
662 else if (resulttext == tr(
"Sort By Type"))
675 else if (resulttext == tr(
"Sort By Count"))
688 else if (resulttext == tr(
"Sort By Record Count"))
701 else if (resulttext == tr(
"Sort By Last Recorded"))
714 else if (resulttext == tr(
"Sort By Average Delay"))
728 else if (resultid ==
"deleterule")
738 if (record->Delete() && item)
741 LOG(VB_GENERAL, LOG_ERR,
742 "Failed to delete recording rule");
747 else if (resultid ==
"templatecat")
768 record->m_recordID = pgRecInfo->GetRecordingRuleID();
770 record->LoadByProgram(pgRecInfo);
774 if (schededit->Create())
788 category = category.trimmed();
789 if (category.isEmpty())
793 QMap<int, ProgramRecPriorityInfo>::Iterator it;
799 Qt::CaseInsensitive) == 0)
810 record->MakeTemplate(category);
814 if (schededit->Create())
836 if (!pgRecInfo || recid != pgRecInfo->
getRecordID())
870 query.
prepare(
"SELECT recpriority, type, inactive "
872 "WHERE recordid = :RECORDID");
878 else if (query.
next())
880 int recPriority = query.
value(0).toInt();
881 int rectype = query.
value(1).toInt();
882 int inactive = query.
value(2).toInt();
913 pgRecInfo->GetCategory()
914 .compare(
"Default", Qt::CaseInsensitive) == 0))
920 record->m_recordID = pgRecInfo->GetRecordingRuleID();
927 QString message = tr(
"Delete '%1' %2 rule?")
928 .arg(record->m_title,
toString(pgRecInfo->GetRecordingRuleType()));
933 okPopup->SetReturnEvent(
this,
"deleterule");
934 okPopup->SetData(QVariant::fromValue(record));
936 if (okPopup->Create())
953 query.
prepare(
"SELECT inactive "
955 "WHERE recordid = :RECID");
956 query.
bindValue(
":RECID", pgRecInfo->GetRecordingRuleID());
963 else if (query.
next())
965 int inactive = query.
value(0).toInt();
972 "SET inactive = :INACTIVE "
973 "WHERE recordid = :RECID");
975 query.
bindValue(
":RECID", pgRecInfo->GetRecordingRuleID());
980 "Update recording schedule inactive query", query);
985 QString(
"DeactivateRule %1 %2")
986 .arg(pgRecInfo->GetRecordingRuleID())
987 .arg(pgRecInfo->GetTitle()));
1007 if (tempRecPriority > -100 && tempRecPriority < 100)
1009 pgRecInfo->m_recPriority = tempRecPriority;
1019 int progRecPriority = pgRecInfo->GetRecordingPriority();
1021 item->
SetText(QString::number(progRecPriority),
"progpriority");
1022 item->
SetText(QString::number(progRecPriority),
"recpriority");
1026 item->
SetText(QString::number(progRecPriority),
"recpriorityB");
1030 item->
SetText(QString::number(progRecPriority),
"finalpriority");
1039 QMap<int, ProgramRecPriorityInfo>::Iterator it;
1056 std::vector<ProgramInfo *> recordinglist;
1062 for (
auto & pgiter : recordinglist)
1071 pgiter->GetRecordingPriority();
1081 result.
prepare(
"SELECT recordid, title, chanid, starttime, startdate, "
1082 "type, inactive, last_record, avg_delay, profile, "
1083 "recgroup, storagegroup "
1092 while (result.
next()) {
1093 uint recordid = result.
value(0).toUInt();
1099 int inactive = result.
value(6).toInt();
1101 int avgd = result.
value(8).toInt();
1103 QString recordingGroup = result.
value(10).toString();
1104 QString storageGroup = result.
value(11).toString();
1108 QMap<int, ProgramRecPriorityInfo>::Iterator it;
1149 for (
auto *program : schedList)
1152 const uint recordid = (*program).GetRecordingRuleID();
1187 QMap<int, ProgramRecPriorityInfo>::Iterator pit;
1241 std::vector<ProgramRecPriorityInfo*>::iterator it;
1247 QVariant::fromValue(progInfo));
1258 item->DisplayState(
rating,
"ratingstate");
1281 progInfo->
ToMap(infoMap);
1282 item->SetTextFromMap(infoMap, state);
1296 matchInfo = QString(
"%1 %2")
1303 matchInfo = tr(
"Recording %1 of %2")
1308 subtitle = QString(
"(%1) %2").arg(matchInfo, subtitle);
1309 item->SetText(subtitle,
"scheduleinfo", state);
1311 item->SetText(QString::number(progRecPriority),
"progpriority", state);
1312 item->SetText(QString::number(progRecPriority),
"finalpriority", state);
1314 item->SetText(QString::number(progRecPriority),
"recpriority", state);
1315 item->SetText(QString::number(progRecPriority),
"recpriorityB", state);
1320 item->SetText(tempDateTime,
"lastrecorded", state);
1324 item->SetText(tempDate,
"lastrecordeddate", state);
1327 item->SetText(tempTime,
"lastrecordedtime", state);
1338 channame = tr(
"Any");
1339 channum = tr(
"Any");
1340 callsign = tr(
"Any");
1342 item->SetText(channame,
"channel", state);
1343 item->SetText(channum,
"channum", state);
1344 item->SetText(callsign,
"callsign", state);
1350 item->SetText(
profile,
"recordingprofile", state);
1353 item->DisplayState(state,
"status");
1364 if (norecordingText)
1384 if (pgRecInfo->m_subtitle !=
"(null)" &&
1389 subtitle = pgRecInfo->m_subtitle;
1395 matchInfo = QString(
"%1 %2")
1396 .arg(
m_listMatch[pgRecInfo->GetRecordingRuleID()])
1398 pgRecInfo->GetRecordingRuleType()));
1402 matchInfo = tr(
"Recording %1 of %2")
1403 .arg(
m_recMatch[pgRecInfo->GetRecordingRuleID()])
1404 .arg(
m_listMatch[pgRecInfo->GetRecordingRuleID()]);
1407 subtitle = QString(
"(%1) %2").arg(matchInfo, subtitle);
1410 pgRecInfo->ToMap(infoMap);
1450 QString channame = pgRecInfo->m_chanName;
1451 QString channum = pgRecInfo->m_chanStr;
1452 QString callsign = pgRecInfo->m_chanSign;
1456 !(pgRecInfo->GetRecordingRule()->m_filter & 1024) &&
1457 pgRecInfo->GetRecordingRule()->m_searchType !=
kManualSearch)
1459 channame = tr(
"Any");
1460 channum = tr(
"Any");
1461 callsign = tr(
"Any");
1473 QString
profile = pgRecInfo->m_profile;
1491 QMap<int, ProgramRecPriorityInfo>::iterator it;
1505#include "moc_programrecpriority.cpp"
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.