Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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;

		}
}
Example #4
0
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();
	}
}