QString CPlayer::replace_tokens(QString str, bool hidePlayingState) { QString status_text = ""; switch(GetState()) { case PLAYER_STOPPED: if(GetPlayer()=="") status_text = ""; else status_text = "Stopped"; break; case PLAYER_PAUSED: status_text = "Paused"; break; case PLAYER_PLAYING: status_text = (hidePlayingState? "" : "Playing"); break; } replace_token(str,"title" ,GetTitle()); replace_token(str,"artist" ,GetArtist()); replace_token(str,"album" ,GetAlbum()); replace_token(str,"duration" ,GetDuration(),GetDuration()); replace_token(str,"played" ,GetPosition(),GetDuration()); replace_token(str,"remaining",GetDuration() - GetPosition(),GetDuration()); replace_token(str,"status" ,status_text); replace_token(str,"player" ,GetPlayer()); replace_token(str,"file" ,GetFilePath()); replace_token(str,"shuffle" ,(GetShuffle() ? "Shuffle" : "")); replace_token(str,"repeat" ,(GetRepeat() ? "Repeat" : "")); replace_token(str,"rating" ,QString::number(GetRating())); replace_token(str,"lyrics" ,GetLyrics()); return str; }
void SjMainFrame::UpdateDisplay() { SjSkinValue value; long totalMs, elapsedMs; // get the number of visible lines long visLineCount = GetLinesCount(), visLine; wxASSERT(visLineCount>=0); // get the player SjPlayer* recentPlayer = &g_mainFrame->m_player; // get the number of tracks in the queue long queueTrackCount = recentPlayer->m_queue.GetCount(), queuePlayingPos = recentPlayer->m_queue.GetCurrPos(), queuePos; wxASSERT(queueTrackCount>=0); // current stuff SjPlaylistEntry& urlInfo1 = recentPlayer->m_queue.GetInfo(-1); wxString currTrackName = urlInfo1.GetTrackName(); wxString currArtistName = urlInfo1.GetLeadArtistName(); unsigned long currTimestamp = SjTools::GetMsTicks(); // update cover { if( !m_display.m_showStartupDisplay && queuePlayingPos != -1 ) { value.string = m_columnMixer.GetTrackCoverUrl(recentPlayer->m_queue.GetUrlByPos(-1)); value.value = SJ_VFLAG_STRING_IS_IMAGE_URL; SetSkinTargetValue(IDT_DISPLAY_COVER, value); } else { SetSkinTargetValue(IDT_DISPLAY_COVER, value); } } // update seeker { totalMs = recentPlayer->GetTotalTime(); value.string.Empty(); if( !m_display.m_showStartupDisplay && !recentPlayer->IsStopped() && totalMs > 0 ) { elapsedMs = recentPlayer->GetElapsedTime(); value.vmax = totalMs/SJ_SEEK_RESOLUTION; if( value.vmax==0 ) value.vmax = 1; value.value = elapsedMs/SJ_SEEK_RESOLUTION; SetSkinTargetValue(IDT_SEEK, value); } else { value.value = 0; SetSkinTargetValue(IDT_SEEK, value); } } // update main window title and the "currTrack" target if( !m_display.m_showStartupDisplay && !IsStopped() ) { wxString title, titleArtistName(currArtistName), titleTrackName(currTrackName); if( recentPlayer != &m_player ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(-1); titleTrackName = urlInfo4.GetTrackName(); titleArtistName = urlInfo4.GetLeadArtistName(); } // set windows title title = CombineArtistNTitle(titleArtistName, titleTrackName, wxT(" - ")); title.Append(wxT(" - ")); title.Append(SJ_PROGRAM_NAME); SetTitle(title); } else { // set windows title SetTitle(SJ_PROGRAM_NAME); } // update display lines... bool displayMsgInCurrNextTrack = false; if( (m_display.m_msgCancelAtTimestamp && !m_display.m_msg1.IsEmpty()) ) { // ...display message wxString msg1(m_display.m_msg1), msg2(m_display.m_msg2); if( HasSkinTarget(IDT_DISPLAY_LINE_FIRST) ) { m_display.m_backupedCurrLine = -1; value.value = SJ_VFLAG_CENTER; value.value |= queueTrackCount? SJ_VFLAG_IGNORECENTEROFFSET : 0; for( visLine = 0; visLine < visLineCount; visLine++ ) { if( visLine==visLineCount/2 ) { value.string = msg1; } else if( visLine==(visLineCount/2)+1 ) { value.string = msg2; } else { value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } else if( HasSkinTarget(IDT_CURR_TRACK) ) { displayMsgInCurrNextTrack = true; value.value = 0; if( HasSkinTarget(IDT_NEXT_TRACK) ) { value.string = msg1; SetSkinTargetValue(IDT_CURR_TRACK, value); value.string = msg2; SetSkinTargetValue(IDT_NEXT_TRACK, value); } else { value.string = msg1; if( !msg2.IsEmpty() ) value.string += wxT(" ") + msg2; SetSkinTargetValue(IDT_CURR_TRACK, value); } } } else if( m_display.m_showStartupDisplay || queueTrackCount == 0 ) { // ...nothing in queue, display logo m_display.m_firstLineQueuePos = -1; value.thumbSize = 1; value.vmin = 0; value.vmax = 1; value.value = 0; SetSkinTargetValue(IDT_DISPLAY_V_SCROLL, value); value.value = SJ_VFLAG_CENTER; for( visLine = 0; visLine < visLineCount; visLine++ ) { if( visLine==visLineCount/2 ) { value.string = SJ_PROGRAM_NAME wxT(" ") SJ_VERSION_STR; } else { value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } else { // ...sth. in queue, display queue... m_display.m_backupedCurrLine = -1; m_display.m_backupedCurrBold = FALSE; queuePos = m_display.m_scrollPos==-1? queuePlayingPos : m_display.m_scrollPos; if( queuePos < 0 ) queuePos = 0; if( queueTrackCount > visLineCount && queuePos > queueTrackCount-visLineCount ) queuePos = queueTrackCount-visLineCount; if( queueTrackCount <= visLineCount ) queuePos = 0; if( m_display.m_scrollPos != -1 ) m_display.m_scrollPos = queuePos; // correct the value value.thumbSize = visLineCount; value.vmin = 0; value.vmax = queueTrackCount; value.value = queuePos; SetSkinTargetValue(IDT_DISPLAY_V_SCROLL, value); value.thumbSize = 0; m_display.m_firstLineQueuePos = queuePos; for( visLine = 0; visLine < visLineCount; visLine++, queuePos++ ) { value.vmax = 0; value.vmin = 0; if( queuePos >= 0 && queuePos < queueTrackCount ) { // ...name SjPlaylistEntry& urlInfo2 = recentPlayer->m_queue.GetInfo(queuePos); value.string = CombineArtistNTitle(urlInfo2.GetLeadArtistName(), urlInfo2.GetTrackName()); if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_AUTOPLAY ) { if( recentPlayer->m_queue.GetFlags(queuePos)&SJ_PLAYLISTENTRY_AUTOPLAY ) { value.string.Prepend(_("AutoPlay")+wxString(wxT(": "))); } } if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TRACKNR ) { value.string.Prepend(wxString::Format(wxT("%i. "), (int)queuePos+1)); } // ...time / right icon value.value = 0; if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { value.value |= (SJ_VFLAG_MOVABLE); } if( IsOpAvailable(SJ_OP_UNQUEUE) ) { value.value |= (SJ_VFLAG_ICONR_DELETE); } if( queuePos == queuePlayingPos && !recentPlayer->IsStopped() ) { value.value |= SJ_VFLAG_VMIN_IS_TIME; if( IsOpAvailable(SJ_OP_TOGGLE_TIME_MODE) ) value.value |= SJ_VFLAG_TIME_CLICKABLE; long totalTime = recentPlayer->GetTotalTime(); if( m_showRemainingTime && totalTime > 0 ) { value.value |= SJ_VFLAG_VMIN_MINUS; value.vmin = recentPlayer->GetRemainingTime(); if( value.vmin <= 0 ) { value.vmin = urlInfo2.GetPlaytimeMs(); } } else { value.vmin = recentPlayer->GetElapsedTime(); } if( m_skinFlags&SJ_SKIN_SHOW_DISPLAY_TOTAL_TIME ) { value.vmax = totalTime; value.value |= value.vmax>0? SJ_VFLAG_VMAX_IS_TIME : 0; } } else { value.vmin = urlInfo2.GetPlaytimeMs(); value.value |= value.vmin>0? SJ_VFLAG_VMIN_IS_TIME : 0; } // marked (or just added?) if( m_display.m_selectedIds.Lookup(urlInfo2.GetId()) ) { value.value |= SJ_VFLAG_BOLD; if( queuePos == queuePlayingPos ) { m_display.m_backupedCurrBold = TRUE; } } // ...left icon if( queuePos == queuePlayingPos ) { if( recentPlayer->IsStopped() ) { value.value |= SJ_VFLAG_ICONL_STOP; } else if( recentPlayer->IsPaused() ) { value.value |= SJ_VFLAG_ICONL_PAUSE; } else { value.value |= SJ_VFLAG_ICONL_PLAY; } m_display.m_backupedCurrTitle = value.string; m_display.m_backupedCurrLine = visLine; } else { long entryFlags = recentPlayer->m_queue.GetFlags(queuePos); if( entryFlags & SJ_PLAYLISTENTRY_MOVED_DOWN ) { if( !recentPlayer->m_queue.IsBoring(queuePos, currTimestamp) ) { entryFlags &= ~SJ_PLAYLISTENTRY_MOVED_DOWN; recentPlayer->m_queue.SetFlags(queuePos, entryFlags); } } if( entryFlags&SJ_PLAYLISTENTRY_ERRONEOUS ) { value.value |= SJ_VFLAG_ICONL_ERRONEOUS; } else if( recentPlayer->m_queue.WasPlayed(queuePos) ) { value.value |= SJ_VFLAG_ICONL_PLAYED; } else if( entryFlags&SJ_PLAYLISTENTRY_MOVED_DOWN ) { value.value |= SJ_VFLAG_ICONL_MOVED_DOWN; } else { value.value |= SJ_VFLAG_ICONL_EMPTY; } } } else { // ...empty line value.value = SJ_VFLAG_ICONL_EMPTY; value.string.Empty(); } SetSkinTargetValue(IDT_DISPLAY_LINE_FIRST+visLine, value); } } // set "currTrack", "nextTrack" and "currTime" targets if( !displayMsgInCurrNextTrack ) { if( HasSkinTarget(IDT_CURR_TRACK) ) { value.value = 0; value.string = SJ_PROGRAM_NAME; if( !IsStopped() && queuePlayingPos < queueTrackCount ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(queuePlayingPos); value.string = CombineArtistNTitle(urlInfo4.GetLeadArtistName(), urlInfo4.GetTrackName()); } SetSkinTargetValue(IDT_CURR_TRACK, value); } if( HasSkinTarget(IDT_NEXT_TRACK) ) { value.value = 0; value.string.Empty(); if( !IsStopped() ) { if( GetShuffle() ) { if( HasNextRegardAP() ) { value.string = _("Shuffle"); } } else { if( queuePlayingPos+1 < queueTrackCount ) { SjPlaylistEntry& urlInfo4 = m_player.m_queue.GetInfo(queuePlayingPos+1); value.string = CombineArtistNTitle(urlInfo4.GetLeadArtistName(), urlInfo4.GetTrackName()); } } } SetSkinTargetValue(IDT_NEXT_TRACK, value); } } if( HasSkinTarget(IDT_CURR_TIME) ) { UpdateCurrTime(); } // playing states value.vmin = 0; value.vmax = 255; value.thumbSize = 0; value.value = m_player.GetMainVol(); SetSkinTargetValue(IDT_MAIN_VOL_SLIDER, value); value.vmax = 0; value.value = m_player.GetMainVolMute()? 1 : 0; SetSkinTargetValue(IDT_MAIN_VOL_MUTE, value); value.value = m_player.IsPlaying()? 1 : 0; SetSkinTargetValue(IDT_PLAY, value); value.value = m_player.IsPaused()? 1 : 0; SetSkinTargetValue(IDT_PAUSE, value); value.value = m_player.IsStopped()? 1 : 0; SetSkinTargetValue(IDT_STOP, value); value.value = HasPrev()? 0 : 2; SetSkinTargetValue(IDT_PREV, value); value.value = HasNextRegardAP()? 0 : 2; SetSkinTargetValue(IDT_NEXT, value); SetSkinTargetValue(IDT_FADE_TO_NEXT, value); value.value = m_player.StopAfterThisTrack()? 1 : (/*m_player.IsStopped()? 2 :*/ 0); SetSkinTargetValue(IDT_STOP_AFTER_THIS_TRACK, value); value.value = m_player.StopAfterEachTrack()? 1 : (/*m_player.IsStopped()? 2 :*/ 0); SetSkinTargetValue(IDT_STOP_AFTER_EACH_TRACK, value); value.value = m_player.m_queue.GetShuffle()? 1 : 0; SetSkinTargetValue(IDT_SHUFFLE, value); value.value = m_player.m_queue.GetRepeat(); /*0=off, 1=single, 2=all*/ SetSkinTargetValue(IDT_REPEAT, value); value.value = queueTrackCount? 0/*enabled*/ : 2/*disabled*/; SetSkinTargetValue(IDT_APPEND_FILES, value); SetSkinTargetValue(IDT_SAVE_PLAYLIST, value); SetSkinTargetValue(IDT_UNQUEUE_ALL, value); SetSkinTargetValue(IDT_MORE_FROM_CURR_ALBUM, value); SetSkinTargetValue(IDT_MORE_FROM_CURR_ARTIST, value); }
void SjMainFrame::OnSkinDisplayEvent(int targetId, SjSkinValue& value, long accelFlags) { if( targetId >= IDT_DISPLAY_LINE_FIRST && targetId <= IDT_DISPLAY_LINE_LAST ) { long displayLine = targetId-IDT_DISPLAY_LINE_FIRST; GotDisplayInputFromUser(); if( !m_display.m_msg1.IsEmpty() ) { ClearDisplayMsg(); return; } long queuePos = m_display.m_firstLineQueuePos + displayLine; if( queuePos >= 0 && queuePos < m_player.m_queue.GetCount() ) { if( value.value == SJ_SUBITEM_ICONRIGHT && IsOpAvailable(SJ_OP_UNQUEUE) ) { UnqueueByPos(queuePos); } else if( value.value == SJ_SUBITEM_ICONLEFT ) { if( m_player.m_queue.GetCurrPos() == queuePos ) { if( IsOpAvailable(SJ_OP_PLAYPAUSE) ) { PlayOrPause(accelFlags != 0); } } else if( m_player.m_queue.WasPlayed(queuePos) ) { if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { m_player.m_queue.ResetPlayCount(queuePos); UpdateDisplay(); } } } else if( value.value == SJ_SUBITEM_TEXT_DCLICK && IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { #ifdef DEBUG_DISPLAY SjPlaylistEntry& urlInfo = m_player.m_queue.GetInfo(queuePos); wxLogDebug("Line pos. %i: %s - %s", (int)queuePos, urlInfo.GetLeadArtistName().c_str(), urlInfo.GetTrackName().c_str()); #endif if( m_player.m_queue.GetCurrPos() == queuePos && IsPlaying() ) { ; // PlayOrPause(); // better do nothing } else { m_player.GotoAbsPos(queuePos, accelFlags!=0); if( !IsPlaying() ) { Play(); UpdateDisplay(); } } } else if( (value.value == SJ_SUBITEM_TEXT_MOUSEDOWN || value.value == SJ_SUBITEM_TEXT/*_MOUSEUP*/ ) && IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { MarkDisplayTrack(targetId, value.value == SJ_SUBITEM_TEXT_MOUSEDOWN, value.vmin); } else if( value.value == SJ_SUBITEM_TEXT_MIDDLECLICK ) { if( g_accelModule->m_middleMouseAction ) { long queueId = m_player.m_queue.GetIdByPos(queuePos); if( queueId == 0 ) { return; } if( !m_display.m_selectedIds.Lookup(queueId) ) { // mark the item under the mouse if it is not marked m_display.m_selectedIds.Clear(); m_display.m_selectedIds.Insert(queueId, 1); m_display.m_selectedAnchorId = queueId; UpdateDisplay(); } m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = SJ_DISPLAY_SELECTION_LOCK_MS; m_contextMenuClickedUrls = m_player.m_queue.GetUrlsByIds(m_display.m_selectedIds); m_contextMenuClickedId = queueId; switch( g_accelModule->m_middleMouseAction ) { case SJ_ACCEL_MID_OPENS_TAG_EDITOR: if( IsAllAvailable() ) { g_tagEditorModule->OpenTagEditor(new SjDisplayEditDlg()); } break; } } } } else { // click on empty line; remove all marks m_display.m_selectedIds.Clear(); m_display.m_selectedAnchorId = 0; UpdateDisplay(); } } else switch( targetId ) { // curr / next tracks case IDT_CURR_TRACK: if( value.value == SJ_SUBITEM_TEXT_DCLICK && !IsStopped() && IsPaused() && IsOpAvailable(SJ_OP_PLAYPAUSE) ) { Play(); UpdateDisplay(); } break; case IDT_NEXT_TRACK: if( value.value == SJ_SUBITEM_TEXT_DCLICK && !IsStopped() && !GetShuffle() && HasNextIgnoreAP() && IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { GotoNextRegardAP(accelFlags!=0); if( !IsPlaying() ) Play(); UpdateDisplay(); } break; // main volume case IDT_MAIN_VOL_UP: case IDT_MAIN_VOL_DOWN: if( IsOpAvailable(SJ_OP_MAIN_VOL) ) { SetRelMainVol(targetId==IDT_MAIN_VOL_UP? 8 : -8); SetSkinTargetValue(IDT_MAIN_VOL_MUTE, m_player.GetMainVolMute()? 1 : 0); // maybe later -- SetDisplayMsg(_("Volume")+wxString::Format(": %i%%", (m_player.GetMainVolume()*100)/255), SDM_STATE_CHANGE_MS); } break; case IDT_MAIN_VOL_SLIDER: if( IsOpAvailable(SJ_OP_MAIN_VOL) ) { SetAbsMainVol(value.value); SetSkinTargetValue(IDT_MAIN_VOL_MUTE, m_player.GetMainVolMute()? 1 : 0); // maybe later -- SetDisplayMsg(_("Volume")+wxString::Format(": %i%%", (m_player.GetMainVolume()*100)/255), SDM_STATE_CHANGE_MS); } break; case IDT_MAIN_VOL_MUTE: if( IsOpAvailable(SJ_OP_MAIN_VOL) ) { m_player.ToggleMainVolMute(); UpdateDisplay(); } break; // seek case IDT_SEEK: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { SjPlayer* recentPlayer = &g_mainFrame->m_player; recentPlayer->SeekAbs(value.value*SJ_SEEK_RESOLUTION); UpdateDisplay(); } break; case IDT_SEEK_BWD: case IDT_SEEK_FWD: if( IsOpAvailable(SJ_OP_EDIT_QUEUE) ) { SjPlayer* recentPlayer = &g_mainFrame->m_player; recentPlayer->SeekRel(targetId==IDT_SEEK_BWD? -5000 : 5000); UpdateDisplay(); } break; // misc. case IDO_DISPLAY_COVER_EXPLR: { SjPlayer* recentPlayer = &g_mainFrame->m_player; g_tools->ExploreUrl(m_columnMixer.GetTrackCoverUrl(recentPlayer->m_queue.GetUrlByPos(-1))); } break; case IDT_DISPLAY_COVER: case IDO_DISPLAY_COVER: // IDO_DISPLAY_COVER is only used for the menu item if( value.value == SJ_SUBITEM_TEXT_DCLICK || (value.value == SJ_SUBITEM_TEXT_MIDDLECLICK && g_accelModule->m_middleMouseAction==SJ_ACCEL_MID_OPENS_TAG_EDITOR) || targetId != IDT_DISPLAY_COVER ) { // open the cover editor for the display cover SjPlayer* recentPlayer = &g_mainFrame->m_player; wxString trackUrl = recentPlayer->m_queue.GetUrlByPos(-1); wxSqlt sql; sql.Query(wxT("SELECT albumid FROM tracks WHERE url='") + sql.QParam(trackUrl) + wxT("';")); unsigned long albumId = sql.Next()? sql.GetLong(0) : 0; wxString selArtUrl = m_columnMixer.GetTrackCoverUrl(recentPlayer->m_queue.GetUrlByPos(-1)); wxArrayLong artIds; wxArrayString artUrls; g_mainFrame->m_libraryModule->GetPossibleAlbumArts(albumId, artIds, &artUrls, true/*addAutoCover*/); g_artEditorModule->OnArtMenu(g_mainFrame, artUrls, selArtUrl, albumId, IDM_OPENARTEDITOR, NULL, true /*IsPlaylistCover*/ ); /* // simulate a double click on the cover row or explore the cover url long index, r; SjCol* col = m_columnMixer.GetMaskedCol(recentPlayer->m_queue.GetUrlByPos(recentPlayer->m_queue.GetCurrPos()), index); SjAlbumCoverRow* row; if( col ) { for( r = 0; r < col->m_rowCount; r++ ) { if( col->m_rows[r]->m_roughType == SJ_RRTYPE_COVER ) { row = (SjAlbumCoverRow*)col->m_rows[r]; row->IsPlaylistCover(true); // if set to true, "follow playlist" is always active row->OnMiddleClick(false); break; } } delete col; } */ } break; case IDT_DISPLAY_UP: GotDisplayInputFromUser(); if( m_display.m_scrollPos == -1 ) { m_display.m_scrollPos = GetQueuePos(); } if( m_display.m_scrollPos >= 1 ) { m_display.m_scrollPos--; UpdateDisplay(); } break; case IDT_DISPLAY_DOWN: GotDisplayInputFromUser(); if( m_display.m_scrollPos == -1 ) { m_display.m_scrollPos = GetQueuePos(); } m_display.m_scrollPos++; // corrected in UpdateDisplay() UpdateDisplay(); break; case IDT_DISPLAY_V_SCROLL: GotDisplayInputFromUser(); m_display.m_scrollPos = value.value; UpdateDisplay(); break; } }
void SjMainFrame::OnSkinTargetContextMenu(int targetId, long x, long y) { SjMenu mainMenu(0); int idtSettings = IDT_SETTINGS_JUKEBOX; bool appendGotoCurrMark = FALSE; bool prependOpen = TRUE; bool embedFastSearch = FALSE; long unmarkQueueId = 0; m_display.m_tagEditorJustOpened = FALSE; GotInputFromUser(); m_contextMenuClickedUrls.Clear(); m_contextMenuClickedId = 0; if( (targetId>=IDT_DISPLAY_LINE_FIRST && targetId<=IDT_DISPLAY_LINE_LAST) || targetId==IDT_CURR_TRACK || targetId==IDT_NEXT_TRACK ) { // queue menu items if( IsAllAvailable() && (targetId==IDT_CURR_TRACK || targetId==IDT_NEXT_TRACK) ) { if( targetId==IDT_CURR_TRACK || targetId==IDT_NEXT_TRACK ) { long queuePos = m_player.m_queue.GetCurrPos()+(targetId==IDT_NEXT_TRACK?1:0); if( !IsStopped() && queuePos >= 0 && queuePos < m_player.m_queue.GetCount() ) { if( targetId==IDT_CURR_TRACK || !GetShuffle() ) { m_contextMenuClickedUrls.Add(m_player.m_queue.GetUrlByPos(queuePos)); m_contextMenuClickedId = m_player.m_queue.GetIdByPos(queuePos); m_display.m_selectedIds.Clear(); m_display.m_selectedIds.Insert(m_contextMenuClickedId, 1); m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = 60*60*1000; // long enough, i think after one hour, the context menu should be closed unmarkQueueId = m_contextMenuClickedId; UpdateDisplay(); } } } else { long trackCount = m_player.m_queue.GetCount(); if( trackCount > 0 ) { // mark the line under the mouse if it is not marked long queuePos = m_display.m_firstLineQueuePos + (targetId-IDT_DISPLAY_LINE_FIRST); if( queuePos >= 0 && queuePos < m_player.m_queue.GetCount() ) { m_contextMenuClickedId = m_player.m_queue.GetIdByPos(queuePos); if( m_contextMenuClickedId != 0 ) { if( m_display.m_selectedIds.Lookup(m_contextMenuClickedId) == 0 ) { m_display.m_selectedIds.Clear(); m_display.m_selectedIds.Insert(m_contextMenuClickedId, 1); m_display.m_selectedIdsTimestamp = SjTools::GetMsTicks(); m_display.m_selectedIdsLockMs = 60*60*1000; // long enough, i think after one hour, the context menu should be closed unmarkQueueId = m_contextMenuClickedId; UpdateDisplay(); } } } m_contextMenuClickedUrls = m_player.m_queue.GetUrlsByIds(m_display.m_selectedIds); appendGotoCurrMark = TRUE; } } long markedCount = m_contextMenuClickedUrls.GetCount(); CreateUnqueueMenu(mainMenu); mainMenu.AppendSeparator(); mainMenu.Append(IDO_EDITQUEUE, _("Edit tracks/Get info")+wxString(wxT("..."))); mainMenu.Enable(IDO_EDITQUEUE, (markedCount>0)); m_libraryModule->CreateRatingMenu(mainMenu, IDO_RATINGQUEUE00, m_contextMenuClickedUrls); m_libraryModule->CreateArtistInfoMenu(mainMenu, IDO_ARTISTINFQUEUE00, m_contextMenuClickedUrls); mainMenu.Append(IDO_EXPLOREQUEUE, _("Show file")); mainMenu.Enable(IDO_EXPLOREQUEUE, (markedCount==1)); } } else { switch( targetId ) { case IDT_DISPLAY_COVER: if( m_player.m_queue.GetCount() ) { mainMenu.Append(IDO_DISPLAY_COVER, _("Cover editor")); if( IsAllAvailable() ) { mainMenu.Append(IDO_DISPLAY_COVER_EXPLR, _("Show file")); } } break; case IDT_OPEN_FILES: case IDT_APPEND_FILES: case IDT_SAVE_PLAYLIST: case IDT_UNQUEUE_ALL: case IDT_DISPLAY_UP: case IDT_DISPLAY_DOWN: case IDT_DISPLAY_V_SCROLL: CreateUnqueueMenu(mainMenu); break; case IDT_SEARCH: case IDT_SEARCH_BUTTON: case IDT_SEARCH_INFO: // "Search" menu prependOpen = FALSE; if( IsAllAvailable() ) { embedFastSearch = TRUE; } else { CreateSearchMenu(mainMenu); } break; } } CreateContextMenu_(mainMenu, prependOpen, idtSettings, appendGotoCurrMark, embedFastSearch); if( targetId == IDT_MAINMENU && !IsKioskStarted() ) { mainMenu.AppendSeparator(); mainMenu.Append(IDT_QUIT); } if( mainMenu.GetMenuItemCount() ) { PopupMenu(&mainMenu, x, y); } if( unmarkQueueId && !m_display.m_tagEditorJustOpened ) // if the tag editor is opened in between, the marked tracks in the display should stay { m_display.m_selectedIds.Remove(unmarkQueueId); UpdateDisplay(); } }