Go to the documentation of this file.
28 const QString &name,
const QString &
action,
34 m_showArrow(showArrow)
69 item->setDrawArrow(
true);
72 item->setDrawArrow(
true);
84 #define LOC QString("PlaylistEditorView: ")
85 #define LOC_WARN QString("PlaylistEditorView, Warning: ")
86 #define LOC_ERR QString("PlaylistEditorView, Error: ")
89 const QString &layout,
bool restorePosition)
90 :
MusicCommon(parent, parentScreen,
"playlisteditorview"),
91 m_layout(layout), m_restorePosition(restorePosition)
118 windowName =
"playlisteditorview_gallery";
123 windowName =
"playlisteditorview_tree";
146 LOG(VB_GENERAL, LOG_ERR, QString(
"Cannot load screen '%1'").arg(windowName));
200 auto *me =
dynamic_cast<MythEvent*
>(event);
204 if (me->Message().startsWith(
"MUSIC_RESYNC_FINISHED"))
206 QStringList list = me->
Message().simplified().split(
' ');
207 if (list.size() == 4)
209 int added = list[1].toInt();
210 int removed = list[2].toInt();
211 int changed = list[3].toInt();
214 if (added || removed || changed)
224 if ((dce ==
nullptr) || (dce->GetResult() < 0))
227 QString resultid = dce->
GetId();
228 QString resulttext = dce->GetResultText();
230 if (resultid ==
"smartplaylistmenu")
243 if (resulttext == tr(
"New Smart Playlist"))
246 if (mnode->getAction() ==
"smartplaylistcategory")
252 if (!editor->Create())
258 editor->newSmartPlaylist(category);
265 else if (resulttext == tr(
"Remove Smart Playlist"))
267 QString category = mnode->getParent()->GetText();
268 QString name = mnode->GetText();
270 ShowOkPopup(tr(
"Are you sure you want to delete this Smart Playlist?\n"
271 "Category: %1 - Name: %2").arg(category, name),
274 else if (resulttext == tr(
"Edit Smart Playlist"))
276 QString category = mnode->getParent()->GetText();
277 QString name = mnode->GetText();
282 if (!editor->Create())
288 editor->editSmartPlaylist(category, name);
295 else if (resulttext == tr(
"Replace Tracks"))
300 else if (resulttext == tr(
"Add Tracks"))
305 else if (resulttext == tr(
"Play Now"))
315 else if (resultid ==
"treeplaylistmenu")
328 if (resulttext == tr(
"Remove Playlist"))
330 QString name = mnode->
GetText();
332 ShowOkPopup(tr(
"Are you sure you want to delete this Playlist?\n"
333 "Name: %1").arg(name),
336 else if (resulttext == tr(
"Replace Tracks"))
341 else if (resulttext == tr(
"Add Tracks"))
346 else if (resulttext == tr(
"Play Now"))
376 for (
int i = 0; i < actions.size() && !handled; i++)
378 const QString&
action = actions[i];
391 if (mnode->getAction() ==
"smartplaylist" &&
action ==
"EDIT")
394 QString name = mnode->GetText();
399 if (!editor->Create())
405 editor->editSmartPlaylist(category, name);
413 else if (mnode->getAction() ==
"smartplaylistcategory" &&
action ==
"EDIT")
415 QString category = mnode->GetText();
420 if (!editor->Create())
426 editor->newSmartPlaylist(category);
435 else if (mnode->getAction() ==
"trackid")
461 if (mnode->getAction() ==
"smartplaylist")
464 QString name = mnode->GetText();
466 ShowOkPopup(tr(
"Are you sure you want to delete this Smart Playlist?\n"
467 "Category: %1 - Name: %2").arg(category, name),
471 else if (mnode->getAction() ==
"playlist")
473 QString name = mnode->GetText();
475 ShowOkPopup(tr(
"Are you sure you want to delete this Playlist?\n"
476 "Name: %1").arg(name),
483 else if (
action ==
"MARK")
542 node->
getAction() ==
"smartplaylistcategory")
549 else if (node->
getAction() ==
"all tracks" ||
561 for (
int x = 0; x < allTracksNode->childCount(); x++)
581 if (allTracksNode->childCount() == 0)
584 for (
int x = 0; x < allTracksNode->childCount(); x++)
592 else if (node->
getAction() ==
"smartplaylist")
596 for (
int x = 0; x < children->count(); x++)
602 else if (node->
getAction() ==
"playlist")
605 int playlistID = node->
getInt();
626 for (
int x = 0; x < tracks->count(); x++)
647 if (mnode->getAction() ==
"smartplaylists" ||
648 mnode->getAction() ==
"smartplaylistcategory" ||
649 mnode->getAction() ==
"smartplaylist")
653 else if (mnode->getAction() ==
"playlists" ||
654 mnode->getAction() ==
"playlist")
659 (mnode->getAction() ==
"error"))
678 if (menuPopup->Create())
701 if (mnode->getAction() ==
"playlist")
703 menu =
new MythMenu(tr(
"Playlist Actions"),
this,
"treeplaylistmenu");
706 menu->AddItem(tr(
"Play Now"));
707 menu->AddItem(tr(
"Add Tracks"));
711 menu->AddItem(tr(
"Add Tracks"));
712 menu->AddItem(tr(
"Play Now"));
714 menu->AddItem(tr(
"Replace Tracks"));
715 menu->AddItem(tr(
"Remove Playlist"));
733 if (mnode->getAction() ==
"smartplaylists" || mnode->getAction() ==
"smartplaylistcategory")
735 QString label = tr(
"Smart Playlist Actions");
739 menu->AddItem(tr(
"New Smart Playlist"));
741 else if (mnode->getAction() ==
"smartplaylist")
743 menu =
new MythMenu(tr(
"Smart Playlist Actions"),
this,
"smartplaylistmenu");
747 menu->AddItem(tr(
"Play Now"));
748 menu->AddItem(tr(
"Add Tracks"));
752 menu->AddItem(tr(
"Add Tracks"));
753 menu->AddItem(tr(
"Play Now"));
755 menu->AddItem(tr(
"Replace Tracks"));
757 menu->AddItem(tr(
"Edit Smart Playlist"));
758 menu->AddItem(tr(
"New Smart Playlist"));
759 menu->AddItem(tr(
"Remove Smart Playlist"));
773 node->setDrawArrow(
true);
777 node->setDrawArrow(
true);
781 node->setDrawArrow(
true);
785 node->setDrawArrow(
true);
789 node->setDrawArrow(
true);
790 node->SetData(QVariant::fromValue(
gMusicData->all_music->getAllMetadata()));
793 node->setDrawArrow(
true);
797 node->setDrawArrow(
true);
801 node->setDrawArrow(
true);
807 for (
int x = 0; x < alltracks->count(); x++)
813 compTracks->append(mdata);
816 node->SetData(QVariant::fromValue(compTracks));
821 node->setDrawArrow(
true);
826 node->setDrawArrow(
true);
830 node->setDrawArrow(
true);
833 node->setDrawArrow(
true);
845 if (mnode->getAction() ==
"trackid")
882 if (item->
GetText(
"*").isEmpty())
888 if (mnode->getAction() ==
"trackid")
894 else if (mnode->getAction() ==
"album")
898 for (
int x = 0; x < tracks->count(); x++)
904 if (!artFile.isEmpty())
909 else if (mnode->getAction() ==
"compartist")
911 artFile =
findIcon(
"artist", mnode->GetText().toLower());
913 else if (mnode->getAction() ==
"all tracks" || mnode->getAction() ==
"genres" ||
914 mnode->getAction() ==
"albums" || mnode->getAction() ==
"artists" ||
915 mnode->getAction() ==
"compartists"|| mnode->getAction() ==
"ratings" ||
916 mnode->getAction() ==
"years" || mnode->getAction() ==
"compilations" ||
917 mnode->getAction() ==
"cd" || mnode->getAction() ==
"directory" ||
918 mnode->getAction() ==
"playlists" || mnode->getAction() ==
"smartplaylists")
920 artFile =
"blank.png";
924 artFile =
findIcon(mnode->getAction(), mnode->GetText().toLower());
927 QString state =
"default";
929 if (mnode->getAction() ==
"all tracks")
931 else if (mnode->getAction() ==
"genres")
933 else if (mnode->getAction() ==
"albums")
935 else if (mnode->getAction() ==
"artists")
937 else if (mnode->getAction() ==
"compartists")
938 state =
"compartists";
939 else if (mnode->getAction() ==
"ratings")
941 else if (mnode->getAction() ==
"years")
943 else if (mnode->getAction() ==
"compilations")
944 state =
"compilations";
945 else if (mnode->getAction() ==
"cd")
947 else if (mnode->getAction() ==
"directory")
949 else if (mnode->getAction() ==
"playlists")
951 else if (mnode->getAction() ==
"smartplaylists")
952 state =
"smartplaylists";
956 if (artFile.isEmpty())
972 route = route.remove(
"Root Music Node -> ");
982 if (mnode->childCount() > 0 || mnode->getAction() ==
"trackid")
985 if (mnode->getAction() ==
"smartplaylists")
989 else if (mnode->getAction() ==
"smartplaylistcategory")
993 else if (mnode->getAction() ==
"smartplaylist")
997 else if (mnode->getAction() ==
"playlists")
1001 else if (mnode->getAction() ==
"playlist")
1005 else if (mnode->getAction() ==
"cd")
1024 QMultiMap<QString, int> map;
1025 bool isAlbum =
false;
1029 isAlbum = parentNode->
getAction() ==
"album";
1031 for (
int x = 0; x < tracks->count(); x++)
1036 QString key = mdata->
Title();
1039 if (isAlbum && mdata->
Track() > 0)
1041 key.prepend(QString::number(mdata->
Track()) +
" - ");
1042 if (mdata->
Track() < 10)
1048 key.prepend(QString::number(mdata->
DiscNumber()) +
"/");
1053 map.insert(key, mdata->
ID());
1057 auto i = map.constBegin();
1058 while (i != map.constEnd())
1061 newnode->setInt(i.value());
1062 newnode->setDrawArrow(
false);
1070 else if (node->
getAction() ==
"artists")
1072 QMap<QString, MetadataPtrList*> map;
1074 for (
int x = 0; x < tracks->count(); x++)
1079 if (map.contains(mdata->
Artist()))
1082 filteredTracks->append(mdata);
1088 filteredTracks->append(mdata);
1089 map.insert(mdata->
Artist(), filteredTracks);
1094 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1095 while (i != map.constEnd())
1098 newnode->SetData(QVariant::fromValue(i.value()));
1104 else if (node->
getAction() ==
"compartists")
1106 QMap<QString, MetadataPtrList*> map;
1108 for (
int x = 0; x < tracks->count(); x++)
1118 filteredTracks->append(mdata);
1124 filteredTracks->append(mdata);
1131 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1132 while (i != map.constEnd())
1135 newnode->SetData(QVariant::fromValue(i.value()));
1143 QMap<QString, MetadataPtrList*> map;
1145 for (
int x = 0; x < tracks->count(); x++)
1150 if (map.contains(mdata->
Album()))
1153 filteredTracks->append(mdata);
1159 filteredTracks->append(mdata);
1160 map.insert(mdata->
Album(), filteredTracks);
1165 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1166 while (i != map.constEnd())
1169 newnode->SetData(QVariant::fromValue(i.value()));
1177 QMap<QString, MetadataPtrList*> map;
1179 for (
int x = 0; x < tracks->count(); x++)
1184 if (map.contains(mdata->
Genre()))
1187 filteredTracks->append(mdata);
1193 filteredTracks->append(mdata);
1194 map.insert(mdata->
Genre(), filteredTracks);
1199 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1200 while (i != map.constEnd())
1203 newnode->SetSortText(i.key());
1204 newnode->SetData(QVariant::fromValue(i.value()));
1210 else if (node->
getAction() ==
"ratings")
1212 QMap<QString, MetadataPtrList*> map;
1214 for (
int x = 0; x < tracks->count(); x++)
1219 QString ratingStr = tr(
"%n Star(s)",
"", mdata->
Rating());
1220 if (map.contains(ratingStr))
1223 filteredTracks->append(mdata);
1229 filteredTracks->append(mdata);
1230 map.insert(ratingStr, filteredTracks);
1235 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1236 while (i != map.constEnd())
1239 newnode->SetData(QVariant::fromValue(i.value()));
1245 QMap<QString, MetadataPtrList*> map;
1247 for (
int x = 0; x < tracks->count(); x++)
1252 QString yearStr = QString(
"%1").arg(mdata->
Year());
1253 if (map.contains(yearStr))
1256 filteredTracks->append(mdata);
1262 filteredTracks->append(mdata);
1263 map.insert(yearStr, filteredTracks);
1268 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1269 while (i != map.constEnd())
1272 newnode->SetData(QVariant::fromValue(i.value()));
1276 else if (node->
getAction() ==
"directory")
1278 QMap<QString, MetadataPtrList*> map;
1285 dir = climber->
GetText() +
'/' + dir;
1290 QString top2 =
"Root Music Node/" + tr(
"Directory") +
'/';
1291 if (dir.startsWith(top2))
1292 dir = dir.mid(top2.length());
1294 for (
int x = 0; x < tracks->count(); x++)
1304 QStringList dirs =
filename.split(
"/");
1306 QString key = dirs.count() > 1 ? dirs[0] :
"[TRACK]" + dirs[0];
1307 if (map.contains(key))
1310 filteredTracks->append(mdata);
1316 filteredTracks->append(mdata);
1317 map.insert(key, filteredTracks);
1323 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1324 while (i != map.constEnd())
1326 if (!i.key().startsWith(
"[TRACK]"))
1329 newnode->SetData(QVariant::fromValue(i.value()));
1335 i = map.constBegin();
1336 while (i != map.constEnd())
1338 if (i.key().startsWith(
"[TRACK]"))
1341 newnode->setInt(i.value()->at(0)->ID());
1342 newnode->setDrawArrow(
false);
1363 auto *newnode =
new MusicGenericTree(node, tr(
"All Tracks"),
"all tracks");
1364 newnode->setDrawArrow(
true);
1365 newnode->SetData(node->
GetData());
1367 if (!fields.contains(
"albums"))
1370 newnode->setDrawArrow(
true);
1371 newnode->SetData(node->
GetData());
1374 if (!fields.contains(
"artists"))
1377 newnode->setDrawArrow(
true);
1378 newnode->SetData(node->
GetData());
1381 if (!fields.contains(
"compartists"))
1384 bool showCompArtists =
false;
1388 if (mnode->
getAction() ==
"compilations")
1390 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();
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