xref: /MusicPlayer2/MusicPlayer2/CSelectPlaylist.h (revision 965ce478a79b0d21e8a6e2ade0490efa175855dd)
1 #pragma once
2 #include "MediaLibTabDlg.h"
3 #include "ListCtrlEx.h"
4 #include "SearchEditCtrl.h"
5 #include "HorizontalSplitter.h"
6 #include "ListCache.h"
7 
8 // CSelectPlaylist 对话框
9 // #define WM_PLAYLIST_SELECTED (WM_USER+119) 不再使用     //WPARA: 传递对话框窗口的指针;LPARA:-2:表示要播放默认的播放列表,>=0,表示要播放列表中指定序号的曲目
10 
11 class CSelectPlaylistDlg : public CMediaLibTabDlg
12 {
13     DECLARE_DYNAMIC(CSelectPlaylistDlg)
14 
15 public:
16     CSelectPlaylistDlg(CWnd* pParent = nullptr);   // 标准构造函数
17     virtual ~CSelectPlaylistDlg();
18 
19     // 对话框数据
20 #ifdef AFX_DESIGN_TIME
21     enum { IDD = IDD_SELECT_PLAYLIST_DIALOG };
22 #endif
23 
24     // 自动调整列表宽度
25     void AdjustColumnWidth();
26     // 完全重新载入标签页数据
27     void RefreshTabData();
28 
29     bool SetCurSel(const wstring& playlist_path);
30 
31 private:
32 
33     bool m_searched{ false };                   // 是否处于搜索状态
34     wstring m_searcher_str;                     // 搜索字符串
35     vector<size_t> m_search_result;             // 储存快速搜索结果的歌曲序号(筛选m_playlist_ctrl_data放入m_playlist_ctrl)
36     CSearchEditCtrl m_search_edit;
37 
38     bool m_left_selected{ false };              // 最后一次选中的是左侧还是右侧
39     int m_left_selected_item{ -1 };             // 左侧选中的播放列表项目的索引(搜索状态下不是m_playlist_ctrl_data的索引)
40     int m_right_selected_item{ -1 };            // 右侧列表选中的项目的索引
41     std::vector<int> m_right_selected_items;    // 右侧列表多选选中的项目的索引
42     wstring m_selected_string;
43 
44     enum SongColumeIndex
45     {
46         COL_INDEX,
47         COL_TITLE,
48         COL_ARTIST,
49         COL_ALBUM,
50         COL_TRACK,
51         COL_GENRE,
52         COL_BITRATE,
53         COL_PATH,
54         COL_MAX
55     };
56 
57     CListCache m_list_cache;                // 缓存ListItem
58     CListCtrlEx m_playlist_ctrl;
59     CListCtrlEx m_song_list_ctrl;
60     CListCtrlEx::ListData m_list_data;  //右侧列表数据
61     vector<SongInfo> m_cur_song_list;   //选中播放列表的数据
62     CHorizontalSplitter m_splitter_ctrl;
63 
64 protected:
65 
66     virtual const vector<SongInfo>& GetSongList() const override;
67     virtual int GetItemSelected() const override;
68     virtual const vector<int>& GetItemsSelected() const override;
69     virtual void RefreshSongList() override;
70     virtual void AfterDeleteFromDisk(const std::vector<SongInfo>& files) override;
71     virtual wstring GetSelectedString() const override;
72 
73     virtual void OnTabEntered() override;
74     virtual bool InitializeControls() override;
75     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
76 
77     DECLARE_MESSAGE_MAP()
78 private:
79     // 根据关键字执行快速查找(更新m_search_result)
80     void QuickSearch(const wstring& key_words);
81     // 左侧列表选中时在右侧列表显示其内容并更新此列表曲目数/总时长
82     void ShowSongList();
83     // 左侧列表点击时更新选中状态(参数为m_playlist_ctrl索引)
84     void LeftListClicked(int index);
85     // 右侧列表点击时更新选中状态(参数为m_song_list_ctrl索引)
86     void SongListClicked(int index);
87     // 计算左侧列表列宽
88     void CalculateColumeWidth(vector<int>& width);
89     // 更新m_playlist_ctrl_data并显示,搜索状态下搜索并显示
90     void ShowPathList();
91     // 插入索引为index的的一行到m_playlist_ctrl
92     void SetListRowData(int index, const ListItem& list_item);
93     // 当前左侧列表选中有效
94     bool LeftSelectValid() const;
95     // 获取左侧列表当前选中项对应PlaylistInfo
96     const ListItem& GetSelectedPlaylist() const;
97     // 向媒体库窗口发送消息更新按钮状态
98     void SetButtonsEnable();
99     // 判断当前选中是否可播放
100     bool SelectedCanPlay() const;
101 
102 public:
103 
104     virtual BOOL OnInitDialog();
105     afx_msg void OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult);
106     virtual void OnOK();
107     afx_msg void OnBnClickedNewPlaylist();
108     afx_msg void OnPlayPlaylist();
109     afx_msg void OnRenamePlaylist();
110     afx_msg void OnDeletePlaylist();
111     afx_msg void OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult);
112     afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult);
113     afx_msg void OnInitMenu(CMenu* pMenu);
114     afx_msg void OnNewPlaylist();
115     afx_msg void OnEnChangeSearchEdit();
116     //afx_msg void OnBnClickedClearButton();
117     virtual BOOL PreTranslateMessage(MSG* pMsg);
118 protected:
119     afx_msg LRESULT OnSearchEditBtnClicked(WPARAM wParam, LPARAM lParam);
120 public:
121     afx_msg void OnNMClickSongList(NMHDR* pNMHDR, LRESULT* pResult);
122     afx_msg void OnNMRClickSongList(NMHDR* pNMHDR, LRESULT* pResult);
123     afx_msg void OnNMDblclkSongList(NMHDR* pNMHDR, LRESULT* pResult);
124     afx_msg void OnSaveAsNewPlaylist();
125     afx_msg void OnPlaylistSaveAs();
126     afx_msg void OnPlaylistFixPathError();
127     afx_msg void OnPlaylistBrowseFile();
128     afx_msg void OnRemoveFromPlaylist();
129     afx_msg void OnBnClickedSortButton();
130     afx_msg void OnLibPlaylistSortRecentPlayed();
131     afx_msg void OnLibPlaylistSortRecentCreated();
132     afx_msg void OnLibPlaylistSortName();
133     afx_msg void OnLibPlaylistProperties();
134 };
135