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