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));
203 auto *me =
dynamic_cast<MythEvent*
>(event);
207 if (me->Message().startsWith(
"MUSIC_RESYNC_FINISHED"))
209 QStringList list = me->
Message().simplified().split(
' ');
210 if (list.size() == 4)
212 int added = list[1].toInt();
213 int removed = list[2].toInt();
214 int changed = list[3].toInt();
217 if (added || removed || changed)
227 if ((dce ==
nullptr) || (dce->GetResult() < 0))
230 QString resultid = dce->
GetId();
231 QString resulttext = dce->GetResultText();
233 if (resultid ==
"smartplaylistmenu")
246 if (resulttext == tr(
"New Smart Playlist"))
249 if (mnode->getAction() ==
"smartplaylistcategory")
255 if (!editor->Create())
261 editor->newSmartPlaylist(category);
268 else if (resulttext == tr(
"Remove Smart Playlist"))
270 QString category = mnode->getParent()->GetText();
271 QString name = mnode->GetText();
273 ShowOkPopup(tr(
"Are you sure you want to delete this Smart Playlist?\n"
274 "Category: %1 - Name: %2").arg(category, name),
277 else if (resulttext == tr(
"Edit Smart Playlist"))
279 QString category = mnode->getParent()->GetText();
280 QString name = mnode->GetText();
285 if (!editor->Create())
291 editor->editSmartPlaylist(category, name);
298 else if (resulttext == tr(
"Replace Tracks"))
304 else if (resulttext == tr(
"Add Tracks"))
311 else if (resultid ==
"treeplaylistmenu")
324 if (resulttext == tr(
"Remove Playlist"))
326 QString name = mnode->
GetText();
328 ShowOkPopup(tr(
"Are you sure you want to delete this Playlist?\n"
329 "Name: %1").arg(name),
332 else if (resulttext == tr(
"Replace Tracks"))
338 else if (resulttext == tr(
"Add Tracks"))
364 for (
int i = 0; i < actions.size() && !handled; i++)
366 QString
action = actions[i];
379 if (mnode->getAction() ==
"smartplaylist" &&
action ==
"EDIT")
382 QString name = mnode->GetText();
387 if (!editor->Create())
393 editor->editSmartPlaylist(category, name);
401 else if (mnode->getAction() ==
"smartplaylistcategory" &&
action ==
"EDIT")
403 QString category = mnode->GetText();
408 if (!editor->Create())
414 editor->newSmartPlaylist(category);
423 else if (mnode->getAction() ==
"trackid")
449 if (mnode->getAction() ==
"smartplaylist")
452 QString name = mnode->GetText();
454 ShowOkPopup(tr(
"Are you sure you want to delete this Smart Playlist?\n"
455 "Category: %1 - Name: %2").arg(category, name),
459 else if (mnode->getAction() ==
"playlist")
461 QString name = mnode->GetText();
463 ShowOkPopup(tr(
"Are you sure you want to delete this Playlist?\n"
464 "Name: %1").arg(name),
471 else if (
action ==
"MARK")
528 node->
getAction() ==
"smartplaylistcategory")
535 else if (node->
getAction() ==
"all tracks" ||
547 for (
int x = 0; x < allTracksNode->childCount(); x++)
567 if (allTracksNode->childCount() == 0)
570 for (
int x = 0; x < allTracksNode->childCount(); x++)
578 else if (node->
getAction() ==
"smartplaylist")
582 for (
int x = 0; x < children->count(); x++)
588 else if (node->
getAction() ==
"playlist")
591 int playlistID = node->
getInt();
612 for (
int x = 0; x < tracks->count(); x++)
633 if (mnode->getAction() ==
"smartplaylists" ||
634 mnode->getAction() ==
"smartplaylistcategory" ||
635 mnode->getAction() ==
"smartplaylist")
639 else if (mnode->getAction() ==
"playlists" ||
640 mnode->getAction() ==
"playlist")
644 else if ((mnode->getAction() ==
"trackid") ||
645 (mnode->getAction() ==
"error"))
664 if (menuPopup->Create())
687 if (mnode->getAction() ==
"playlist")
689 menu =
new MythMenu(tr(
"Playlist Actions"),
this,
"treeplaylistmenu");
690 menu->AddItem(tr(
"Replace Tracks"));
691 menu->AddItem(tr(
"Add Tracks"));
692 menu->AddItem(tr(
"Remove Playlist"));
710 if (mnode->getAction() ==
"smartplaylists" || mnode->getAction() ==
"smartplaylistcategory")
712 QString label = tr(
"Smart Playlist Actions");
716 menu->AddItem(tr(
"New Smart Playlist"));
718 else if (mnode->getAction() ==
"smartplaylist")
720 menu =
new MythMenu(tr(
"Smart Playlist Actions"),
this,
"smartplaylistmenu");
722 menu->AddItem(tr(
"Replace Tracks"));
723 menu->AddItem(tr(
"Add Tracks"));
725 menu->AddItem(tr(
"Edit Smart Playlist"));
726 menu->AddItem(tr(
"New Smart Playlist"));
727 menu->AddItem(tr(
"Remove Smart Playlist"));
741 node->setDrawArrow(
true);
745 node->setDrawArrow(
true);
749 node->setDrawArrow(
true);
753 node->setDrawArrow(
true);
757 node->setDrawArrow(
true);
758 node->SetData(QVariant::fromValue(
gMusicData->all_music->getAllMetadata()));
761 node->setDrawArrow(
true);
765 node->setDrawArrow(
true);
769 node->setDrawArrow(
true);
775 for (
int x = 0; x < alltracks->count(); x++)
781 compTracks->append(mdata);
784 node->SetData(QVariant::fromValue(compTracks));
789 node->setDrawArrow(
true);
794 node->setDrawArrow(
true);
798 node->setDrawArrow(
true);
801 node->setDrawArrow(
true);
813 if (mnode->getAction() ==
"trackid")
841 if (item->
GetText(
"*").isEmpty())
847 if (mnode->getAction() ==
"trackid")
853 else if (mnode->getAction() ==
"album")
857 for (
int x = 0; x < tracks->count(); x++)
863 if (!artFile.isEmpty())
868 else if (mnode->getAction() ==
"compartist")
870 artFile =
findIcon(
"artist", mnode->GetText().toLower());
872 else if (mnode->getAction() ==
"all tracks" || mnode->getAction() ==
"genres" ||
873 mnode->getAction() ==
"albums" || mnode->getAction() ==
"artists" ||
874 mnode->getAction() ==
"compartists"|| mnode->getAction() ==
"ratings" ||
875 mnode->getAction() ==
"years" || mnode->getAction() ==
"compilations" ||
876 mnode->getAction() ==
"cd" || mnode->getAction() ==
"directory" ||
877 mnode->getAction() ==
"playlists" || mnode->getAction() ==
"smartplaylists")
879 artFile =
"blank.png";
883 artFile =
findIcon(mnode->getAction(), mnode->GetText().toLower());
886 QString state =
"default";
888 if (mnode->getAction() ==
"all tracks")
890 else if (mnode->getAction() ==
"genres")
892 else if (mnode->getAction() ==
"albums")
894 else if (mnode->getAction() ==
"artists")
896 else if (mnode->getAction() ==
"compartists")
897 state =
"compartists";
898 else if (mnode->getAction() ==
"ratings")
900 else if (mnode->getAction() ==
"years")
902 else if (mnode->getAction() ==
"compilations")
903 state =
"compilations";
904 else if (mnode->getAction() ==
"cd")
906 else if (mnode->getAction() ==
"directory")
908 else if (mnode->getAction() ==
"playlists")
910 else if (mnode->getAction() ==
"smartplaylists")
911 state =
"smartplaylists";
915 if (artFile.isEmpty())
931 route = route.remove(
"Root Music Node -> ");
941 if (mnode->childCount() > 0 || mnode->getAction() ==
"trackid")
944 if (mnode->getAction() ==
"smartplaylists")
948 else if (mnode->getAction() ==
"smartplaylistcategory")
952 else if (mnode->getAction() ==
"smartplaylist")
956 else if (mnode->getAction() ==
"playlists")
960 else if (mnode->getAction() ==
"playlist")
964 else if (mnode->getAction() ==
"cd")
981 QMultiMap<QString, int> map;
982 bool isAlbum =
false;
986 isAlbum = parentNode->
getAction() ==
"album";
988 for (
int x = 0; x < tracks->count(); x++)
993 QString key = mdata->
Title();
996 if (isAlbum && mdata->
Track() > 0)
998 key.prepend(QString::number(mdata->
Track()) +
" - ");
999 if (mdata->
Track() < 10)
1005 key.prepend(QString::number(mdata->
DiscNumber()) +
"/");
1010 map.insert(key, mdata->
ID());
1014 auto i = map.constBegin();
1015 while (i != map.constEnd())
1018 newnode->setInt(i.value());
1019 newnode->setDrawArrow(
false);
1027 else if (node->
getAction() ==
"artists")
1029 QMap<QString, MetadataPtrList*> map;
1031 for (
int x = 0; x < tracks->count(); x++)
1036 if (map.contains(mdata->
Artist()))
1039 filteredTracks->append(mdata);
1045 filteredTracks->append(mdata);
1046 map.insert(mdata->
Artist(), filteredTracks);
1051 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1052 while (i != map.constEnd())
1055 newnode->SetData(QVariant::fromValue(i.value()));
1061 else if (node->
getAction() ==
"compartists")
1063 QMap<QString, MetadataPtrList*> map;
1065 for (
int x = 0; x < tracks->count(); x++)
1075 filteredTracks->append(mdata);
1081 filteredTracks->append(mdata);
1088 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1089 while (i != map.constEnd())
1092 newnode->SetData(QVariant::fromValue(i.value()));
1100 QMap<QString, MetadataPtrList*> map;
1102 for (
int x = 0; x < tracks->count(); x++)
1107 if (map.contains(mdata->
Album()))
1110 filteredTracks->append(mdata);
1116 filteredTracks->append(mdata);
1117 map.insert(mdata->
Album(), filteredTracks);
1122 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1123 while (i != map.constEnd())
1126 newnode->SetData(QVariant::fromValue(i.value()));
1134 QMap<QString, MetadataPtrList*> map;
1136 for (
int x = 0; x < tracks->count(); x++)
1141 if (map.contains(mdata->
Genre()))
1144 filteredTracks->append(mdata);
1150 filteredTracks->append(mdata);
1151 map.insert(mdata->
Genre(), filteredTracks);
1156 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1157 while (i != map.constEnd())
1160 newnode->SetSortText(i.key());
1161 newnode->SetData(QVariant::fromValue(i.value()));
1167 else if (node->
getAction() ==
"ratings")
1169 QMap<QString, MetadataPtrList*> map;
1171 for (
int x = 0; x < tracks->count(); x++)
1176 QString ratingStr = tr(
"%n Star(s)",
"", mdata->
Rating());
1177 if (map.contains(ratingStr))
1180 filteredTracks->append(mdata);
1186 filteredTracks->append(mdata);
1187 map.insert(ratingStr, filteredTracks);
1192 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1193 while (i != map.constEnd())
1196 newnode->SetData(QVariant::fromValue(i.value()));
1202 QMap<QString, MetadataPtrList*> map;
1204 for (
int x = 0; x < tracks->count(); x++)
1209 QString yearStr = QString(
"%1").arg(mdata->
Year());
1210 if (map.contains(yearStr))
1213 filteredTracks->append(mdata);
1219 filteredTracks->append(mdata);
1220 map.insert(yearStr, filteredTracks);
1225 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1226 while (i != map.constEnd())
1229 newnode->SetData(QVariant::fromValue(i.value()));
1233 else if (node->
getAction() ==
"directory")
1235 QMap<QString, MetadataPtrList*> map;
1242 dir = climber->
GetText() +
'/' + dir;
1247 QString top2 =
"Root Music Node/" + tr(
"Directory") +
'/';
1248 if (dir.startsWith(top2))
1249 dir = dir.mid(top2.length());
1251 for (
int x = 0; x < tracks->count(); x++)
1261 QStringList dirs =
filename.split(
"/");
1263 QString key = dirs.count() > 1 ? dirs[0] :
"[TRACK]" + dirs[0];
1264 if (map.contains(key))
1267 filteredTracks->append(mdata);
1273 filteredTracks->append(mdata);
1274 map.insert(key, filteredTracks);
1280 QMap<QString, MetadataPtrList*>::const_iterator i = map.constBegin();
1281 while (i != map.constEnd())
1283 if (!i.key().startsWith(
"[TRACK]"))
1286 newnode->SetData(QVariant::fromValue(i.value()));
1292 i = map.constBegin();
1293 while (i != map.constEnd())
1295 if (i.key().startsWith(
"[TRACK]"))
1298 newnode->setInt(i.value()->at(0)->ID());
1299 newnode->setDrawArrow(
false);
1320 auto *newnode =
new MusicGenericTree(node, tr(
"All Tracks"),
"all tracks");
1321 newnode->setDrawArrow(
true);
1322 newnode->SetData(node->
GetData());
1324 if (!fields.contains(
"albums"))
1327 newnode->setDrawArrow(
true);
1328 newnode->SetData(node->
GetData());
1331 if (!fields.contains(
"artists"))
1334 newnode->setDrawArrow(
true);
1335 newnode->SetData(node->
GetData());
1338 if (!fields.contains(
"compartists"))
1341 bool showCompArtists =
false;
1345 if (mnode->
getAction() ==
"compilations")
1347 showCompArtists =
true;
1358 for (
int x = 0; x < tracks2->count(); x++)
1371 if (showCompArtists && found)
1373 newnode =
new MusicGenericTree(node, tr(
"Compilation Artists"),
"compartists");
1374 newnode->setDrawArrow(
true);
1375 newnode->SetData(node->
GetData());
1379 if (!fields.contains(
"genres"))
1382 newnode->setDrawArrow(
true);
1383 newnode->SetData(node->
GetData());
1386 if (!fields.contains(
"tags"))
1389 newnode->setDrawArrow(
true);
1390 newnode->SetData(node->
GetData());
1393 if (!fields.contains(
"ratings"))
1396 newnode->setDrawArrow(
true);
1397 newnode->SetData(node->
GetData());
1400 if (!fields.contains(
"years"))
1403 newnode->setDrawArrow(
true);
1404 newnode->SetData(node->
GetData());
1413 if (query.
exec(
"SELECT categoryid, name FROM music_smartplaylist_categories ORDER BY name;"))
1418 while (query.
next())
1424 newnode->setInt(query.
value(0).toInt());
1436 int categoryid = node->
getInt();
1439 query.
prepare(
"SELECT smartplaylistid, name FROM music_smartplaylists WHERE categoryid = :CATEGORYID "
1441 query.
bindValue(
":CATEGORYID", categoryid);
1447 while (query.
next())
1453 newnode->setInt(query.
value(0).toInt());
1470 query.
prepare(
"SELECT smartplaylistid, matchtype, orderby, limitto "
1471 "FROM music_smartplaylists "
1472 "WHERE smartplaylistid = :SMARTPLAYLISTID;");
1473 query.
bindValue(
":SMARTPLAYLISTID", playlistID);
1480 matchType = (query.
value(1).toString() ==
"All") ?
" AND " :
" OR ";
1481 orderBy = query.
value(2).toString();
1482 limitTo = query.
value(3).toInt();
1486 LOG(VB_GENERAL, LOG_WARNING,
1487 LOC + QString(
"Cannot find smartplaylist: %1").arg(playlistID));
1498 QString whereClause =
"WHERE ";
1500 query.
prepare(
"SELECT field, operator, value1, value2 "
1501 "FROM music_smartplaylist_items "
1502 "WHERE smartplaylistid = :ID;");
1507 while (query.
next())
1509 QString fieldName = query.
value(0).toString();
1510 QString operatorName = query.
value(1).toString();
1511 QString value1 = query.
value(2).toString();
1512 QString value2 = query.
value(3).toString();
1516 operatorName, value1, value2);
1532 whereClause +=
" LIMIT " + QString::number(limitTo);
1538 theQuery =
"SELECT song_id, name FROM music_songs "
1539 "LEFT JOIN music_directories ON"
1540 " music_songs.directory_id=music_directories.directory_id "
1541 "LEFT JOIN music_artists ON"
1542 " music_songs.artist_id=music_artists.artist_id "
1543 "LEFT JOIN music_albums ON"
1544 " music_songs.album_id=music_albums.album_id "
1545 "LEFT JOIN music_genres ON"
1546 " music_songs.genre_id=music_genres.genre_id "
1547 "LEFT JOIN music_artists AS music_comp_artists ON "
1548 "music_albums.artist_id=music_comp_artists.artist_id ";
1549 if (whereClause.length() > 0)
1550 theQuery += whereClause;
1552 if (!query.
exec(theQuery))
1558 while (query.
next())
1562 newnode->setInt(query.
value(0).toInt());
1563 newnode->setDrawArrow(
false);
1573 newnode->setDrawArrow(
false);
1582 for (
int x =0; x < playlists->count(); x++)
1584 Playlist *playlist = playlists->at(x);
1589 newnode->setInt(playlist->
getID());
1597 for (
int x = 0; x < tracks->count(); x++)
1600 QString title = QString(
"%1 - %2").arg(mdata->
Track()).arg(mdata->
FormatTitle());
1602 newnode->setInt(mdata->
ID());
1603 newnode->setDrawArrow(
false);
1621 newnode->setInt(mdata->
ID());
1622 newnode->setDrawArrow(
false);
1634 newnode->setDrawArrow(
false);
1650 if (mnode->getAction() ==
"trackid")
1657 if (mnode->childCount())
1683 if (route.count() < 2)
1688 for (
int x = 1 ; x < route.count(); x++)
1716 route <<
"Root Music Node" << tr(
"Smart Playlists") << category << name;
1731 if (mnode->getAction() ==
"smartplaylist")
1734 QString name = mnode->GetText();
1754 if (mnode->getAction() ==
"playlist")
1756 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
static Type MythEventMessage
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.
QVariant value(int i) const
QVariant GetData(void) const
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void doUpdatePlaylist(void)
static Type TrackAddedEvent
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 Type MetadataChangedEvent
Playlist * getCurrentPlaylist(void)
static void getPlaylists(MusicGenericTree *node)
void removeListener(QObject *listener)
void prepare(void) override
const QString & Message() const
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)
@ MV_PLAYLISTEDITORGALLERY
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
static Type AllTracksRemovedEvent
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)
MythMenu * createMainMenu(void)
static void getCDTracks(MusicGenericTree *node)
void restoreTreePosition(const QStringList &route)
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.
static Type PlaylistChangedEvent
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
static Type TrackRemovedEvent
virtual void SetText(const QString &text)
MythMenu * createPlaylistMenu(void)
MythMainWindow * GetMythMainWindow(void)
MythUIText * m_positionText
void createRootNode(void)
static Type CDChangedEvent
void saveTreePosition(void)
PlayPLOption playPLOption
MythScreenStack * GetStack(const QString &Stackname)
static void getPlaylistTracks(MusicGenericTree *node, int playlistID)
static void getSmartPlaylists(MusicGenericTree *node)
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
static Type AlbumArtChangedEvent
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
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="")
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
MythUIText * m_breadcrumbsText