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