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  QCoreApplication::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;
241  QDateTime recstartts;
242  QDate group = m_currentGroup;
243 
244  if (currentItem)
245  {
246  auto *currentpginfo = currentItem->GetData().value<ProgramInfo*>();
247  if (currentpginfo)
248  {
249  callsign = currentpginfo->GetChannelSchedulingID();
250  startts = currentpginfo->GetScheduledStartTime();
251  recstartts = currentpginfo->GetRecordingStartTime();
252  }
253  }
254 
255  QDateTime now = MythDate::current();
256 
257  QMap<int, int> toomanycounts;
258 
260  if (m_groupList)
261  m_groupList->Reset();
262 
263  m_recgroupList.clear();
264 
265  if (!useExistingData)
267 
268  auto pit = m_recList.begin();
269  QString currentDate;
271  m_recgroupList[m_defaultGroup].setAutoDelete(false);
272  while (pit != m_recList.end())
273  {
274  ProgramInfo *pginfo = *pit;
275  const RecStatus::Type recstatus = pginfo->GetRecordingStatus();
276  if ((pginfo->GetRecordingEndTime() >= now ||
277  pginfo->GetScheduledEndTime() >= now ||
278  recstatus == RecStatus::Recording ||
279  recstatus == RecStatus::Tuning ||
280  recstatus == RecStatus::Failing) &&
281  (m_showAll ||
282  (recstatus >= RecStatus::Pending &&
283  recstatus <= RecStatus::WillRecord) ||
284  recstatus == RecStatus::DontRecord ||
285  (recstatus == RecStatus::TooManyRecordings &&
286  ++toomanycounts[pginfo->GetRecordingRuleID()] <= 1) ||
287  (recstatus > RecStatus::TooManyRecordings &&
288  recstatus != RecStatus::Repeat &&
289  recstatus != RecStatus::NeverRecord)))
290  {
291  m_inputref[pginfo->GetInputID()]++;
292  if (pginfo->GetInputID() > m_maxinput)
293  m_maxinput = pginfo->GetInputID();
294 
295  QDate date = pginfo->GetRecordingStartTime().toLocalTime().date();
296  m_recgroupList[date].push_back(pginfo);
297  m_recgroupList[date].setAutoDelete(false);
298 
299  m_recgroupList[m_defaultGroup].push_back(pginfo);
300 
301  ++pit;
302  }
303  else
304  {
305  pit = m_recList.erase(pit);
306  continue;
307  }
308  }
309 
310  if (m_groupList)
311  {
312  QString label;
313  QMap<QDate,ProgramList>::iterator dateit = m_recgroupList.begin();
314  while (dateit != m_recgroupList.end())
315  {
316  if (dateit.key().isNull())
317  label = tr("All");
318  else
319  label = MythDate::toString(
320  dateit.key(), MythDate::kDateFull | MythDate::kSimplify);
321 
323  QVariant::fromValue(dateit.key()));
324  ++dateit;
325  }
326 
327  // Restore group
328  if (m_recgroupList.contains(group))
329  m_currentGroup = group;
330  else
332 
333  m_groupList->SetValueByData(QVariant::fromValue(m_currentGroup));
334  }
335 
336  FillList();
337 
338  // Restore position after a list update
339  if (!callsign.isEmpty())
340  {
342 
343  int listPos = ((int) plist.size()) - 1;
344  for (int i = listPos; i >= 0; --i)
345  {
346  ProgramInfo *pginfo = plist[i];
347  if (callsign == pginfo->GetChannelSchedulingID() &&
348  startts == pginfo->GetScheduledStartTime())
349  {
350  listPos = i;
351  break;
352  }
353  if (recstartts <= pginfo->GetRecordingStartTime())
354  listPos = i;
355  }
357  }
358 
359  m_inFill = false;
360  m_needFill = false;
361 }
362 
363 
365 {
366  if (!item || m_recList.empty())
367  return;
368 
369  auto group = item->GetData().value<QDate>();
370 
371  m_currentGroup = group;
372 
373  if (!m_inFill)
374  FillList();
375 }
376 
378 {
380 
381  MythUIText *norecordingText = dynamic_cast<MythUIText*>
382  (GetChild("norecordings_info"));
383 
384  if (norecordingText)
385  norecordingText->SetVisible(m_recList.empty());
386 
387  if (m_recList.empty())
388  return;
389 
390  ProgramList plist;
391 
392  if (!m_recgroupList.contains(m_currentGroup))
394 
396 
397  auto pit = plist.begin();
398  while (pit != plist.end())
399  {
400  ProgramInfo *pginfo = *pit;
401  if (!pginfo)
402  {
403  ++pit;
404  continue;
405  }
406 
407  QString state;
408 
409  const RecStatus::Type recstatus = pginfo->GetRecordingStatus();
410  if (recstatus == RecStatus::Recording ||
411  recstatus == RecStatus::Tuning)
412  state = "running";
413  else if (recstatus == RecStatus::Conflict ||
414  recstatus == RecStatus::Offline ||
415  recstatus == RecStatus::TunerBusy ||
416  recstatus == RecStatus::Failed ||
417  recstatus == RecStatus::Failing ||
418  recstatus == RecStatus::Aborted ||
419  recstatus == RecStatus::Missed)
420  state = "error";
421  else if (recstatus == RecStatus::WillRecord ||
422  recstatus == RecStatus::Pending)
423  {
424  if (m_curinput == 0 || pginfo->GetInputID() == m_curinput)
425  {
426  if (pginfo->GetRecordingPriority2() < 0)
427  state = "warning";
428  else
429  state = "normal";
430  }
431  }
432  else if (recstatus == RecStatus::Repeat ||
433  recstatus == RecStatus::NeverRecord ||
434  recstatus == RecStatus::DontRecord ||
435  (recstatus != RecStatus::DontRecord &&
436  recstatus <= RecStatus::EarlierShowing))
437  state = "disabled";
438  else
439  state = "warning";
440 
441  auto *item = new MythUIButtonListItem(m_schedulesList,"",
442  QVariant::fromValue(pginfo));
443 
444  InfoMap infoMap;
445  pginfo->ToMap(infoMap);
446  item->SetTextFromMap(infoMap, state);
447 
448  QString rating = QString::number(pginfo->GetStars(10));
449  item->DisplayState(rating, "ratingstate");
450  item->DisplayState(state, "status");
451 
452  ++pit;
453  }
454 
455  MythUIText *statusText = dynamic_cast<MythUIText*>(GetChild("status"));
456  if (statusText)
457  {
458  if (m_conflictBool)
459  {
460  // Find first conflict and store in m_conflictDate field
461  for (auto & conflict : plist)
462  {
463  if (conflict->GetRecordingStatus() == RecStatus::Conflict)
464  {
465  m_conflictDate = conflict->GetRecordingStartTime()
466  .toLocalTime().date();
467  break;
468  }
469  }
470 
471  // TODO: This can be templated instead of hardcoding
472  // Conflict/No Conflict
473  QString cstring = tr("Conflict %1")
476 
477  statusText->SetText(cstring);
478  }
479  else
480  statusText->SetText(tr("No Conflicts"));
481  }
482 
483  MythUIText *filterText = dynamic_cast<MythUIText*>(GetChild("filter"));
484  if (filterText)
485  {
486  if (m_showAll)
487  filterText->SetText(tr("All"));
488  else
489  filterText->SetText(tr("Important"));
490  }
491 }
492 
494 {
495  if (!item)
496  return;
497 
498  auto *pginfo = item->GetData().value<ProgramInfo*> ();
499  if (pginfo)
500  {
501  InfoMap infoMap;
502  pginfo->ToMap(infoMap);
503  SetTextFromMap(infoMap);
504 
505  MythUIStateType *ratingState = dynamic_cast<MythUIStateType*>
506  (GetChild("ratingstate"));
507  if (ratingState)
508  {
509  QString rating = QString::number(pginfo->GetStars(10));
510  ratingState->DisplayState(rating);
511  }
512  }
513 }
514 
516 {
518 
519  if (!item)
520  return;
521 
522  auto *pginfo = item->GetData().value<ProgramInfo*>();
523  if (!pginfo)
524  return;
525 
526  auto *record = new RecordingRule();
527  if (!record->LoadByProgram(pginfo))
528  {
529  delete record;
530  return;
531  }
532 
533  QString message = tr("Delete '%1' %2 rule?").arg(record->m_title)
534  .arg(toString(pginfo->GetRecordingRuleType()));
535 
536  MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
537 
538  auto *okPopup = new MythConfirmationDialog(popupStack, message, true);
539 
540  okPopup->SetReturnEvent(this, "deleterule");
541  okPopup->SetData(QVariant::fromValue(record));
542 
543  if (okPopup->Create())
544  popupStack->AddScreen(okPopup);
545  else
546  delete okPopup;
547 }
548 
550 {
551  m_showAll = all;
552  m_needFill = true;
553 }
554 
556 {
557  m_needFill = true;
558 
559  m_curinput++;
560  while (m_curinput <= m_maxinput)
561  {
562  if (m_inputref[m_curinput] > 0)
563  return;
564  m_curinput++;
565  }
566  m_curinput = 0;
567 }
568 
570 {
571  if (m_player)
572  m_player->StartEmbedding(QRect());
573 }
574 
575 void ViewScheduled::customEvent(QEvent *event)
576 {
577  if (event->type() == MythEvent::MythEventMessage)
578  {
579  auto *me = dynamic_cast<MythEvent *>(event);
580  if (me == nullptr)
581  return;
582 
583  const QString& message = me->Message();
584  if (message != "SCHEDULE_CHANGE")
585  return;
586 
587  m_needFill = true;
588 
589  if (m_inEvent)
590  return;
591 
592  m_inEvent = true;
593 
594  LoadList();
595 
596  m_inEvent = false;
597  }
598  else if (event->type() == DialogCompletionEvent::kEventType)
599  {
600  auto *dce = (DialogCompletionEvent*)(event);
601 
602  QString resultid = dce->GetId();
603  QString resulttext = dce->GetResultText();
604  int buttonnum = dce->GetResult();
605 
606  if (resultid == "deleterule")
607  {
608  auto *record = dce->GetData().value<RecordingRule *>();
609  if (record)
610  {
611  if (buttonnum > 0)
612  {
613  if (!record->Delete())
614  LOG(VB_GENERAL, LOG_ERR,
615  "Failed to delete recording rule");
616  }
617  delete record;
618  }
619 
620  EmbedTVWindow();
621  }
622  else if (resultid == "menu")
623  {
624  if (resulttext == tr("Show Important"))
625  {
626  setShowAll(false);
627  }
628  else if (resulttext == tr("Show All"))
629  {
630  setShowAll(true);
631  }
632  else if (resulttext == tr("Program Details"))
633  {
634  ShowDetails();
635  }
636  else if (resulttext == tr("Program Guide"))
637  {
638  ShowGuide();
639  }
640  else if (resulttext == tr("Channel Search"))
641  {
643  }
644  else if (resulttext == tr("Upcoming by title"))
645  {
646  ShowUpcoming();
647  }
648  else if (resulttext == tr("Upcoming scheduled"))
649  {
651  }
652  else if (resulttext == tr("Previously Recorded"))
653  {
654  ShowPrevious();
655  }
656  else if (resulttext == tr("Custom Edit"))
657  {
658  EditCustom();
659  }
660  else if (resulttext == tr("Delete Rule"))
661  {
662  deleteRule();
663  }
664  else if (resulttext == tr("Show Inputs"))
665  {
666  viewInputs();
667  }
668 
669  if (m_needFill)
670  LoadList();
671  }
672  else
674  }
675 }
676 
678 {
680  return item ? item->GetData().value<ProgramInfo*>() : nullptr;
681 }
This widget is used for grouping other widgets for display when a particular named state is called.
void customEvent(QEvent *event) override
iterator erase(iterator it)
float GetStars(void) const
Definition: programinfo.h:436
void updateInfo(MythUIButtonListItem *item)
MythScreenStack * GetScreenStack() const
void ChangeGroup(MythUIButtonListItem *item)
uint GetInputID(void) const
Definition: programinfo.h:457
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.
~ViewScheduled() override
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:73
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:31
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
static void * RunViewScheduled(void *player, bool showTv)
void FillList(void)
iterator begin(void)
void BuildFocusList(void)
static Type kEventType
Definition: mythdialogbox.h:57
bool StartEmbedding(const QRect &embedRect)
Definition: tv_play.cpp:8469
void SwitchList(void)
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
Definition: programinfo.h:384
Holds information on recordings and videos.
Definition: programinfo.h:67
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:377
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:280
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:391
void customEvent(QEvent *event) override
virtual void EditCustom(void)
Creates a dialog for creating a custom recording rule.
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:101
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 *event) override
Key event handler.
QDate m_currentGroup
Definition: viewscheduled.h:80
RecStatus::Type GetRecordingStatus(void) const
Definition: programinfo.h:441
MythUIButtonList * m_schedulesList
Definition: viewscheduled.h:67
void SetLCDTitles(const QString &title, const QString &columnList="")
int GetRecordingPriority2(void) const
Definition: programinfo.h:435
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:443
bool DisplayState(const QString &name)
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
Definition: programinfo.h:398
QDateTime GetRecordingEndTime(void) const
Approximate time the recording should have ended, did end, or is intended to end.
Definition: programinfo.h:406
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
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
Definition: programinfo.h:877
void SaveBoolSetting(const QString &key, bool newValue)
ProgramList m_recList
Definition: viewscheduled.h:77
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:41
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
Definition: mythuitype.cpp:130
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
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:23