xref: /MusicPlayer2/MusicPlayer2/UiMediaLibItemMgr.h (revision 5fc30e0abf53adbd9bf838ea947d2a6e1e1ea732)
1ee577835SZhong Yang #pragma once
2ee577835SZhong Yang #include <map>
3ee577835SZhong Yang #include "MediaLibHelper.h"
4*5fc30e0aSzhongyang219 #include "UIElement.h"
5ee577835SZhong Yang 
6ee577835SZhong Yang class CUiMediaLibItemMgr
7ee577835SZhong Yang {
8ee577835SZhong Yang public:
9ee577835SZhong Yang     ~CUiMediaLibItemMgr();
10ee577835SZhong Yang     static CUiMediaLibItemMgr& Instance();
11ee577835SZhong Yang 
12ee577835SZhong Yang     void Init();
13ee577835SZhong Yang 
140695507bSZhong Yang     int GetItemCount(CMediaClassifier::ClassificationType type) const;                              //获取指定类别下项目的数量
150695507bSZhong Yang     std::wstring GetItemDisplayName(CMediaClassifier::ClassificationType type, int index) const;    //获取指定类别下项目显示到界面中的名称
160695507bSZhong Yang     const std::wstring& GetItemName(CMediaClassifier::ClassificationType type, int index) const;    //获取指定项的原始名称,如果是<未知xxx>返回的是空
170695507bSZhong Yang     int GetItemSongCount(CMediaClassifier::ClassificationType type, int index) const;               //获取指定类别下项目的曲目数量
180695507bSZhong Yang     void SetCurrentName(CMediaClassifier::ClassificationType type, const std::wstring& name);       //设置指定类别下正在播放项目的名称,其中name为原始名称
190695507bSZhong Yang     int GetCurrentIndex(CMediaClassifier::ClassificationType type);                                 //获取指定类别下正在播放项目的序号
IsLoading()20f02766e1Szhongyang219     bool IsLoading() const { return m_loading; }
IsInited()21f02766e1Szhongyang219     bool IsInited() const { return m_inited; }
22ee577835SZhong Yang 
23ee577835SZhong Yang private:
24ee577835SZhong Yang     CUiMediaLibItemMgr();
25ee577835SZhong Yang     void GetClassifiedMeidaLibItemList(CMediaClassifier::ClassificationType type);
26ee577835SZhong Yang 
27ee577835SZhong Yang     static CUiMediaLibItemMgr m_instance;
28cda444b5SZhong Yang     struct ItemInfo
29cda444b5SZhong Yang     {
30cda444b5SZhong Yang         std::wstring name;
31cda444b5SZhong Yang         int count{};
32cda444b5SZhong Yang     };
33cda444b5SZhong Yang 
34cda444b5SZhong Yang     const ItemInfo& GetItemInfo(CMediaClassifier::ClassificationType type, int index) const;
35cda444b5SZhong Yang 
36cda444b5SZhong Yang     std::map<CMediaClassifier::ClassificationType, std::vector<ItemInfo>> m_item_map;   //保存媒体库中所有分类的名称列表
37ee577835SZhong Yang     bool m_loading{};
38f02766e1Szhongyang219     bool m_inited{};                        //如果已经初始化过,则为true
39ee577835SZhong Yang     std::map<CMediaClassifier::ClassificationType, int> m_current_index_map;    //保存媒体库模式下每种模式正在播放的曲目
40ee577835SZhong Yang     std::map<CMediaClassifier::ClassificationType, std::wstring> m_current_name_map;    //保存媒体库模式下每种模式正在播放的曲目
41519fa9c3SZhong Yang     mutable std::shared_mutex m_shared_mutex;
42ee577835SZhong Yang };
43ee577835SZhong Yang 
44817fc88aSZhong Yang 
45817fc88aSZhong Yang class CUiMyFavouriteItemMgr
46817fc88aSZhong Yang {
47817fc88aSZhong Yang public:
48817fc88aSZhong Yang     ~CUiMyFavouriteItemMgr();
49817fc88aSZhong Yang     static CUiMyFavouriteItemMgr& Instance();
50817fc88aSZhong Yang 
51817fc88aSZhong Yang     int GetSongCount() const;
52817fc88aSZhong Yang     const SongInfo& GetSongInfo(int index) const;
53817fc88aSZhong Yang     void UpdateMyFavourite();
IsLoading()54817fc88aSZhong Yang     bool IsLoading() const { return m_loading; }
IsInited()55f02766e1Szhongyang219     bool IsInited() const { return m_inited; }
564a21136cSZhong Yang     void GetSongList(std::vector<SongInfo>& song_list) const;
570d9f5172SZhong Yang     bool Contains(const SongInfo& song) const;
58817fc88aSZhong Yang 
59817fc88aSZhong Yang private:
60817fc88aSZhong Yang     CUiMyFavouriteItemMgr();
61817fc88aSZhong Yang     static CUiMyFavouriteItemMgr m_instance;
62817fc88aSZhong Yang 
63817fc88aSZhong Yang     vector<SongInfo> m_may_favourite_song_list;     //“我喜欢的音乐”列表
64817fc88aSZhong Yang     bool m_loading{};
65f02766e1Szhongyang219     bool m_inited{};                        //如果已经初始化过,则为true
66519fa9c3SZhong Yang     mutable std::shared_mutex m_shared_mutex;
67817fc88aSZhong Yang 
68817fc88aSZhong Yang };
69817fc88aSZhong Yang 
700695507bSZhong Yang 
710695507bSZhong Yang class CUiAllTracksMgr
720695507bSZhong Yang {
730695507bSZhong Yang public:
740695507bSZhong Yang     ~CUiAllTracksMgr();
750695507bSZhong Yang     static CUiAllTracksMgr& Instance();
760695507bSZhong Yang 
770695507bSZhong Yang     //用于在UI中显示的曲目信息
780695507bSZhong Yang     struct UTrackInfo
790695507bSZhong Yang     {
800695507bSZhong Yang         SongKey song_key;
810695507bSZhong Yang         std::wstring name;
820695507bSZhong Yang         Time length;
830d9f5172SZhong Yang         bool is_favourite{};
840695507bSZhong Yang     };
850695507bSZhong Yang 
860695507bSZhong Yang     int GetSongCount() const;
870695507bSZhong Yang     SongInfo GetSongInfo(int index) const;
880695507bSZhong Yang     const UTrackInfo& GetItem(int index) const;
890695507bSZhong Yang     int GetCurrentIndex() const;                //获取正在播放的曲目在m_all_tracks_list中的序号
900695507bSZhong Yang     void SetCurrentSong(const SongInfo& song);  //设置正在播放的曲目,将其在m_all_tracks_list中的序号保存起来
910695507bSZhong Yang     void UpdateAllTracks();                     //从CSongDataManager中更新所有曲目信息
IsLoading()920695507bSZhong Yang     bool IsLoading() const { return m_loading; }
IsInited()93f02766e1Szhongyang219     bool IsInited() const { return m_inited; }
940695507bSZhong Yang     void GetSongList(std::vector<SongInfo>& song_list) const;
950d9f5172SZhong Yang     void AddOrRemoveMyFavourite(int index);     //仅更新UI中显示的“我喜欢”的状态,不更新到“我喜欢的音乐”播放列表中
960695507bSZhong Yang 
970695507bSZhong Yang private:
980695507bSZhong Yang     CUiAllTracksMgr();
990695507bSZhong Yang     static CUiAllTracksMgr m_instance;
1000695507bSZhong Yang 
1010695507bSZhong Yang     std::vector<UTrackInfo> m_all_tracks_list;  //所有曲目信息列表
102f6f420a7SZhong Yang     bool m_loading{};                       //如果正在初始化中,则为true
1030695507bSZhong Yang     int m_current_index{ -1 };              //正在播放的曲目在m_all_tracks_list中的序号
104f6f420a7SZhong Yang     bool m_inited{};                        //如果已经初始化过,则为true
105519fa9c3SZhong Yang     mutable std::shared_mutex m_shared_mutex;
1060695507bSZhong Yang };
107*5fc30e0aSzhongyang219 
108*5fc30e0aSzhongyang219 
109*5fc30e0aSzhongyang219 class CUiFolderExploreMgr
110*5fc30e0aSzhongyang219 {
111*5fc30e0aSzhongyang219 public:
112*5fc30e0aSzhongyang219     static CUiFolderExploreMgr& Instance();
113*5fc30e0aSzhongyang219 
114*5fc30e0aSzhongyang219     std::vector<std::shared_ptr<UiElement::TreeElement::Node>>& GetRootNodes();
115*5fc30e0aSzhongyang219     void UpdateFolders();
IsLoading()116*5fc30e0aSzhongyang219     bool IsLoading() const { return m_loading; }
IsInited()117*5fc30e0aSzhongyang219     bool IsInited() const { return m_inited; }
118*5fc30e0aSzhongyang219 
119*5fc30e0aSzhongyang219 private:
120*5fc30e0aSzhongyang219     CUiFolderExploreMgr();
121*5fc30e0aSzhongyang219     void CreateFolderNodeByPath(std::wstring path, std::shared_ptr<UiElement::TreeElement::Node> parent);
122*5fc30e0aSzhongyang219     int GetAudioFilesNum(std::wstring path);
123*5fc30e0aSzhongyang219 
124*5fc30e0aSzhongyang219     static CUiFolderExploreMgr m_instance;
125*5fc30e0aSzhongyang219 
126*5fc30e0aSzhongyang219     bool m_loading{};                       //如果正在初始化中,则为true
127*5fc30e0aSzhongyang219     bool m_inited{};                        //如果已经初始化过,则为true
128*5fc30e0aSzhongyang219 
129*5fc30e0aSzhongyang219     std::vector<std::shared_ptr<UiElement::TreeElement::Node>> m_root_nodes;
130*5fc30e0aSzhongyang219     std::map<std::wstring, int> m_folder_audio_files_num;       //保存每个文件夹下音频文件的数量
131*5fc30e0aSzhongyang219 };
132