xref: /MusicPlayer2/MusicPlayer2/ListItem.h (revision 965ce478a79b0d21e8a6e2ade0490efa175855dd)
1*965ce478Slrisora #pragma once
2*965ce478Slrisora #include "IconMgr.h"
3*965ce478Slrisora #include "MediaLibHelper.h"
4*965ce478Slrisora 
5*965ce478Slrisora enum ListType
6*965ce478Slrisora {
7*965ce478Slrisora     LT_FOLDER,
8*965ce478Slrisora     LT_PLAYLIST,
9*965ce478Slrisora     LT_MEDIA_LIB,
10*965ce478Slrisora     LT_MAX,
11*965ce478Slrisora 
12*965ce478Slrisora     // 以下项目仅用来构造CListCache时表示某个列表集合,不能出现在其他情况下
13*965ce478Slrisora 
14*965ce478Slrisora     LT_RECENT,              // 最近播放的列表
15*965ce478Slrisora     LT_PLAYLIST_NO_SPEC,    // 除特殊播放列表外的播放列表
16*965ce478Slrisora     LT_CURRENT,             // 当前播放列表
17*965ce478Slrisora };
18*965ce478Slrisora 
19*965ce478Slrisora // ListItem描述一个“作为列表的可播放对象”的全部信息
20*965ce478Slrisora struct ListItem
21*965ce478Slrisora {
22*965ce478Slrisora     ListType type{};                            // 此列表的类型
23*965ce478Slrisora     wstring path;                               // 路径 (媒体库模式存储具体项目名)
24*965ce478Slrisora     SortMode sort_mode{ SM_UNSORT };            // 此列表中音频的排序方式
25*965ce478Slrisora     SongKey last_track{};                       // 最后播放到的曲目
26*965ce478Slrisora     int last_position{};                        // 最后播放到的位置
27*965ce478Slrisora     int total_time{};                           // 此列表中音频文件的总时长
28*965ce478Slrisora     int total_num{};                            // 此列表中音频文件的数量
29*965ce478Slrisora     uint64_t last_played_time{};                // 上次播放的时间 (time_t)
30*965ce478Slrisora     uint64_t create_time{};                     // 创建/添加时间 (time_t)
31*965ce478Slrisora 
32*965ce478Slrisora     // 媒体库列表时存储列表种类 否则应保持默认
33*965ce478Slrisora     // 例如medialib_type为CT_ARTIST,则path字段储存的是艺术家的名称
34*965ce478Slrisora     // 特别的,CT_NONE表示所有曲目,此时path应留空
35*965ce478Slrisora     CMediaClassifier::ClassificationType medialib_type{};
36*965ce478Slrisora     // 文件夹列表时存储是否包含子文件夹 否则应保持默认
37*965ce478Slrisora     bool contain_sub_folder{};
38*965ce478Slrisora 
39*965ce478Slrisora     ListItem() {}
40*965ce478Slrisora     ListItem(ListType _type, wstring _path, CMediaClassifier::ClassificationType _medialib_type = {});
41*965ce478Slrisora 
42*965ce478Slrisora     bool operator==(const ListItem& other) const
43*965ce478Slrisora     {
44*965ce478Slrisora         return type == other.type && path == other.path && medialib_type == other.medialib_type;
45*965ce478Slrisora     }
46*965ce478Slrisora     bool operator<(const ListItem& other) const
47*965ce478Slrisora     {
48*965ce478Slrisora         return last_played_time > other.last_played_time;
49*965ce478Slrisora     }
50*965ce478Slrisora     bool empty() const
51*965ce478Slrisora     {
52*965ce478Slrisora         return type == 0 && path.empty();
53*965ce478Slrisora     }
54*965ce478Slrisora 
55*965ce478Slrisora     // 为此ListItem设置打开时要播放的曲目,覆盖掉最后播放到的曲目
56*965ce478Slrisora     void SetPlayTrack(const SongKey& song_key, int position = 0)
57*965ce478Slrisora     {
58*965ce478Slrisora         last_track = song_key;
59*965ce478Slrisora         last_position = position;
60*965ce478Slrisora     }
61*965ce478Slrisora 
62*965ce478Slrisora     // 当sort_mode为默认初始值SM_UNSORT时返回项目类型应有的的默认排序方式代替SM_UNSORT
63*965ce478Slrisora     SortMode GetDefaultSortMode() const;
64*965ce478Slrisora 
65*965ce478Slrisora     // 获取项目的类型名,例如:“文件夹”、“播放列表”、“艺术家”、“唱片集”等
66*965ce478Slrisora     wstring GetTypeDisplayName() const;
67*965ce478Slrisora     // 获取项目的类型对应的图标类型
68*965ce478Slrisora     IconMgr::IconType GetTypeIcon() const;
69*965ce478Slrisora     // 获取项目具体显示名称,对LT_FOLDER返回去掉结尾'\'的path
70*965ce478Slrisora     // LT_PLAYLIST返回文件名并处理特殊播放列表的名称转换“[默认]”、“[我喜欢的音乐]”
71*965ce478Slrisora     // LT_MEDIA_LIB返回项目名“path”并在需要时转换特殊情况“<未知艺术家>”、“<其他>”等
72*965ce478Slrisora     wstring GetDisplayName() const;
73*965ce478Slrisora     // 在媒体库查询此项目上次播放曲目的SongKey,返回其用于显示的名称
74*965ce478Slrisora     // 效率不太好,如需用于自绘UI需要在CListCache加一层缓存
75*965ce478Slrisora     wstring GetLastTrackDisplayName() const;
76*965ce478Slrisora };
77*965ce478Slrisora 
78