49 m_parentScreen(parentScreen)
236 LOG(VB_GENERAL, LOG_ERR, QString(
"MusicCommon: Got a bad saved visualizer: %1").arg(
m_currentVisual));
453 if (plview->Create())
471 auto *oldView = qobject_cast<PlaylistEditorView *>(
this);
473 oldView->saveTreePosition();
479 if (pleview->Create())
500 auto *oldView = qobject_cast<PlaylistEditorView *>(
this);
502 oldView->saveTreePosition();
506 auto *pleview =
new PlaylistEditorView(mainStack, parentScreen,
"gallery", restorePos);
508 if (pleview->Create())
526 auto *sview =
new SearchView(mainStack,
this);
560 auto *lview =
new LyricsView(mainStack,
this);
589 bool handled =
false;
606 for (
int i = 0; i < actions.size() && !handled; i++)
608 const QString&
action = actions[i];
635 else if (
action ==
"DOWN")
670 if (exit_action ==
"stop")
676 else if (exit_action ==
"play")
687 else if (
action ==
"THMBUP")
691 else if (
action ==
"THMBDOWN")
695 else if (
action ==
"NEXTTRACK")
702 else if (
action ==
"PREVTRACK")
709 else if (
action ==
"FFWD")
719 else if (
action ==
"RWND")
729 else if (
action ==
"PAUSE")
752 else if (
action ==
"PLAY")
759 else if (
action ==
"STOP")
767 else if (
action ==
"CYCLEVIS")
771 else if (
action ==
"BLANKSCR")
781 else if (
action ==
"VOLUMEDOWN")
785 else if (
action ==
"VOLUMEUP")
789 else if (
action ==
"SPEEDDOWN")
793 else if (
action ==
"SPEEDUP")
797 else if (
action ==
"MUTE")
801 else if (
action ==
"TOGGLEUPMIX")
839 else if (
action ==
"MENU")
843 else if (
action ==
"REFRESH")
848 else if (
action ==
"MARK")
899 else if (
action ==
"TOGGLESHUFFLE")
904 else if (
action ==
"TOGGLEREPEAT")
974 QString status = QString(
"%1%").arg((
int)(100.0 / ((
double)maxSize / (
double)available)));
987 int percentplayed = 1;
1096 lcd->switchToTime();
1168 decoder->
seek(pos.count());
1192 float percent_heard =
m_maxTime <= 0s ? 0.0F : ((float)pos.count() /
1198 if (lcd_time_string.length() > lcd->getLCDWidth())
1199 lcd_time_string.remove(
' ');
1201 lcd->setMusicProgress(lcd_time_string, percent_heard);
1233 QString statusString;
1241 statusString = tr(
"Playing stream.");
1270 statusString = tr(
"Buffering stream.");
1274 statusString = tr(
"Stream paused.");
1303 std::chrono::seconds rs = 0s;
1327 0.0F:((float)rs.count() / (float)curMeta->
Length().count()) * 1000.0F;
1329 QString lcd_time_string = time_string;
1332 if (time_string.length() > lcd->getLCDWidth())
1333 lcd_time_string.remove(
' ');
1335 lcd->setMusicProgress(lcd_time_string, percent_heard);
1339 QString info_string;
1342 if (oe->bitrate() < 2000)
1344 info_string = QString(
"%1 "+tr(
"kbps")+
" %2 "+ tr(
"kHz")+
" %3 "+ tr(
"ch"))
1346 .arg(
static_cast<double>(oe->frequency()) / 1000.0,0,
'f',1,QChar(
'0'))
1347 .arg(oe->channels() > 1 ?
"2" :
"1");
1351 info_string = QString(
"%1 "+ tr(
"kHz")+
" %2 "+ tr(
"ch"))
1352 .arg(
static_cast<double>(oe->frequency()) / 1000.0,0,
'f',1,QChar(
'0'))
1353 .arg(oe->channels() > 1 ?
"2" :
"1");
1369 statusString = tr(
"Stream stopped.");
1396 if ((dce ==
nullptr) || (dce->GetResult() < 0))
1399 QString resultid = dce->
GetId();
1400 QString resulttext = dce->GetResultText();
1402 if (resultid ==
"mainmenu")
1404 if (resulttext == tr(
"Fullscreen Visualizer"))
1406 else if (resulttext == tr(
"Playlist Editor") ||
1407 resulttext == tr(
"Browse Music Library"))
1414 else if (resulttext == tr(
"Search for Music"))
1418 else if (resulttext == tr(
"Switch To Gallery View"))
1422 else if (resulttext == tr(
"Switch To Tree View"))
1426 else if (resulttext == tr(
"Lyrics"))
1431 else if (resultid ==
"submenu")
1433 if (resulttext == tr(
"Search List..."))
1436 else if (resultid ==
"playlistmenu")
1438 if (resulttext == tr(
"Sync List With Current Track"))
1442 else if (resulttext == tr(
"Remove Selected Track"))
1452 else if (resulttext == tr(
"Remove All Tracks"))
1460 else if (resulttext == tr(
"Save To New Playlist"))
1462 QString message = tr(
"Enter new playlist name");
1468 if (inputdialog->Create())
1470 inputdialog->SetReturnEvent(
this,
"addplaylist");
1478 else if (resulttext == tr(
"Save To Existing Playlist"))
1480 QString message = tr(
"Select the playlist to save to");
1487 if (searchdialog->Create())
1489 searchdialog->SetReturnEvent(
this,
"updateplaylist");
1493 else if (resulttext == tr(
"Switch To Move Mode"))
1501 else if (resulttext == tr(
"Switch To Select Mode"))
1518 else if (resultid ==
"repeatmenu")
1520 int mode = dce->GetData().toInt();
1524 else if (resultid ==
"shufflemenu")
1526 int mode = dce->GetData().toInt();
1530 else if (resultid ==
"exitmenu")
1532 if (resulttext == tr(
"No - Exit, Stop Playing"))
1538 else if (resulttext == tr(
"Yes - Exit, Continue Playing"))
1543 else if (resultid ==
"playermenu")
1545 if (resulttext == tr(
"Change Volume"))
1547 else if (resulttext == tr(
"Mute"))
1549 else if (resulttext == tr(
"Previous Track"))
1551 else if (resulttext == tr(
"Next Track"))
1553 else if (resulttext == tr(
"Jump Back"))
1555 else if (resulttext == tr(
"Jump Forward"))
1557 else if (resulttext == tr(
"Play"))
1559 else if (resulttext == tr(
"Stop"))
1561 else if (resulttext == tr(
"Pause"))
1564 else if (resultid ==
"quickplaylistmenu")
1566 if (resulttext == tr(
"All Tracks"))
1568 else if (resulttext == tr(
"From CD"))
1570 else if (resulttext == tr(
"Tracks By Current Artist"))
1572 else if (resulttext == tr(
"Tracks From Current Genre"))
1574 else if (resulttext == tr(
"Tracks From Current Album"))
1576 else if (resulttext == tr(
"Tracks From Current Year"))
1578 else if (resulttext == tr(
"Tracks With Same Title"))
1581 else if (resultid ==
"playlistoptionsmenu")
1583 if (resulttext == tr(
"Replace Tracks"))
1588 else if (resulttext == tr(
"Add Tracks"))
1593 else if (resulttext == tr(
"Play Now"))
1603 else if (resulttext == tr(
"Prefer Play Now"))
1607 else if (resulttext == tr(
"Prefer Add Tracks"))
1612 else if (resultid ==
"visualizermenu")
1614 if (dce->GetResult() >= 0)
1622 else if (resultid ==
"addplaylist")
1628 else if (resultid ==
"updateplaylist")
1652 if (
m_currentTrack >= 0 && m_currentTrack < m_currentPlaylist->GetCount())
1662 if (trackNo >= 0 && trackNo < m_currentPlaylist->GetCount())
1762 mdata->
toMap(metadataMap);
1765 QVariant::fromValue(mdata));
1767 item->SetTextFromMap(metadataMap);
1772 item->SetFontState(
"running");
1773 item->DisplayState(
"playing",
"playstate");
1777 item->SetFontState(
"normal");
1778 item->DisplayState(
"default",
"playstate");
1821 if (mdata && mdata->ID() == trackID)
1824 mdata->
toMap(metadataMap);
1827 item->
DisplayState(QString(
"%1").arg(mdata->Rating()),
"ratingstate");
1839 if (mdata && mdata->ID() == trackID)
1842 mdata->
toMap(metadataMap);
1870 if (mdata && mdata->ID() == trackID)
1876 if (artFile.isEmpty())
1883 item->
SetImage(mdata->getAlbumArtFile());
1884 item->
SetImage(mdata->getAlbumArtFile(),
"coverart");
1909 if (mdata && mdata->ID() == trackID)
1955 if (!editDialog->Create())
1970 metadata.
toMap(metadataMap);
1971 metadata.
toMap(metadataMap,
"next");
1998 mdata->
toMap(metadataMap);
2003 nextMetadata->
toMap(metadataMap,
"next");
2075 if (mdata && item->
GetText() ==
" ")
2080 if (artFile.isEmpty())
2087 item->
SetImage(mdata->getAlbumArtFile());
2088 item->
SetImage(mdata->getAlbumArtFile(),
"coverart");
2093 mdata->toMap(metadataMap);
2096 item->
DisplayState(QString(
"%1").arg(mdata->Rating()),
"ratingstate");
2123 QVariant::fromValue(mdata));
2125 item->SetText(mdata->
Artist() + mdata->
Album() + mdata->
Title(),
"**search**");
2126 item->SetFontState(
"normal");
2127 item->DisplayState(
"default",
"playstate");
2134 item->SetFontState(
"running");
2135 item->DisplayState(
"playing",
"playstate");
2139 item->SetFontState(
"idle");
2140 item->DisplayState(
"paused",
"playstate");
2144 item->SetFontState(
"normal");
2145 item->DisplayState(
"stopped",
"playstate");
2164 for (
int x = playedList.count(); x > 0; x--)
2168 QVariant::fromValue(mdata));
2171 mdata->
toMap(metadataMap);
2172 item->SetTextFromMap(metadataMap);
2174 item->SetFontState(
"normal");
2175 item->DisplayState(
"default",
"playstate");
2191 QString playlistcurrent = QLocale::system().toString(
m_currentTrack + 1);
2192 QString playlisttotal = QLocale::system().toString(trackCount);
2194 map[
"playlistposition"] = tr(
"%1 of %2").arg(playlistcurrent, playlisttotal);
2195 map[
"playlistcurrent"] = playlistcurrent;
2196 map[
"playlistcount"] = playlisttotal;
2201 if (playlistName ==
"default_playlist_storage")
2202 playlistName = tr(
"Default Playlist");
2203 else if (playlistName ==
"stream_playlist")
2204 playlistName = tr(
"Stream Playlist");
2205 map[
"playlistname"] = playlistName;
2212 map[
"playlistposition"] =
"";
2213 map[
"playlistcurrent"] =
"";
2214 map[
"playlistcount"] =
"";
2215 map[
"playlisttime"] =
"";
2216 map[
"playlistplayedtime"] =
"";
2217 map[
"playlisttotaltime"] =
"";
2218 map[
"playlistname"] =
"";
2219 map[
"playedtime"] =
"";
2220 map[
"totaltime"] =
"";
2221 map[
"trackspeed"] =
"";
2232 if (exTime > -1s && maxTime <= 0s)
2234 (exTime >= 1h) ?
"H:mm:ss" :
"mm:ss");
2236 QString fmt = (maxTime >= 1h) ?
"H:mm:ss" :
"mm:ss";
2240 QString speedstr =
"";
2241 if (lroundf(speed * 100.0F) != 100.0F)
2243 speedstr = QString(
"%1").arg(speed);
2244 out +=
", " + speedstr +
"X";
2268 auto *menuPopup =
new MythDialogBox(mainMenu, popupStack,
"actionmenu");
2270 if (menuPopup->Create())
2278 QString label = tr(
"View Actions");
2284 menu->AddItem(tr(
"Switch To Gallery View"));
2288 menu->AddItem(tr(
"Switch To Tree View"));
2291 QStringList screenList;
2295 screenList.append(screen->objectName());
2296 screen = qobject_cast<MusicCommon*>(screen)->m_parentScreen;
2299 if (!screenList.contains(
"visualizerview"))
2300 menu->AddItem(tr(
"Fullscreen Visualizer"));
2303 menu->AddItem(tr(
"Browse Music Library"));
2306 if (!screenList.contains(
"searchview") && !screenList.contains(
"streamview"))
2307 menu->AddItem(tr(
"Search for Music"));
2309 if (!screenList.contains(
"lyricsview"))
2310 menu->AddItem(tr(
"Lyrics"));
2320 QString label = tr(
"Actions");
2326 menu->AddItem(tr(
"Search List..."));
2348 QString label = tr(
"Playlist Options");
2350 auto *
menu =
new MythMenu(label,
this,
"playlistmenu");
2354 menu->AddItem(tr(
"Sync List With Current Track"));
2355 menu->AddItem(tr(
"Remove Selected Track"));
2358 menu->AddItem(tr(
"Remove All Tracks"));
2362 menu->AddItem(tr(
"Save To New Playlist"));
2363 menu->AddItem(tr(
"Save To Existing Playlist"));
2366 menu->AddItem(tr(
"Switch To Select Mode"));
2368 menu->AddItem(tr(
"Switch To Move Mode"));
2376 QString label = tr(
"Exiting Music Player.\n\n"
2377 "Do you want to continue playing in the background?");
2389 menu->SetReturnEvent(
this,
"exitmenu");
2391 menu->AddButton(tr(
"No - Exit, Stop Playing"));
2392 menu->AddButton(tr(
"Yes - Exit, Continue Playing"));
2393 menu->AddButton(tr(
"Cancel"));
2400 QString label = tr(
"Player Actions");
2404 menu->AddItem(tr(
"Change Volume"));
2405 menu->AddItem(tr(
"Mute"));
2406 menu->AddItem(tr(
"Previous Track"));
2407 menu->AddItem(tr(
"Next Track"));
2411 menu->AddItem(tr(
"Jump Back"));
2412 menu->AddItem(tr(
"Jump Forward"));
2415 menu->AddItem(tr(
"Play"));
2416 menu->AddItem(tr(
"Stop"));
2419 menu->AddItem(tr(
"Pause"));
2426 QString label = tr(
"Set Repeat Mode");
2441 QString label = tr(
"Set Shuffle Mode");
2458 QString label = tr(
"Quick Playlists");
2460 auto *
menu =
new MythMenu(label,
this,
"quickplaylistmenu");
2462 menu->AddItem(tr(
"All Tracks"));
2465 menu->AddItem(tr(
"From CD"));
2469 menu->AddItem(tr(
"Tracks By Current Artist"));
2470 menu->AddItem(tr(
"Tracks From Current Album"));
2471 menu->AddItem(tr(
"Tracks From Current Genre"));
2472 menu->AddItem(tr(
"Tracks From Current Year"));
2473 menu->AddItem(tr(
"Tracks With Same Title"));
2481 QString label = tr(
"Choose Visualizer");
2483 auto *
menu =
new MythMenu(label,
this,
"visualizermenu");
2495 QString label = tr(
"Add to Playlist Options");
2497 auto *
menu =
new MythMenu(label,
this,
"playlistoptionsmenu");
2501 menu->AddItem(tr(
"Play Now"));
2502 menu->AddItem(tr(
"Add Tracks"));
2503 menu->AddItem(tr(
"Replace Tracks"));
2504 menu->AddItem(tr(
"Prefer Add Tracks"));
2508 menu->AddItem(tr(
"Add Tracks"));
2509 menu->AddItem(tr(
"Play Now"));
2510 menu->AddItem(tr(
"Replace Tracks"));
2511 menu->AddItem(tr(
"Prefer Play Now"));
2519 m_whereClause =
"ORDER BY music_artists.artist_name, album_name, disc_number, track";
2548 m_whereClause =
"WHERE music_artists.artist_name = " + value +
2549 " ORDER BY album_name, disc_number, track";
2562 " ORDER BY disc_number, track";
2575 " ORDER BY music_artists.artist_name, album_name, disc_number, track";
2588 " ORDER BY music_artists.artist_name, album_name, disc_number, track";
2601 " ORDER BY music_artists.artist_name, album_name, disc_number, track";
2630 if (menuPopup->Create())
2638 int curTrackID = -1;
2668 if (
nullptr == playlist)
2728 bool foundTrack =
false;
2731 if (
nullptr == playlist)
2807 QStringList actions;
2810 for (
int i = 0; i < actions.size() && !handled; i++)
2812 const QString&
action = actions[i];
2906 QStringList actions;
2909 for (
int i = 0; i < actions.size() && !handled; i++)
2911 const QString&
action = actions[i];
MusicMetadata * getCDMetadata(int m_the_track)
MusicMetadata * getMetadata(int an_id)
int getCDTrackCount(void) const
virtual bool IsPaused(void) const =0
virtual void SetTimecode(std::chrono::milliseconds timecode)=0
virtual bool ToggleUpmix(void)
virtual void unlock(void)
virtual void seek(double)=0
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
static const Type kEventType
void switchToMusic(const QString &artist, const QString &album, const QString &track)
bool isRunning(void) const
void prepare(void) override
void setVisual(const QString &name)
QStringList getVisualizations(void)
int getCurrentVisual(void) const
void seek(std::chrono::seconds pos)
MythUIButton * m_nextButton
void updateRepeatMode(void)
void changeVolume(bool up) const
MythMenu * createRepeatMenu(void)
void cycleVisualizer(void)
MythUIButton * m_ffButton
MythMenu * createPlaylistOptionsMenu(void)
std::chrono::seconds m_currentTime
std::chrono::seconds m_maxTime
void playlistItemClicked(MythUIButtonListItem *item)
void init(bool startPlayback=true)
void switchVisualizer(const QString &visual)
static void showSpeed(bool show)
MythUIProgressBar * m_trackProgress
QStringList m_visualModes
static void toggleUpmix(void)
MythUIVideo * m_visualizerVideo
void updateShuffleMode(bool updateUIList=false)
MythUIButton * m_playButton
MythMenu * createMainMenu(void)
MythMenu * createPlaylistMenu(void)
MythUIText * m_trackSpeedText
MythUIStateType * m_shuffleState
void doUpdatePlaylist(void)
MythScreenType * m_parentScreen
static void setTrackOnLCD(MusicMetadata *mdata)
MythMenu * createShuffleMenu(void)
MythMenu * createVisualizerMenu(void)
std::chrono::seconds m_playlistPlayedTime
void changeSpeed(bool up)
void stopVisualizer(void)
~MusicCommon(void) override
PlaylistOptions m_playlistOptions
MythUIButton * m_pauseButton
MythUIButton * m_rewButton
static void showTrackInfo(MusicMetadata *mdata)
static void showVolume(void)
void updateTrackInfo(MusicMetadata *mdata)
MythUIText * m_trackProgressText
MythMenu * createQuickPlaylistsMenu(void)
static void changeRating(bool increase)
void ShowMenu(void) override
MythUIStateType * m_ratingState
void updateUIPlayedList(void)
static void playlistItemVisible(MythUIButtonListItem *item)
static void editTrackInfo(MusicMetadata *mdata)
MythMenu * createSubMenu(void)
std::chrono::seconds m_playlistMaxTime
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
MythUIText * m_visualText
MythUIProgressBar * m_playlistProgress
unsigned int m_currentVisual
bool restorePosition(int trackID)
MythUIButtonList * m_playedTracksList
MainVisual * m_mainvisual
MythUIText * m_volumeText
MythUIText * m_noTracksText
static QString getTimeString(std::chrono::seconds exTime, std::chrono::seconds maxTime)
MythUIStateType * m_repeatState
void showPlaylistOptionsMenu(bool addMainMenu=false)
void searchButtonList(void)
MythUIButton * m_prevButton
MythUIButton * m_stopButton
void updateProgressBar(void)
uint m_playlistTrackCount
void switchView(MusicView view)
MythUIImage * m_coverartImage
MythUIStateType * m_trackState
MusicCommon(MythScreenStack *parent, MythScreenType *parentScreen, const QString &name)
void customEvent(QEvent *event) override
MythUIStateType * m_movingTracksState
MythUIButtonList * m_currentPlaylist
void toggleMute(void) const
static void playFirstTrack()
void updatePlaylistStats(void)
void startVisualizer(void)
MythMenu * createPlayerMenu(void)
void updateUIPlaylist(void)
MythUIStateType * m_muteState
PlaylistContainer * m_all_playlists
static const Type kMetadataChangedEvent
static const Type kTrackStatsChangedEvent
static const Type kTrackUnavailableEvent
static const Type kAlbumArtChangedEvent
static const Type kVolumeChangeEvent
static const Type kAllTracksRemovedEvent
static const Type kTrackAddedEvent
static const Type kTrackChangeEvent
static const Type kTrackRemovedEvent
MusicMetadata * getCurrentMetadata(void)
get the metadata for the current track in the playlist
ShuffleMode toggleShuffleMode(void)
PlayMode getPlayMode(void)
void playlistChanged(int playlistID)
uint getVolume(void) const
void setPlayMode(PlayMode mode)
void removeTrack(int trackID)
void stop(bool stopAll=false)
void activePlaylistChanged(int trackID, bool deleted)
@ PLAYMODE_TRACKSPLAYLIST
void getBufferStatus(int *bufferAvailable, int *bufferSize) const
void setAllowRestorePos(bool allow)
QList< MusicMetadata * > & getPlayedTracksList(void)
void moveTrackUpDown(bool moveUp, int whichTrack)
void restorePosition(void)
void removeListener(QObject *listener)
bool isPlaying(void) const
void removeVisual(MainVisual *visual)
bool setCurrentTrackPos(int pos)
ShuffleMode getShuffleMode(void)
AudioOutput * getOutput(void)
void sendTrackStatsChangedEvent(int trackID)
void addListener(QObject *listener)
RepeatMode getRepeatMode(void)
static bool getPlayNow(void)
void setShuffleMode(ShuffleMode mode)
Playlist * getCurrentPlaylist(void)
static void setPlayNow(bool PlayNow)
whether we prefer Play Now over Add Tracks
void setRepeatMode(RepeatMode mode)
Decoder * getDecoder(void)
MusicMetadata * getNextMetadata(void)
get the metadata for the next track in the playlist
RepeatMode toggleRepeatMode(void)
void changeCurrentTrack(int trackNo)
change the current track to the given track
int getCurrentTrackPos(void) const
void addVisual(MainVisual *visual)
void toMap(InfoMap &infoMap) const
QString GetSetting(const QString &key, const QString &defaultval="")
bool GetBoolSetting(const QString &key, bool defaultval=false)
Basic menu dialog, message and a list of options.
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)
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Screen in which all other widgets are contained and rendered.
MythUIType * GetFocusWidget(void) const
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
Dialog prompting the user to enter a text string.
virtual void SetTextFromMap(const InfoMap &infoMap)
virtual void ResetMap(const InfoMap &infoMap)
Image widget, displays a single image or multiple images in sequence.
bool Load(bool allowLoadInBackground=true, bool forceStat=false)
Load the image(s), wraps ImageLoader::LoadImage()
void SetFilename(const QString &filename)
Must be followed by a call to Load() to load the image.
void Reset(void) override
Reset the image back to the default defined in the theme.
Provide a dialog to quickly find an entry in a list.
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.
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
void SetTextFromMap(const InfoMap &map)
virtual void SetText(const QString &text)
virtual void SetVisible(bool visible)
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
static const Type kPlaying
static const Type kStopped
static const Type kPaused
static const Type kBuffering
Playlist * getPlaylist(int id)
Playlist * getActive(void)
void copyNewPlaylist(const QString &name)
QStringList getPlaylistNames(void)
QString toRawSonglist(bool shuffled=false, bool tracksOnly=false)
void removeAllTracks(void)
int fillSonglistFromQuery(const QString &whereClause, bool removeDuplicates=false, InsertPLOption insertOption=PL_REPLACE, int currentTrackID=0)
void fillSongsFromSonglist(const QString &songList)
void getStats(uint *trackCount, std::chrono::seconds *totalLength, uint currentTrack=0, std::chrono::seconds *playedLength=nullptr) const
MusicMetadata * getSongAt(int pos) const
int fillSonglistFromList(const QList< int > &songList, bool removeDuplicates, InsertPLOption insertOption, int currentTrackID)
MusicMetadata * m_metadata
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
bool Create(void) override
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
static constexpr std::chrono::milliseconds MUSICVOLUMEPOPUPTIME
@ MV_PLAYLISTEDITORGALLERY
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
static void startPlayback(void)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
MythMainWindow * GetMythMainWindow(void)
Convenience inline random number generator functions.
static MythThemedMenu * menu
QHash< QString, QString > InfoMap
QString formatTime(std::chrono::milliseconds msecs, QString fmt)
Format a milliseconds time value.
uint32_t MythRandom()
generate 32 random bits
static eu8 clamp(eu8 value, eu8 low, eu8 high)
static void show(uint8_t *buf, int length)
QString formattedFieldValue(const QVariant &value)
PlayPLOption playPLOption
InsertPLOption insertPLOption
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)