📄 gtkmusicbrowser.cpp
字号:
PlaylistItem *tip = NULL;
if (tipee)
tip = tipee;
if (!tip) {
if (GetClickState() == kContextPlaylist) {
if (m_lastindex == kInvalidIndex)
return;
tip = m_plm->ItemAt(*(m_plSelected.begin()));
}
else
return;
}
string artistname = tip->GetMetaData().Artist();
if (artistname.size() == 0 || artistname == "Unknown")
return;
string encoded;
ReplaceSpaces(artistname, encoded);
string url = string("http://www.fairtunes.com/servlet/ArtistLookupServlet?redirectPage=http://www.fairtunes.com/search.jsp&searchTerms=") + encoded;
LaunchBrowser(url.c_str());
}
void GTKMusicBrowser::PopUpInfoEditor(PlaylistItem *editee)
{
if (editee) {
vector<PlaylistItem *> *list = new vector<PlaylistItem *>;
list->push_back(editee);
infoeditorUI *infoedit = new infoeditorUI(m_context, m_plm, list);
infoedit->DisplayInfo();
return;
}
if (GetClickState() == kContextPlaylist) {
if (m_lastindex == kInvalidIndex)
return;
vector<PlaylistItem *> *list = new vector<PlaylistItem *>;
set<uint32>::iterator i = m_plSelected.begin();
for (; i != m_plSelected.end(); i++)
list->push_back(m_plm->ItemAt(*i));
infoeditorUI *infoedit = new infoeditorUI(m_context, m_plm, list);
infoedit->DisplayInfo();
}
else if (GetClickState() == kContextBrowser) {
vector<PlaylistItem *> *list = NULL;
vector<TreeData *>::iterator i = mbSelections->begin();
for (; i != mbSelections->end(); i++) {
switch ((*i)->type) {
case kTreePlaylist: {
CreateNewEditor((char*)(*i)->playlistname.c_str());
break; }
case kTreeTrack: {
if (!list)
list = new vector<PlaylistItem *>;
list->push_back((*i)->track);
break; }
case kTreeUncat: {
MusicCatalog *cat = m_context->catalog;
vector<PlaylistItem *> *unsort =
(vector<PlaylistItem *>*)cat->GetUnsortedMusic();
if (unsort->size() > 0) {
if (!list)
list = new vector<PlaylistItem *>;
vector<PlaylistItem *>::iterator k = unsort->begin();
for (; k != unsort->end(); k++)
list->push_back(*k);
}
break; }
case kTreeAlbum: {
AlbumList *alb = (*i)->album;
vector<PlaylistItem *>::iterator j =
alb->m_trackList->begin();
if (!list)
list = new vector<PlaylistItem *>;
for (; j != alb->m_trackList->end(); j++)
list->push_back(*j);
break; }
case kTreeArtist: {
ArtistList *art = (*i)->artist;
vector<AlbumList *>::iterator j =
art->m_albumList->begin();
if (!list)
list = new vector<PlaylistItem *>;
for (; j != art->m_albumList->end(); j++) {
vector<PlaylistItem *>::iterator k =
(*j)->m_trackList->begin();
for (; k != (*j)->m_trackList->end(); k++)
list->push_back(*k);
}
break; }
case kTreeMyMusic:
case kTreeAll: {
MusicCatalog *cat = m_context->catalog;
vector<PlaylistItem *> *unsort =
(vector<PlaylistItem *>*)cat->GetUnsortedMusic();
vector<ArtistList *> *artlist =
(vector<ArtistList *>*)cat->GetMusicList();
if (!list)
list = new vector<PlaylistItem *>;
vector<ArtistList *>::iterator h = artlist->begin();
for (; h != artlist->end(); h++) {
vector<AlbumList *>::iterator z =
(*h)->m_albumList->begin();
for (; z != (*h)->m_albumList->end(); z++) {
vector<PlaylistItem *>::iterator x =
(*z)->m_trackList->begin();
for (; x != (*z)->m_trackList->end(); x++)
list->push_back(*x);
}
}
if (unsort->size() > 0) {
vector<PlaylistItem *>::iterator k = unsort->begin();
for (; k != unsort->end(); k++)
list->push_back(*k);
}
break; }
default:
break;
}
}
if (list) {
infoeditorUI *infoedit = new infoeditorUI(m_context, m_plm, list);
infoedit->DisplayInfo();
}
}
}
void GTKMusicBrowser::SaveCurrentPlaylist(char *path)
{
if (path != NULL)
m_currentListName = path;
if (m_currentListName.length() == 0)
return;
char *ext = strrchr(m_currentListName.c_str(), '.');
if (ext)
ext = ext + 1;
Error result = kError_NoErr;
int i = 0;
bool found = false;
PlaylistFormatInfo format;
while (ext && result == kError_NoErr) {
result = m_plm->GetSupportedPlaylistFormats(&format, i);
if (!strcmp(ext, format.GetExtension())) {
found = true;
break;
}
i++;
}
if (!found) {
m_plm->GetSupportedPlaylistFormats(&format, 0);
m_currentListName += "." ;
m_currentListName += format.GetExtension();
}
if (!strncmp("file://", m_currentListName.c_str(), 7)) {
m_plm->WritePlaylist(m_currentListName.c_str(), &format);
m_context->catalog->AddPlaylist(m_currentListName.c_str());
}
else {
uint32 urlLength = m_currentListName.length() + 20;
char *writeURL = new char[urlLength];
Error err = FilePathToURL(m_currentListName.c_str(), writeURL, &urlLength);
if (IsntError(err)) {
m_plm->WritePlaylist(writeURL, &format);
m_context->catalog->AddPlaylist(writeURL);
}
delete [] writeURL;
}
if (!master && !m_bCDMode) {
string labelstr = string("Editing playlist: ");
if (m_currentListName.length() == 0)
labelstr += string("New Playlist");
else
labelstr += m_currentListName;
gtk_label_set_text(GTK_LABEL(playlistLabel), labelstr.c_str());
}
}
void GTKMusicBrowser::LoadPlaylist(string &oPlaylist)
{
if (oPlaylist == m_currentListName)
return;
if (oPlaylist.length() == 0)
return;
if (m_currentListName.length() != 0 && !master)
SaveCurrentPlaylist(NULL);
if (!strncmp("file://", oPlaylist.c_str(), 7)) {
m_plm->ReadPlaylist(oPlaylist.c_str());
m_currentListName = oPlaylist;
}
else {
uint32 length = _MAX_PATH;
char *PlaylistURL = new char[length];
if (IsntError(FilePathToURL(oPlaylist.c_str(), PlaylistURL, &length))) {
m_plm->ReadPlaylist(PlaylistURL);
m_currentListName = PlaylistURL;
}
delete [] PlaylistURL;
}
}
void GTKMusicBrowser::ImportPlaylist(char *path)
{
if (!path)
return;
uint32 length = strlen(path) + 10;
char *url = new char[length];
if (IsntError(FilePathToURL(path, url, &length)))
m_context->catalog->AddPlaylist(path);
delete [] url;
}
void GTKMusicBrowser::ReadPlaylist(char *path, vector<PlaylistItem *> *plist)
{
m_plm->ReadPlaylist(path, plist);
}
GTKMusicBrowser::GTKMusicBrowser(FAContext *context, MusicBrowserUI *masterUI,
string playlistURL, bool cdCreationMode)
{
m_context = context;
m_initialized = false;
isVisible = false;
m_lastindex = 0;
m_currentListName = "";
m_state = kStateCollapsed;
statusContext = 0;
playlistList = NULL;
m_musicCatalog = NULL;
lastPanedPosition = -1;
lastPanedHandle = -1;
pauseState = 0;
stopState = 1;
musicBrowserTree = NULL;
m_playingindex = kInvalidIndex;
iSetRepeatMode = false;
iSetShuffleMode = false;
CD_DiscID = 0;
CD_numtracks = 0;
scheduleCDredraw = false;
CDTracks = new vector<PlaylistItem *>;
m_bIgnoringMusicCatalogMessages = false;
m_bCDMode = cdCreationMode;
stream_timer_started = false;
stream_timer = NULL;
m_sigsExist = false;
m_sigsStart = true;
playlistColsChanged = true;
for (int i = 0; i < 8; i++)
playlistCols[i] = kEmptyColumn;
playlistCols[0] = kPositionColumn;
mbSelections = new vector<TreeData *>;
parentUI = masterUI;
if (playlistURL.find("currentlist.m3u") <= playlistURL.length()) {
m_plm = context->plm;
master = true;
}
else {
m_plm = new PlaylistManager(context);
m_plm->SetActivePlaylist(kPlaylistKey_ExternalPlaylist);
master = false;
}
if (master) {
bool saveOnExit;
m_context->prefs->GetPrefBoolean(kSaveCurrentPlaylistOnExitPref, &saveOnExit);
if (saveOnExit) {
LoadPlaylist(playlistURL);
uint32 pos = 0;
m_context->prefs->GetPrefInt32(kSavedPlaylistPositionPref,
(int32 *)&pos);
m_plm->SetCurrentIndex(pos);
}
else
m_currentListName = playlistURL;
}
else if (playlistURL != "")
LoadPlaylist(playlistURL);
}
GTKMusicBrowser::~GTKMusicBrowser(void)
{
if (m_initialized) {
gtk_widget_destroy(musicBrowser);
if (stream_timer)
m_context->timerManager->StopTimer(stream_timer);
}
delete mbSelections;
delete CDTracks;
}
void GTKMusicBrowser::ShowMusicBrowser(void)
{
gdk_threads_enter();
isVisible = true;
if (m_initialized)
gtk_widget_show(musicBrowser);
else {
CreatePlaylist();
m_initialized = true;
}
if (master) {
bool viewMusicBrowser = true;
m_context->prefs->GetPrefBoolean(kViewMusicBrowserPref, &viewMusicBrowser);
if ((viewMusicBrowser == true) && (m_state == kStateCollapsed))
ExpandCollapseEvent();
else if ((viewMusicBrowser == false) && (m_state == kStateExpanded))
ExpandCollapseEvent();
}
SetToolbarType();
if (scheduleCDredraw)
RegenerateCDTree();
UpdatePlaylistList();
gdk_threads_leave();
}
void GTKMusicBrowser::Close(bool inMain)
{
gdk_threads_enter();
isVisible = false;
if (master) {
bool saveOnExit = false;
m_context->prefs->GetPrefBoolean(kSaveCurrentPlaylistOnExitPref, &saveOnExit);
if (saveOnExit && m_plm) {
SaveCurrentPlaylist(NULL);
m_context->prefs->SetPrefInt32(kSavedPlaylistPositionPref, m_plm->GetCurrentIndex());
}
}
else {
if (m_plm && m_currentListName.length() == 0 && m_plm->CountItems() > 0)
{
gdk_window_raise(musicBrowser->window);
GTKMessageDialog oBox;
string oMessage = string("Do you want to save this playlist to disk? ");
if (oBox.Show(oMessage.c_str(), "Save Confirmation", kMessageYesNo,
inMain) == kMessageReturnYes) {
FileSelector *filesel = new FileSelector("Save This Playlist to Disk");
if (filesel->Run())
m_curren
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -