📄 listview.cpp
字号:
void
ListView::AddFile(const char *name)
{
m_PlayList.AddTrack(name);
}
/*----------------------------------------------------------------------
| ListView::AddPlayList
+---------------------------------------------------------------------*/
void
ListView::AddPlayList(const char *name)
{
char line[MAX_PATH];
int offset = 0;
DWORD bytes_read;
HANDLE file;
USES_CONVERSION;
file = CreateFile(A2W(name), // pointer to name of the file
GENERIC_READ, // access (read-write) mode
0, // share mode
NULL, // pointer to security attributes
OPEN_EXISTING, // how to create
FILE_ATTRIBUTE_NORMAL,// file attributes
NULL); // handle to file with attributes to copy
if (file == INVALID_HANDLE_VALUE) {
ShowWindowsError(TEXT("Cannot Open PlayList"), GetLastError());
return;
}
while (ReadFile(file, &line[offset], 1, &bytes_read, NULL) > 0) {
if (bytes_read == 0) break;
if (line[offset] == '\n' || line[offset] == '\r') {
line[offset] = '\0';
if (offset >= 1) AddFile(line);
offset = 0;
} else {
offset++;
if (offset >= MAX_PATH) break;
}
}
CloseHandle(file);
}
/*----------------------------------------------------------------------
| ListView::DoOpenFile
+---------------------------------------------------------------------*/
void
ListView::DoOpenFile()
{
char name[MAX_PATH];
if (ChooseOpenFile(m_Window, name, sizeof(name)-1,
FILE_CHOOSER_TYPE_MPEG_AUDIO)) {
m_Player->Stop();
m_PlayList.Clear();
AddFile(name);
PlayListItem *item = GetPlayListItem(0);
if (item) {
item->Play();
}
}
}
/*----------------------------------------------------------------------
| ListView::DoAddFile
+---------------------------------------------------------------------*/
void
ListView::DoAddFile()
{
char name[MAX_PATH];
if (ChooseOpenFile(m_Window, name, sizeof(name)-1,
FILE_CHOOSER_TYPE_MPEG_AUDIO)) {
AddFile(name);
}
}
/*----------------------------------------------------------------------
| ListView::DoOpenPlayList
+---------------------------------------------------------------------*/
void
ListView::DoOpenPlayList()
{
char name[MAX_PATH];
if (ChooseOpenFile(m_Window, name, sizeof(name)-1,
FILE_CHOOSER_TYPE_PLAYLIST)) {
m_Player->Stop();
m_PlayList.Clear();
AddPlayList(name);
PlayListItem *item = GetPlayListItem(0);
if (item) {
item->Play();
}
}
}
/*----------------------------------------------------------------------
| ListView::DoAddPlayList
+---------------------------------------------------------------------*/
void
ListView::DoAddPlayList()
{
char name[MAX_PATH];
if (ChooseOpenFile(m_Window, name, sizeof(name)-1,
FILE_CHOOSER_TYPE_PLAYLIST)) {
AddPlayList(name);
}
}
/*----------------------------------------------------------------------
| ListView::DoSave
+---------------------------------------------------------------------*/
void
ListView::DoSave()
{
char name[MAX_PATH];
int items;
items = ListView_GetItemCount(m_ListView);
if (items <= 0) return;
if (ChooseSaveFile(m_Window, name, sizeof(name)-1,
FILE_CHOOSER_TYPE_PLAYLIST)) {
HANDLE file;
USES_CONVERSION;
file = CreateFile(A2W(name), // pointer to name of the file
GENERIC_WRITE, // access (read-write) mode
0, // share mode
NULL, // pointer to security attributes
CREATE_ALWAYS, // how to create
FILE_ATTRIBUTE_NORMAL,// file attributes
NULL); // handle to file with attributes to copy
if (file == INVALID_HANDLE_VALUE) {
ShowWindowsError(TEXT("Cannot Save PlayList"), GetLastError());
return;
}
for (int i=0; i<items; i++) {
PlayListItem *item;
item = GetPlayListItem(i);
if (item) {
DWORD nb_written;
WriteFile(file,
item->m_FullName,
strlen(item->m_FullName)+1,
&nb_written,
NULL);
WriteFile(file,
"\r\n",
1,
&nb_written,
NULL);
}
}
CloseHandle(file);
}
}
/*----------------------------------------------------------------------
| ListView::DoDelete
+---------------------------------------------------------------------*/
void
ListView::DoDelete()
{
// find index of selected item
int index = ListView_GetNextItem(m_ListView, -1, LVNI_SELECTED);
if (index < 0) return;
PlayListItem *item = GetPlayListItem(index);
if (item) {
delete item;
}
}
/*----------------------------------------------------------------------
| ListView::DoPlay
+---------------------------------------------------------------------*/
void
ListView::DoPlay()
{
m_PlayList.Play();
}
/*----------------------------------------------------------------------
| ListView::DoNext
+---------------------------------------------------------------------*/
void
ListView::DoNext()
{
if (m_Playing) {
m_Player->OutputReset();
}
m_PlayList.Next();
}
/*----------------------------------------------------------------------
| ListView::DoPrev
+---------------------------------------------------------------------*/
void
ListView::DoPrev()
{
if (m_Playing) {
m_Player->OutputReset();
}
m_PlayList.Prev();
}
/*----------------------------------------------------------------------
| ListView::DoLoop
+---------------------------------------------------------------------*/
void
ListView::DoLoop()
{
TBBUTTONINFO info;
info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = TBIF_STATE;
if (SendMessage(m_CommandBar1,
TB_GETBUTTONINFO,
XA_LISTVIEW_LOOP,
(LPARAM)&info) >= 0) {
if (info.fsState & TBSTATE_CHECKED) {
m_PlayList.SetMode(PLAYLIST_MODE_LOOP, PLAYLIST_MODE_LOOP);
} else {
m_PlayList.SetMode(PLAYLIST_MODE_LOOP, 0);
}
}
}
/*----------------------------------------------------------------------
| ListView::DoRandom
+---------------------------------------------------------------------*/
void
ListView::DoRandom()
{
TBBUTTONINFO info;
info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = TBIF_STATE;
if (SendMessage(m_CommandBar2,
TB_GETBUTTONINFO,
XA_LISTVIEW_RANDOM,
(LPARAM)&info) >= 0) {
if (info.fsState & TBSTATE_CHECKED) {
m_PlayList.SetMode(PLAYLIST_MODE_RANDOM, PLAYLIST_MODE_RANDOM);
} else {
m_PlayList.SetMode(PLAYLIST_MODE_RANDOM, 0);
}
}
}
/*----------------------------------------------------------------------
| ListView::DoDoubleClick
+---------------------------------------------------------------------*/
void
ListView::DoDoubleClick(int x, int y)
{
// find index of selected item
int index = ListView_GetNextItem(m_ListView, -1, LVNI_SELECTED);
if (index < 0) return;
PlayListItem *item = GetPlayListItem(index);
if (item) {
m_Player->Stop();
item->Play();
}
}
/*----------------------------------------------------------------------
| ListView::OnItemCreated
+---------------------------------------------------------------------*/
void
ListView::OnItemCreated(PlayListItem *item)
{
USES_CONVERSION;
LV_ITEM lv_item;
int item_position;
// compute which position to insert the item at
if (item->m_LeftSibling) {
int sibling_position = GetListViewItem(item->m_LeftSibling);
if (sibling_position >= 0) {
item_position = sibling_position+1;
} else {
item_position = 0;
}
} else {
item_position = 0;
}
lv_item.mask = LVIF_TEXT | LVIF_PARAM;
lv_item.pszText = A2W(item->m_ShortName);
lv_item.iItem = item_position;
lv_item.iSubItem = 0;
lv_item.lParam = (LPARAM)item;
ListView_InsertItem(m_ListView, &lv_item);
}
/*----------------------------------------------------------------------
| ListView::OnItemDeleted
+---------------------------------------------------------------------*/
void
ListView::OnItemDeleted(PlayListItem *item)
{
int index;
index = GetListViewItem(item);
if (index >= 0) ListView_DeleteItem(m_ListView, index);
}
/*----------------------------------------------------------------------
| ListView::OnCurrentChanged
+---------------------------------------------------------------------*/
void
ListView::OnCurrentChanged(PlayListCurrentChangedEvent *event)
{
if (event->previous) {
int previous_index = GetListViewItem(event->previous);
ListView_SetItemState(m_ListView, previous_index,
INDEXTOSTATEIMAGEMASK(0),
LVIS_STATEIMAGEMASK);
ListView_RedrawItems(m_ListView,
previous_index,
previous_index);
}
if (event->current) {
int current_index = GetListViewItem(event->current);
ListView_SetItemState(m_ListView, current_index,
INDEXTOSTATEIMAGEMASK(1),
LVIS_STATEIMAGEMASK);
ListView_EnsureVisible(m_ListView, current_index, FALSE);
ListView_RedrawItems(m_ListView,
current_index,
current_index);
if (event->action == PLAYLIST_ACTION_PLAY) {
m_Player->InputOpen(event->current->m_FullName);
} else {
m_Player->InputClose();
m_Player->SetInputName(event->current->m_FullName);
}
}
}
/*----------------------------------------------------------------------
| ListView::OnActionStopPlaying
+---------------------------------------------------------------------*/
void
ListView::OnActionStopPlaying()
{
m_Player->Stop();
m_Player->Seek(0,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -