29 const QString &name,
const QString &
action,
35 m_showArrow(showArrow)
70 item->setDrawArrow(
true);
73 item->setDrawArrow(
true);
85#define LOC QString("PlaylistEditorView: ")
86#define LOC_WARN QString("PlaylistEditorView, Warning: ")
87#define LOC_ERR QString("PlaylistEditorView, Error: ")
90 const QString &layout,
bool restorePosition)
91 :
MusicCommon(parent, parentScreen,
"playlisteditorview"),
92 m_layout(layout), m_restorePosition(restorePosition)
119 windowName =
"playlisteditorview_gallery";
124 windowName =
"playlisteditorview_tree";
147 LOG(VB_GENERAL, LOG_ERR, QString(
"Cannot load screen '%1'").arg(windowName));
201 auto *me =
dynamic_cast<MythEvent*
>(event);
205 if (me->Message().startsWith(
"MUSIC_RESYNC_FINISHED"))
207 QStringList list = me->
Message().simplified().split(
' ');
208 if (list.size() == 4)
210 int added = list[1].toInt();
211 int removed = list[2].toInt();
212 int changed = list[3].toInt();
215 if (added || removed || changed)
225 if ((dce ==
nullptr) || (dce->GetResult() < 0))
228 QString resultid = dce->
GetId();
229 QString resulttext = dce->GetResultText();
231 if (resultid ==
"smartplaylistmenu")
244 if (resulttext == tr(
"New Smart Playlist"))
247 if (mnode->getAction() ==
"smartplaylistcategory")
253 if (!editor->Create())
259 editor->newSmartPlaylist(category);
266 else if (resulttext == tr(
"Remove Smart Playlist"))
268 QString category = mnode->getParent()->GetText();
269 QString name = mnode->GetText();
271 ShowOkPopup(tr(
"Are you sure you want to delete this Smart Playlist?\n"
272 "Category: %1 - Name: %2").arg(category, name),
275 else if (resulttext == tr(
"Edit Smart Playlist"))
277 QString category = mnode->getParent()->GetText();
278 QString name = mnode->GetText();
283 if (!editor->Create())
289 editor->editSmartPlaylist(category, name);
296 else if (resulttext == tr(
"Replace Tracks"))
301 else if (resulttext == tr(
"Add Tracks"))
306 else if (resulttext == tr(
"Play Now"))
316 else if (resultid ==
"treeplaylistmenu")
329 if (resulttext == tr(
"Remove Playlist"))
331 QString name = mnode->
GetText();
333 ShowOkPopup(tr(
"Are you sure you want to delete this Playlist?\n"
334 "Name: %1").arg(name),
337 else if (resulttext == tr(
"Replace Tracks"))
342 else if (resulttext == tr(
"Add Tracks"))
347 else if (resulttext == tr(
"Play Now"))
377 for (
int i = 0; i < actions.size() && !handled; i++)
379 const QString&
action = actions[i];
392 if (mnode->getAction() ==
"smartplaylist" &&
action ==
"EDIT")
395 QString name = mnode->GetText();
400 if (!editor->Create())
406 editor->editSmartPlaylist(category, name);
414 else if (mnode->getAction() ==
"smartplaylistcategory" &&
action ==
"EDIT")
416 QString category = mnode->GetText();
421 if (!editor->Create())
427 editor->newSmartPlaylist(category);
436 else if (mnode->getAction() ==
"trackid")
462 if (mnode->getAction() ==
"smartplaylist")
465 QString name = mnode->GetText();
467 ShowOkPopup(tr(
"Are you sure you want to delete this Smart Playlist?\n"
468 "Category: %1 - Name: %2").arg(category, name),
472 else if (mnode->getAction() ==
"playlist")
474 QString name = mnode->GetText();
476 ShowOkPopup(tr(
"Are you sure you want to delete this Playlist?\n"
477 "Name: %1").arg(name),
484 else if (
action ==
"MARK")
543 node->
getAction() ==
"smartplaylistcategory")
550 else if (node->
getAction() ==
"all tracks" ||
562 for (
int x = 0; x < allTracksNode->childCount(); x++)
582 if (allTracksNode->childCount() == 0)
585 for (
int x = 0; x < allTracksNode->childCount(); x++)
593 else if (node->
getAction() ==
"smartplaylist")
597 for (
int x = 0; x < children->count(); x++)
603 else if (node->
getAction() ==
"playlist")
606 int playlistID = node->
getInt();
627 for (
int x = 0; x < tracks->count(); x++)
648 if (mnode->getAction() ==
"smartplaylists" ||
649 mnode->getAction() ==
"smartplaylistcategory" ||
650 mnode->getAction() ==
"smartplaylist")
654 else if (mnode->getAction() ==
"playlists" ||
655 mnode->getAction() ==
"playlist")
660 (mnode->getAction() ==
"error"))
679 if (menuPopup->Create())
702 if (mnode->getAction() ==
"playlist")
704 menu =
new MythMenu(tr(
"Playlist Actions"),
this,
"treeplaylistmenu");
707 menu->AddItem(tr(
"Play Now"));
708 menu->AddItem(tr(
"Add Tracks"));
712 menu->AddItem(tr(
"Add Tracks"));
713 menu->AddItem(tr(
"Play Now"));
715 menu->AddItem(tr(
"Replace Tracks"));
716 menu->AddItem(tr(
"Remove Playlist"));
734 if (mnode->getAction() ==
"smartplaylists" || mnode->getAction() ==
"smartplaylistcategory")
736 QString label = tr(
"Smart Playlist Actions");
740 menu->AddItem(tr(
"New Smart Playlist"));
742 else if (mnode->getAction() ==
"smartplaylist")
744 menu =
new MythMenu(tr(
"Smart Playlist Actions"),
this,
"smartplaylistmenu");
748 menu->AddItem(tr(
"Play Now"));
749 menu->AddItem(tr(
"Add Tracks"));
753 menu->AddItem(tr(
"Add Tracks"));
754 menu->AddItem(tr(
"Play Now"));
756 menu->AddItem(tr(
"Replace Tracks"));
758 menu->AddItem(tr(
"Edit Smart Playlist"));
759 menu->AddItem(tr(
"New Smart Playlist"));
760 menu->AddItem(tr(
"Remove Smart Playlist"));
774 node->setDrawArrow(
true);
778 node->setDrawArrow(
true);
782 node->setDrawArrow(
true);
786 node->setDrawArrow(
true);
790 node->setDrawArrow(
true);
791 node->SetData(QVariant::fromValue(
gMusicData->all_music->getAllMetadata()));
794 node->setDrawArrow(
true);
798 node->setDrawArrow(
true);
802 node->setDrawArrow(
true);
808 for (
int x = 0; x < alltracks->count(); x++)
814 compTracks->append(mdata);
817 node->SetData(QVariant::fromValue(compTracks));
822 node->setDrawArrow(
true);
827 node->setDrawArrow(
true);
831 node->setDrawArrow(
true);
834 node->setDrawArrow(
true);
846 if (mnode->getAction() ==
"trackid")
883 if (item->
GetText(
"*").isEmpty())
889 if (mnode->getAction() ==
"trackid")
895 else if (mnode->getAction() ==
"album")
899 for (
int x = 0; x < tracks->count(); x++)
905 if (!artFile.isEmpty())
910 else if (mnode->getAction() ==
"compartist")
912 artFile =
findIcon(
"artist", mnode->GetText().toLower());
914 else if (mnode->getAction() ==
"all tracks" || mnode->getAction() ==
"genres" ||
915 mnode->getAction() ==
"albums" || mnode->getAction() ==
"artists" ||
916 mnode->getAction() ==
"compartists"|| mnode->getAction() ==
"ratings" ||
917 mnode->getAction() ==
"years" || mnode->getAction() ==
"compilations" ||
918 mnode->getAction() ==
"cd" || mnode->getAction() ==
"directory" ||
919 mnode->getAction() ==
"playlists" || mnode->getAction() ==
"smartplaylists")
921 artFile =
"blank.png";
925 artFile =
findIcon(mnode->getAction(), mnode->GetText().toLower());
928 QString state =
"default";
930 if (mnode->getAction() ==
"all tracks")
932 else if (mnode->getAction() ==
"genres")
934 else if (mnode->getAction() ==
"albums")
936 else if (mnode->getAction() ==
"artists")
938 else if (mnode->getAction() ==
"compartists")
939 state =
"compartists";
940 else if (mnode->getAction() ==
"ratings")
942 else if (mnode->getAction() ==
"years")
944 else if (mnode->getAction() ==
"compilations")
945 state =
"compilations";
946 else if (mnode->getAction() ==
"cd")
948 else if (mnode->getAction() ==
"directory")
950 else if (mnode->getAction() ==
"playlists")
952 else if (mnode->getAction() ==
"smartplaylists")
953 state =
"smartplaylists";
957 if (artFile.isEmpty())
973 route = route.remove(
"Root Music Node -> ");
983 if (mnode->childCount() > 0 || mnode->getAction() ==
"trackid")
986 if (mnode->getAction() ==
"smartplaylists")
990 else if (mnode->getAction() ==
"smartplaylistcategory")
994 else if (mnode->getAction() ==
"smartplaylist")
998 else if (mnode->getAction() ==
"playlists")
1002 else if (mnode->getAction() ==
"playlist")
1006 else if (mnode->getAction() ==
"cd")
1025 QMultiMap<QString, int> map;
1026 bool isAlbum =
false;
1030 isAlbum = parentNode->
getAction() ==
"album";
1032 for (
int x = 0; x < tracks->count(); x++)
1037 QString key = mdata->
Title();
1040 if (isAlbum && mdata->
Track() > 0)
1042 key.prepend(QString::number(mdata->
Track()) +
" - ");
1043 if (mdata->
Track() < 10)
1049 key.prepend(QString::number(mdata->
DiscNumber()) +
"/");
1054 map.insert(key, mdata->
ID());
1058 auto i = map.constBegin();
1059 while (i != map.constEnd())
1062 newnode->setInt(i.value());
1063 newnode->setDrawArrow(
false);
1071 else if (node->
getAction() ==
"artists")
1073 QMap<QString, MetadataPtrList*> map;
1075 for (
int x = 0; x < tracks->count(); x++)
1080 if (map.contains(mdata->
Artist()))
1083 filteredTracks->append(mdata);
1089 filteredTracks->append(mdata);
1090 map.insert(mdata->
Artist(), filteredTracks);
1095 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1096 while (i != map.constEnd())
1099 newnode->SetData(QVariant::fromValue(i.value()));
1105 else if (node->
getAction() ==
"compartists")
1107 QMap<QString, MetadataPtrList*> map;
1109 for (
int x = 0; x < tracks->count(); x++)
1119 filteredTracks->append(mdata);
1125 filteredTracks->append(mdata);
1132 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1133 while (i != map.constEnd())
1136 newnode->SetData(QVariant::fromValue(i.value()));
1144 QMap<QString, MetadataPtrList*> map;
1146 for (
int x = 0; x < tracks->count(); x++)
1151 if (map.contains(mdata->
Album()))
1154 filteredTracks->append(mdata);
1160 filteredTracks->append(mdata);
1161 map.insert(mdata->
Album(), filteredTracks);
1166 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1167 while (i != map.constEnd())
1170 newnode->SetData(QVariant::fromValue(i.value()));
1178 QMap<QString, MetadataPtrList*> map;
1180 for (
int x = 0; x < tracks->count(); x++)
1185 if (map.contains(mdata->
Genre()))
1188 filteredTracks->append(mdata);
1194 filteredTracks->append(mdata);
1195 map.insert(mdata->
Genre(), filteredTracks);
1200 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1201 while (i != map.constEnd())
1204 newnode->SetSortText(i.key());
1205 newnode->SetData(QVariant::fromValue(i.value()));
1211 else if (node->
getAction() ==
"ratings")
1213 QMap<QString, MetadataPtrList*> map;
1215 for (
int x = 0; x < tracks->count(); x++)
1220 QString ratingStr = tr(
"%n Star(s)",
"", mdata->
Rating());
1221 if (map.contains(ratingStr))
1224 filteredTracks->append(mdata);
1230 filteredTracks->append(mdata);
1231 map.insert(ratingStr, filteredTracks);
1236 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1237 while (i != map.constEnd())
1240 newnode->SetData(QVariant::fromValue(i.value()));
1246 QMap<QString, MetadataPtrList*> map;
1248 for (
int x = 0; x < tracks->count(); x++)
1253 QString yearStr = QString(
"%1").arg(mdata->
Year());
1254 if (map.contains(yearStr))
1257 filteredTracks->append(mdata);
1263 filteredTracks->append(mdata);
1264 map.insert(yearStr, filteredTracks);
1269 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1270 while (i != map.constEnd())
1273 newnode->SetData(QVariant::fromValue(i.value()));
1277 else if (node->
getAction() ==
"directory")
1279 QMap<QString, MetadataPtrList*> map;
1286 dir = climber->
GetText() +
'/' + dir;
1291 QString top2 =
"Root Music Node/" + tr(
"Directory") +
'/';
1292 if (dir.startsWith(top2))
1293 dir = dir.mid(top2.length());
1295 for (
int x = 0; x < tracks->count(); x++)
1305 QStringList dirs =
filename.split(
"/");
1307 QString key = dirs.count() > 1 ? dirs[0] :
"[TRACK]" + dirs[0];
1308 if (map.contains(key))
1311 filteredTracks->append(mdata);
1317 filteredTracks->append(mdata);
1318 map.insert(key, filteredTracks);
1324 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1325 while (i != map.constEnd())
1327 if (!i.key().startsWith(
"[TRACK]"))
1330 newnode->SetData(QVariant::fromValue(i.value()));
1336 i = map.constBegin();
1337 while (i != map.constEnd())
1339 if (i.key().startsWith(
"[TRACK]"))
1342 newnode->setInt(i.value()->at(0)->ID());
1343 newnode->setDrawArrow(
false);
1364 auto *newnode =
new MusicGenericTree(node, tr(
"All Tracks"),
"all tracks");
1365 newnode->setDrawArrow(
true);
1366 newnode->SetData(node->
GetData());
1368 if (!fields.contains(
"albums"))
1371 newnode->setDrawArrow(
true);
1372 newnode->SetData(node->
GetData());
1375 if (!fields.contains(
"artists"))
1378 newnode->setDrawArrow(
true);
1379 newnode->SetData(node->
GetData());
1382 if (!fields.contains(
"compartists"))
1385 bool showCompArtists =
false;
1389 if (mnode->
getAction() ==
"compilations")
1391 showCompArtists =
true;
1401 for (
int x = 0; x < tracks2->count(); x++)
1414 if (showCompArtists && found)
1416 newnode =
new MusicGenericTree(node, tr(
"Compilation Artists"),
"compartists");
1417 newnode->setDrawArrow(
true);
1418 newnode->SetData(node->
GetData());
1422 if (!fields.contains(
"genres"))
1425 newnode->setDrawArrow(
true);
1426 newnode->SetData(node->
GetData());
1429 if (!fields.contains(
"tags"))
1432 newnode->setDrawArrow(
true);
1433 newnode->SetData(node->
GetData());
1436 if (!fields.contains(
"ratings"))
1439 newnode->setDrawArrow(
true);
1440 newnode->SetData(node->
GetData());
1443 if (!fields.contains(
"years"))
1446 newnode->setDrawArrow(
true);
1447 newnode->SetData(node->
GetData());
1456 if (query.
exec(
"SELECT categoryid, name FROM music_smartplaylist_categories ORDER BY name;"))
1461 while (query.
next())
1467 newnode->setInt(query.
value(0).toInt());
1479 int categoryid = node->
getInt();
1482 query.
prepare(
"SELECT smartplaylistid, name FROM music_smartplaylists WHERE categoryid = :CATEGORYID "
1484 query.
bindValue(
":CATEGORYID", categoryid);
1490 while (query.
next())
1496 newnode->setInt(query.
value(0).toInt());
1515 query.
prepare(
"SELECT smartplaylistid, matchtype, orderby, limitto "
1516 "FROM music_smartplaylists "
1517 "WHERE smartplaylistid = :SMARTPLAYLISTID;");
1518 query.
bindValue(
":SMARTPLAYLISTID", playlistID);
1525 matchType = (query.
value(1).toString() ==
"All") ?
" AND " :
" OR ";
1526 orderBy = query.
value(2).toString();
1527 limitTo = query.
value(3).toInt();
1531 LOG(VB_GENERAL, LOG_WARNING,
1532 LOC + QString(
"Cannot find smartplaylist: %1").arg(playlistID));
1543 QString whereClause =
"WHERE ";
1545 query.
prepare(
"SELECT field, operator, value1, value2 "
1546 "FROM music_smartplaylist_items "
1547 "WHERE smartplaylistid = :ID;");
1552 while (query.
next())
1554 QString fieldName = query.
value(0).toString();
1555 QString operatorName = query.
value(1).toString();
1556 QString value1 = query.
value(2).toString();
1557 QString value2 = query.
value(3).toString();
1561 operatorName, value1, value2);
1577 whereClause +=
" LIMIT " + QString::number(limitTo);
1583 theQuery =
"SELECT song_id, name FROM music_songs "
1584 "LEFT JOIN music_directories ON"
1585 " music_songs.directory_id=music_directories.directory_id "
1586 "LEFT JOIN music_artists ON"
1587 " music_songs.artist_id=music_artists.artist_id "
1588 "LEFT JOIN music_albums ON"
1589 " music_songs.album_id=music_albums.album_id "
1590 "LEFT JOIN music_genres ON"
1591 " music_songs.genre_id=music_genres.genre_id "
1592 "LEFT JOIN music_artists AS music_comp_artists ON "
1593 "music_albums.artist_id=music_comp_artists.artist_id ";
1594 if (whereClause.length() > 0)
1595 theQuery += whereClause;
1597 if (!query.
exec(theQuery))
1603 while (query.
next())
1607 newnode->setInt(query.
value(0).toInt());
1608 newnode->setDrawArrow(
false);
1618 newnode->setDrawArrow(
false);
1627 for (
int x =0; x < playlists->count(); x++)
1629 Playlist *playlist = playlists->at(x);
1634 newnode->setInt(playlist->
getID());
1642 for (
int x = 0; x < tracks->count(); x++)
1645 QString title = QString(
"%1 - %2").arg(mdata->
Track()).arg(mdata->
FormatTitle());
1647 newnode->setInt(mdata->
ID());
1648 newnode->setDrawArrow(
false);
1666 newnode->setInt(mdata->
ID());
1667 newnode->setDrawArrow(
false);
1679 newnode->setDrawArrow(
false);
1695 if (mnode->getAction() ==
"trackid")
1702 if (mnode->childCount())
1728 if (route.count() < 2)
1733 for (
int x = 1 ; x < route.count(); x++)
1761 route <<
"Root Music Node" << tr(
"Smart Playlists") << category << name;
1776 if (mnode->getAction() ==
"smartplaylist")
1779 QString name = mnode->GetText();
1799 if (mnode->getAction() ==
"playlist")
1801 int id = mnode->
getInt();
MusicMetadata * getMetadata(int an_id)
int getCDTrackCount(void) const
MetadataPtrList * getAllCDMetadata(void)
MetadataPtrList * getAllMetadata(void)
QString getCDTitle(void) const
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
static const Type kEventType
QSqlQuery wrapper that fetches a DB connection from the connection pool.
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
bool first(void)
Wrap QSqlQuery::first() so we can display the query results.
QVariant value(int i) const
bool isActive(void) const
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
void prepare(void) override
MythMenu * createPlaylistOptionsMenu(void)
void updateShuffleMode(bool updateUIList=false)
MythMenu * createMainMenu(void)
void doUpdatePlaylist(void)
void stopVisualizer(void)
PlaylistOptions m_playlistOptions
static void showTrackInfo(MusicMetadata *mdata)
void ShowMenu(void) override
static void editTrackInfo(MusicMetadata *mdata)
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
MainVisual * m_mainvisual
void customEvent(QEvent *event) override
void updateUIPlaylist(void)
PlaylistContainer * m_all_playlists
void setDrawArrow(bool flag)
void setCheck(MythUIButtonListItem::CheckState state)
MusicGenericTree(MusicGenericTree *parent, const QString &name, const QString &action="", MythUIButtonListItem::CheckState check=MythUIButtonListItem::CantCheck, bool showArrow=true)
QString getAction(void) const
QPointer< MusicButtonItem > m_buttonItem
MythUIButtonListItem * CreateListButton(MythUIButtonList *list) override
MythUIButtonListItem::CheckState m_check
static const Type kCDChangedEvent
static const Type kMetadataChangedEvent
static const Type kAlbumArtChangedEvent
static const Type kAllTracksRemovedEvent
static const Type kTrackAddedEvent
static const Type kPlaylistChangedEvent
static const Type kTrackRemovedEvent
void removeTrack(int trackID)
void addTrack(int trackID, bool updateUI)
void removeListener(QObject *listener)
bool setCurrentTrackPos(int pos)
static bool getPlayNow(void)
void setShuffleMode(ShuffleMode mode)
Playlist * getCurrentPlaylist(void)
void setRepeatMode(RepeatMode mode)
void SaveSetting(const QString &key, int newValue)
QString GetSetting(const QString &key, const QString &defaultval="")
static void DBError(const QString &where, const MSqlQuery &query)
Basic menu dialog, message and a list of options.
This class is used as a container for messages.
const QString & Message() const
static const Type kMythEventMessage
QVariant GetData(void) const
QString GetText(const QString &name="") const
MythGenericTree * getParent(void) const
int siblingCount(void) const
MythGenericTree * addNode(const QString &a_string, int an_int=0, bool selectable_flag=false, bool visible=true)
QStringList getRouteByString(void)
MythGenericTree * getChildAt(uint reference) const
int childCount(void) const
uint visibleChildCount() const
void setSelectable(bool flag)
MythGenericTree * getChildByName(const QString &a_name) const
QList< MythGenericTree * > * getAllChildren() const
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)
void addListener(QObject *listener)
Add a listener to the observable.
void removeListener(QObject *listener)
Remove a listener to the observable.
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Screen in which all other widgets are contained and rendered.
void BuildFocusList(void)
MythUIType * GetFocusWidget(void) const
virtual void SetText(const QString &text)
Playlist * getPlaylist(int id)
QList< Playlist * > * getPlaylists(void)
void deletePlaylist(int kill_me)
static void getCDTracks(MusicGenericTree *node)
MythUIText * m_positionText
MythUIText * m_breadcrumbsText
void ShowMenu(void) override
void filterTracks(MusicGenericTree *node)
static void getSmartPlaylistTracks(MusicGenericTree *node, int playlistID)
bool Create(void) override
void updateSelectedTracks(void)
MusicGenericTree * m_rootNode
static void getSmartPlaylistCategories(MusicGenericTree *node)
void treeItemClicked(MythUIButtonListItem *item)
static void getSmartPlaylists(MusicGenericTree *node)
static void treeItemVisible(MythUIButtonListItem *item)
void deletePlaylist(bool ok)
static void getPlaylists(MusicGenericTree *node)
void saveTreePosition(void)
~PlaylistEditorView(void) override
QList< MetadataPtrList * > m_deleteList
void treeNodeChanged(MythGenericTree *node)
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
void smartPLChanged(const QString &category, const QString &name)
void createRootNode(void)
static void getPlaylistTracks(MusicGenericTree *node, int playlistID)
MythUIButtonTree * m_playlistTree
void restoreTreePosition(const QStringList &route)
MythMenu * createPlaylistMenu(void)
MythMenu * createSmartPlaylistMenu(void)
void deleteSmartPlaylist(bool ok)
void customEvent(QEvent *event) override
void updateSonglist(MusicGenericTree *node)
PlaylistEditorView(MythScreenStack *parent, MythScreenType *parentScreen, const QString &layout, bool restorePosition=false)
MusicMetadata * getSongAt(int pos) const
bool checkTrack(MusicMetadata::IdType trackID) const
void smartPLChanged(const QString &category, const QString &name)
static bool deleteSmartPlaylist(const QString &category, const QString &name)
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
@ MV_PLAYLISTEDITORGALLERY
QString findIcon(const QString &type, const QString &name, bool ignoreCache)
find an image for a artist or genre
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
MythConfirmationDialog * ShowOkPopup(const QString &message, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
MythMainWindow * GetMythMainWindow(void)
static MythThemedMenu * menu
QString getOrderBySQL(const QString &orderByFields)
QString getCriteriaSQL(const QString &fieldName, const QString &operatorName, QString value1, QString value2)
PlayPLOption playPLOption
InsertPLOption insertPLOption
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)