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