MythTV  master
videoselector.cpp
Go to the documentation of this file.
1 // c
2 #include <chrono>
3 #include <cstdlib>
4 #include <unistd.h>
5 
6 // qt
7 #include <QDir>
8 #include <QTimer>
9 
10 // mythtv
11 #include <mythcontext.h>
12 #include <mythdb.h>
13 #include <mythuitext.h>
14 #include <mythuibutton.h>
15 #include <mythuiimage.h>
16 #include <mythuibuttonlist.h>
17 #include <mythmainwindow.h>
18 #include <mythdialogbox.h>
19 #include <metadata/videoutils.h>
20 #include <remotefile.h>
21 
22 // mytharchive
23 #include "archiveutil.h"
24 #include "videoselector.h"
25 
26 using namespace std::chrono_literals;
27 
28 VideoSelector::VideoSelector(MythScreenStack *parent, QList<ArchiveItem *> *archiveList)
29  :MythScreenType(parent, "VideoSelector"),
30  m_archiveList(archiveList)
31 {
35 }
36 
38 {
39  delete m_videoList;
40  while (!m_selectedList.isEmpty())
41  delete m_selectedList.takeFirst();
42  m_selectedList.clear();
44 }
45 
47 {
48  // Load the theme for this screen
49  bool foundtheme = LoadWindowFromXML("mytharchive-ui.xml", "video_selector", this);
50  if (!foundtheme)
51  return false;
52 
53  bool err = false;
54  UIUtilE::Assign(this, m_okButton, "ok_button", &err);
55  UIUtilE::Assign(this, m_cancelButton, "cancel_button", &err);
56  UIUtilE::Assign(this, m_categorySelector, "category_selector", &err);
57  UIUtilE::Assign(this, m_videoButtonList, "videolist", &err);
58  UIUtilE::Assign(this, m_titleText, "videotitle", &err);
59  UIUtilE::Assign(this, m_plotText, "videoplot", &err);
60  UIUtilE::Assign(this, m_filesizeText, "filesize", &err);
61  UIUtilE::Assign(this, m_coverImage, "cover_image", &err);
62  UIUtilE::Assign(this, m_warningText, "warning_text", &err);
63  UIUtilE::Assign(this, m_plText, "parentallevel_text", &err);
64 
65  if (err)
66  {
67  LOG(VB_GENERAL, LOG_ERR, "Cannot load screen 'video_selector'");
68  return false;
69  }
70 
73 
76 
77  getVideoList();
82 
84 
86 
88 
91 
92  return true;
93 }
94 
95 bool VideoSelector::keyPressEvent(QKeyEvent *event)
96 {
97  if (GetFocusWidget()->keyPressEvent(event))
98  return true;
99 
100  QStringList actions;
101  bool handled = GetMythMainWindow()->TranslateKeyPress("Global", event, actions);
102 
103  for (int i = 0; i < actions.size() && !handled; i++)
104  {
105  QString action = actions[i];
106  handled = true;
107 
108  if (action == "MENU")
109  {
110  ShowMenu();
111  }
112  else if (action == "1")
113  {
115  }
116  else if (action == "2")
117  {
119  }
120  else if (action == "3")
121  {
123  }
124  else if (action == "4")
125  {
127  }
128  else
129  handled = false;
130  }
131 
132  if (!handled && MythScreenType::keyPressEvent(event))
133  handled = true;
134 
135  return handled;
136 }
137 
139 {
140  MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
141 
142  auto *menuPopup = new MythDialogBox(tr("Menu"), popupStack, "actionmenu");
143 
144  if (menuPopup->Create())
145  popupStack->AddScreen(menuPopup);
146 
147  menuPopup->SetReturnEvent(this, "action");
148 
149  menuPopup->AddButton(tr("Clear All"), &VideoSelector::clearAll);
150  menuPopup->AddButton(tr("Select All"), &VideoSelector::selectAll);
151 }
152 
154 {
155  while (!m_selectedList.isEmpty())
156  m_selectedList.takeFirst();
157  m_selectedList.clear();
158 
159  for (auto *v : *m_videoList)
160  m_selectedList.append(v);
161 
162  updateVideoList();
163 }
164 
166 {
167  while (!m_selectedList.isEmpty())
168  m_selectedList.takeFirst();
169  m_selectedList.clear();
170 
171  updateVideoList();
172 }
173 
175 {
177  {
178  int index = m_selectedList.indexOf(item->GetData().value<VideoInfo *>());
179  if (index != -1)
180  m_selectedList.takeAt(index);
182  }
183  else
184  {
185  int index = m_selectedList.indexOf(item->GetData().value<VideoInfo *>());
186  if (index == -1)
187  m_selectedList.append(item->GetData().value<VideoInfo *>());
188 
190  }
191 }
192 
194 {
195  auto *v = item->GetData().value<VideoInfo *>();
196 
197  if (!v)
198  return;
199 
200  if (m_titleText)
201  m_titleText->SetText(v->title);
202 
203  if (m_plotText)
204  m_plotText->SetText(v->plot);
205 
206  if (m_coverImage)
207  {
208  if (v->coverfile != "" && v->coverfile != "No Cover")
209  {
210  m_coverImage->SetFilename(v->coverfile);
211  m_coverImage->Load();
212  }
213  else
214  {
215  m_coverImage->SetFilename("blank.png");
216  m_coverImage->Load();
217  }
218  }
219 
220  if (m_filesizeText)
221  {
222  if (v->size == 0)
223  {
224  struct stat fileinfo {};
225 
226  bool bExists = RemoteFile::Exists(v->filename, &fileinfo);
227  if (bExists)
228  v->size = (uint64_t)fileinfo.st_size;
229 
230  if (!bExists)
231  {
232  LOG(VB_GENERAL, LOG_ERR,
233  QString("VideoSelector: Cannot find file: %1")
234  .arg(v->filename));
235  }
236  }
237 
238  m_filesizeText->SetText(formatSize(v->size / 1024));
239  }
240 }
241 
243 {
244  // loop though selected videos and add them to the list
245  // remove any items that have been removed from the list
246  QList<ArchiveItem *> tempAList;
247  for (auto *a : qAsConst(*m_archiveList))
248  {
249  bool found = false;
250 
251  for (const auto *v : qAsConst(m_selectedList))
252  {
253  if (a->type != "Video" || a->filename == v->filename)
254  {
255  found = true;
256  break;
257  }
258  }
259 
260  if (!found)
261  tempAList.append(a);
262  }
263 
264  for (auto *x : qAsConst(tempAList))
265  m_archiveList->removeAll(x);
266 
267  // remove any items that are already in the list
268  QList<VideoInfo *> tempSList;
269  for (auto *v : qAsConst(m_selectedList))
270  {
271  for (const auto *a : qAsConst(*m_archiveList))
272  {
273  if (a->filename == v->filename)
274  {
275  tempSList.append(v);
276  break;
277  }
278  }
279  }
280 
281  for (auto *x : qAsConst(tempSList))
282  m_selectedList.removeAll(x);
283 
284  // add all that are left
285  for (const auto *v : qAsConst(m_selectedList))
286  {
287  auto *a = new ArchiveItem;
288  a->type = "Video";
289  a->title = v->title;
290  a->subtitle = "";
291  a->description = v->plot;
292  a->startDate = "";
293  a->startTime = "";
294  a->size = v->size;
295  a->newsize = v->size;
296  a->filename = v->filename;
297  a->hasCutlist = false;
298  a->useCutlist = false;
299  a->duration = 0;
300  a->cutDuration = 0;
301  a->videoWidth = 0;
302  a->videoHeight = 0;
303  a->fileCodec = "";
304  a->videoCodec = "";
305  a->encoderProfile = nullptr;
306  a->editedDetails = false;
307  m_archiveList->append(a);
308  }
309 
310  emit haveResult(true);
311  Close();
312 }
313 
315 {
316  emit haveResult(false);
317  Close();
318 }
319 
321 {
322  if (!m_videoList)
323  return;
324 
326 
327  if (m_categorySelector)
328  {
329  for (auto *v : *m_videoList)
330  {
331  if (v->category == m_categorySelector->GetValue() ||
332  m_categorySelector->GetValue() == tr("All Videos"))
333  {
334  if (v->parentalLevel <= m_currentParentalLevel)
335  {
336  auto* item = new MythUIButtonListItem(m_videoButtonList,
337  v->title);
338  item->setCheckable(true);
339  if (m_selectedList.indexOf(v) != -1)
340  {
341  item->setChecked(MythUIButtonListItem::FullChecked);
342  }
343  else
344  {
345  item->setChecked(MythUIButtonListItem::NotChecked);
346  }
347 
348  item->SetData(QVariant::fromValue(v));
349  }
350  }
351  }
352  }
353 
354  if (m_videoButtonList->GetCount() > 0)
355  {
358  m_warningText->Hide();
359  }
360  else
361  {
362  m_warningText->Show();
363  m_titleText->Reset();
364  m_plotText->Reset();
365  m_coverImage->SetFilename("blank.png");
366  m_coverImage->Load();
368  }
369 }
370 
371 std::vector<VideoInfo *> *VideoSelector::getVideoListFromDB(void)
372 {
373  // get a list of category's
374  using CategoryMap = QMap<int, QString>;
375  CategoryMap categoryMap;
377  query.prepare("SELECT intid, category FROM videocategory");
378 
379  if (query.exec())
380  {
381  while (query.next())
382  {
383  int id = query.value(0).toInt();
384  QString category = query.value(1).toString();
385  categoryMap.insert(id, category);
386  }
387  }
388 
389  query.prepare("SELECT intid, title, plot, length, filename, coverfile, "
390  "category, showlevel, subtitle, season, episode, host "
391  "FROM videometadata ORDER BY title,season,episode");
392 
393  if (query.exec() && query.size())
394  {
395  auto *videoList = new std::vector<VideoInfo*>;
396  QString episode;
397  while (query.next())
398  {
399  // Exclude iso images as they aren't supported
400  QString filename = query.value(4).toString();
401  if (filename.endsWith(".iso") || filename.endsWith(".ISO"))
402  continue;
403 
404  auto *info = new VideoInfo;
405 
406  info->id = query.value(0).toInt();
407  if (query.value(9).toInt() > 0)
408  {
409  episode = query.value(10).toString();
410  if (episode.size() < 2)
411  episode.prepend("0");
412  info->title = QString("%1 %2x%3 - %4")
413  .arg(query.value(1).toString())
414  .arg(query.value(9).toString())
415  .arg(episode)
416  .arg(query.value(8).toString());
417  }
418  else
419  info->title = query.value(1).toString();
420 
421  info->plot = query.value(2).toString();
422  info->size = 0; //query.value(3).toInt();
423  QString host = query.value(11).toString();
424 
425  // try to find the file locally
426  if (host.isEmpty())
427  {
428  // must already be a local filename?
429  info->filename = filename;
430  }
431  else
432  {
433  // if the file is on this host then we should be able to find it locally
434  if (host == gCoreContext->GetHostName())
435  {
436  StorageGroup videoGroup("Videos", gCoreContext->GetHostName(), false);
437  info->filename = videoGroup.FindFile(filename);
438 
439  // sanity check the file exists
440  if (!QFile::exists(info->filename))
441  {
442  LOG(VB_GENERAL, LOG_ERR,
443  QString("VideoSelector: Failed to find local file '%1'").arg(info->filename));
444  info->filename.clear();
445  }
446  }
447 
448  if (info->filename.isEmpty())
449  {
450  // file must not be local or doesn't exist
451  info->filename = generate_file_url("Videos", host, filename);
452  }
453  }
454 
455  LOG(VB_FILE, LOG_INFO,
456  QString("VideoSelector: found file '%1'").arg(info->filename));
457 
458  info->coverfile = query.value(5).toString();
459  info->category = categoryMap[query.value(6).toInt()];
460  info->parentalLevel = query.value(7).toInt();
461  if (info->category.isEmpty())
462  info->category = "(None)";
463  videoList->push_back(info);
464  }
465 
466  return videoList;
467  }
468 
469  LOG(VB_GENERAL, LOG_ERR, "VideoSelector: Failed to get any videos");
470 
471  return nullptr;
472 }
473 
475 {
477  QStringList categories;
478 
479  if (m_videoList && !m_videoList->empty())
480  {
481  for (auto *v : *m_videoList)
482  {
483  if (categories.indexOf(v->category) == -1)
484  categories.append(v->category);
485  }
486  }
487  else
488  {
489  QTimer::singleShot(100ms, this, &VideoSelector::cancelPressed);
490  return;
491  }
492 
493  // sort and add categories to selector
494  categories.sort();
495 
496  if (m_categorySelector)
497  {
498  new MythUIButtonListItem(m_categorySelector, tr("All Videos"));
500 
501  for (int x = 0; x < categories.count(); x++)
502  {
503  new MythUIButtonListItem(m_categorySelector, categories[x]);
504  }
505  }
506 
507  setCategory(nullptr);
508 }
509 
511 {
512  (void)item;
513  updateVideoList();
514 }
515 
517 {
518  if (!m_videoList)
519  return;
520 
521  m_selectedList.clear();
522 
523  for (const auto *a : qAsConst(*m_archiveList))
524  {
525  for (auto *v : qAsConst(*m_videoList))
526  {
527  if (v->filename == a->filename)
528  {
529  if (m_selectedList.indexOf(v) == -1)
530  m_selectedList.append(v);
531  break;
532  }
533  }
534  }
535 }
536 
538 {
540 }
541 
543 {
544  if (passwordValid)
545  {
546  m_currentParentalLevel = newLevel;
547  updateVideoList();
548  m_plText->SetText(QString::number(newLevel));
549  }
550  else
551  ShowOkPopup(tr("You need to enter a valid password for this parental level"));
552 }
553 
MythUIButton::Clicked
void Clicked()
MSqlQuery::next
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:783
MSqlQuery
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:126
generate_file_url
QString generate_file_url(const QString &storage_group, const QString &host, const QString &path)
Definition: videoutils.h:65
VideoSelector::clearAll
void clearAll(void)
Definition: videoselector.cpp:165
VideoSelector::setCategory
void setCategory(MythUIButtonListItem *item)
Definition: videoselector.cpp:510
VideoSelector::m_categorySelector
MythUIButtonList * m_categorySelector
Definition: videoselector.h:88
MSqlQuery::size
int size(void) const
Definition: mythdbcon.h:203
MythUIButtonList::GetItemCurrent
MythUIButtonListItem * GetItemCurrent() const
Definition: mythuibuttonlist.cpp:1590
mythuitext.h
MythUIText::Reset
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
Definition: mythuitext.cpp:84
ParentalLevel::plLowest
@ plLowest
Definition: parentalcontrols.h:12
VideoSelector::m_plotText
MythUIText * m_plotText
Definition: videoselector.h:91
mythdb.h
VideoSelector::haveResult
void haveResult(bool ok)
MythScreenType::Close
virtual void Close()
Definition: mythscreentype.cpp:402
RemoteFile::Exists
static bool Exists(const QString &url, struct stat *fileinfo)
Definition: remotefile.cpp:461
MythMainWindow::TranslateKeyPress
bool TranslateKeyPress(const QString &context, QKeyEvent *e, QStringList &actions, bool allowJumps=true)
Get a list of actions for a keypress in the given context.
Definition: mythmainwindow.cpp:1142
VideoSelector::m_warningText
MythUIText * m_warningText
Definition: videoselector.h:85
StorageGroup::FindFile
QString FindFile(const QString &filename)
Definition: storagegroup.cpp:602
MythUIImage::Load
bool Load(bool allowLoadInBackground=true, bool forceStat=false)
Load the image(s), wraps ImageLoader::LoadImage()
Definition: mythuiimage.cpp:968
ParentalLevel::plMedium
@ plMedium
Definition: parentalcontrols.h:12
ParentalLevel::plHigh
@ plHigh
Definition: parentalcontrols.h:13
MythUIButtonList::itemSelected
void itemSelected(MythUIButtonListItem *item)
ParentalLevel::plLow
@ plLow
Definition: parentalcontrols.h:12
VideoSelector::toggleSelected
void toggleSelected(MythUIButtonListItem *item)
Definition: videoselector.cpp:174
mythdialogbox.h
MSqlQuery::value
QVariant value(int i) const
Definition: mythdbcon.h:198
MythScreenStack
Definition: mythscreenstack.h:16
arg
arg(title).arg(filename).arg(doDelete))
MythUIButtonListItem::FullChecked
@ FullChecked
Definition: mythuibuttonlist.h:34
VideoSelector::m_selectedList
QList< VideoInfo * > m_selectedList
Definition: videoselector.h:79
MSqlQuery::exec
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:603
category
QString category
Definition: mythplugins/mytharchive/mytharchivehelper/main.cpp:1422
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:23
MythScreenType
Screen in which all other widgets are contained and rendered.
Definition: mythscreentype.h:45
VideoSelector::m_currentParentalLevel
ParentalLevel::Level m_currentParentalLevel
Definition: videoselector.h:81
VideoSelector::getVideoListFromDB
static std::vector< VideoInfo * > * getVideoListFromDB(void)
Definition: videoselector.cpp:371
VideoSelector::updateSelectedList
void updateSelectedList(void)
Definition: videoselector.cpp:516
ParentalLevelChangeChecker
Definition: parentalcontrols.h:44
MythMainWindow::GetStack
MythScreenStack * GetStack(const QString &stackname)
Definition: mythmainwindow.cpp:329
mythuibuttonlist.h
VideoSelector::m_parentalLevelChecker
ParentalLevelChangeChecker * m_parentalLevelChecker
Definition: videoselector.h:75
mythuiimage.h
MythUIButtonList::GetCount
int GetCount() const
Definition: mythuibuttonlist.cpp:1655
VideoSelector::titleChanged
void titleChanged(MythUIButtonListItem *item)
Definition: videoselector.cpp:193
VideoSelector::m_titleText
MythUIText * m_titleText
Definition: videoselector.h:89
VideoSelector::cancelPressed
void cancelPressed(void)
Definition: videoselector.cpp:314
VideoSelector::m_videoList
std::vector< VideoInfo * > * m_videoList
Definition: videoselector.h:78
MythScreenType::GetFocusWidget
MythUIType * GetFocusWidget(void) const
Definition: mythscreentype.cpp:112
VideoSelector::selectAll
void selectAll(void)
Definition: videoselector.cpp:153
VideoInfo::id
int id
Definition: videoselector.h:28
VideoSelector::setParentalLevel
void setParentalLevel(ParentalLevel::Level level)
Definition: videoselector.cpp:537
MythUIButtonListItem
Definition: mythuibuttonlist.h:28
VideoSelector::Create
bool Create() override
Definition: videoselector.cpp:46
ArchiveItem::type
QString type
Definition: archiveutil.h:53
VideoSelector::m_archiveList
QList< ArchiveItem * > * m_archiveList
Definition: videoselector.h:77
if
if(query.exec() &&query.next())
Definition: mythplugins/mytharchive/mytharchivehelper/main.cpp:461
VideoSelector::keyPressEvent
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
Definition: videoselector.cpp:95
VideoSelector::m_plText
MythUIText * m_plText
Definition: videoselector.h:83
MythUIType::Show
void Show(void)
Definition: mythuitype.cpp:1125
MythUIButtonList::itemClicked
void itemClicked(MythUIButtonListItem *item)
remotefile.h
ParentalLevel::Level
Level
Definition: parentalcontrols.h:12
archiveutil.h
MythScreenType::SetFocusWidget
bool SetFocusWidget(MythUIType *widget=nullptr)
Definition: mythscreentype.cpp:117
MythDialogBox
Basic menu dialog, message and a list of options.
Definition: mythdialogbox.h:167
MSqlQuery::InitCon
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:535
MythScreenType::BuildFocusList
void BuildFocusList(void)
Definition: mythscreentype.cpp:222
VideoSelector::parentalLevelChanged
void parentalLevelChanged(bool passwordValid, ParentalLevel::Level newLevel)
Definition: videoselector.cpp:542
videoselector.h
VideoSelector::OKPressed
void OKPressed(void)
Definition: videoselector.cpp:242
filename
QString filename
Definition: mythplugins/mytharchive/mytharchivehelper/main.cpp:637
VideoInfo
Definition: videoselector.h:27
MythUIButtonListItem::GetData
QVariant GetData()
Definition: mythuibuttonlist.cpp:3580
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:60
ParentalLevelChangeChecker::SigResultReady
void SigResultReady(bool passwordValid, ParentalLevel::Level newLevel)
UIUtilDisp::Assign
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)
Definition: mythuiutils.h:27
VideoSelector::ShowMenu
void ShowMenu(void) override
Definition: videoselector.cpp:138
MythUIType::Hide
void Hide(void)
Definition: mythuitype.cpp:1120
VideoSelector::m_coverImage
MythUIImage * m_coverImage
Definition: videoselector.h:92
VideoSelector::m_okButton
MythUIButton * m_okButton
Definition: videoselector.h:86
MythScreenType::keyPressEvent
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
Definition: mythscreentype.cpp:414
ParentalLevelChangeChecker::Check
void Check(ParentalLevel::Level fromLevel, ParentalLevel::Level toLevel)
Definition: parentalcontrols.cpp:366
XMLParseBase::LoadWindowFromXML
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
Definition: xmlparsebase.cpp:692
MythUIButtonList::GetValue
virtual QString GetValue() const
Definition: mythuibuttonlist.cpp:1609
MythUIText::SetText
virtual void SetText(const QString &text)
Definition: mythuitext.cpp:134
VideoSelector::m_cancelButton
MythUIButton * m_cancelButton
Definition: videoselector.h:87
MythUIButtonListItem::state
CheckState state() const
Definition: mythuibuttonlist.cpp:3534
mythcontext.h
MythUIButtonList::Reset
void Reset() override
Reset the widget to it's original state, should not reset changes made by the theme.
Definition: mythuibuttonlist.cpp:114
GetMythMainWindow
MythMainWindow * GetMythMainWindow(void)
Definition: mythmainwindow.cpp:108
StorageGroup
Definition: storagegroup.h:12
VideoSelector::m_filesizeText
MythUIText * m_filesizeText
Definition: videoselector.h:90
MythUIButtonList::SetItemCurrent
void SetItemCurrent(MythUIButtonListItem *item)
Definition: mythuibuttonlist.cpp:1557
build_compdb.action
action
Definition: build_compdb.py:9
mythuibutton.h
MythCoreContext::GetHostName
QString GetHostName(void)
Definition: mythcorecontext.cpp:859
VideoSelector::VideoSelector
VideoSelector(MythScreenStack *parent, QList< ArchiveItem * > *archiveList)
Definition: videoselector.cpp:28
formatSize
static QString formatSize(int64_t sizeKB, int prec)
Definition: recordingutils.cpp:22
ArchiveItem
Definition: archiveutil.h:51
VideoSelector::~VideoSelector
~VideoSelector(void) override
Definition: videoselector.cpp:37
MythUIImage::SetFilename
void SetFilename(const QString &filename)
Must be followed by a call to Load() to load the image.
Definition: mythuiimage.cpp:676
MythUIButtonList::GetItemFirst
MythUIButtonListItem * GetItemFirst() const
Definition: mythuibuttonlist.cpp:1636
mythmainwindow.h
MythUIButtonListItem::setChecked
void setChecked(CheckState state)
Definition: mythuibuttonlist.cpp:3544
MythScreenStack::AddScreen
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Definition: mythscreenstack.cpp:52
query
MSqlQuery query(MSqlQuery::InitCon())
VideoSelector::updateVideoList
void updateVideoList(void)
Definition: videoselector.cpp:320
ShowOkPopup
MythConfirmationDialog * ShowOkPopup(const QString &message, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
Definition: mythdialogbox.cpp:557
VideoSelector::m_videoButtonList
MythUIButtonList * m_videoButtonList
Definition: videoselector.h:84
VideoSelector::getVideoList
void getVideoList(void)
Definition: videoselector.cpp:474
videoutils.h
MythUIButtonListItem::NotChecked
@ NotChecked
Definition: mythuibuttonlist.h:32
MSqlQuery::prepare
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:808