⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 event.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

    // skip the "Create New Playlist..." item
    tv_item.hItem = TreeView_GetNextSibling(m_hMusicView, tv_item.hItem);


    if(tv_item.hItem)
    {
        BOOL result = FALSE;

        // iterate the items and see if any are selected.
        // for now we only grab the first one on an export
        // but i need to figure out a good way to allow a
        // user to export multiple items since we allow
        // multi-select in the treeview.
        do
        {
            result = TreeView_GetItem(m_hMusicView, &tv_item);

            if(result && (tv_item.state & TVIS_SELECTED))
            {
                string playlistPath;

                TreeData* treedata = (TreeData*)tv_item.lParam;

                if(treedata)
                {
                    playlistPath = treedata->m_oPlaylistPath;

                    ExportPlaylist(playlistPath);
                }
                break;
            }
            
        }while(result && 
               (tv_item.hItem = TreeView_GetNextSibling(m_hMusicView, 
                                                        tv_item.hItem)));
    }
}

const char* kMultipleArtists =  "<Multiple Artists Selected>";
const char* kMultipleAlbums =   "<Multiple Albums Selected>";
const char* kMultipleGenres =   "<Multiple Genres Selected>";
const char* kMultipleTracks =   "<Multiple Tracks Selected>";
const char* kMultipleComments = "<Enter a new comment for all selected tracks.>";

void MusicBrowserUI::EditInfoEvent()
{
    vector<PlaylistItem*> items;

    if(m_hPlaylistView == GetFocus())
        GetSelectedPlaylistItems(&items); 
    else if(m_hMusicView == GetFocus())
        GetSelectedMusicTreeItems(&items); 

    if(items.size())
    {
        EditInfo(items);
    }
}

void MusicBrowserUI::EditInfo(vector<PlaylistItem*>& items, HWND hwnd)
{
    MetaData metadata;

    metadata = items[0]->GetMetaData();

    bool sameArtist = true;
    bool sameAlbum = true;
    bool sameGenre = true;
    bool sameYear = true;
    bool samePlayCount = true;
    vector<PlaylistItem*>::iterator track;

    for(track = items.begin(); track != items.end(); track++)
    {
        MetaData metadataCheck = (*track)->GetMetaData();

        if(metadata.Artist() != metadataCheck.Artist())
            sameArtist = false;

        if(metadata.Album() != metadataCheck.Album())
            sameAlbum = false;

        if(metadata.Genre() != metadataCheck.Genre())
            sameGenre = false;

        if(metadata.Year() != metadataCheck.Year())
            sameYear = false;

        if(metadata.PlayCount() != metadataCheck.PlayCount())
            samePlayCount = false;
    }

    if(!sameArtist)
        metadata.SetArtist(kMultipleArtists);

    if(!sameAlbum)
        metadata.SetAlbum(kMultipleAlbums);

    if(!sameYear)
        metadata.SetYear(-1);

    if(!sameGenre)
        metadata.SetGenre(kMultipleGenres);

    if(!samePlayCount)
        metadata.SetPlayCount(-1);

    char location[MAX_PATH];

    if(items.size() > 1)
    {
        metadata.SetTitle(kMultipleTracks);
        metadata.SetTrack(-1);
        metadata.SetComment(kMultipleComments);
        strcpy(location, kMultipleTracks);
    }
    else
    {
        uint32 size = sizeof(location);
        if(IsError(URLToFilePath(items[0]->URL().c_str(), location, &size)))
            strcpy(location, items[0]->URL().c_str());

    }

    EditTrackInfoDialog editTrackInfo(m_context,
                                      (HINSTANCE)GetWindowLong(m_hWnd, GWL_HINSTANCE),  
                                      (hwnd ? hwnd : m_hWnd),
                                      m_context->catalog->GetMusicList(),
                                      &metadata,
                                      location);
    if(editTrackInfo.Show())
    {
        for(track = items.begin(); track != items.end(); track++)
        {
            MetaData oldMetaData, newMetaData;

            oldMetaData = newMetaData = (*track)->GetMetaData();

            if(metadata.Artist() != kMultipleArtists)
                newMetaData.SetArtist(metadata.Artist().c_str());

            if(metadata.Album() != kMultipleAlbums)
                newMetaData.SetAlbum(metadata.Album().c_str());

            if(metadata.Title() != kMultipleTracks)
                newMetaData.SetTitle(metadata.Title().c_str());

            if(metadata.Genre() != kMultipleGenres)
                newMetaData.SetGenre(metadata.Genre().c_str());

            if(metadata.Comment() != kMultipleComments)
                newMetaData.SetComment(metadata.Comment().c_str());

            if(metadata.Year() != -1)
               newMetaData.SetYear(metadata.Year());

            if(metadata.Track() != -1)
                newMetaData.SetTrack(metadata.Track());

            if(metadata.PlayCount() != -1)
                newMetaData.SetPlayCount(metadata.PlayCount());

            if(newMetaData != oldMetaData)
            {
                (*track)->SetMetaData(&newMetaData);

                m_context->catalog->UpdateSong(*track);

                m_plm->UpdateTrackMetaData(*track, true);
            }
        } 
    }
}

void MusicBrowserUI::EjectCDEvent()
{
    char mciCommand[128];
    char mciReturn[128];

    sprintf(mciCommand, "sysinfo cdaudio quantity wait");

    mciSendString(mciCommand, mciReturn, sizeof(mciReturn), NULL);
	
    if (atoi(mciReturn) <= 0)
        return;

    sprintf(mciCommand, "open cdaudio shareable alias cd1 wait");
    mciSendString(mciCommand, mciReturn, sizeof(mciReturn), NULL);

    sprintf(mciCommand, "set cd1 door open");
    mciSendString(mciCommand, mciReturn, sizeof(mciReturn), NULL);

    sprintf(mciCommand, "close cd1 wait");
    mciSendString(mciCommand, mciReturn, sizeof(mciReturn), NULL);
}

