Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

876 lines (790 sloc) 27.996 kb
/*
* Copyright (C) 2005-2012 Team XBMC
* http://www.xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XBMC; see the file COPYING. If not, see
* <http://www.gnu.org/licenses/>.
*
*/
#include "GUIWindowMusicNav.h"
#include "utils/FileUtils.h"
#include "utils/URIUtils.h"
#include "PlayListPlayer.h"
#include "GUIPassword.h"
#include "settings/GUIDialogContentSettings.h"
#include "filesystem/MusicDatabaseDirectory.h"
#include "filesystem/VideoDatabaseDirectory.h"
#include "PartyModeManager.h"
#include "playlists/PlayList.h"
#include "playlists/PlayListFactory.h"
#include "video/VideoDatabase.h"
#include "video/windows/GUIWindowVideoNav.h"
#include "music/tags/MusicInfoTag.h"
#include "guilib/GUIWindowManager.h"
#include "dialogs/GUIDialogOK.h"
#include "guilib/GUIKeyboardFactory.h"
#include "dialogs/GUIDialogYesNo.h"
#include "guilib/GUIEditControl.h"
#include "GUIUserMessages.h"
#include "filesystem/File.h"
#include "FileItem.h"
#include "Application.h"
#include "ApplicationMessenger.h"
#include "settings/Settings.h"
#include "settings/AdvancedSettings.h"
#include "guilib/LocalizeStrings.h"
#include "utils/log.h"
#include "utils/StringUtils.h"
#include "TextureCache.h"
#include "Util.h"
#include "URL.h"
using namespace std;
using namespace XFILE;
using namespace PLAYLIST;
using namespace MUSICDATABASEDIRECTORY;
#define CONTROL_BTNVIEWASICONS 2
#define CONTROL_BTNSORTBY 3
#define CONTROL_BTNSORTASC 4
#define CONTROL_BTNTYPE 5
#define CONTROL_LABELFILES 12
#define CONTROL_SEARCH 8
#define CONTROL_FILTER 15
#define CONTROL_BTNPARTYMODE 16
#define CONTROL_BTNMANUALINFO 17
#define CONTROL_BTN_FILTER 19
#define CONTROL_LABELEMPTY 18
CGUIWindowMusicNav::CGUIWindowMusicNav(void)
: CGUIWindowMusicBase(WINDOW_MUSIC_NAV, "MyMusicNav.xml")
{
m_vecItems->SetPath("?");
m_bDisplayEmptyDatabaseMessage = false;
m_thumbLoader.SetObserver(this);
m_searchWithEdit = false;
}
CGUIWindowMusicNav::~CGUIWindowMusicNav(void)
{
}
bool CGUIWindowMusicNav::OnMessage(CGUIMessage& message)
{
switch (message.GetMessage())
{
case GUI_MSG_WINDOW_RESET:
m_vecItems->SetPath("?");
break;
case GUI_MSG_WINDOW_DEINIT:
if (m_thumbLoader.IsLoading())
m_thumbLoader.StopThread();
break;
case GUI_MSG_WINDOW_INIT:
{
/* We don't want to show Autosourced items (ie removable pendrives, memorycards) in Library mode */
m_rootDir.AllowNonLocalSources(false);
// is this the first time the window is opened?
if (m_vecItems->GetPath() == "?" && message.GetStringParam().IsEmpty())
message.SetStringParam(g_settings.m_defaultMusicLibSource);
DisplayEmptyDatabaseMessage(false); // reset message state
if (!CGUIWindowMusicBase::OnMessage(message))
return false;
// base class has opened the database, do our check
DisplayEmptyDatabaseMessage(m_musicdatabase.GetSongsCount() <= 0);
if (m_bDisplayEmptyDatabaseMessage)
{
// no library - make sure we focus on a known control, and default to the root.
SET_CONTROL_FOCUS(CONTROL_BTNTYPE, 0);
m_vecItems->SetPath("");
SetHistoryForPath("");
Update("");
}
return true;
}
break;
case GUI_MSG_CLICKED:
{
int iControl = message.GetSenderId();
if (iControl == CONTROL_BTNPARTYMODE)
{
if (g_partyModeManager.IsEnabled())
g_partyModeManager.Disable();
else
{
if (!g_partyModeManager.Enable())
{
SET_CONTROL_SELECTED(GetID(),CONTROL_BTNPARTYMODE,false);
return false;
}
// Playlist directory is the root of the playlist window
if (m_guiState.get()) m_guiState->SetPlaylistDirectory("playlistmusic://");
return true;
}
UpdateButtons();
}
else if (iControl == CONTROL_BTNMANUALINFO)
{
OnManualAlbumInfo();
return true;
}
else if (iControl == CONTROL_SEARCH)
{
if (m_searchWithEdit)
{
// search updated - reset timer
m_searchTimer.StartZero();
// grab our search string
CGUIMessage selected(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_SEARCH);
OnMessage(selected);
SetProperty("search", selected.GetLabel());
return true;
}
CStdString search(GetProperty("search").asString());
CGUIKeyboardFactory::ShowAndGetFilter(search, true);
SetProperty("search", search);
return true;
}
}
break;
case GUI_MSG_PLAYBACK_STOPPED:
case GUI_MSG_PLAYBACK_ENDED:
case GUI_MSG_PLAYLISTPLAYER_STOPPED:
case GUI_MSG_PLAYBACK_STARTED:
{
SET_CONTROL_SELECTED(GetID(),CONTROL_BTNPARTYMODE, g_partyModeManager.IsEnabled());
}
break;
case GUI_MSG_NOTIFY_ALL:
{
if (message.GetParam1() == GUI_MSG_SEARCH_UPDATE && IsActive())
{
// search updated - reset timer
m_searchTimer.StartZero();
SetProperty("search", message.GetStringParam());
}
}
}
return CGUIWindowMusicBase::OnMessage(message);
}
bool CGUIWindowMusicNav::OnAction(const CAction& action)
{
if (action.GetID() == ACTION_SCAN_ITEM)
{
int item = m_viewControl.GetSelectedItem();
CMusicDatabaseDirectory dir;
if (item > -1 && m_vecItems->Get(item)->m_bIsFolder
&& (dir.HasAlbumInfo(m_vecItems->Get(item)->GetPath())||
dir.IsArtistDir(m_vecItems->Get(item)->GetPath())))
OnContextButton(item,CONTEXT_BUTTON_INFO);
return true;
}
return CGUIWindowMusicBase::OnAction(action);
}
CStdString CGUIWindowMusicNav::GetQuickpathName(const CStdString& strPath) const
{
if (strPath.Equals("musicdb://1/"))
return "Genres";
else if (strPath.Equals("musicdb://2/"))
return "Artists";
else if (strPath.Equals("musicdb://3/"))
return "Albums";
else if (strPath.Equals("musicdb://4/"))
return "Songs";
else if (strPath.Equals("musicdb://5/"))
return "Top100";
else if (strPath.Equals("musicdb://5/2/"))
return "Top100Songs";
else if (strPath.Equals("musicdb://5/1/"))
return "Top100Albums";
else if (strPath.Equals("musicdb://6/"))
return "RecentlyAddedAlbums";
else if (strPath.Equals("musicdb://7/"))
return "RecentlyPlayedAlbums";
else if (strPath.Equals("musicdb://8/"))
return "Compilations";
else if (strPath.Equals("musicdb://9/"))
return "Years";
else if (strPath.Equals("musicdb://10/"))
return "Singles";
else if (strPath.Equals("special://musicplaylists/"))
return "Playlists";
else
{
CLog::Log(LOGERROR, " CGUIWindowMusicNav::GetQuickpathName: Unknown parameter (%s)", strPath.c_str());
return strPath;
}
}
bool CGUIWindowMusicNav::OnClick(int iItem)
{
if (iItem < 0 || iItem >= m_vecItems->Size()) return false;
CFileItemPtr item = m_vecItems->Get(iItem);
if (item->GetPath().Left(14) == "musicsearch://")
{
if (m_searchWithEdit)
OnSearchUpdate();
else
{
CStdString search(GetProperty("search").asString());
CGUIKeyboardFactory::ShowAndGetFilter(search, true);
SetProperty("search", search);
}
return true;
}
if (item->IsMusicDb() && !item->m_bIsFolder)
m_musicdatabase.SetPropertiesForFileItem(*item);
return CGUIWindowMusicBase::OnClick(iItem);
}
bool CGUIWindowMusicNav::Update(const CStdString &strDirectory)
{
if (m_thumbLoader.IsLoading())
m_thumbLoader.StopThread();
if (CGUIWindowMusicBase::Update(strDirectory))
{
m_thumbLoader.Load(*m_unfilteredItems);
return true;
}
return false;
}
bool CGUIWindowMusicNav::GetDirectory(const CStdString &strDirectory, CFileItemList &items)
{
if (m_bDisplayEmptyDatabaseMessage)
return true;
if (strDirectory.IsEmpty())
AddSearchFolder();
bool bResult = CGUIWindowMusicBase::GetDirectory(strDirectory, items);
if (bResult)
{
if (items.IsPlayList())
OnRetrieveMusicInfo(items);
}
// update our content in the info manager
if (strDirectory.Left(10).Equals("videodb://"))
{
CVideoDatabaseDirectory dir;
VIDEODATABASEDIRECTORY::NODE_TYPE node = dir.GetDirectoryChildType(strDirectory);
if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS)
items.SetContent("musicvideos");
}
else if (strDirectory.Left(10).Equals("musicdb://"))
{
CMusicDatabaseDirectory dir;
NODE_TYPE node = dir.GetDirectoryChildType(strDirectory);
if (node == NODE_TYPE_ALBUM ||
node == NODE_TYPE_ALBUM_RECENTLY_ADDED ||
node == NODE_TYPE_ALBUM_RECENTLY_PLAYED ||
node == NODE_TYPE_ALBUM_TOP100 ||
node == NODE_TYPE_ALBUM_COMPILATIONS ||
node == NODE_TYPE_YEAR_ALBUM)
items.SetContent("albums");
else if (node == NODE_TYPE_ARTIST)
items.SetContent("artists");
else if (node == NODE_TYPE_SONG ||
node == NODE_TYPE_SONG_TOP100 ||
node == NODE_TYPE_SINGLES)
items.SetContent("songs");
else if (node == NODE_TYPE_GENRE)
items.SetContent("genres");
else if (node == NODE_TYPE_YEAR)
items.SetContent("years");
}
else if (strDirectory.Equals("special://musicplaylists/"))
items.SetContent("playlists");
else if (strDirectory.Equals("plugin://music/"))
items.SetContent("plugins");
else if (items.IsPlayList())
items.SetContent("songs");
return bResult;
}
void CGUIWindowMusicNav::UpdateButtons()
{
CGUIWindowMusicBase::UpdateButtons();
// Update object count
int iItems = m_vecItems->Size();
if (iItems)
{
// check for parent dir and "all" items
// should always be the first two items
for (int i = 0; i <= (iItems>=2 ? 1 : 0); i++)
{
CFileItemPtr pItem = m_vecItems->Get(i);
if (pItem->IsParentFolder()) iItems--;
if (pItem->GetPath().Left(4).Equals("/-1/")) iItems--;
}
// or the last item
if (m_vecItems->Size() > 2 &&
m_vecItems->Get(m_vecItems->Size()-1)->GetPath().Left(4).Equals("/-1/"))
iItems--;
}
CStdString items;
items.Format("%i %s", iItems, g_localizeStrings.Get(127).c_str());
SET_CONTROL_LABEL(CONTROL_LABELFILES, items);
// set the filter label
CStdString strLabel;
// "Playlists"
if (m_vecItems->GetPath().Equals("special://musicplaylists/"))
strLabel = g_localizeStrings.Get(136);
// "{Playlist Name}"
else if (m_vecItems->IsPlayList())
{
// get playlist name from path
CStdString strDummy;
URIUtils::Split(m_vecItems->GetPath(), strDummy, strLabel);
}
// everything else is from a musicdb:// path
else
{
CMusicDatabaseDirectory dir;
dir.GetLabel(m_vecItems->GetPath(), strLabel);
}
SET_CONTROL_LABEL(CONTROL_FILTER, strLabel);
SET_CONTROL_SELECTED(GetID(),CONTROL_BTNPARTYMODE, g_partyModeManager.IsEnabled());
}
void CGUIWindowMusicNav::PlayItem(int iItem)
{
// unlike additemtoplaylist, we need to check the items here
// before calling it since the current playlist will be stopped
// and cleared!
// root is not allowed
if (m_vecItems->IsVirtualDirectoryRoot())
return;
CGUIWindowMusicBase::PlayItem(iItem);
}
void CGUIWindowMusicNav::OnWindowLoaded()
{
const CGUIControl *control = GetControl(CONTROL_SEARCH);
m_searchWithEdit = (control && control->GetControlType() == CGUIControl::GUICONTROL_EDIT);
CGUIWindowMusicBase::OnWindowLoaded();
if (m_searchWithEdit)
{
SendMessage(GUI_MSG_SET_TYPE, CONTROL_SEARCH, CGUIEditControl::INPUT_TYPE_SEARCH);
SET_CONTROL_LABEL2(CONTROL_SEARCH, GetProperty("search").asString());
}
}
void CGUIWindowMusicNav::GetContextButtons(int itemNumber, CContextButtons &buttons)
{
CGUIWindowMusicBase::GetContextButtons(itemNumber, buttons);
CFileItemPtr item;
if (itemNumber >= 0 && itemNumber < m_vecItems->Size())
item = m_vecItems->Get(itemNumber);
if (item && (item->GetExtraInfo().Find("lastfm") < 0) && !item->GetPath().Left(14).Equals("addons://more/"))
{
// are we in the playlists location?
bool inPlaylists = m_vecItems->GetPath().Equals(CUtil::MusicPlaylistsLocation()) ||
m_vecItems->GetPath().Equals("special://musicplaylists/");
CMusicDatabaseDirectory dir;
// enable music info button on an album or on a song.
if (item->IsAudio() && !item->IsPlayList() && !item->IsSmartPlayList() &&
!item->IsLastFM() && !item->m_bIsFolder)
{
buttons.Add(CONTEXT_BUTTON_SONG_INFO, 658);
}
else if (item->IsVideoDb())
{
if (!item->m_bIsFolder) // music video
buttons.Add(CONTEXT_BUTTON_INFO, 20393);
if (item->GetPath().Left(14).Equals("videodb://3/4/") &&
item->GetPath().size() > 14 && item->m_bIsFolder)
{
long idArtist = m_musicdatabase.GetArtistByName(m_vecItems->Get(itemNumber)->GetLabel());
if (idArtist > - 1)
buttons.Add(CONTEXT_BUTTON_INFO,21891);
}
}
else if (!inPlaylists && (dir.HasAlbumInfo(item->GetPath())||
dir.IsArtistDir(item->GetPath()) ) &&
!dir.IsAllItem(item->GetPath()) && !item->IsParentFolder() &&
!item->IsLastFM() && !item->IsPlugin() && !item->IsScript() &&
!item->GetPath().Left(14).Equals("musicsearch://"))
{
if (dir.IsArtistDir(item->GetPath()))
buttons.Add(CONTEXT_BUTTON_INFO, 21891);
else
buttons.Add(CONTEXT_BUTTON_INFO, 13351);
}
// enable query all albums button only in album view
if (dir.HasAlbumInfo(item->GetPath()) && !dir.IsAllItem(item->GetPath()) &&
item->m_bIsFolder && !item->IsVideoDb() && !item->IsParentFolder() &&
!item->IsLastFM() &&
!item->IsPlugin() && !item->GetPath().Left(14).Equals("musicsearch://"))
{
buttons.Add(CONTEXT_BUTTON_INFO_ALL, 20059);
}
// enable query all artist button only in album view
if (dir.IsArtistDir(item->GetPath()) && !dir.IsAllItem(item->GetPath()) &&
item->m_bIsFolder && !item->IsVideoDb())
{
ADDON::ScraperPtr info;
m_musicdatabase.GetScraperForPath(item->GetPath(), info, ADDON::ADDON_SCRAPER_ARTISTS);
if (info && info->Supports(CONTENT_ARTISTS))
buttons.Add(CONTEXT_BUTTON_INFO_ALL, 21884);
}
//Set default or clear default
NODE_TYPE nodetype = dir.GetDirectoryType(item->GetPath());
if (!item->IsParentFolder() && !inPlaylists &&
(nodetype == NODE_TYPE_ROOT ||
nodetype == NODE_TYPE_OVERVIEW ||
nodetype == NODE_TYPE_TOP100))
{
if (!item->GetPath().Equals(g_settings.m_defaultMusicLibSource))
buttons.Add(CONTEXT_BUTTON_SET_DEFAULT, 13335); // set default
if (strcmp(g_settings.m_defaultMusicLibSource, ""))
buttons.Add(CONTEXT_BUTTON_CLEAR_DEFAULT, 13403); // clear default
}
NODE_TYPE childtype = dir.GetDirectoryChildType(item->GetPath());
if (childtype == NODE_TYPE_ALBUM ||
childtype == NODE_TYPE_ARTIST ||
nodetype == NODE_TYPE_GENRE ||
nodetype == NODE_TYPE_ALBUM ||
nodetype == NODE_TYPE_ALBUM_RECENTLY_ADDED ||
nodetype == NODE_TYPE_ALBUM_COMPILATIONS)
{
// we allow the user to set content for
// 1. general artist and album nodes
// 2. specific per genre
// 3. specific per artist
// 4. specific per album
buttons.Add(CONTEXT_BUTTON_SET_CONTENT,20195);
}
if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetArtist().size() > 0)
{
CVideoDatabase database;
database.Open();
if (database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator)) > -1)
buttons.Add(CONTEXT_BUTTON_GO_TO_ARTIST, 20400);
}
if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetArtist().size() > 0 &&
item->GetMusicInfoTag()->GetAlbum().size() > 0 &&
item->GetMusicInfoTag()->GetTitle().size() > 0)
{
CVideoDatabase database;
database.Open();
if (database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator),item->GetMusicInfoTag()->GetAlbum(),item->GetMusicInfoTag()->GetTitle()) > -1)
buttons.Add(CONTEXT_BUTTON_PLAY_OTHER, 20401);
}
if (item->HasVideoInfoTag() && !item->m_bIsFolder)
{
if (item->GetVideoInfoTag()->m_playCount > 0)
buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); //Mark as UnWatched
else
buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); //Mark as Watched
if ((g_settings.GetCurrentProfile().canWriteDatabases() || g_passwordManager.bMasterUser) && !item->IsPlugin())
{
buttons.Add(CONTEXT_BUTTON_RENAME, 16105);
buttons.Add(CONTEXT_BUTTON_DELETE, 646);
}
}
if (inPlaylists && !URIUtils::GetFileName(item->GetPath()).Equals("PartyMode.xsp")
&& (item->IsPlayList() || item->IsSmartPlayList()))
buttons.Add(CONTEXT_BUTTON_DELETE, 117);
if (item->IsPlugin() || item->IsScript() || m_vecItems->IsPlugin())
buttons.Add(CONTEXT_BUTTON_PLUGIN_SETTINGS, 1045);
}
// noncontextual buttons
if (g_application.IsMusicScanning())
buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353); // Stop Scanning
else
{
if (!m_vecItems->IsPlugin())
buttons.Add(CONTEXT_BUTTON_UPDATE_LIBRARY, 653);
}
CGUIWindowMusicBase::GetNonContextButtons(buttons);
}
bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
{
CFileItemPtr item;
if (itemNumber >= 0 && itemNumber < m_vecItems->Size())
item = m_vecItems->Get(itemNumber);
switch (button)
{
case CONTEXT_BUTTON_INFO:
{
if (!item->IsVideoDb())
return CGUIWindowMusicBase::OnContextButton(itemNumber,button);
// music videos - artists
if (item->GetPath().Left(14).Equals("videodb://3/4/"))
{
long idArtist = m_musicdatabase.GetArtistByName(item->GetLabel());
if (idArtist == -1)
return false;
CStdString path; path.Format("musicdb://2/%ld/", idArtist);
CArtist artist;
m_musicdatabase.GetArtistInfo(idArtist,artist,false);
*item = CFileItem(artist);
item->SetPath(path);
CGUIWindowMusicBase::OnContextButton(itemNumber,button);
Update(m_vecItems->GetPath());
m_viewControl.SetSelectedItem(itemNumber);
return true;
}
// music videos - albums
if (item->GetPath().Left(14).Equals("videodb://3/5/"))
{
long idAlbum = m_musicdatabase.GetAlbumByName(item->GetLabel());
if (idAlbum == -1)
return false;
CStdString path; path.Format("musicdb://3/%ld/", idAlbum);
CAlbum album;
m_musicdatabase.GetAlbumInfo(idAlbum,album,NULL);
*item = CFileItem(path,album);
item->SetPath(path);
CGUIWindowMusicBase::OnContextButton(itemNumber,button);
Update(m_vecItems->GetPath());
m_viewControl.SetSelectedItem(itemNumber);
return true;
}
if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->m_strTitle.IsEmpty())
{
CGUIWindowVideoNav* pWindow = (CGUIWindowVideoNav*)g_windowManager.GetWindow(WINDOW_VIDEO_NAV);
if (pWindow)
{
ADDON::ScraperPtr info;
pWindow->OnInfo(item.get(),info);
Update(m_vecItems->GetPath());
}
}
return true;
}
case CONTEXT_BUTTON_INFO_ALL:
OnInfoAll(itemNumber);
return true;
case CONTEXT_BUTTON_UPDATE_LIBRARY:
{
g_application.StartMusicScan("");
return true;
}
case CONTEXT_BUTTON_SET_DEFAULT:
g_settings.m_defaultMusicLibSource = GetQuickpathName(item->GetPath());
g_settings.Save();
return true;
case CONTEXT_BUTTON_CLEAR_DEFAULT:
g_settings.m_defaultMusicLibSource.Empty();
g_settings.Save();
return true;
case CONTEXT_BUTTON_GO_TO_ARTIST:
{
CStdString strPath;
CVideoDatabase database;
database.Open();
strPath.Format("videodb://3/4/%ld/",database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator)));
g_windowManager.ActivateWindow(WINDOW_VIDEO_NAV,strPath);
return true;
}
case CONTEXT_BUTTON_PLAY_OTHER:
{
CVideoDatabase database;
database.Open();
CVideoInfoTag details;
database.GetMusicVideoInfo("",details,database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator),item->GetMusicInfoTag()->GetAlbum(),item->GetMusicInfoTag()->GetTitle()));
CApplicationMessenger::Get().PlayFile(CFileItem(details));
return true;
}
case CONTEXT_BUTTON_MARK_WATCHED:
CGUIWindowVideoBase::MarkWatched(item,true);
CUtil::DeleteVideoDatabaseDirectoryCache();
Update(m_vecItems->GetPath());
return true;
case CONTEXT_BUTTON_MARK_UNWATCHED:
CGUIWindowVideoBase::MarkWatched(item,false);
CUtil::DeleteVideoDatabaseDirectoryCache();
Update(m_vecItems->GetPath());
return true;
case CONTEXT_BUTTON_RENAME:
CGUIWindowVideoBase::UpdateVideoTitle(item.get());
CUtil::DeleteVideoDatabaseDirectoryCache();
Update(m_vecItems->GetPath());
return true;
case CONTEXT_BUTTON_DELETE:
if (item->IsPlayList() || item->IsSmartPlayList())
{
item->m_bIsFolder = false;
CFileUtils::DeleteItem(item);
}
else
{
CGUIWindowVideoNav::DeleteItem(item.get());
CUtil::DeleteVideoDatabaseDirectoryCache();
}
Update(m_vecItems->GetPath());
return true;
case CONTEXT_BUTTON_SET_CONTENT:
{
ADDON::ScraperPtr scraper;
CStdString path(item->GetPath());
CQueryParams params;
CDirectoryNode::GetDatabaseInfo(item->GetPath(), params);
CONTENT_TYPE content = CONTENT_ALBUMS;
if (params.GetAlbumId() != -1)
path.Format("musicdb://3/%i/",params.GetAlbumId());
else if (params.GetArtistId() != -1)
{
path.Format("musicdb://2/%i/",params.GetArtistId());
content = CONTENT_ARTISTS;
}
if (m_vecItems->GetPath().Equals("musicdb://1/") || item->GetPath().Equals("musicdb://2/"))
{
content = CONTENT_ARTISTS;
}
if (!m_musicdatabase.GetScraperForPath(path, scraper, ADDON::ScraperTypeFromContent(content)))
{
ADDON::AddonPtr defaultScraper;
if (ADDON::CAddonMgr::Get().GetDefault(ADDON::ScraperTypeFromContent(content), defaultScraper))
{
scraper = boost::dynamic_pointer_cast<ADDON::CScraper>(defaultScraper->Clone(defaultScraper));
}
}
if (CGUIDialogContentSettings::Show(scraper, content))
{
m_musicdatabase.SetScraperForPath(path,scraper);
if (CGUIDialogYesNo::ShowAndGetInput(20442,20443,20444,20022))
{
OnInfoAll(itemNumber,true,true);
}
}
return true;
}
default:
break;
}
return CGUIWindowMusicBase::OnContextButton(itemNumber, button);
}
bool CGUIWindowMusicNav::GetSongsFromPlayList(const CStdString& strPlayList, CFileItemList &items)
{
CStdString strParentPath=m_history.GetParentPath();
if (m_guiState.get() && !m_guiState->HideParentDirItems())
{
CFileItemPtr pItem(new CFileItem(".."));
pItem->SetPath(strParentPath);
items.Add(pItem);
}
items.SetPath(strPlayList);
CLog::Log(LOGDEBUG,"CGUIWindowMusicNav, opening playlist [%s]", strPlayList.c_str());
auto_ptr<CPlayList> pPlayList (CPlayListFactory::Create(strPlayList));
if ( NULL != pPlayList.get())
{
// load it
if (!pPlayList->Load(strPlayList))
{
CGUIDialogOK::ShowAndGetInput(6, 0, 477, 0);
return false; //hmmm unable to load playlist?
}
CPlayList playlist = *pPlayList;
// convert playlist items to songs
for (int i = 0; i < (int)playlist.size(); ++i)
{
items.Add(playlist[i]);
}
}
return true;
}
void CGUIWindowMusicNav::DisplayEmptyDatabaseMessage(bool bDisplay)
{
m_bDisplayEmptyDatabaseMessage = bDisplay;
}
void CGUIWindowMusicNav::OnSearchUpdate()
{
CStdString search(GetProperty("search").asString());
CURL::Encode(search);
if (!search.IsEmpty())
{
CStdString path = "musicsearch://" + search + "/";
m_history.ClearPathHistory();
Update(path);
}
else if (m_vecItems->IsVirtualDirectoryRoot())
{
Update("");
}
}
void CGUIWindowMusicNav::FrameMove()
{
static const int search_timeout = 2000;
// update our searching
if (m_searchTimer.IsRunning() && m_searchTimer.GetElapsedMilliseconds() > search_timeout)
{
m_searchTimer.Stop();
OnSearchUpdate();
}
if (m_bDisplayEmptyDatabaseMessage)
SET_CONTROL_LABEL(CONTROL_LABELEMPTY,g_localizeStrings.Get(745)+'\n'+g_localizeStrings.Get(746));
else
SET_CONTROL_LABEL(CONTROL_LABELEMPTY,"");
CGUIWindowMusicBase::FrameMove();
}
void CGUIWindowMusicNav::OnPrepareFileItems(CFileItemList &items)
{
CGUIWindowMusicBase::OnPrepareFileItems(items);
}
void CGUIWindowMusicNav::AddSearchFolder()
{
// we use a general viewstate (and not our member) here as our
// current viewstate may be specific to some other folder, and
// we know we're in the root here
CFileItemList items;
CGUIViewState* viewState = CGUIViewState::GetViewState(GetID(), items);
if (viewState)
{
// add our remove the musicsearch source
VECSOURCES &sources = viewState->GetSources();
bool haveSearchSource = false;
bool needSearchSource = !GetProperty("search").empty() || !m_searchWithEdit; // we always need it if we don't have the edit control
for (IVECSOURCES it = sources.begin(); it != sources.end(); ++it)
{
CMediaSource& share = *it;
if (share.strPath == "musicsearch://")
{
haveSearchSource = true;
if (!needSearchSource)
{ // remove it
sources.erase(it);
break;
}
}
}
if (!haveSearchSource && needSearchSource)
{
// add earch share
CMediaSource share;
share.strName=g_localizeStrings.Get(137); // Search
share.strPath = "musicsearch://";
share.m_iDriveType = CMediaSource::SOURCE_TYPE_LOCAL;
sources.push_back(share);
}
m_rootDir.SetSources(sources);
delete viewState;
}
}
CStdString CGUIWindowMusicNav::GetStartFolder(const CStdString &dir)
{
if (dir.Equals("Genres"))
return "musicdb://1/";
else if (dir.Equals("Artists"))
return "musicdb://2/";
else if (dir.Equals("Albums"))
return "musicdb://3/";
else if (dir.Equals("Singles"))
return "musicdb://10/";
else if (dir.Equals("Songs"))
return "musicdb://4/";
else if (dir.Equals("Top100"))
return "musicdb://5/";
else if (dir.Equals("Top100Songs"))
return "musicdb://5/1/";
else if (dir.Equals("Top100Albums"))
return "musicdb://5/2/";
else if (dir.Equals("RecentlyAddedAlbums"))
return "musicdb://6/";
else if (dir.Equals("RecentlyPlayedAlbums"))
return "musicdb://7/";
else if (dir.Equals("Compilations"))
return "musicdb://8/";
else if (dir.Equals("Years"))
return "musicdb://9/";
return CGUIWindowMusicBase::GetStartFolder(dir);
}
Jump to Line
Something went wrong with that request. Please try again.