MythTV  master
lyricsview.cpp
Go to the documentation of this file.
1 #include <iostream>
2 #include <cstdlib>
3 #include <unistd.h>
4 
5 // qt
6 #include <QKeyEvent>
7 #include <QRegExp>
8 #include <QThread>
9 #include <QDomDocument>
10 
11 // myth
12 #include <mythcontext.h>
13 #include <mythversion.h>
14 #include <mythdbcon.h>
15 #include <mythmainwindow.h>
16 #include <mythuibuttonlist.h>
17 #include <mythuicheckbox.h>
18 #include <mythuitext.h>
19 #include <mythuibutton.h>
20 #include <mythuitextedit.h>
21 #include <mythuiutils.h>
22 #include <mythdialogbox.h>
23 #include <mythuistatetype.h>
24 #include <mythuiprogressbar.h>
25 #include <mythdownloadmanager.h>
26 #include <mythuihelper.h>
27 #include <mythdirs.h>
28 #include <audiooutput.h>
29 
30 
31 // mythmusic
32 #include "musiccommon.h"
33 #include "lyricsview.h"
34 #include "musicplayer.h"
35 
37 // LyricsView
38 
40  : MusicCommon(parent, parentScreen, "lyricsview")
41 {
43 
45 }
46 
48 {
49  if (m_lyricData)
50  {
51  m_lyricData->disconnect();
52  m_lyricData = nullptr;
53  }
54 
56 }
57 
59 {
60  QString windowName = gPlayer->getPlayMode() == MusicPlayer::PLAYMODE_RADIO ? "streamlyricsview" : "trackslyricsview";
61 
62  // Load the theme for this screen
63  bool err = LoadWindowFromXML("music-ui.xml", windowName, this);
64 
65  if (!err)
66  return false;
67 
68  // find common widgets available on any view
69  err = CreateCommon();
70 
71  // find widgets specific to this view
72  UIUtilE::Assign(this, m_lyricsList, "lyrics_list", &err);
73  UIUtilW::Assign(this, m_statusText, "status_text");
74  UIUtilW::Assign(this, m_loadingState, "loading_state");
75 
76  // for streams
77  UIUtilW::Assign(this, m_bufferStatus, "bufferstatus", &err);
78  UIUtilW::Assign(this, m_bufferProgress, "bufferprogress", &err);
79 
80  if (err)
81  {
82  LOG(VB_GENERAL, LOG_ERR, QString("Cannot load screen '%1'").arg(windowName));
83  return false;
84  }
85 
86  connect(m_lyricsList, SIGNAL(itemClicked(MythUIButtonListItem*)), this, SLOT(setLyricTime()));
87 
89 
90  findLyrics();
91 
92  return true;
93 }
94 
95 void LyricsView::customEvent(QEvent *event)
96 {
97  bool handled = false;
98 
99  if (event->type() == MusicPlayerEvent::TrackChangeEvent)
100  {
101  findLyrics();
102  }
103  else if (event->type() == MusicPlayerEvent::PlayedTracksChangedEvent)
104  {
105  findLyrics();
106  }
107  else if (event->type() == OutputEvent::Info)
108  {
109  if (m_autoScroll)
110  {
111  OutputEvent *oe = dynamic_cast<OutputEvent *>(event);
113 
114  if (!oe || !curMeta)
115  return;
116 
117  int rs = 0;
118 
120  {
121  rs = gPlayer->getCurrentTrackTime() * 1000;
122  }
123  else
124  rs = oe->elapsedSeconds() * 1000;
125 
126  int pos = 0;
127  for (int x = 0; x < m_lyricsList->GetCount(); x++)
128  {
130  LyricsLine *lyric = item->GetData().value<LyricsLine*>();
131  if (lyric)
132  {
133  if (lyric->m_time > 1000 && rs >= lyric->m_time)
134  pos = x;
135  }
136  }
137 
139  }
140  }
141  else if (event->type() == DialogCompletionEvent::kEventType)
142  {
143  DialogCompletionEvent *dce = static_cast<DialogCompletionEvent*>(event);
144 
145  // make sure the user didn't ESCAPE out of the menu
146  if (dce->GetResult() < 0)
147  return;
148 
149  QString resultid = dce->GetId();
150  QString resulttext = dce->GetResultText();
151  if (resultid == "actionmenu")
152  {
153  if (resulttext == tr("Save Lyrics"))
154  {
155  saveLyrics();
156  }
157  else if (resulttext == tr("Edit Lyrics"))
158  {
159  editLyrics();
160  }
161  else if (resulttext == tr("Add Lyrics"))
162  {
163  editLyrics();
164  }
165  else if (resulttext == tr("Auto Scroll Lyrics"))
166  {
167  m_autoScroll = true;
168  }
169 
170  handled = true;
171  }
172  else if (resultid == "findlyricsmenu")
173  {
174  if (dce->GetResult() >= 0)
175  {
176  QString grabber = dce->GetData().toString();
177  m_lyricData->clear();
178  findLyrics(grabber);
179  }
180 
181  handled = true;
182  }
183  }
184  else if (event->type() == DecoderHandlerEvent::OperationStart)
185  {
186  DecoderHandlerEvent *dhe = dynamic_cast<DecoderHandlerEvent*>(event);
187  if (!dhe)
188  return;
189  if (dhe->getMessage() && m_bufferStatus)
190  {
192  }
193  }
194  else if (event->type() == DecoderHandlerEvent::BufferStatus)
195  {
196  DecoderHandlerEvent *dhe = dynamic_cast<DecoderHandlerEvent*>(event);
197  if (!dhe)
198  return;
199 
200  int available, maxSize;
201  dhe->getBufferStatus(&available, &maxSize);
202 
203  if (m_bufferStatus)
204  {
205  QString status = QString("%1%").arg((int)(100.0 / ((double)maxSize / (double)available)));
206  m_bufferStatus->SetText(status);
207  }
208 
209  if (m_bufferProgress)
210  {
211  m_bufferProgress->SetTotal(maxSize);
212  m_bufferProgress->SetUsed(available);
213  }
214  }
215  else if (event->type() == DecoderHandlerEvent::OperationStop)
216  {
217  if (m_bufferStatus)
219  }
220 
221  if (!handled)
223 }
224 
226 {
227  QString label = tr("Actions");
228 
229  MythMenu *menu = new MythMenu(label, this, "actionmenu");
230 
231  if (m_lyricData)
232  {
233  menu->AddItem(tr("Find Lyrics"), nullptr, createFindLyricsMenu());
234 
236  {
237  if (m_lyricData->lyrics()->count())
238  menu->AddItem(tr("Edit Lyrics"), nullptr, nullptr);
239  else
240  menu->AddItem(tr("Add Lyrics"), nullptr, nullptr);
241 
242  if (m_lyricData->lyrics()->count() && m_lyricData->changed())
243  menu->AddItem(tr("Save Lyrics"), nullptr, nullptr);
244  }
245 
246  if (!m_autoScroll)
247  menu->AddItem(tr("Auto Scroll Lyrics"), nullptr, nullptr);
248  }
249 
250  menu->AddItem(tr("Other Options"), nullptr, createMainMenu());
251 
252  MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
253 
254  MythDialogBox *menuPopup = new MythDialogBox(menu, popupStack, "actionmenu");
255 
256  if (menuPopup->Create())
257  popupStack->AddScreen(menuPopup);
258  else
259  delete menuPopup;
260 }
261 
263 {
264  QString label = tr("Find Lyrics");
265 
266  MythMenu *menu = new MythMenu(label, this, "findlyricsmenu");
267  menu->AddItem(tr("Search All Grabbers"), qVariantFromValue(QString("ALL")));
268 
269  QStringList strList("MUSIC_LYRICS_GETGRABBERS");
270  if (gCoreContext->SendReceiveStringList(strList))
271  {
272  for (int x = 1; x < strList.count(); x++)
273  menu->AddItem(tr("Search %1").arg(strList.at(x)), qVariantFromValue(strList.at(x)));
274  }
275 
276  return menu;
277 }
278 
279 bool LyricsView::keyPressEvent(QKeyEvent *event)
280 {
281  bool handled = false;
282  QStringList actions;
283 
284  if (GetFocusWidget() && GetFocusWidget()->keyPressEvent(event))
285  {
286  // if the lyrics list widget has focus and the UP/DOWN or PAGEUP/PAGEDOWN keys
287  // are pressed turn off auto scroll
288  if (GetFocusWidget() == m_lyricsList)
289  {
290  GetMythMainWindow()->TranslateKeyPress("Global", event, actions);
291  if (actions.contains("UP") || actions.contains("DOWN") ||
292  actions.contains("PAGEUP") || actions.contains("PAGEDOWN"))
293  m_autoScroll = false;
294  }
295 
296  return true;
297  }
298 
299  handled = GetMythMainWindow()->TranslateKeyPress("Music", event, actions);
300 
301  for (int i = 0; i < actions.size() && !handled; i++)
302  {
303  QString action = actions[i];
304  handled = true;
305 
306  if (action == "EDIT")
307  {
308  if (GetFocusWidget() == m_lyricsList)
309  {
311  editLyrics();
312  }
313  else
314  {
315  // pass the EDIT action on for normal tracks if not on the lyrics list
317  handled = false;
318  }
319  }
320  else if (GetFocusWidget() == m_lyricsList && (action == "MARK" || action == "SELECT"))
321  {
322  setLyricTime();
323  }
324  else
325  handled = false;
326  }
327 
328  if (!handled && MusicCommon::keyPressEvent(event))
329  handled = true;
330 
331  return handled;
332 }
333 
335 {
336  // change the time of the next lyric to the playback time
338  {
340 
342  if (item)
343  {
344  LyricsLine *lyric = item->GetData().value<LyricsLine*>();
345  if (lyric)
346  {
347  lyric->m_time = gPlayer->getOutput()->GetAudiotime() - 750;
348  m_lyricData->setChanged(true);
350  m_autoScroll = false;
351  }
352  }
353  }
354 }
355 
356 void LyricsView::findLyrics(const QString &grabber)
357 {
358  if (m_lyricData)
359  {
360  if (m_lyricData->changed())
361  m_lyricData->save();
362 
363  m_lyricData->disconnect();
364  m_lyricData = nullptr;
365  }
366 
367  MusicMetadata *mdata = nullptr;
368 
370  {
371  if (gPlayer->getPlayedTracksList().count())
372  mdata = gPlayer->getPlayedTracksList().last();
373  }
374  else
375  mdata = gPlayer->getCurrentMetadata();
376 
377  if (!mdata)
378  return;
379 
380  m_lyricsList->Reset();
381 
382  if (m_loadingState)
384 
385  m_lyricData = mdata->getLyricsData();
386 
387  connect(m_lyricData, SIGNAL(statusChanged(LyricsData::Status, const QString&)),
388  this, SLOT(lyricStatusChanged(LyricsData::Status, const QString&)));
389 
390  m_lyricData->findLyrics(grabber);
391 }
392 
393 void LyricsView::lyricStatusChanged(LyricsData::Status status, const QString &message)
394 {
395  switch (status)
396  {
398  {
399  showMessage(message);
400  break;
401  }
402 
404  {
405  if (m_loadingState)
407 
408  showMessage(message);
409  break;
410  }
411 
413  {
414  showLyrics();
415  break;
416  }
417 
418  default:
419  if (m_loadingState)
421 
422  showMessage("");
423  break;
424  }
425 }
426 
427 void LyricsView::showMessage(const QString &message)
428 {
429  if (m_statusText)
430  {
431  if (message.isEmpty())
432  {
433  m_statusText->Reset();
434  m_statusText->Hide();
435  }
436  else
437  {
438  m_statusText->SetText(message);
439  m_statusText->Show();
440  }
441  }
442 }
443 
445 {
446  if (m_loadingState)
448 
449  showMessage("");
450 
451  m_lyricsList->Reset();
452 
453  QString syncronized = m_lyricData->syncronized() ? tr("Syncronized") : tr("Unsyncronized");
454  new MythUIButtonListItem(m_lyricsList, tr("** Lyrics from %1 (%2) **").arg(m_lyricData->grabber()).arg(syncronized));
455 
456  QMap<int, LyricsLine*>::iterator i = m_lyricData->lyrics()->begin();
457  while (i != m_lyricData->lyrics()->end())
458  {
459  LyricsLine *line = (*i);
460  if (line)
461  new MythUIButtonListItem(m_lyricsList, line->m_lyric, qVariantFromValue(line));
462  ++i;
463  }
464 
465  m_autoScroll = true;
466 }
467 
469 {
470  if (m_lyricData)
471  m_lyricData->save();
472 }
473 
475 {
477 
478  EditLyricsDialog *editDialog = new EditLyricsDialog(mainStack, m_lyricData);
479 
480  if (!editDialog->Create())
481  {
482  delete editDialog;
483  return;
484  }
485  connect(editDialog, SIGNAL(haveResult(bool)), this, SLOT(editFinished(bool)));
486  mainStack->AddScreen(editDialog);
487 }
488 
489 void LyricsView::editFinished(bool result)
490 {
491  if (result)
492  showLyrics();
493 }
494 
496 // EditLyricsDialog
497 
499  MythScreenStack *parent, LyricsData *sourceData) :
500  MythScreenType(parent, "EditLyricsDialog"),
501  m_sourceData(sourceData)
502 {
503 }
504 
506 {
507  // Load the theme for this screen
508  bool foundtheme = LoadWindowFromXML("music-ui.xml", "editlyrics", this);
509  if (!foundtheme)
510  return false;
511 
512  bool err = false;
513  UIUtilE::Assign(this, m_grabberEdit, "grabberedit", &err);
514  UIUtilE::Assign(this, m_syncronizedCheck, "syncronizedcheck", &err);
515  UIUtilE::Assign(this, m_titleEdit, "titleedit", &err);
516  UIUtilE::Assign(this, m_artistEdit, "artistedit", &err);
517  UIUtilE::Assign(this, m_albumEdit, "albumedit", &err);
518  UIUtilE::Assign(this, m_lyricsEdit, "lyricsedit", &err);
519  UIUtilE::Assign(this, m_okButton, "okbutton", &err);
520  UIUtilE::Assign(this, m_cancelButton, "cancelbutton", &err);
521 
522  if (err)
523  {
524  LOG(VB_GENERAL, LOG_ERR, "Cannot load screen 'editlyrics'");
525  return false;
526  }
527 
528  connect(m_okButton, SIGNAL(Clicked()), this, SLOT(okPressed()));
529  connect(m_cancelButton, SIGNAL(Clicked()), this, SLOT(cancelPressed()));
530  connect(m_syncronizedCheck, SIGNAL(toggled(bool)), this, SLOT(syncronizedChanged(bool)));
531 
537 
538  loadLyrics();
539 
540  BuildFocusList();
541 
542  return true;
543 }
544 
545 bool EditLyricsDialog::keyPressEvent(QKeyEvent *event)
546 {
547  bool handled = false;
548  QStringList actions;
549 
550  if (GetFocusWidget()->keyPressEvent(event))
551  return true;
552 
553  handled = GetMythMainWindow()->TranslateKeyPress("Music", event, actions);
554 
555  for (int i = 0; i < actions.size() && !handled; i++)
556  {
557  QString action = actions[i];
558 
559  if (action == "ESCAPE" && somethingChanged())
560  {
561  cancelPressed();
562  return true;
563  }
564  }
565 
566  return MythScreenType::keyPressEvent(event);
567 }
568 
570 {
571  QString lyrics;
572  QMap<int, LyricsLine*>::iterator i = m_sourceData->lyrics()->begin();
573  while (i != m_sourceData->lyrics()->end())
574  {
575  LyricsLine *line = (*i);
576  ++i;
577 
579 
580  if (i != m_sourceData->lyrics()->end())
581  lyrics += '\n';
582  }
583 
584  m_lyricsEdit->SetText(lyrics);
585 }
586 
588 {
589  (void) syncronized;
590 
591  loadLyrics();
592 }
593 
595 {
596  bool changed = false;
597 
598  changed |= m_sourceData->artist() != m_artistEdit->GetText();
599  changed |= m_sourceData->album() != m_albumEdit->GetText();
600  changed |= m_sourceData->title() != m_titleEdit->GetText();
601  changed |= m_sourceData->grabber() != m_grabberEdit->GetText();
603 
604  QStringList lines = m_lyricsEdit->GetText().split('\n');
605 
606  if (lines.count() != m_sourceData->lyrics()->count())
607  return true;
608 
609  int x = 0;
610  QMap<int, LyricsLine*>::iterator i = m_sourceData->lyrics()->begin();
611  while (i != m_sourceData->lyrics()->end())
612  {
613  LyricsLine *line = (*i);
614  if (line->toString(m_sourceData->syncronized()) != lines.at(x))
615  changed = true;
616 
617  ++i;
618  ++x;
619  }
620 
621  return changed;
622 }
623 
625 {
626  if (!somethingChanged())
627  {
628  emit haveResult(false);
629  Close();
630  return;
631  }
632 
633  QStringList lyrics = m_lyricsEdit->GetText().split('\n');
634 
635  m_sourceData->setChanged(true);
641  m_sourceData->setLyrics(lyrics);
642  m_sourceData->save();
643  m_sourceData->setChanged(false);
644 
645  emit haveResult(true);
646  Close();
647 }
648 
650 {
651  if (!ok)
652  {
653  emit haveResult(false);
654  Close();
655  return;
656  }
657 
658  okPressed();
659 }
660 
662 {
663  if (somethingChanged())
664  {
665  ShowOkPopup(tr("Save changes?"), this, SLOT(saveEdits(bool)), true);
666  return;
667  }
668 
669  emit haveResult(false);
670  Close();
671 }
static Type Info
Definition: output.h:63
void setGrabber(const QString &grabber)
Definition: lyricsdata.h:63
MythUIButtonList * m_lyricsList
Definition: lyricsview.h:47
void Show(void)
void customEvent(QEvent *event) override
Definition: lyricsview.cpp:95
void lyricStatusChanged(LyricsData::Status status, const QString &message)
Definition: lyricsview.cpp:393
MusicPlayer * gPlayer
Definition: musicplayer.cpp:35
QString title(void)
Definition: lyricsdata.h:71
MusicMetadata * getCurrentMetadata(void)
get the metadata for the current track in the playlist
MythUIText * m_statusText
Definition: lyricsview.h:48
MythUIText * m_bufferStatus
Definition: lyricsview.h:50
bool TranslateKeyPress(const QString &context, QKeyEvent *e, QStringList &actions, bool allowJumps=true)
Get a list of actions for a keypress in the given context.
MythConfirmationDialog * ShowOkPopup(const QString &message, QObject *parent, const char *slot, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
void setChanged(bool changed)
Definition: lyricsdata.h:81
LyricsData * m_lyricData
Definition: lyricsview.h:53
MythUIButton * m_cancelButton
Definition: lyricsview.h:92
int getCurrentTrackTime(void)
Definition: musicplayer.h:136
MusicView m_currentView
Definition: musiccommon.h:139
void removeListener(QObject *listener)
Remove a listener to the observable.
Basic menu dialog, message and a list of options.
EditLyricsDialog(MythScreenStack *parent, LyricsData *sourceData)
Definition: lyricsview.cpp:498
bool somethingChanged(void)
Definition: lyricsview.cpp:594
QString artist(void)
Definition: lyricsdata.h:65
MythUITextEdit * m_lyricsEdit
Definition: lyricsview.h:91
void customEvent(QEvent *event) override
virtual void SetText(const QString &text)
Definition: mythuitext.cpp:136
bool isPlaying(void)
Definition: musicplayer.h:102
void setTitle(const QString &title)
Definition: lyricsdata.h:72
MythScreenStack * GetStack(const QString &stackname)
MythUICheckBox * m_syncronizedCheck
Definition: lyricsview.h:87
void haveResult(bool ok)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
MythScreenStack * GetMainStack()
Events sent by the DecoderHandler and it's helper classes.
void addListener(QObject *listener)
Add a listener to the observable.
MythUIButtonListItem * GetItemAt(int pos) const
QString grabber(void)
Definition: lyricsdata.h:62
static MythThemedMenu * menu
LyricsData * m_sourceData
Definition: lyricsview.h:84
void editFinished(bool result)
Definition: lyricsview.cpp:489
QString toString(bool syncronized)
Definition: lyricsdata.h:27
bool keyPressEvent(QKeyEvent *) override
Key event handler.
Definition: lyricsview.cpp:279
void loadLyrics(void)
Definition: lyricsview.cpp:569
MythUITextEdit * m_grabberEdit
Definition: lyricsview.h:86
void BuildFocusList(void)
static Type kEventType
Definition: mythdialogbox.h:50
virtual int64_t GetAudiotime(void)=0
static Type TrackChangeEvent
Definition: musicplayer.h:40
void Hide(void)
virtual void Close()
MythUIStateType * m_loadingState
Definition: lyricsview.h:49
MythUITextEdit * m_artistEdit
Definition: lyricsview.h:89
MythMenu * createFindLyricsMenu(void)
Definition: lyricsview.cpp:262
bool GetBooleanCheckState(void) const
bool SendReceiveStringList(QStringList &strlist, bool quickTimeout=false, bool block=true)
Send a message to the backend and wait for a response.
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
void findLyrics(const QString &grabber)
Definition: lyricsdata.cpp:50
QString album(void)
Definition: lyricsdata.h:68
PlayMode getPlayMode(void)
Definition: musicplayer.h:70
void showLyrics(void)
Definition: lyricsview.cpp:444
void editLyrics(void)
Definition: lyricsview.cpp:474
int m_time
Definition: lyricsdata.h:24
QString * getMessage(void) const
MythMenu * createMainMenu(void)
QList< MusicMetadata * > & getPlayedTracksList(void)
Definition: musicplayer.h:130
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
Definition: mythuitext.cpp:84
static Type OperationStart
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)
Definition: mythuiutils.h:27
bool Create(void) override
Definition: lyricsview.cpp:505
void saveLyrics(void)
Definition: lyricsview.cpp:468
void saveEdits(bool ok)
Definition: lyricsview.cpp:649
~LyricsView(void)
Definition: lyricsview.cpp:47
bool syncronized(void)
Definition: lyricsdata.h:77
void findLyrics(const QString &grabber="ALL")
Definition: lyricsview.cpp:356
bool Create(void) override
Definition: lyricsview.cpp:58
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
void SetText(const QString &text, bool moveCursor=true)
MythUIType * GetFocusWidget(void) const
void setArtist(const QString &artist)
Definition: lyricsdata.h:66
MythUITextEdit * m_albumEdit
Definition: lyricsview.h:90
void Reset() override
Reset the widget to it's original state, should not reset changes made by the theme.
MythMainWindow * GetMythMainWindow(void)
void setLyricTime(void)
Definition: lyricsview.cpp:334
void setAlbum(const QString &album)
Definition: lyricsdata.h:69
bool keyPressEvent(QKeyEvent *) override
Key event handler.
#define LOG(_MASK_, _LEVEL_, _STRING_)
Definition: mythlogging.h:41
void clear(void)
Definition: lyricsdata.cpp:27
LyricsView(MythScreenStack *parent, MythScreenType *parentScreen)
Definition: lyricsview.cpp:39
LyricsData * getLyricsData(void)
MythUIProgressBar * m_bufferProgress
Definition: lyricsview.h:51
void showMessage(const QString &message)
Definition: lyricsview.cpp:427
void setLyrics(const QStringList &lyrics)
Definition: lyricsdata.cpp:310
MythUIButton * m_okButton
Definition: lyricsview.h:93
static Type BufferStatus
QMap< int, LyricsLine * > * lyrics(void)
Definition: lyricsdata.h:74
bool DisplayState(const QString &name)
void SetCheckState(MythUIStateType::StateType state)
void getBufferStatus(int *available, int *maxSize) const
MythUITextEdit * m_titleEdit
Definition: lyricsview.h:88
void SetItemCurrent(MythUIButtonListItem *item)
void okPressed(void)
Definition: lyricsview.cpp:624
static Type OperationStop
const long & elapsedSeconds() const
Definition: output.h:51
void cancelPressed(void)
Definition: lyricsview.cpp:661
static Type PlayedTracksChangedEvent
Definition: musicplayer.h:51
bool m_autoScroll
Definition: lyricsview.h:55
void save(void)
Definition: lyricsdata.cpp:115
bool changed(void)
Definition: lyricsdata.h:80
void ShowMenu(void) override
Definition: lyricsview.cpp:225
AudioOutput * getOutput(void)
Definition: musicplayer.h:117
Screen in which all other widgets are contained and rendered.
void syncronizedChanged(bool syncronized)
Definition: lyricsview.cpp:587
int GetCurrentPos() const
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
Definition: mythdialogbox.h:37
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
Definition: lyricsview.cpp:545
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
void setSyncronized(bool syncronized)
Definition: lyricsdata.h:78
bool CreateCommon(void)
Definition: musiccommon.cpp:84
QString m_lyric
Definition: lyricsdata.h:25
QString GetText(void) const
MythUIButtonListItem * GetItemCurrent() const
bool Create(void) override