void MusicBrowserUI::NewFavoriteEvent()
{
    FavoriteDialog favoriteDialog(m_context,
                                  m_hWnd,
                                  NULL);

    favoriteDialog.Show();
}

void MusicBrowserUI::AddFavoriteEvent()
{
    HWND hwndFocus = GetFocus();

    if(hwndFocus == m_hMusicView)
    {
        vector<PlaylistItem*> items;

        GetSelectedStreamItems(&items);

        if(items.size())
        {
            vector<PlaylistItem*>::iterator i = items.begin();
        
            for(; i != items.end(); i++)
            {
                m_context->catalog->WriteMetaDataToDatabase((*i)->URL().c_str(),
                                                            (*i)->GetMetaData(),
                                                            kTypeStream);

                m_context->catalog->AddStream((*i)->URL().c_str());
            }
        }
    }
    else if(hwndFocus == m_hPlaylistView)
    {
        uint32 count = ListView_GetItemCount(m_hPlaylistView);
        uint32 selected = ListView_GetSelectedCount(m_hPlaylistView);

        uint32 index = 0;
        uint32 found = 0;

        for(index = 0; index < count, found < selected; index++)
        {
            uint32 state = ListView_GetItemState(m_hPlaylistView, 
                                                 index, 
                                                 LVIS_SELECTED);
            if(state & LVIS_SELECTED)
            {
                found++;

                PlaylistItem* item = m_plm->ItemAt(index);

                if(!item->URL().compare(0, 4, "http"))
                {
                    m_context->catalog->WriteMetaDataToDatabase(item->URL().c_str(),
                                                                item->GetMetaData(),
                                                                kTypeStream);

                    m_context->catalog->AddStream(item->URL().c_str()); 
                }
            }
        }
    }
}

void MusicBrowserUI::RemoveFavoriteEvent()
{
    vector<PlaylistItem*> items;

    GetSelectedFavoritesItems(&items);

    if(items.size())
    {
        vector<PlaylistItem*>::iterator i = items.begin();
        
        for(; i != items.end(); i++)
        {
            m_context->catalog->RemoveStream((*i)->URL().c_str());
        }
    }
}

void MusicBrowserUI::EditStreamInfoEvent()
{
    vector<PlaylistItem*> items;

    GetSelectedFavoritesItems(&items);

    if(items.size())
    {
        FavoriteDialog favoriteDialog(m_context,
                                      m_hWnd,
                                      items[0]);

        favoriteDialog.Show();  
    }
}

int32 MusicBrowserUI::Notify(WPARAM command, NMHDR *pHdr)
{
    int32 result = 0;

	TOOLTIPTEXT *pToolTipText;
    
    
    if (pHdr->idFrom == IDC_MUSICTREE)
    {
        NM_TREEVIEW* pTreeView = (NM_TREEVIEW*)pHdr;

        switch(pTreeView->hdr.code)
        {
            case TVN_DELETEITEM:
            {
                TreeData* treedata = (TreeData*)pTreeView->itemOld.lParam;

                if(treedata)
                    delete treedata; 

                break;
            }

            case TVN_BEGINDRAG:
            {
                TVBeginDrag(m_hMusicView, pTreeView);
                break;
            }

            case TVN_KEYDOWN:
            {
                TV_KEYDOWN* pnkd = (TV_KEYDOWN*)pHdr; 

                if(pnkd->wVKey == VK_DELETE)
                    RemoveEvent();
                else if(pnkd->wVKey == VK_F2)
                {
                    HTREEITEM item = TreeView_GetSelection(m_hMusicView);

                    if(item &&
                       item != m_hMyMusicItem &&
                       item != m_hPlaylistItem &&
                       item != m_hAllItem &&
                       item != m_hUncatItem &&
                       item != m_hNewPlaylistItem &&
                       item != m_hPortableItem &&
                       item != m_hStreamsItem &&
                       item != m_hCDItem &&
                       item != m_hFavoritesItem &&
                       item != m_hNewFavoritesItem &&
                       item != m_hRelatableItem &&
                       TreeView_GetParent(m_hMusicView, item) != m_hStreamsItem &&
                       TreeView_GetParent(m_hMusicView,TreeView_GetParent(m_hMusicView, item)) != m_hStreamsItem)
                        TreeView_EditLabel(m_hMusicView, item);
                }

                break;
            }

            case TVN_BEGINLABELEDIT:
            {
                TV_DISPINFO* info = (TV_DISPINFO*)pHdr;
                HTREEITEM item = info->item.hItem;

                if(item == m_hMyMusicItem ||
                   item == m_hPlaylistItem ||
                   item == m_hAllItem ||
                   item == m_hUncatItem ||
                   item == m_hNewPlaylistItem ||
                   item == m_hPortableItem ||
                   TreeView_GetParent(m_hMusicView, item) == m_hPortableItem)
                {
                    result = TRUE;
                }

                break;
            }

            case TVN_ENDLABELEDIT:
            {
                TV_DISPINFO* info = (TV_DISPINFO*)pHdr;
                TV_ITEM tv_item = info->item;
                TreeData* treedata = (TreeData*)tv_item.lParam;
                
                if(treedata)
                {
                    // was the operation cancelled?
                    if(tv_item.pszText)
                    {
                        if(treedata->IsTrack())
                        {
                            // just change the title for this song
                            UpdateTrackName(treedata->m_pTrack, 
                                            tv_item.pszText);
                        } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -