Go to the documentation of this file.
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;
1402 for (
int x = 0; x < tracks2->count(); x++)
1415 if (showCompArtists && found)
1417 newnode =
new MusicGenericTree(node, tr(
"Compilation Artists"),
"compartists");
1418 newnode->setDrawArrow(
true);
1419 newnode->SetData(node->
GetData());
1423 if (!fields.contains(
"genres"))
1426 newnode->setDrawArrow(
true);
1427 newnode->SetData(node->
GetData());
1430 if (!fields.contains(
"tags"))
1433 newnode->setDrawArrow(
true);
1434 newnode->SetData(node->
GetData());
1437 if (!fields.contains(
"ratings"))
1440 newnode->setDrawArrow(
true);
1441 newnode->SetData(node->
GetData());
1444 if (!fields.contains(
"years"))
1447 newnode->setDrawArrow(
true);
1448 newnode->SetData(node->
GetData());
1457 if (query.
exec(
"SELECT categoryid, name FROM music_smartplaylist_categories ORDER BY name;"))
1462 while (query.
next())
1468 newnode->setInt(query.
value(0).toInt());
1480 int categoryid = node->
getInt();
1483 query.
prepare(
"SELECT smartplaylistid, name FROM music_smartplaylists WHERE categoryid = :CATEGORYID "
1485 query.
bindValue(
":CATEGORYID", categoryid);
1491 while (query.
next())
1497 newnode->setInt(query.
value(0).toInt());
1516 query.
prepare(
"SELECT smartplaylistid, matchtype, orderby, limitto "
1517 "FROM music_smartplaylists "
1518 "WHERE smartplaylistid = :SMARTPLAYLISTID;");
1519 query.
bindValue(
":SMARTPLAYLISTID", playlistID);
1526 matchType = (query.
value(1).toString() ==
"All") ?
" AND " :
" OR ";
1527 orderBy = query.
value(2).toString();
1528 limitTo = query.
value(3).toInt();
1532 LOG(VB_GENERAL, LOG_WARNING,
1533 LOC + QString(
"Cannot find smartplaylist: %1").arg(playlistID));
1544 QString whereClause =
"WHERE ";
1546 query.
prepare(
"SELECT field, operator, value1, value2 "
1547 "FROM music_smartplaylist_items "
1548 "WHERE smartplaylistid = :ID;");
1553 while (query.
next())
1555 QString fieldName = query.
value(0).toString();
1556 QString operatorName = query.
value(1).toString();
1557 QString value1 = query.
value(2).toString();
1558 QString value2 = query.
value(3).toString();
1562 operatorName, value1, value2);
1578 whereClause +=
" LIMIT " + QString::number(limitTo);
1584 theQuery =
"SELECT song_id, name FROM music_songs "
1585 "LEFT JOIN music_directories ON"
1586 " music_songs.directory_id=music_directories.directory_id "
1587 "LEFT JOIN music_artists ON"
1588 " music_songs.artist_id=music_artists.artist_id "
1589 "LEFT JOIN music_albums ON"
1590 " music_songs.album_id=music_albums.album_id "
1591 "LEFT JOIN music_genres ON"
1592 " music_songs.genre_id=music_genres.genre_id "
1593 "LEFT JOIN music_artists AS music_comp_artists ON "
1594 "music_albums.artist_id=music_comp_artists.artist_id ";
1595 if (whereClause.length() > 0)
1596 theQuery += whereClause;
1598 if (!query.
exec(theQuery))
1604 while (query.
next())
1608 newnode->setInt(query.
value(0).toInt());
1609 newnode->setDrawArrow(
false);
1619 newnode->setDrawArrow(
false);
1628 for (
int x =0; x < playlists->count(); x++)
1630 Playlist *playlist = playlists->at(x);
1635 newnode->setInt(playlist->
getID());
1643 for (
int x = 0; x < tracks->count(); x++)
1646 QString title = QString(
"%1 - %2").arg(mdata->
Track()).arg(mdata->
FormatTitle());
1648 newnode->setInt(mdata->
ID());
1649 newnode->setDrawArrow(
false);
1667 newnode->setInt(mdata->
ID());
1668 newnode->setDrawArrow(
false);
1680 newnode->setDrawArrow(
false);
1696 if (mnode->getAction() ==
"trackid")
1703 if (mnode->childCount())
1729 if (route.count() < 2)
1734 for (
int x = 1 ; x < route.count(); x++)
1762 route <<
"Root Music Node" << tr(
"Smart Playlists") << category << name;
1777 if (mnode->getAction() ==
"smartplaylist")
1780 QString name = mnode->GetText();
1800 if (mnode->getAction() ==
"playlist")
1802 int id = mnode->
getInt();
bool isActive(void) const
void setDrawArrow(bool flag)
void setCheck(MythUIButtonListItem::CheckState state)
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
MythScreenStack * GetMainStack()
static void editTrackInfo(MusicMetadata *mdata)
void updateSonglist(MusicGenericTree *node)
QString findIcon(const QString &type, const QString &name, bool ignoreCache)
find an image for a artist or genre
MusicGenericTree(MusicGenericTree *parent, const QString &name, const QString &action="", MythUIButtonListItem::CheckState check=MythUIButtonListItem::CantCheck, bool showArrow=true)
static void getSmartPlaylistCategories(MusicGenericTree *node)
MusicMetadata * getSongAt(int pos) const
bool setCurrentTrackPos(int pos)
static const Type kMythEventMessage
static bool deleteSmartPlaylist(const QString &category, const QString &name)
QString GetText(const QString &name="") const
QString getOrderBySQL(const QString &orderByFields)
void treeItemClicked(MythUIButtonListItem *item)
MetadataPtrList * getAllCDMetadata(void)
MythMenu * createPlaylistOptionsMenu(void)
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
QPointer< MusicButtonItem > m_buttonItem
PlaylistEditorView(MythScreenStack *parent, MythScreenType *parentScreen, const QString &layout, bool restorePosition=false)
uint visibleChildCount() const
InsertPLOption insertPLOption
This class is used as a container for messages.
static bool getPlayNow(void)
QVariant value(int i) const
QVariant GetData(void) const
void setShuffleMode(ShuffleMode mode)
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void doUpdatePlaylist(void)
bool Create(void) override
MythGenericTree * getChildByName(const QString &a_name) const
static void getSmartPlaylistTracks(MusicGenericTree *node, int playlistID)
void deletePlaylist(int kill_me)
static void showTrackInfo(MusicMetadata *mdata)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Screen in which all other widgets are contained and rendered.
static const Type kMetadataChangedEvent
Playlist * getCurrentPlaylist(void)
static void getPlaylists(MusicGenericTree *node)
void removeListener(QObject *listener)
@ MV_PLAYLISTEDITORGALLERY
void prepare(void) override
const QString & Message() const
static const Type kAllTracksRemovedEvent
void updateSelectedTracks(void)
MythUIType * GetFocusWidget(void) const
MetadataPtrList * getAllMetadata(void)
void smartPLChanged(const QString &category, const QString &name)
QString getCriteriaSQL(const QString &fieldName, const QString &operatorName, QString value1, QString value2)
PlaylistOptions m_playlistOptions
QList< MetadataPtrList * > m_deleteList
void ShowMenu(void) override
MythGenericTree * getChildAt(uint reference) const
MythGenericTree * addNode(const QString &a_string, int an_int=0, bool selectable_flag=false, bool visible=true)
void addListener(QObject *listener)
Add a listener to the observable.
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
MythUIButtonListItem * CreateListButton(MythUIButtonList *list) override
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
void deletePlaylist(bool ok)
bool first(void)
Wrap QSqlQuery::first() so we can display the query results.
QStringList getRouteByString(void)
Basic menu dialog, message and a list of options.
static MythThemedMenu * menu
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
QString getAction(void) const
static void DBError(const QString &where, const MSqlQuery &query)
void BuildFocusList(void)
QString getCDTitle(void) const
int childCount(void) const
Playlist * getPlaylist(int id)
void stopVisualizer(void)
int getCDTrackCount(void) const
MainVisual * m_mainvisual
void setSelectable(bool flag)
void deleteSmartPlaylist(bool ok)
bool checkTrack(MusicMetadata::IdType trackID) const
MusicMetadata * getMetadata(int an_id)
void removeTrack(int trackID)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
PlaylistContainer * m_all_playlists
~PlaylistEditorView(void) override
QList< MythGenericTree * > * getAllChildren() const
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)
int siblingCount(void) const
static void treeItemVisible(MythUIButtonListItem *item)
static const Type kCDChangedEvent
MythMenu * createMainMenu(void)
static void getCDTracks(MusicGenericTree *node)
void restoreTreePosition(const QStringList &route)
void updateShuffleMode(bool updateUIList=false)
void setRepeatMode(RepeatMode mode)
void customEvent(QEvent *event) override
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
MythGenericTree * getParent(void) const
void addTrack(int trackID, bool updateUI)
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
virtual void SetText(const QString &text)
static const Type kEventType
MythMenu * createPlaylistMenu(void)
MythMainWindow * GetMythMainWindow(void)
MythUIText * m_positionText
void createRootNode(void)
void saveTreePosition(void)
static const Type kTrackRemovedEvent
PlayPLOption playPLOption
MythScreenStack * GetStack(const QString &Stackname)
static const Type kTrackAddedEvent
static void getPlaylistTracks(MusicGenericTree *node, int playlistID)
static void getSmartPlaylists(MusicGenericTree *node)
void updateUIPlaylist(void)
MythMenu * createSmartPlaylistMenu(void)
void smartPLChanged(const QString &category, const QString &name)
void treeNodeChanged(MythGenericTree *node)
void SaveSetting(const QString &key, int newValue)
QList< Playlist * > * getPlaylists(void)
MythUIButtonTree * m_playlistTree
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
MusicGenericTree * m_rootNode
MythConfirmationDialog * ShowOkPopup(const QString &message, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
MythUIButtonListItem::CheckState m_check
void customEvent(QEvent *event) override
static const Type kPlaylistChangedEvent
void removeListener(QObject *listener)
Remove a listener to the observable.
void filterTracks(MusicGenericTree *node)
void ShowMenu(void) override
QString GetSetting(const QString &key, const QString &defaultval="")
static const Type kAlbumArtChangedEvent
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
MythUIText * m_breadcrumbsText