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