[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / music / windows / MusicFileItemListModifier.cpp
blob56a2dad2fef5c44ffb06551bc5da84c41fd76816
1 /*
2 * Copyright (C) 2016-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "MusicFileItemListModifier.h"
11 #include "FileItem.h"
12 #include "FileItemList.h"
13 #include "ServiceBroker.h"
14 #include "filesystem/MusicDatabaseDirectory/DirectoryNode.h"
15 #include "guilib/LocalizeStrings.h"
16 #include "music/MusicDbUrl.h"
17 #include "music/MusicFileItemClassify.h"
18 #include "settings/AdvancedSettings.h"
19 #include "settings/Settings.h"
20 #include "settings/SettingsComponent.h"
22 #include <memory>
24 using namespace KODI;
25 using namespace XFILE::MUSICDATABASEDIRECTORY;
27 bool CMusicFileItemListModifier::CanModify(const CFileItemList &items) const
29 if (MUSIC::IsMusicDb(items))
30 return true;
32 return false;
35 bool CMusicFileItemListModifier::Modify(CFileItemList &items) const
37 AddQueuingFolder(items);
38 return true;
41 // Add an "* All ..." folder to the CFileItemList
42 // depending on the child node
43 void CMusicFileItemListModifier::AddQueuingFolder(CFileItemList& items)
45 if (!MUSIC::IsMusicDb(items))
46 return;
48 auto directoryNode = CDirectoryNode::ParseURL(items.GetPath());
50 CFileItemPtr pItem;
52 CMusicDbUrl musicUrl;
53 if (!musicUrl.FromString(directoryNode->BuildPath()))
54 return;
56 // always show "all" items by default
57 if (!CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_MUSICLIBRARY_SHOWALLITEMS))
58 return;
60 // no need for "all" item when only one item
61 if (items.GetObjectCount() <= 1)
62 return;
64 auto nodeChildType = directoryNode->GetChildType();
66 // No need for "*all" when overview node and child node is "albums" or "artists"
67 // without options (hence all albums or artists unfiltered).
68 if (directoryNode->GetType() == NODE_TYPE_OVERVIEW &&
69 (nodeChildType == NODE_TYPE_ARTIST || nodeChildType == NODE_TYPE_ALBUM) &&
70 musicUrl.GetOptions().empty())
71 return;
72 // Smart playlist rules on parent node do not get applied to child nodes so no "*all"
73 // ! @Todo: Remove this allowing "*all" once rules do get applied to child nodes.
74 if (directoryNode->GetType() == NODE_TYPE_OVERVIEW &&
75 (nodeChildType == NODE_TYPE_ARTIST || nodeChildType == NODE_TYPE_ALBUM) &&
76 musicUrl.HasOption("xsp"))
77 return;
79 switch (nodeChildType)
81 case NODE_TYPE_ARTIST:
82 pItem = std::make_shared<CFileItem>(g_localizeStrings.Get(15103)); // "All Artists"
83 musicUrl.AppendPath("-1/");
84 pItem->SetPath(musicUrl.ToString());
85 break;
87 // All album related nodes
88 case NODE_TYPE_ALBUM:
89 case NODE_TYPE_ALBUM_RECENTLY_PLAYED:
90 case NODE_TYPE_ALBUM_RECENTLY_ADDED:
91 case NODE_TYPE_ALBUM_TOP100:
92 pItem = std::make_shared<CFileItem>(g_localizeStrings.Get(15102)); // "All Albums"
93 musicUrl.AppendPath("-1/");
94 pItem->SetPath(musicUrl.ToString());
95 break;
97 // Disc node
98 case NODE_TYPE_DISC:
99 pItem = std::make_shared<CFileItem>(g_localizeStrings.Get(38075)); // "All Discs"
100 musicUrl.AppendPath("-1/");
101 pItem->SetPath(musicUrl.ToString());
102 break;
104 default:
105 break;
108 if (pItem)
110 pItem->m_bIsFolder = true;
111 pItem->SetSpecialSort(CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_bMusicLibraryAllItemsOnBottom ? SortSpecialOnBottom : SortSpecialOnTop);
112 pItem->SetCanQueue(false);
113 pItem->SetLabelPreformatted(true);
114 if (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_bMusicLibraryAllItemsOnBottom)
115 items.Add(pItem);
116 else
117 items.AddFront(pItem, (items.Size() > 0 && items[0]->IsParentFolder()) ? 1 : 0);