xref: /MusicPlayer2/MusicPlayer2/ListItem.h (revision c1fa382b6dc582665d7ede9b222314265bb88c8f)
1965ce478Slrisora #pragma once
2965ce478Slrisora #include "IconMgr.h"
3965ce478Slrisora #include "MediaLibHelper.h"
4965ce478Slrisora 
5965ce478Slrisora enum ListType
6965ce478Slrisora {
7965ce478Slrisora     LT_FOLDER,
8965ce478Slrisora     LT_PLAYLIST,
9965ce478Slrisora     LT_MEDIA_LIB,
10965ce478Slrisora     LT_MAX,
11965ce478Slrisora 
12965ce478Slrisora     // 以下项目仅用来构造CListCache时表示某个列表集合,不能出现在其他情况下
13965ce478Slrisora 
14965ce478Slrisora     LT_RECENT,              // 最近播放的列表
15965ce478Slrisora     LT_PLAYLIST_NO_SPEC,    // 除特殊播放列表外的播放列表
16965ce478Slrisora     LT_CURRENT,             // 当前播放列表
17*c1fa382bSzhongyang219     LT_ALL
18965ce478Slrisora };
19965ce478Slrisora 
20965ce478Slrisora // ListItem描述一个“作为列表的可播放对象”的全部信息
21965ce478Slrisora struct ListItem
22965ce478Slrisora {
23965ce478Slrisora     ListType type{};                            // 此列表的类型
24965ce478Slrisora     wstring path;                               // 路径 (媒体库模式存储具体项目名)
25965ce478Slrisora     SortMode sort_mode{ SM_UNSORT };            // 此列表中音频的排序方式
26965ce478Slrisora     SongKey last_track{};                       // 最后播放到的曲目
27965ce478Slrisora     int last_position{};                        // 最后播放到的位置
28965ce478Slrisora     int total_time{};                           // 此列表中音频文件的总时长
29965ce478Slrisora     int total_num{};                            // 此列表中音频文件的数量
30965ce478Slrisora     uint64_t last_played_time{};                // 上次播放的时间 (time_t)
31965ce478Slrisora     uint64_t create_time{};                     // 创建/添加时间 (time_t)
32965ce478Slrisora 
33965ce478Slrisora     // 媒体库列表时存储列表种类 否则应保持默认
34965ce478Slrisora     // 例如medialib_type为CT_ARTIST,则path字段储存的是艺术家的名称
35965ce478Slrisora     // 特别的,CT_NONE表示所有曲目,此时path应留空
36965ce478Slrisora     CMediaClassifier::ClassificationType medialib_type{};
37965ce478Slrisora     // 文件夹列表时存储是否包含子文件夹 否则应保持默认
38965ce478Slrisora     bool contain_sub_folder{};
39965ce478Slrisora 
ListItemListItem40965ce478Slrisora     ListItem() {}
41965ce478Slrisora     ListItem(ListType _type, wstring _path, CMediaClassifier::ClassificationType _medialib_type = {});
42965ce478Slrisora 
43965ce478Slrisora     bool operator==(const ListItem& other) const
44965ce478Slrisora     {
45965ce478Slrisora         return type == other.type && path == other.path && medialib_type == other.medialib_type;
46965ce478Slrisora     }
47965ce478Slrisora     bool operator<(const ListItem& other) const
48965ce478Slrisora     {
49965ce478Slrisora         return last_played_time > other.last_played_time;
50965ce478Slrisora     }
emptyListItem51965ce478Slrisora     bool empty() const
52965ce478Slrisora     {
53965ce478Slrisora         return type == 0 && path.empty();
54965ce478Slrisora     }
55965ce478Slrisora 
56965ce478Slrisora     // 为此ListItem设置打开时要播放的曲目,覆盖掉最后播放到的曲目
57965ce478Slrisora     void SetPlayTrack(const SongKey& song_key, int position = 0)
58965ce478Slrisora     {
59965ce478Slrisora         last_track = song_key;
60965ce478Slrisora         last_position = position;
61965ce478Slrisora     }
62965ce478Slrisora 
63965ce478Slrisora     // 当sort_mode为默认初始值SM_UNSORT时返回项目类型应有的的默认排序方式代替SM_UNSORT
64965ce478Slrisora     SortMode GetDefaultSortMode() const;
65965ce478Slrisora 
66965ce478Slrisora     // 获取项目的类型名,例如:“文件夹”、“播放列表”、“艺术家”、“唱片集”等
67965ce478Slrisora     wstring GetTypeDisplayName() const;
68965ce478Slrisora     // 获取项目的类型对应的图标类型
69965ce478Slrisora     IconMgr::IconType GetTypeIcon() const;
70965ce478Slrisora     // 获取项目具体显示名称,对LT_FOLDER返回去掉结尾'\'的path
71965ce478Slrisora     // LT_PLAYLIST返回文件名并处理特殊播放列表的名称转换“[默认]”、“[我喜欢的音乐]”
72965ce478Slrisora     // LT_MEDIA_LIB返回项目名“path”并在需要时转换特殊情况“<未知艺术家>”、“<其他>”等
73965ce478Slrisora     wstring GetDisplayName() const;
74965ce478Slrisora     // 在媒体库查询此项目上次播放曲目的SongKey,返回其用于显示的名称
75965ce478Slrisora     // 效率不太好,如需用于自绘UI需要在CListCache加一层缓存
76965ce478Slrisora     wstring GetLastTrackDisplayName() const;
77965ce478Slrisora };
78965ce478Slrisora 
79