diff --git a/mythtv/bindings/perl/MythTV.pm b/mythtv/bindings/perl/MythTV.pm index 1a86c8bf932..6063d670209 100644 --- a/mythtv/bindings/perl/MythTV.pm +++ b/mythtv/bindings/perl/MythTV.pm @@ -115,7 +115,7 @@ package MythTV; # schema version supported in the main code. We need to check that the schema # version in the database is as expected by the bindings, which are expected # to be kept in sync with the main code. - our $SCHEMA_VERSION = "1309"; + our $SCHEMA_VERSION = "1310"; # NUMPROGRAMLINES is defined in mythtv/libs/libmythtv/programinfo.h and is # the number of items in a ProgramInfo QStringList group used by diff --git a/mythtv/bindings/python/MythTV/static.py b/mythtv/bindings/python/MythTV/static.py index 7da4d5d908b..98c0448d598 100644 --- a/mythtv/bindings/python/MythTV/static.py +++ b/mythtv/bindings/python/MythTV/static.py @@ -5,7 +5,7 @@ """ OWN_VERSION = (0,27,-1,0) -SCHEMA_VERSION = 1309 +SCHEMA_VERSION = 1310 NVSCHEMA_VERSION = 1007 MUSICSCHEMA_VERSION = 1018 PROTO_VERSION = '76' @@ -39,7 +39,7 @@ class RECTYPE( object ): kNotRecording = 0 kSingleRecord = 1 kDailyRecord = 2 - kChannelRecord = 3 + #kChannelRecord = 3 (Obsolete) kAllRecord = 4 kWeeklyRecord = 5 kOneRecord = 6 diff --git a/mythtv/libs/libmyth/programinfo.cpp b/mythtv/libs/libmyth/programinfo.cpp index e4289e4d01c..19130ebaff6 100644 --- a/mythtv/libs/libmyth/programinfo.cpp +++ b/mythtv/libs/libmyth/programinfo.cpp @@ -1731,6 +1731,15 @@ uint64_t ProgramInfo::QueryLastFrameInPosMap(void) const return last_frame; } +bool ProgramInfo::IsGeneric(void) const +{ + return + (programid.isEmpty() && subtitle.isEmpty() && + description.isEmpty()) || + (!programid.isEmpty() && programid.endsWith("0000") + && catType == "series"); +} + QString ProgramInfo::toString(const Verbosity v, QString sep, QString grp) const { diff --git a/mythtv/libs/libmyth/programinfo.h b/mythtv/libs/libmyth/programinfo.h index dab7929ce3f..3f3e976d445 100644 --- a/mythtv/libs/libmyth/programinfo.h +++ b/mythtv/libs/libmyth/programinfo.h @@ -435,6 +435,7 @@ class MPUBLIC ProgramInfo uint32_t GetProgramFlags(void) const { return programflags; } ProgramInfoType GetProgramInfoType(void) const { return (ProgramInfoType)((programflags & FL_TYPEMASK) >> 16); } + bool IsGeneric(void) const; bool IsInUsePlaying(void) const { return programflags & FL_INUSEPLAYING;} bool IsCommercialFree(void) const { return programflags & FL_CHANCOMMFREE;} bool HasCutlist(void) const { return programflags & FL_CUTLIST; } diff --git a/mythtv/libs/libmyth/recordingtypes.cpp b/mythtv/libs/libmyth/recordingtypes.cpp index 31310519f18..91643b9b1f9 100644 --- a/mythtv/libs/libmyth/recordingtypes.cpp +++ b/mythtv/libs/libmyth/recordingtypes.cpp @@ -15,8 +15,7 @@ int RecTypePrecedence(RecordingType rectype) case kOneRecord: return 4; break; case kWeeklyRecord: return 6; break; case kDailyRecord: return 8; break; - case kChannelRecord: return 9; break; - case kAllRecord: return 10; break; + case kAllRecord: return 9; break; case kTemplateRecord: return 0; break; default: return 11; } @@ -29,8 +28,6 @@ QString toString(RecordingType rectype) { case kSingleRecord: return QObject::tr("Single Record"); - case kChannelRecord: - return QObject::tr("Channel Record"); case kAllRecord: return QObject::tr("Record All"); case kOneRecord: @@ -56,8 +53,6 @@ QString toRawString(RecordingType rectype) { case kSingleRecord: return QString("Single Record"); - case kChannelRecord: - return QString("Channel Record"); case kAllRecord: return QString("Record All"); case kOneRecord: @@ -80,8 +75,6 @@ RecordingType recTypeFromString(QString type) return kNotRecording; if (type.toLower() == "single record" || type.toLower() == "single") return kSingleRecord; - else if (type.toLower() == "channel record" || type.toLower() == "channel") - return kChannelRecord; else if (type.toLower() == "record all" || type.toLower() == "all") return kAllRecord; else if (type.toLower() == "record one" || type.toLower() == "one" || @@ -109,8 +102,6 @@ QChar toQChar(RecordingType rectype) { case kSingleRecord: ret = QObject::tr("S", "RecTypeChar kSingleRecord"); break; - case kChannelRecord: - ret = QObject::tr("C", "RecTypeChar kChannelRecord"); break; case kAllRecord: ret = QObject::tr("A", "RecTypeChar kAllRecord"); break; case kOneRecord: diff --git a/mythtv/libs/libmyth/recordingtypes.h b/mythtv/libs/libmyth/recordingtypes.h index 37c1400ac2f..2d3f6a26f6d 100644 --- a/mythtv/libs/libmyth/recordingtypes.h +++ b/mythtv/libs/libmyth/recordingtypes.h @@ -21,7 +21,7 @@ typedef enum RecordingTypes kNotRecording = 0, kSingleRecord = 1, kDailyRecord = 2, - kChannelRecord = 3, + //kChannelRecord = 3, (Obsolete) kAllRecord = 4, kWeeklyRecord = 5, kOneRecord = 6, diff --git a/mythtv/libs/libmythbase/mythversion.h b/mythtv/libs/libmythbase/mythversion.h index 2e68bb17c2b..ce18790cf28 100644 --- a/mythtv/libs/libmythbase/mythversion.h +++ b/mythtv/libs/libmythbase/mythversion.h @@ -12,7 +12,7 @@ /// Update this whenever the plug-in API changes. /// Including changes in the libmythbase, libmyth, libmythtv, libmythav* and /// libmythui class methods used by plug-ins. -#define MYTH_BINARY_VERSION "0.27.20121227-1" +#define MYTH_BINARY_VERSION "0.27.20121227-2" /** \brief Increment this whenever the MythTV network protocol changes. * @@ -57,7 +57,7 @@ * mythtv/bindings/php/MythBackend.php #endif -#define MYTH_DATABASE_VERSION "1309" +#define MYTH_DATABASE_VERSION "1310" MBASE_PUBLIC const char *GetMythSourceVersion(); diff --git a/mythtv/libs/libmythtv/dbcheck.cpp b/mythtv/libs/libmythtv/dbcheck.cpp index 6211aa259f8..4da5eaf4a0c 100644 --- a/mythtv/libs/libmythtv/dbcheck.cpp +++ b/mythtv/libs/libmythtv/dbcheck.cpp @@ -2325,6 +2325,20 @@ NULL return false; } + if (dbver == "1309") + { + const char *updates[] = { +// Add this channel filter +"REPLACE INTO recordfilter (filterid, description, clause, newruledefault) " +" VALUES (10, 'This channel', 'channel.callsign = RECTABLE.station', 0)", +// Convert old, Channel rules to All with channel filter +"UPDATE record SET type = 4, filter = filter|1024 WHERE type = 3", +NULL +}; + if (!performActualUpdate(&updates[0], "1310", dbver)) + return false; + } + return true; } diff --git a/mythtv/libs/libmythtv/recordinginfo.cpp b/mythtv/libs/libmythtv/recordinginfo.cpp index 1aa7cd62705..af610f65575 100644 --- a/mythtv/libs/libmythtv/recordinginfo.cpp +++ b/mythtv/libs/libmythtv/recordinginfo.cpp @@ -766,53 +766,14 @@ void RecordingInfo::ApplyTranscoderProfileChange(const QString &profile) const } } -/** \fn RecordingInfo::ToggleRecord(void) - * \brief Cycles through recording types. - * - * If the program recording status is kNotRecording, - * ApplyRecordStateChange(kSingleRecord) is called. - * If the program recording status is kSingleRecording, - * ApplyRecordStateChange(kOneRecord) is called. - *
etc... - * - * The states in order are: kNotRecording, kSingleRecord, kOneRecord, - * kWeeklyRecord, kDailyRecord, kChannelRecord, kAllRecord.
- * And: kOverrideRecord, kDontRecord. - * - * That is if you the recording is in any of the first set of states, - * we cycle through those, if not we toggle between kOverrideRecord and - * kDontRecord. +/** \fn RecordingInfo::QuickRecord(void) + * \brief Create a kSingleRecord if not already scheduled. */ -void RecordingInfo::ToggleRecord(void) +void RecordingInfo::QuickRecord(void) { RecordingType curType = GetProgramRecordingStatus(); - - switch (curType) - { - case kNotRecording: - ApplyRecordStateChange(kSingleRecord); - break; - case kSingleRecord: - ApplyRecordStateChange(kOneRecord); - break; - case kOneRecord: - ApplyRecordStateChange(kAllRecord); - break; - case kAllRecord: - ApplyRecordStateChange(kSingleRecord); - break; - - case kOverrideRecord: - ApplyRecordStateChange(kDontRecord); - break; - case kDontRecord: - ApplyRecordStateChange(kOverrideRecord); - break; - - default: - ApplyRecordStateChange(kAllRecord); - break; - } + if (curType == kNotRecording) + ApplyRecordStateChange(kSingleRecord); } /** diff --git a/mythtv/libs/libmythtv/recordinginfo.h b/mythtv/libs/libmythtv/recordinginfo.h index f27d02ed4f1..c775e71fe07 100644 --- a/mythtv/libs/libmythtv/recordinginfo.h +++ b/mythtv/libs/libmythtv/recordinginfo.h @@ -220,7 +220,7 @@ class MTV_PUBLIC RecordingInfo : public ProgramInfo QString GetProgramRecordingProfile(void) const; void ApplyRecordStateChange(RecordingType newstate, bool save = true); void ApplyRecordRecPriorityChange(int); - void ToggleRecord(void); + void QuickRecord(void); // Used in determining start and end for RecordingQuality determination void SetDesiredStartTime(const QDateTime &dt) { desiredrecstartts = dt; } diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp index 57f900d6e9b..47a2cef448e 100644 --- a/mythtv/libs/libmythtv/tv_play.cpp +++ b/mythtv/libs/libmythtv/tv_play.cpp @@ -3901,7 +3901,7 @@ bool TV::BrowseHandleAction(PlayerContext *ctx, const QStringList &actions) browsehelper->BrowseEnd(ctx, false); } else if (has_action(ACTION_TOGGLERECORD, actions)) - ToggleRecord(ctx); + QuickRecord(ctx); else { handled = false; @@ -4481,7 +4481,7 @@ bool TV::ToggleHandleAction(PlayerContext *ctx, else if (has_action(ACTION_TOGGLESLEEP, actions)) ToggleSleepTimer(ctx); else if (has_action(ACTION_TOGGLERECORD, actions) && islivetv) - ToggleRecord(ctx); + QuickRecord(ctx); else if (has_action(ACTION_TOGGLEFAV, actions) && islivetv) ToggleChannelFavorite(ctx); else if (has_action(ACTION_TOGGLECHANCONTROLS, actions) && islivetv) @@ -9487,7 +9487,7 @@ void TV::customEvent(QEvent *e) } } -void TV::ToggleRecord(PlayerContext *ctx) +void TV::QuickRecord(PlayerContext *ctx) { BrowseInfo bi = browsehelper->GetBrowsedInfo(); if (bi.m_chanid) @@ -9498,7 +9498,7 @@ void TV::ToggleRecord(PlayerContext *ctx) RecordingInfo::LoadStatus status; RecordingInfo recinfo(bi.m_chanid, startts, false, 0, &status); if (RecordingInfo::kFoundProgram == status) - recinfo.ToggleRecord(); + recinfo.QuickRecord(); recinfo.ToMap(infoMap); infoMap["iconpath"] = ChannelUtil::GetIcon(recinfo.GetChanID()); if ((recinfo.IsVideoFile() || recinfo.IsVideoDVD() || diff --git a/mythtv/libs/libmythtv/tv_play.h b/mythtv/libs/libmythtv/tv_play.h index 175bb983782..9584593a8e1 100644 --- a/mythtv/libs/libmythtv/tv_play.h +++ b/mythtv/libs/libmythtv/tv_play.h @@ -317,7 +317,7 @@ class MTV_PUBLIC TV : public QObject // Other toggles void ToggleAutoExpire(PlayerContext*); - void ToggleRecord(PlayerContext*); + void QuickRecord(PlayerContext*); // General TV state static bool StateIsRecording(TVState state); diff --git a/mythtv/programs/mythbackend/scheduler.cpp b/mythtv/programs/mythbackend/scheduler.cpp index 0e99c8895f4..2a3bdece4cd 100644 --- a/mythtv/programs/mythbackend/scheduler.cpp +++ b/mythtv/programs/mythbackend/scheduler.cpp @@ -3559,29 +3559,24 @@ void Scheduler::UpdateMatches(uint recordid, uint sourceid, uint mplexid, QString(" AND channel.visible = 1 ") + filterClause + QString(" AND " -"((RECTABLE.type = %1 " // all record +"(" +" (RECTABLE.type = %1 " // all record " OR RECTABLE.type = %2 " // one record " OR RECTABLE.type = %3 " // daily record " OR RECTABLE.type = %4) " // weekly record " OR " -" ((RECTABLE.station = channel.callsign) " // channel matches -" AND " -" ((RECTABLE.type = %5) " // channel record -" OR" -" ((ADDTIME(RECTABLE.startdate, RECTABLE.starttime) = program.starttime) " // date/time matches -" AND " -" (RECTABLE.type = %6 " -" OR RECTABLE.type = %7 " -" OR RECTABLE.type = %8)" // single/override/don't record -" )" -" )" -" )" +" ((RECTABLE.type = %6 " // single record +" OR RECTABLE.type = %7 " // override record +" OR RECTABLE.type = %8)" // don't record +" AND " +" ADDTIME(RECTABLE.startdate, RECTABLE.starttime) = program.starttime " // date/time matches +" AND " +" RECTABLE.station = channel.callsign) " // channel matches ") ") .arg(kAllRecord) .arg(kOneRecord) .arg(kDailyRecord) .arg(kWeeklyRecord) - .arg(kChannelRecord) .arg(kSingleRecord) .arg(kOverrideRecord) .arg(kDontRecord); diff --git a/mythtv/programs/mythfrontend/guidegrid.cpp b/mythtv/programs/mythfrontend/guidegrid.cpp index 3ee060ba956..5a0aa447408 100644 --- a/mythtv/programs/mythfrontend/guidegrid.cpp +++ b/mythtv/programs/mythfrontend/guidegrid.cpp @@ -1303,9 +1303,6 @@ void GuideGrid::fillProgramRowInfos(unsigned int row, bool useExistingData) case kDailyRecord: recFlag = 2; break; - case kChannelRecord: - recFlag = 3; - break; case kAllRecord: recFlag = 4; break; @@ -1983,10 +1980,7 @@ void GuideGrid::quickRecord() if (pginfo->GetTitle() == kUnknownTitle) return; - RecordingInfo ri(*pginfo); - ri.ToggleRecord(); - *pginfo = ri; - + QuickRecord(pginfo); LoadFromScheduler(m_recList); fillProgramInfos(); updateInfo(); diff --git a/mythtv/programs/mythfrontend/progfind.cpp b/mythtv/programs/mythfrontend/progfind.cpp index 28c45c1397b..16baf4a8e24 100644 --- a/mythtv/programs/mythfrontend/progfind.cpp +++ b/mythtv/programs/mythfrontend/progfind.cpp @@ -415,11 +415,7 @@ void ProgFinder::getInfo(bool toggle) if (curPick) { if (toggle) - { - RecordingInfo ri(*curPick); - ri.ToggleRecord(); - *curPick = ri; - } + QuickRecord(curPick); else EditRecording(curPick); } diff --git a/mythtv/programs/mythfrontend/proglist.cpp b/mythtv/programs/mythfrontend/proglist.cpp index 11ee7444c73..9c012b3b14a 100644 --- a/mythtv/programs/mythfrontend/proglist.cpp +++ b/mythtv/programs/mythfrontend/proglist.cpp @@ -608,11 +608,7 @@ void ProgLister::RecordSelected(void) { ProgramInfo *pi = GetCurrent(); if (pi) - { - RecordingInfo ri(*pi); - ri.ToggleRecord(); - *pi = ri; - } + QuickRecord(pi); } void ProgLister::HandleClicked(void) diff --git a/mythtv/programs/mythfrontend/schedulecommon.cpp b/mythtv/programs/mythfrontend/schedulecommon.cpp index b03e9200aa1..7e9d4e2e9c7 100644 --- a/mythtv/programs/mythfrontend/schedulecommon.cpp +++ b/mythtv/programs/mythfrontend/schedulecommon.cpp @@ -98,6 +98,24 @@ void ScheduleCommon::ShowUpcomingScheduled(ProgramInfo *pginfo) const delete pl; } +/** +* \brief Create a kSingleRecord or bring up recording dialog. +*/ +void ScheduleCommon::QuickRecord(ProgramInfo *pginfo) +{ + if (!pginfo) + return; + + if (pginfo->GetRecordingRuleID()) + EditRecording(pginfo); + else + { + RecordingInfo ri(*pginfo); + ri.QuickRecord(); + *pginfo = ri; + } +} + /** * \brief Creates a dialog for editing the recording status, * blocking until user leaves dialog. @@ -110,7 +128,7 @@ void ScheduleCommon::EditRecording(ProgramInfo *pginfo) RecordingInfo ri(*pginfo); if (!ri.GetRecordingRuleID()) - EditScheduled(&ri); + ShowNotScheduledDialog(ri); else if (ri.GetRecordingStatus() <= rsWillRecord || ri.GetRecordingStatus() == rsOtherShowing) ShowRecordingDialog(ri); @@ -219,10 +237,10 @@ void ScheduleCommon::ShowRecordingDialog(const RecordingInfo& recinfo) recinfo.GetRecordingStatus() != rsTuning && recinfo.GetRecordingStatus() != rsOtherRecording && recinfo.GetRecordingStatus() != rsOtherTuning) - menuPopup->AddButton(tr("Reactivate"), + menuPopup->AddButton(tr("Restart recording this showing"), qVariantFromValue(recinfo)); else - menuPopup->AddButton(tr("Stop recording"), + menuPopup->AddButton(tr("Stop recording this showing"), qVariantFromValue(recinfo)); } @@ -233,7 +251,7 @@ void ScheduleCommon::ShowRecordingDialog(const RecordingInfo& recinfo) { if (recinfo.GetRecordingStartTime() > now) { - menuPopup->AddButton(tr("Don't record"), + menuPopup->AddButton(tr("Don't record this showing"), qVariantFromValue(recinfo)); } @@ -261,7 +279,7 @@ void ScheduleCommon::ShowRecordingDialog(const RecordingInfo& recinfo) (!recinfo.GetSubtitle().isEmpty() || !recinfo.GetDescription().isEmpty())) )) { - menuPopup->AddButton(tr("Never record"), + menuPopup->AddButton(tr("Never record this episode"), qVariantFromValue(recinfo)); } } @@ -274,20 +292,17 @@ void ScheduleCommon::ShowRecordingDialog(const RecordingInfo& recinfo) recinfo.GetRecordingStatus() == rsOtherRecording || recinfo.GetRecordingStatus() == rsOtherTuning) { - menuPopup->AddButton(tr("Modify Recording Options"), + menuPopup->AddButton(tr("Edit options for this showing"), qVariantFromValue(recinfo)); } else { - menuPopup->AddButton(tr("Edit Options"), - qVariantFromValue(recinfo)); - - if (recinfo.GetRecordingRuleType() != kSingleRecord && - recinfo.GetRecordingRuleType() != kOneRecord) + if (recinfo.GetRecordingRuleType() != kSingleRecord) { - menuPopup->AddButton(tr("Add Override"), + menuPopup->AddButton(tr("Override this showing with options"), qVariantFromValue(recinfo)); } + } } @@ -299,19 +314,28 @@ void ScheduleCommon::ShowRecordingDialog(const RecordingInfo& recinfo) recinfo.GetRecordingStatus() == rsOtherRecording || recinfo.GetRecordingStatus() == rsOtherTuning) { - menuPopup->AddButton(tr("Modify Recording Options"), + menuPopup->AddButton(tr("Edit options for this showing"), qVariantFromValue(recinfo)); } else { - menuPopup->AddButton(tr("Edit Override"), + menuPopup->AddButton(tr("Edit override options"), qVariantFromValue(recinfo)); - menuPopup->AddButton(tr("Clear Override"), + menuPopup->AddButton(tr("Delete override rule"), qVariantFromValue(recinfo)); } } } + if (recinfo.GetRecordingRuleType() != kOverrideRecord && + recinfo.GetRecordingRuleType() != kDontRecord) + { + menuPopup->AddButton(tr("Edit recording options"), + qVariantFromValue(recinfo)); + menuPopup->AddButton(tr("Delete recording rule"), + qVariantFromValue(recinfo)); + } + popupStack->AddScreen(menuPopup); } else @@ -382,7 +406,7 @@ void ScheduleCommon::ShowNotRecordingDialog(const RecordingInfo& recinfo) (recinfo.GetRecordingStatus() != rsDontRecord) && (recinfo.GetRecordingStatus() != rsNotListed)) { - menuPopup->AddButton(tr("Reactivate"), + menuPopup->AddButton(tr("Restart recording this showing"), qVariantFromValue(recinfo)); } @@ -399,12 +423,12 @@ void ScheduleCommon::ShowNotRecordingDialog(const RecordingInfo& recinfo) recinfo.GetRecordingStatus() == rsInactive || recinfo.GetRecordingStatus() == rsLaterShowing)) { - menuPopup->AddButton(tr("Record anyway"), + menuPopup->AddButton(tr("Record this showing anyway"), qVariantFromValue(recinfo)); if (recinfo.GetRecordingStatus() == rsPreviousRecording || recinfo.GetRecordingStatus() == rsNeverRecord) { - menuPopup->AddButton(tr("Forget Previous"), + menuPopup->AddButton(tr("Forget previous recording"), qVariantFromValue(recinfo)); } } @@ -420,7 +444,7 @@ void ScheduleCommon::ShowNotRecordingDialog(const RecordingInfo& recinfo) { if (recinfo.GetRecordingStartTime() > now) { - menuPopup->AddButton(tr("Don't record"), + menuPopup->AddButton(tr("Don't record this showing"), qVariantFromValue(recinfo)); } @@ -444,29 +468,31 @@ void ScheduleCommon::ShowNotRecordingDialog(const RecordingInfo& recinfo) (!recinfo.GetSubtitle().isEmpty() || !recinfo.GetDescription().isEmpty())) )) { - menuPopup->AddButton(tr("Never record"), + menuPopup->AddButton(tr("Never record this episode"), qVariantFromValue(recinfo)); } } - menuPopup->AddButton(tr("Edit Options"), - qVariantFromValue(recinfo)); - if (recinfo.GetRecordingRuleType() != kSingleRecord && recinfo.GetRecordingRuleType() != kOneRecord && recinfo.GetRecordingStatus() != rsNotListed) { - menuPopup->AddButton(tr("Add Override"), + menuPopup->AddButton(tr("Override this showing with options"), qVariantFromValue(recinfo)); } + + menuPopup->AddButton(tr("Edit recording options"), + qVariantFromValue(recinfo)); + menuPopup->AddButton(tr("Delete recording rule"), + qVariantFromValue(recinfo)); } if (recinfo.GetRecordingRuleType() == kOverrideRecord || recinfo.GetRecordingRuleType() == kDontRecord) { - menuPopup->AddButton(tr("Edit Override"), + menuPopup->AddButton(tr("Edit override options"), qVariantFromValue(recinfo)); - menuPopup->AddButton(tr("Clear Override"), + menuPopup->AddButton(tr("Delete override rule"), qVariantFromValue(recinfo)); } } @@ -477,6 +503,52 @@ void ScheduleCommon::ShowNotRecordingDialog(const RecordingInfo& recinfo) delete menuPopup; } +/** +* \brief Creates a dialog displaying current recording status and options +* available +*/ +void ScheduleCommon::ShowNotScheduledDialog(const RecordingInfo& recinfo) +{ + QString message = recinfo.toString(ProgramInfo::kTitleSubtitle, " - "); + + message += "\n\n"; + message += toDescription(recinfo.GetRecordingStatus(), + recinfo.GetRecordingRuleType(), + recinfo.GetRecordingStartTime()); + + MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); + MythDialogBox *menuPopup = new MythDialogBox(message, popupStack, + "notSchedOptionPopup", true); + + if (menuPopup->Create()) + { + menuPopup->SetReturnEvent(this, "schedulenotscheduled"); + + QDateTime now = MythDate::current(); + + if (recinfo.GetRecordingEndTime() > now) + menuPopup->AddButton(tr("Record only this showing"), + qVariantFromValue(recinfo)); + + menuPopup->AddButton(tr("Record all showings"), + qVariantFromValue(recinfo)); + + if (!recinfo.IsGeneric()) + menuPopup->AddButton(tr("Record one showing of this episode"), + qVariantFromValue(recinfo)); + + menuPopup->AddButton(tr("Record all showings on this channel"), + qVariantFromValue(recinfo)); + + menuPopup->AddButton(tr("Record with more options"), + qVariantFromValue(recinfo)); + + popupStack->AddScreen(menuPopup); + } + else + delete menuPopup; +} + void ScheduleCommon::customEvent(QEvent *event) { if (event->type() == DialogCompletionEvent::kEventType) @@ -486,7 +558,36 @@ void ScheduleCommon::customEvent(QEvent *event) QString resultid = dce->GetId(); QString resulttext = dce->GetResultText(); - if (resultid == "schedulenotrecording") + if (resultid == "schedulenotscheduled") + { + if (!qVariantCanConvert(dce->GetData())) + return; + + RecordingInfo recInfo = qVariantValue + (dce->GetData()); + + if (resulttext == tr("Record only this showing")) + recInfo.ApplyRecordStateChange(kSingleRecord); + else if (resulttext == tr("Record all showings")) + recInfo.ApplyRecordStateChange(kAllRecord); + else if (resulttext == tr("Record one showing of this episode")) + { + recInfo.ApplyRecordStateChange(kOneRecord, false); + recInfo.GetRecordingRule()->m_filter |= 64; // This episode + recInfo.GetRecordingRule()->Save(); + } + else if (resulttext == tr("Record all showings on this channel")) + { + recInfo.ApplyRecordStateChange(kAllRecord, false); + recInfo.GetRecordingRule()->m_filter |= 1024; // This channel + recInfo.GetRecordingRule()->Save(); + } + else if (resulttext == tr("Record with more options")) + { + EditScheduled(&recInfo); + } + } + else if (resultid == "schedulenotrecording") { if (!qVariantCanConvert(dce->GetData())) return; @@ -494,33 +595,34 @@ void ScheduleCommon::customEvent(QEvent *event) RecordingInfo recInfo = qVariantValue (dce->GetData()); - if (resulttext == tr("Reactivate")) + if (resulttext == tr("Restart recording this showing")) recInfo.ReactivateRecording(); - else if (resulttext == tr("Record anyway")) + else if (resulttext == tr("Record this showing anyway")) { recInfo.ApplyRecordStateChange(kOverrideRecord); if (recInfo.GetRecordingStartTime() < MythDate::current()) recInfo.ReactivateRecording(); } - else if (resulttext == tr("Forget Previous")) + else if (resulttext == tr("Forget previous recording")) recInfo.ForgetHistory(); - else if (resulttext == tr("Don't record")) + else if (resulttext == tr("Don't record this showing")) recInfo.ApplyRecordStateChange(kDontRecord); - else if (resulttext == tr("Never record")) + else if (resulttext == tr("Never record this episode")) { recInfo.SetRecordingStatus(rsNeverRecord); recInfo.SetScheduledStartTime(MythDate::current()); recInfo.SetScheduledEndTime(recInfo.GetRecordingStartTime()); recInfo.AddHistory(true, true); } - else if (resulttext == tr("Clear Override")) + else if (resulttext == tr("Delete override rule") || + resulttext == tr("Delete recording rule")) recInfo.ApplyRecordStateChange(kNotRecording); - else if (resulttext == tr("Edit Override") || - resulttext == tr("Edit Options")) + else if (resulttext == tr("Edit override options") || + resulttext == tr("Edit recording options")) { EditScheduled(&recInfo); } - else if (resulttext == tr("Add Override")) + else if (resulttext == tr("Override this showing with options")) { MakeOverride(&recInfo); } @@ -533,27 +635,28 @@ void ScheduleCommon::customEvent(QEvent *event) RecordingInfo recInfo = qVariantValue (dce->GetData()); - if (resulttext == tr("Reactivate")) + if (resulttext == tr("Restart recording this showing")) recInfo.ReactivateRecording(); - else if (resulttext == tr("Stop recording")) + else if (resulttext == tr("Stop recording this showing")) { ProgramInfo pginfo( recInfo.GetChanID(), recInfo.GetRecordingStartTime()); if (pginfo.GetChanID()) RemoteStopRecording(&pginfo); } - else if (resulttext == tr("Don't record")) + else if (resulttext == tr("Don't record this showing")) recInfo.ApplyRecordStateChange(kDontRecord); - else if (resulttext == tr("Never record")) + else if (resulttext == tr("Never record this episode")) { recInfo.SetRecordingStatus(rsNeverRecord); recInfo.SetScheduledStartTime(MythDate::current()); recInfo.SetScheduledEndTime(recInfo.GetRecordingStartTime()); recInfo.AddHistory(true, true); } - else if (resulttext == tr("Clear Override")) + else if (resulttext == tr("Delete override rule") || + resulttext == tr("Delete recording rule")) recInfo.ApplyRecordStateChange(kNotRecording); - else if (resulttext == tr("Modify Recording Options")) + else if (resulttext == tr("Edit options for this showing")) { if (recInfo.GetRecordingRuleType() == kSingleRecord || recInfo.GetRecordingRuleType() == kOverrideRecord || @@ -562,12 +665,12 @@ void ScheduleCommon::customEvent(QEvent *event) else MakeOverride(&recInfo, true); } - else if (resulttext == tr("Edit Override") || - resulttext == tr("Edit Options")) + else if (resulttext == tr("Edit override options") || + resulttext == tr("Edit recording options")) { EditScheduled(&recInfo); } - else if (resulttext == tr("Add Override")) + else if (resulttext == tr("Override this showing with options")) { MakeOverride(&recInfo); } diff --git a/mythtv/programs/mythfrontend/schedulecommon.h b/mythtv/programs/mythfrontend/schedulecommon.h index 3f348f38f91..4e580e57924 100644 --- a/mythtv/programs/mythfrontend/schedulecommon.h +++ b/mythtv/programs/mythfrontend/schedulecommon.h @@ -25,6 +25,7 @@ class ScheduleCommon : public MythScreenType void ShowUpcoming(const QString &title, const QString &seriesid) const; void ShowUpcoming(ProgramInfo *pginfo) const; void ShowUpcomingScheduled(ProgramInfo *pginfo) const; + void QuickRecord(ProgramInfo *pginfo); void EditRecording(ProgramInfo *pginfo); void EditScheduled(ProgramInfo *pginfo); void EditScheduled(RecordingInfo *recinfo); @@ -32,6 +33,7 @@ class ScheduleCommon : public MythScreenType void MakeOverride(RecordingInfo *recinfo, bool startActive = false); void ShowRecordingDialog(const RecordingInfo &recinfo); void ShowNotRecordingDialog(const RecordingInfo &recinfo); + void ShowNotScheduledDialog(const RecordingInfo &recinfo); virtual void customEvent(QEvent*); diff --git a/mythtv/programs/mythfrontend/scheduleeditor.cpp b/mythtv/programs/mythfrontend/scheduleeditor.cpp index cdd33724f30..c4e42c3b40e 100644 --- a/mythtv/programs/mythfrontend/scheduleeditor.cpp +++ b/mythtv/programs/mythfrontend/scheduleeditor.cpp @@ -54,6 +54,7 @@ static QString fs6(QT_TRANSLATE_NOOP("SchedFilterEditor", "This episode")); static QString fs7(QT_TRANSLATE_NOOP("SchedFilterEditor", "This series")); static QString fs8(QT_TRANSLATE_NOOP("SchedFilterEditor", "This time")); static QString fs9(QT_TRANSLATE_NOOP("SchedFilterEditor", "This day and time")); +static QString fs10(QT_TRANSLATE_NOOP("SchedFilterEditor", "This channel")); void *ScheduleEditor::RunScheduleEditor(ProgramInfo *proginfo, void *player) { @@ -296,10 +297,6 @@ void ScheduleEditor::Load() new MythUIButtonListItem(m_rulesList, tr("Record one showing every day"), ENUM_TO_QVARIANT(kDailyRecord)); - if (hasChannel && !isManual) - new MythUIButtonListItem(m_rulesList, - tr("Record all showings on this channel"), - ENUM_TO_QVARIANT(kChannelRecord)); if (!isManual) new MythUIButtonListItem(m_rulesList, ("Record all showings"),