MythTV master
viewscheduled.cpp
Go to the documentation of this file.
1// C++
2#include <algorithm>
3
4// Qt
5#include <QCoreApplication>
6
7// MythTV
14#include "libmythtv/tv_actions.h" // for ACTION_CHANNELSEARCH
15#include "libmythtv/tv_play.h"
22
23// mythFrontend
24#include "guidegrid.h"
25#include "viewscheduled.h"
26
27void *ViewScheduled::RunViewScheduled(void *player, bool showTV)
28{
30 auto *vsb = new ViewScheduled(mainStack, static_cast<TV*>(player), showTV);
31
32 if (vsb->Create())
33 mainStack->AddScreen(vsb, (player == nullptr));
34 else
35 delete vsb;
36
37 return nullptr;
38}
39
40ViewScheduled::ViewScheduled(MythScreenStack *parent, TV* player, bool /*showTV*/)
41 : ScheduleCommon(parent, "ViewScheduled"),
42 m_showAll(!gCoreContext->GetBoolSetting("ViewSchedShowLevel", false)),
43 m_player(player)
44{
46 if (m_player)
48}
49
51{
53 gCoreContext->SaveBoolSetting("ViewSchedShowLevel", !m_showAll);
54
55 // if we have a player, we need to tell we are done
56 if (m_player)
57 {
58 emit m_player->RequestEmbedding(false);
60 }
61}
62
64{
65 if (!LoadWindowFromXML("schedule-ui.xml", "viewscheduled", this))
66 return false;
67
68 m_groupList = dynamic_cast<MythUIButtonList *> (GetChild("groups"));
69 m_schedulesList = dynamic_cast<MythUIButtonList *> (GetChild("schedules"));
70 m_progressBar = dynamic_cast<MythUIProgressBar *>(GetChild("recordedprogressbar"));
71
72 if (!m_schedulesList)
73 {
74 LOG(VB_GENERAL, LOG_ERR, "Theme is missing critical theme elements.");
75 return false;
76 }
77
81 this, qOverload<MythUIButtonListItem*>(&ViewScheduled::EditRecording));
82
83 m_schedulesList->SetLCDTitles(tr("Scheduled Recordings"),
84 "shortstarttimedate|channel|titlesubtitle|card");
85 m_schedulesList->SetSearchFields("titlesubtitle");
86
87 if (m_groupList)
88 {
93 m_groupList->SetLCDTitles(tr("Group List"), "");
94 }
95
98
100
101 return true;
102}
103
105{
107}
108
110{
111 LoadList(true);
112}
113
115{
116 // don't fade the screen if we are returning to the player
117 if (m_player)
118 GetScreenStack()->PopScreen(this, false);
119 else
120 GetScreenStack()->PopScreen(this, true);
121}
122
124{
127 else if (GetFocusWidget() == m_schedulesList)
129}
130
131bool ViewScheduled::keyPressEvent(QKeyEvent *event)
132{
133 // FIXME: Blackholes keypresses, not good
134 if (m_inEvent)
135 return true;
136
137 m_inEvent = true;
138
139 if (GetFocusWidget()->keyPressEvent(event))
140 {
141 m_inEvent = false;
142 return true;
143 }
144
145 QStringList actions;
146 bool handled = GetMythMainWindow()->TranslateKeyPress("TV Frontend", event,
147 actions);
148
149 for (int i = 0; i < actions.size() && !handled; i++)
150 {
151 const QString& action = actions[i];
152 handled = true;
153
154 if (action == "EDIT")
156 else if (action == "CUSTOMEDIT")
157 EditCustom();
158 else if (action == "DELETE")
159 deleteRule();
160 else if (action == "UPCOMING")
161 ShowUpcoming();
162 else if (action == "VIEWSCHEDULED")
164 else if (action == "PREVRECORDED")
165 ShowPrevious();
166 else if (action == "DETAILS" || action == "INFO")
167 ShowDetails();
168 else if (action == "GUIDE")
169 ShowGuide();
170 else if (action == ACTION_CHANNELSEARCH)
172 else if (action == "1")
173 setShowAll(true);
174 else if (action == "2")
175 setShowAll(false);
176 else if (action == "PREVVIEW" || action == "NEXTVIEW")
178 else if (action == "VIEWINPUT")
179 viewInputs();
180 else
181 handled = false;
182 }
183
184 if (m_needFill)
185 LoadList();
186
187 if (!handled && MythScreenType::keyPressEvent(event))
188 handled = true;
189
190 m_inEvent = false;
191
192 return handled;
193}
194
196{
197 QString label = tr("Options");
198
199 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
200 auto *menuPopup = new MythDialogBox(label, popupStack, "menuPopup");
201
202 if (menuPopup->Create())
203 {
204 menuPopup->SetReturnEvent(this, "menu");
205
206 if (m_showAll)
207 menuPopup->AddButton(tr("Show Important"));
208 else
209 menuPopup->AddButton(tr("Show All"));
210 menuPopup->AddButton(tr("Program Details"));
211 menuPopup->AddButton(tr("Program Guide"));
212 menuPopup->AddButton(tr("Channel Search"));
213 menuPopup->AddButton(tr("Upcoming by title"));
214 menuPopup->AddButton(tr("Upcoming scheduled"));
215 menuPopup->AddButton(tr("Previously Recorded"));
216 menuPopup->AddButton(tr("Custom Edit"));
217 menuPopup->AddButton(tr("Delete Rule"));
218 menuPopup->AddButton(tr("Show Inputs"));
219
220 popupStack->AddScreen(menuPopup);
221 }
222 else
223 {
224 delete menuPopup;
225 }
226}
227
228void ViewScheduled::LoadList(bool useExistingData)
229{
230 if (m_inFill)
231 return;
232
233 m_inFill = true;
234
236
237 QString callsign;
238 QDateTime startts;
239 QDateTime recstartts;
240 QDate group = m_currentGroup;
241
242 if (currentItem)
243 {
244 auto *currentpginfo = currentItem->GetData().value<ProgramInfo*>();
245 if (currentpginfo)
246 {
247 callsign = currentpginfo->GetChannelSchedulingID();
248 startts = currentpginfo->GetScheduledStartTime();
249 recstartts = currentpginfo->GetRecordingStartTime();
250 }
251 }
252
253 QDateTime now = MythDate::current();
254
255 QMap<int, int> toomanycounts;
256
258 if (m_groupList)
260
261 m_recgroupList.clear();
262
263 if (!useExistingData)
265
267 m_recgroupList[m_defaultGroup].setAutoDelete(false);
268
269 auto pit = m_recList.begin();
270 while (pit != m_recList.end())
271 {
272 ProgramInfo *pginfo = *pit;
273 if (pginfo == nullptr)
274 {
275 pit = m_recList.erase(pit);
276 continue;
277 }
278
280
281 const RecStatus::Type recstatus = pginfo->GetRecordingStatus();
282 if ((pginfo->GetRecordingEndTime() >= now ||
283 pginfo->GetScheduledEndTime() >= now ||
284 recstatus == RecStatus::Recording ||
285 recstatus == RecStatus::Tuning ||
286 recstatus == RecStatus::Failing) &&
287 (m_showAll ||
288 (recstatus >= RecStatus::Pending &&
289 recstatus <= RecStatus::WillRecord) ||
290 recstatus == RecStatus::DontRecord ||
291 (recstatus == RecStatus::TooManyRecordings &&
292 ++toomanycounts[pginfo->GetRecordingRuleID()] <= 1) ||
293 (recstatus > RecStatus::TooManyRecordings &&
294 recstatus != RecStatus::Repeat &&
295 recstatus != RecStatus::NeverRecord)))
296 {
297 m_inputref[pginfo->GetInputID()]++;
298 m_maxinput = std::max(pginfo->GetInputID(), m_maxinput);
299
300 QDate date = pginfo->GetRecordingStartTime().toLocalTime().date();
301 m_recgroupList[date].push_back(pginfo);
302 m_recgroupList[date].setAutoDelete(false);
303
304 m_recgroupList[m_defaultGroup].push_back(pginfo);
305
306 ++pit;
307 }
308 else
309 {
310 pit = m_recList.erase(pit);
311 continue;
312 }
313 }
314
315 if (m_groupList)
316 {
317 QString label;
318 QMap<QDate,ProgramList>::iterator dateit = m_recgroupList.begin();
319 while (dateit != m_recgroupList.end())
320 {
321 if (dateit.key().isNull())
322 label = tr("All");
323 else
324 label = MythDate::toString(
326
328 QVariant::fromValue(dateit.key()));
329 ++dateit;
330 }
331
332 // Restore group
333 if (m_recgroupList.contains(group))
334 m_currentGroup = group;
335 else
337
338 m_groupList->SetValueByData(QVariant::fromValue(m_currentGroup));
339 }
340
341 FillList();
342
343 // Restore position after a list update
344 if (!callsign.isEmpty())
345 {
347
348 int listPos = ((int) plist.size()) - 1;
349 for (int i = listPos; i >= 0; --i)
350 {
351 ProgramInfo *pginfo = plist[i];
352 if (pginfo == nullptr)
353 continue;
354 if (callsign == pginfo->GetChannelSchedulingID() &&
355 startts == pginfo->GetScheduledStartTime())
356 {
357 listPos = i;
358 break;
359 }
360 if (recstartts <= pginfo->GetRecordingStartTime())
361 listPos = i;
362 }
364 }
365
366 m_inFill = false;
367 m_needFill = false;
368}
369
370
372{
373 if (!item || m_recList.empty())
374 return;
375
376 auto group = item->GetData().value<QDate>();
377
378 m_currentGroup = group;
379
380 if (!m_inFill)
381 FillList();
382}
383
385 ProgramInfo *pginfo) const
386{
387 QString state;
388
389 const RecStatus::Type recstatus = pginfo->GetRecordingStatus();
390 if (recstatus == RecStatus::Recording ||
391 recstatus == RecStatus::Tuning)
392 {
393 state = "running";
394 }
395 else if (recstatus == RecStatus::Conflict ||
396 recstatus == RecStatus::Offline ||
397 recstatus == RecStatus::TunerBusy ||
398 recstatus == RecStatus::Failed ||
399 recstatus == RecStatus::Failing ||
400 recstatus == RecStatus::Aborted ||
401 recstatus == RecStatus::Missed)
402 {
403 state = "error";
404 }
405 else if (recstatus == RecStatus::WillRecord ||
406 recstatus == RecStatus::Pending)
407 {
408 if (m_curinput == 0 || pginfo->GetInputID() == m_curinput)
409 {
410 if (pginfo->GetRecordingPriority2() < 0)
411 state = "warning";
412 else
413 state = "normal";
414 }
415 }
416 else if (recstatus == RecStatus::Repeat ||
417 recstatus == RecStatus::NeverRecord ||
418 recstatus == RecStatus::DontRecord ||
419 (recstatus != RecStatus::DontRecord &&
420 recstatus <= RecStatus::EarlierShowing))
421 {
422 state = "disabled";
423 }
424 else
425 {
426 state = "warning";
427 }
428
429 InfoMap infoMap;
430 pginfo->ToMap(infoMap);
431 item->SetTextFromMap(infoMap, state);
432
433 item->SetProgress2(0, 100, pginfo->GetRecordedPercent());
434
435 QString rating = QString::number(pginfo->GetStars(10));
436 item->DisplayState(rating, "ratingstate");
437 item->DisplayState(state, "status");
438}
439
441{
443
444 MythUIText *norecordingText = dynamic_cast<MythUIText*>
445 (GetChild("norecordings_info"));
446
447 if (norecordingText)
448 norecordingText->SetVisible(m_recList.empty());
449
450 if (m_recList.empty())
451 return;
452
453 ProgramList plist;
454
455 if (!m_recgroupList.contains(m_currentGroup))
457
459
460 auto pit = plist.begin();
461 while (pit != plist.end())
462 {
463 ProgramInfo *pginfo = *pit;
464 if (pginfo)
465 {
466 auto *item = new MythUIButtonListItem(m_schedulesList,"",
467 QVariant::fromValue(pginfo));
468 UpdateUIListItem(item, pginfo);
469 }
470 ++pit;
471 }
472
473 MythUIText *statusText = dynamic_cast<MythUIText*>(GetChild("status"));
474 if (statusText)
475 {
476 if (m_conflictBool)
477 {
478 // Find first conflict and store in m_conflictDate field
479 for (auto & conflict : plist)
480 {
481 if (conflict->GetRecordingStatus() == RecStatus::Conflict)
482 {
483 m_conflictDate = conflict->GetRecordingStartTime()
484 .toLocalTime().date();
485 break;
486 }
487 }
488
489 // TODO: This can be templated instead of hardcoding
490 // Conflict/No Conflict
491 QString cstring = tr("Conflict %1")
494
495 statusText->SetText(cstring);
496 }
497 else
498 {
499 statusText->SetText(tr("No Conflicts"));
500 }
501 }
502
503 MythUIText *filterText = dynamic_cast<MythUIText*>(GetChild("filter"));
504 if (filterText)
505 {
506 if (m_showAll)
507 filterText->SetText(tr("All"));
508 else
509 filterText->SetText(tr("Important"));
510 }
511}
512
513// Called whenever a new recording is selected from the list of
514// recordings. This function updates the screen with the information
515// on the newly selected recording.
517{
518 if (!item)
519 return;
520
521 auto *pginfo = item->GetData().value<ProgramInfo*> ();
522 if (pginfo)
523 {
524 InfoMap infoMap;
525 pginfo->ToMap(infoMap);
526 SetTextFromMap(infoMap);
527 if (m_progressBar != nullptr)
528 m_progressBar->Set(0, 100, pginfo->GetRecordedPercent());
529
530 MythUIStateType *ratingState = dynamic_cast<MythUIStateType*>
531 (GetChild("ratingstate"));
532 if (ratingState)
533 {
534 QString rating = QString::number(pginfo->GetStars(10));
535 ratingState->DisplayState(rating);
536 }
537 }
538}
539
541{
543
544 if (!item)
545 return;
546
547 auto *pginfo = item->GetData().value<ProgramInfo*>();
548 if (!pginfo)
549 return;
550
551 auto *record = new RecordingRule();
552 if (!record->LoadByProgram(pginfo))
553 {
554 delete record;
555 return;
556 }
557
558 QString message = tr("Delete '%1' %2 rule?")
559 .arg(record->m_title, toString(pginfo->GetRecordingRuleType()));
560
561 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
562
563 auto *okPopup = new MythConfirmationDialog(popupStack, message, true);
564
565 okPopup->SetReturnEvent(this, "deleterule");
566 okPopup->SetData(QVariant::fromValue(record));
567
568 if (okPopup->Create())
569 popupStack->AddScreen(okPopup);
570 else
571 delete okPopup;
572}
573
575{
576 m_showAll = all;
577 m_needFill = true;
578}
579
581{
582 m_needFill = true;
583
584 m_curinput++;
585 while (m_curinput <= m_maxinput)
586 {
587 if (m_inputref[m_curinput] > 0)
588 return;
589 m_curinput++;
590 }
591 m_curinput = 0;
592}
593
595{
596 if (m_player)
597 emit m_player->RequestEmbedding(true);
598}
599
600void ViewScheduled::customEvent(QEvent *event)
601{
602 if (event->type() == MythEvent::kMythEventMessage)
603 {
604 auto *me = dynamic_cast<MythEvent *>(event);
605 if (me == nullptr)
606 return;
607
608 const QString& message = me->Message();
609 if (message == "SCHEDULE_CHANGE")
610 {
611 m_needFill = true;
612
613 if (m_inEvent)
614 return;
615
616 m_inEvent = true;
617
618 LoadList();
619
620 m_inEvent = false;
621 }
622 else if (message.startsWith("UPDATE_FILE_SIZE"))
623 {
624 QStringList tokens = message.simplified().split(" ");
625 if (tokens.size() < 3)
626 return;
627
628 bool ok {false};
629 uint recordingID = tokens[1].toUInt();
630 uint64_t filesize = tokens[2].toLongLong(&ok);
631
632 // Locate program
633 auto pit = m_recList.begin();
634 while (pit != m_recList.end())
635 {
636 ProgramInfo* pginfo = *pit;
637 if (pginfo && pginfo->GetRecordingID() == recordingID)
638 {
639 // Update size & progress
640 pginfo->SetFilesize(filesize);
641 uint current = pginfo->GetRecordedPercent();
643 if (pginfo->GetRecordedPercent() != current)
644 {
645 // Update display, if it's shown
648 GetItemByData(QVariant::fromValue(pginfo));
649 if (item)
650 {
651 UpdateUIListItem(item, pginfo);
652
653 // Update selected item if necessary
654 MythUIButtonListItem *selected =
656 if (item == selected)
657 updateInfo(selected);
658 }
659 }
660 break;
661 }
662 ++pit;
663 }
664 }
665 }
666 else if (event->type() == DialogCompletionEvent::kEventType)
667 {
668 auto *dce = (DialogCompletionEvent*)event;
669
670 QString resultid = dce->GetId();
671 QString resulttext = dce->GetResultText();
672 int buttonnum = dce->GetResult();
673
674 if (resultid == "deleterule")
675 {
676 auto *record = dce->GetData().value<RecordingRule *>();
677 if (record)
678 {
679 if (buttonnum > 0)
680 {
681 if (!record->Delete())
682 LOG(VB_GENERAL, LOG_ERR,
683 "Failed to delete recording rule");
684 }
685 delete record;
686 }
687
689 }
690 else if (resultid == "menu")
691 {
692 if (resulttext == tr("Show Important"))
693 {
694 setShowAll(false);
695 }
696 else if (resulttext == tr("Show All"))
697 {
698 setShowAll(true);
699 }
700 else if (resulttext == tr("Program Details"))
701 {
702 ShowDetails();
703 }
704 else if (resulttext == tr("Program Guide"))
705 {
706 ShowGuide();
707 }
708 else if (resulttext == tr("Channel Search"))
709 {
711 }
712 else if (resulttext == tr("Upcoming by title"))
713 {
714 ShowUpcoming();
715 }
716 else if (resulttext == tr("Upcoming scheduled"))
717 {
719 }
720 else if (resulttext == tr("Previously Recorded"))
721 {
722 ShowPrevious();
723 }
724 else if (resulttext == tr("Custom Edit"))
725 {
726 EditCustom();
727 }
728 else if (resulttext == tr("Delete Rule"))
729 {
730 deleteRule();
731 }
732 else if (resulttext == tr("Show Inputs"))
733 {
734 viewInputs();
735 }
736
737 if (m_needFill)
738 LoadList();
739 }
740 else
741 {
743 }
744 }
745}
746
748{
750 return item ? item->GetData().value<ProgramInfo*>() : nullptr;
751}
iterator erase(const iterator &it)
iterator begin(void)
iterator end(void)
bool empty(void) const
size_t size(void) const
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
Definition: mythdialogbox.h:40
static const Type kEventType
Definition: mythdialogbox.h:55
Dialog asking for user confirmation.
void SaveBoolSetting(const QString &key, bool newValue)
Basic menu dialog, message and a list of options.
This class is used as a container for messages.
Definition: mythevent.h:17
const QString & Message() const
Definition: mythevent.h:65
static const Type kMythEventMessage
Definition: mythevent.h:79
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)
void addListener(QObject *listener)
Add a listener to the observable.
void removeListener(QObject *listener)
Remove a listener to the observable.
virtual void PopScreen(MythScreenType *screen=nullptr, bool allowFade=true, bool deleteScreen=true)
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
void LoadInBackground(const QString &message="")
void BuildFocusList(void)
MythUIType * GetFocusWidget(void) const
MythScreenStack * GetScreenStack() const
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
bool SetFocusWidget(MythUIType *widget=nullptr)
void DisplayState(const QString &state, const QString &name)
void SetProgress2(int start, int total, int used)
void SetTextFromMap(const InfoMap &infoMap, const QString &state="")
List widget, displays list items in a variety of themeable arrangements and can trigger signals when ...
void SetLCDTitles(const QString &title, const QString &columnList="")
MythUIButtonListItem * GetItemCurrent() const
void SetItemCurrent(MythUIButtonListItem *item)
void Reset() override
Reset the widget to it's original state, should not reset changes made by the theme.
void SetSearchFields(const QString &fields)
void itemClicked(MythUIButtonListItem *item)
void SetValueByData(const QVariant &data)
void itemSelected(MythUIButtonListItem *item)
virtual void SetTextFromMap(const InfoMap &infoMap)
Progress bar widget.
void Set(int start, int total, int used)
This widget is used for grouping other widgets for display when a particular named state is called.
bool DisplayState(const QString &name)
All purpose text widget, displays a text string.
Definition: mythuitext.h:29
virtual void SetText(const QString &text)
Definition: mythuitext.cpp:115
virtual void SetVisible(bool visible)
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
Definition: mythuitype.cpp:130
Holds information on recordings and videos.
Definition: programinfo.h:74
float GetStars(void) const
Definition: programinfo.h:453
uint GetRecordingRuleID(void) const
Definition: programinfo.h:460
uint GetRecordingID(void) const
Definition: programinfo.h:457
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
Definition: programinfo.h:405
void CalculateRecordedProgress()
virtual void SetFilesize(uint64_t sz)
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
Definition: programinfo.h:412
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
Definition: programinfo.h:398
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...
uint GetInputID(void) const
Definition: programinfo.h:474
int GetRecordingPriority2(void) const
Definition: programinfo.h:452
uint GetRecordedPercent() const
Definition: programinfo.h:598
RecStatus::Type GetRecordingStatus(void) const
Definition: programinfo.h:458
QDateTime GetRecordingEndTime(void) const
Approximate time the recording should have ended, did end, or is intended to end.
Definition: programinfo.h:420
QString GetChannelSchedulingID(void) const
This is the unique programming identifier of a channel.
Definition: programinfo.h:391
Internal representation of a recording rule, mirrors the record table.
Definition: recordingrule.h:30
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
virtual int IncrRef(void)
Increments reference count.
virtual void EditScheduled(void)
Creates a dialog for editing the recording schedule.
virtual void EditRecording(bool may_watch_now=false)
Creates a dialog for editing the recording status, blocking until user leaves dialog.
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 ShowUpcomingScheduled(void) const
Show the upcoming recordings for this recording rule.
virtual void ShowGuide(void) const
Show the program guide.
virtual void ShowUpcoming(void) const
Show the upcoming recordings for this title.
virtual void ShowChannelSearch(void) const
Show the channel search.
virtual void ShowPrevious(void) const
Show the previous recordings for this recording rule.
void RequestEmbedding(bool Embed, const QRect &Rect={}, const QStringList &Data={})
Control TV playback.
Definition: tv_play.h:157
ProgramList m_recList
Definition: viewscheduled.h:85
MythUIButtonList * m_groupList
Definition: viewscheduled.h:75
void SwitchList(void)
QMap< QDate, ProgramList > m_recgroupList
Definition: viewscheduled.h:86
~ViewScheduled() override
ProgramInfo * GetCurrentProgram(void) const override
void ChangeGroup(MythUIButtonListItem *item)
void updateInfo(MythUIButtonListItem *item)
bool Create(void) override
void customEvent(QEvent *event) override
ViewScheduled(MythScreenStack *parent, TV *player=nullptr, bool showTV=false)
void Close(void) override
void setShowAll(bool all)
QDate m_defaultGroup
Definition: viewscheduled.h:89
void ShowMenu(void) override
void FillList(void)
static void * RunViewScheduled(void *player, bool showTv)
void Load(void) override
Load data which will ultimately be displayed on-screen or used to determine what appears on-screen (S...
QMap< int, int > m_inputref
Definition: viewscheduled.h:91
void Init(void) override
Used after calling Load() to assign data to widgets and other UI initilisation which is prohibited in...
MythUIProgressBar * m_progressBar
Definition: viewscheduled.h:76
void UpdateUIListItem(MythUIButtonListItem *item, ProgramInfo *pginfo) const
void viewInputs(void)
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
void LoadList(bool useExistingData=false)
QDate m_conflictDate
Definition: viewscheduled.h:70
QDate m_currentGroup
Definition: viewscheduled.h:88
MythUIButtonList * m_schedulesList
Definition: viewscheduled.h:74
void EmbedTVWindow(void)
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
unsigned int uint
Definition: compat.h:60
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MythMainWindow * GetMythMainWindow(void)
QHash< QString, QString > InfoMap
Definition: mythtypes.h:15
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:93
@ kSimplify
Do Today/Yesterday/Tomorrow transform.
Definition: mythdate.h:26
@ kDateFull
Default local time.
Definition: mythdate.h:19
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
Definition: mythdate.cpp:15
def rating(profile, smoonURL, gate)
Definition: scan.py:36
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
Definition: programinfo.h:945
AutoDeleteDeque< ProgramInfo * > ProgramList
Definition: programinfo.h:37
#define ACTION_CHANNELSEARCH
Definition: tv_actions.h:28
VERBOSE_PREAMBLE false
Definition: verbosedefs.h:80