summaryrefslogtreecommitdiffstats
path: root/xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp')
-rw-r--r--xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp479
1 files changed, 479 insertions, 0 deletions
diff --git a/xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp b/xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp
new file mode 100644
index 0000000..a9e2232
--- /dev/null
+++ b/xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp
@@ -0,0 +1,479 @@
+/*
+ * Copyright (C) 2017-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "GUIDialogInfoProviderSettings.h"
+
+#include "ServiceBroker.h"
+#include "Util.h"
+#include "addons/AddonManager.h"
+#include "addons/AddonSystemSettings.h"
+#include "addons/addoninfo/AddonType.h"
+#include "addons/gui/GUIDialogAddonSettings.h"
+#include "addons/gui/GUIWindowAddonBrowser.h"
+#include "dialogs/GUIDialogFileBrowser.h"
+#include "dialogs/GUIDialogKaiToast.h"
+#include "filesystem/AddonsDirectory.h"
+#include "filesystem/Directory.h"
+#include "guilib/GUIComponent.h"
+#include "guilib/GUIWindowManager.h"
+#include "guilib/LocalizeStrings.h"
+#include "interfaces/builtins/Builtins.h"
+#include "settings/Settings.h"
+#include "settings/SettingsComponent.h"
+#include "settings/lib/Setting.h"
+#include "settings/windows/GUIControlSettings.h"
+#include "storage/MediaManager.h"
+#include "utils/URIUtils.h"
+#include "utils/log.h"
+
+#include <limits.h>
+#include <map>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+using namespace ADDON;
+
+const std::string SETTING_ALBUMSCRAPER_SETTINGS = "albumscrapersettings";
+const std::string SETTING_ARTISTSCRAPER_SETTINGS = "artistscrapersettings";
+const std::string SETTING_APPLYTOITEMS = "applysettingstoitems";
+
+CGUIDialogInfoProviderSettings::CGUIDialogInfoProviderSettings()
+ : CGUIDialogSettingsManualBase(WINDOW_DIALOG_INFOPROVIDER_SETTINGS, "DialogSettings.xml")
+{ }
+
+bool CGUIDialogInfoProviderSettings::Show()
+{
+ CGUIDialogInfoProviderSettings *dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogInfoProviderSettings>(WINDOW_DIALOG_INFOPROVIDER_SETTINGS);
+ if (!dialog)
+ return false;
+
+ const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings();
+
+ dialog->m_showSingleScraper = false;
+
+ // Get current default info provider settings from service broker
+ dialog->m_fetchInfo = settings->GetBool(CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO);
+
+ ADDON::AddonPtr defaultScraper;
+ // Get default album scraper (when enabled - can default scraper be disabled??)
+ if (ADDON::CAddonSystemSettings::GetInstance().GetActive(ADDON::AddonType::SCRAPER_ALBUMS,
+ defaultScraper))
+ {
+ ADDON::ScraperPtr scraper = std::dynamic_pointer_cast<ADDON::CScraper>(defaultScraper);
+ dialog->SetAlbumScraper(scraper);
+ }
+
+ // Get default artist scraper
+ if (ADDON::CAddonSystemSettings::GetInstance().GetActive(ADDON::AddonType::SCRAPER_ARTISTS,
+ defaultScraper))
+ {
+ ADDON::ScraperPtr scraper = std::dynamic_pointer_cast<ADDON::CScraper>(defaultScraper);
+ dialog->SetArtistScraper(scraper);
+ }
+
+ dialog->m_strArtistInfoPath = settings->GetString(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER);
+
+ dialog->Open();
+
+ dialog->ResetDefaults();
+ return dialog->IsConfirmed();
+}
+
+int CGUIDialogInfoProviderSettings::Show(ADDON::ScraperPtr& scraper)
+{
+ CGUIDialogInfoProviderSettings *dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogInfoProviderSettings>(WINDOW_DIALOG_INFOPROVIDER_SETTINGS);
+ if (!dialog || !scraper)
+ return -1;
+ if (scraper->Content() != CONTENT_ARTISTS && scraper->Content() != CONTENT_ALBUMS)
+ return -1;
+
+ dialog->m_showSingleScraper = true;
+ dialog->m_singleScraperType = scraper->Content();
+
+ if (dialog->m_singleScraperType == CONTENT_ALBUMS)
+ dialog->SetAlbumScraper(scraper);
+ else
+ dialog->SetArtistScraper(scraper);
+ // toast selected but disabled scrapers
+ if (CServiceBroker::GetAddonMgr().IsAddonDisabled(scraper->ID()))
+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(24024), scraper->Name(), 2000, true);
+
+ dialog->Open();
+
+ bool confirmed = dialog->IsConfirmed();
+ unsigned int applyToItems = dialog->m_applyToItems;
+ if (confirmed)
+ {
+ if (dialog->m_singleScraperType == CONTENT_ALBUMS)
+ scraper = dialog->GetAlbumScraper();
+ else
+ {
+ scraper = dialog->GetArtistScraper();
+ // Save artist information folder (here not in the caller) when applying setting as default for all artists
+ if (applyToItems == INFOPROVIDERAPPLYOPTIONS::INFOPROVIDER_DEFAULT)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetString(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER, dialog->m_strArtistInfoPath);
+ }
+ if (scraper)
+ scraper->SetPathSettings(dialog->m_singleScraperType, "");
+ }
+
+ dialog->ResetDefaults();
+
+ if (confirmed)
+ return applyToItems;
+ else
+ return -1;
+}
+
+void CGUIDialogInfoProviderSettings::OnInitWindow()
+{
+ CGUIDialogSettingsManualBase::OnInitWindow();
+}
+
+void CGUIDialogInfoProviderSettings::OnSettingChanged(
+ const std::shared_ptr<const CSetting>& setting)
+{
+ if (setting == nullptr)
+ return;
+
+ CGUIDialogSettingsManualBase::OnSettingChanged(setting);
+
+ const std::string &settingId = setting->GetId();
+
+ if (settingId == CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO)
+ {
+ m_fetchInfo = std::static_pointer_cast<const CSettingBool>(setting)->GetValue();
+ SetupView();
+ SetFocus(CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO);
+ }
+ else if (settingId == CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER)
+ m_strArtistInfoPath = std::static_pointer_cast<const CSettingString>(setting)->GetValue();
+ else if (settingId == SETTING_APPLYTOITEMS)
+ {
+ m_applyToItems = std::static_pointer_cast<const CSettingInt>(setting)->GetValue();
+ SetupView();
+ SetFocus(SETTING_APPLYTOITEMS);
+ }
+}
+
+void CGUIDialogInfoProviderSettings::OnSettingAction(const std::shared_ptr<const CSetting>& setting)
+{
+ if (setting == nullptr)
+ return;
+
+ CGUIDialogSettingsManualBase::OnSettingAction(setting);
+
+ const std::string &settingId = setting->GetId();
+
+ if (settingId == CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER)
+ {
+ std::string currentScraperId;
+ if (m_albumscraper)
+ currentScraperId = m_albumscraper->ID();
+ std::string selectedAddonId = currentScraperId;
+
+ if (CGUIWindowAddonBrowser::SelectAddonID(AddonType::SCRAPER_ALBUMS, selectedAddonId, false) ==
+ 1 &&
+ selectedAddonId != currentScraperId)
+ {
+ AddonPtr scraperAddon;
+ if (CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon,
+ OnlyEnabled::CHOICE_YES))
+ {
+ m_albumscraper = std::dynamic_pointer_cast<CScraper>(scraperAddon);
+ SetupView();
+ SetFocus(settingId);
+ }
+ else
+ {
+ CLog::Log(LOGERROR, "{} - Could not get settings for addon: {}", __FUNCTION__,
+ selectedAddonId);
+ }
+ }
+ }
+ else if (settingId == CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER)
+ {
+ std::string currentScraperId;
+ if (m_artistscraper)
+ currentScraperId = m_artistscraper->ID();
+ std::string selectedAddonId = currentScraperId;
+
+ if (CGUIWindowAddonBrowser::SelectAddonID(AddonType::SCRAPER_ARTISTS, selectedAddonId, false) ==
+ 1 &&
+ selectedAddonId != currentScraperId)
+ {
+ AddonPtr scraperAddon;
+ if (CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon,
+ OnlyEnabled::CHOICE_YES))
+ {
+ m_artistscraper = std::dynamic_pointer_cast<CScraper>(scraperAddon);
+ SetupView();
+ SetFocus(settingId);
+ }
+ else
+ {
+ CLog::Log(LOGERROR, "{} - Could not get addon: {}", __FUNCTION__, selectedAddonId);
+ }
+ }
+ }
+ else if (settingId == SETTING_ALBUMSCRAPER_SETTINGS)
+ CGUIDialogAddonSettings::ShowForAddon(m_albumscraper, false);
+ else if (settingId == SETTING_ARTISTSCRAPER_SETTINGS)
+ CGUIDialogAddonSettings::ShowForAddon(m_artistscraper, false);
+ else if (settingId == CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER)
+ {
+ VECSOURCES shares;
+ CServiceBroker::GetMediaManager().GetLocalDrives(shares);
+ CServiceBroker::GetMediaManager().GetNetworkLocations(shares);
+ CServiceBroker::GetMediaManager().GetRemovableDrives(shares);
+ std::string strDirectory = m_strArtistInfoPath;
+ if (!strDirectory.empty())
+ {
+ URIUtils::AddSlashAtEnd(strDirectory);
+ bool bIsSource;
+ if (CUtil::GetMatchingSource(strDirectory, shares, bIsSource) < 0) // path is outside shares - add it as a separate one
+ {
+ CMediaSource share;
+ share.strName = g_localizeStrings.Get(13278);
+ share.strPath = strDirectory;
+ shares.push_back(share);
+ }
+ }
+ else
+ strDirectory = "default location";
+
+ if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(20223), strDirectory, true))
+ {
+ if (!strDirectory.empty())
+ {
+ m_strArtistInfoPath = strDirectory;
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER, strDirectory);
+ SetFocus(CSettings::CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER);
+ }
+ }
+ }
+}
+
+bool CGUIDialogInfoProviderSettings::Save()
+{
+ if (m_showSingleScraper)
+ return true; //Save done by caller of ::Show
+
+ // Save default settings for fetching additional information and art
+ CLog::Log(LOGINFO, "{} called", __FUNCTION__);
+ // Save Fetch addiitional info during update
+ const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings();
+ settings->SetBool(CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO, m_fetchInfo);
+ // Save default scrapers and addon setting values
+ settings->SetString(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, m_albumscraper->ID());
+ m_albumscraper->SaveSettings();
+ settings->SetString(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, m_artistscraper->ID());
+ m_artistscraper->SaveSettings();
+ // Save artist information folder
+ settings->SetString(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER, m_strArtistInfoPath);
+ settings->Save();
+
+ return true;
+}
+
+void CGUIDialogInfoProviderSettings::SetupView()
+{
+ CGUIDialogSettingsManualBase::SetupView();
+
+ SET_CONTROL_HIDDEN(CONTROL_SETTINGS_CUSTOM_BUTTON);
+ SET_CONTROL_LABEL(CONTROL_SETTINGS_OKAY_BUTTON, 186);
+ SET_CONTROL_LABEL(CONTROL_SETTINGS_CANCEL_BUTTON, 222);
+
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER, m_strArtistInfoPath);
+
+ if (!m_showSingleScraper)
+ {
+ SetHeading(38330);
+ if (!m_fetchInfo)
+ {
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, false);
+ ToggleState(SETTING_ALBUMSCRAPER_SETTINGS, false);
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, false);
+ ToggleState(SETTING_ARTISTSCRAPER_SETTINGS, false);
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER, false);
+ }
+ else
+ { // Album scraper
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, true);
+ if (m_albumscraper && !CServiceBroker::GetAddonMgr().IsAddonDisabled(m_albumscraper->ID()))
+ {
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, m_albumscraper->Name());
+ if (m_albumscraper && m_albumscraper->HasSettings())
+ ToggleState(SETTING_ALBUMSCRAPER_SETTINGS, true);
+ else
+ ToggleState(SETTING_ALBUMSCRAPER_SETTINGS, false);
+ }
+ else
+ {
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, g_localizeStrings.Get(231)); //Set label2 to "None"
+ ToggleState(SETTING_ALBUMSCRAPER_SETTINGS, false);
+ }
+ // Artist scraper
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, true);
+ if (m_artistscraper && !CServiceBroker::GetAddonMgr().IsAddonDisabled(m_artistscraper->ID()))
+ {
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, m_artistscraper->Name());
+ if (m_artistscraper && m_artistscraper->HasSettings())
+ ToggleState(SETTING_ARTISTSCRAPER_SETTINGS, true);
+ else
+ ToggleState(SETTING_ARTISTSCRAPER_SETTINGS, false);
+ }
+ else
+ {
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, g_localizeStrings.Get(231)); //Set label2 to "None"
+ ToggleState(SETTING_ARTISTSCRAPER_SETTINGS, false);
+ }
+ // Artist Information Folder
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER, true);
+ }
+ }
+ else if (m_singleScraperType == CONTENT_ALBUMS)
+ {
+ SetHeading(38331);
+ // Album scraper
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, true);
+ if (m_albumscraper && !CServiceBroker::GetAddonMgr().IsAddonDisabled(m_albumscraper->ID()))
+ {
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, m_albumscraper->Name());
+ if (m_albumscraper && m_albumscraper->HasSettings())
+ ToggleState(SETTING_ALBUMSCRAPER_SETTINGS, true);
+ else
+ ToggleState(SETTING_ALBUMSCRAPER_SETTINGS, false);
+ }
+ else
+ {
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, g_localizeStrings.Get(231)); //Set label2 to "None"
+ ToggleState(SETTING_ALBUMSCRAPER_SETTINGS, false);
+ }
+ }
+ else
+ {
+ SetHeading(38332);
+ // Artist scraper
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, true);
+ if (m_artistscraper && !CServiceBroker::GetAddonMgr().IsAddonDisabled(m_artistscraper->ID()))
+ {
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, m_artistscraper->Name());
+ if (m_artistscraper && m_artistscraper->HasSettings())
+ ToggleState(SETTING_ARTISTSCRAPER_SETTINGS, true);
+ else
+ ToggleState(SETTING_ARTISTSCRAPER_SETTINGS, false);
+ }
+ else
+ {
+ SetLabel2(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, g_localizeStrings.Get(231)); //Set label2 to "None"
+ ToggleState(SETTING_ARTISTSCRAPER_SETTINGS, false);
+ }
+ // Artist Information Folder when default settings
+ ToggleState(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER, m_applyToItems == INFOPROVIDER_DEFAULT);
+ }
+}
+
+void CGUIDialogInfoProviderSettings::InitializeSettings()
+{
+ CGUIDialogSettingsManualBase::InitializeSettings();
+
+ std::shared_ptr<CSettingCategory> category = AddCategory("infoprovidersettings", -1);
+ if (category == nullptr)
+ {
+ CLog::Log(LOGERROR, "{}: unable to setup settings", __FUNCTION__);
+ return;
+ }
+ std::shared_ptr<CSettingGroup> group1 = AddGroup(category);
+ if (group1 == nullptr)
+ {
+ CLog::Log(LOGERROR, "{}: unable to setup settings", __FUNCTION__);
+ return;
+ }
+
+ if (!m_showSingleScraper)
+ {
+ AddToggle(group1, CSettings::SETTING_MUSICLIBRARY_DOWNLOADINFO, 38333, SettingLevel::Basic, m_fetchInfo); // "Fetch additional information during scan"
+ }
+ else
+ {
+ TranslatableIntegerSettingOptions entries;
+ entries.clear();
+ if (m_singleScraperType == CONTENT_ALBUMS)
+ {
+ entries.push_back(TranslatableIntegerSettingOption(38066, INFOPROVIDER_THISITEM));
+ entries.push_back(TranslatableIntegerSettingOption(38067, INFOPROVIDER_ALLVIEW));
+ }
+ else
+ {
+ entries.push_back(TranslatableIntegerSettingOption(38064, INFOPROVIDER_THISITEM));
+ entries.push_back(TranslatableIntegerSettingOption(38065, INFOPROVIDER_ALLVIEW));
+ }
+ entries.push_back(TranslatableIntegerSettingOption(38063, INFOPROVIDER_DEFAULT));
+ AddList(group1, SETTING_APPLYTOITEMS, 38338, SettingLevel::Basic, m_applyToItems, entries, 38339); // "Apply settings to"
+ }
+
+ std::shared_ptr<CSettingGroup> group = AddGroup(category, 38337);
+ if (group == nullptr)
+ {
+ CLog::Log(LOGERROR, "{}: unable to setup settings", __FUNCTION__);
+ return;
+ }
+ std::shared_ptr<CSettingAction> subsetting;
+ if (!m_showSingleScraper || m_singleScraperType == CONTENT_ALBUMS)
+ {
+ AddButton(group, CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER, 38334, SettingLevel::Basic); //Provider for album information
+ subsetting = AddButton(group, SETTING_ALBUMSCRAPER_SETTINGS, 10004, SettingLevel::Basic); //"settings"
+ if (subsetting)
+ subsetting->SetParent(CSettings::SETTING_MUSICLIBRARY_ALBUMSSCRAPER);
+ }
+ if (!m_showSingleScraper || m_singleScraperType == CONTENT_ARTISTS)
+ {
+ AddButton(group, CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER, 38335, SettingLevel::Basic); //Provider for artist information
+ subsetting = AddButton(group, SETTING_ARTISTSCRAPER_SETTINGS, 10004, SettingLevel::Basic); //"settings"
+ if (subsetting)
+ subsetting->SetParent(CSettings::SETTING_MUSICLIBRARY_ARTISTSSCRAPER);
+
+ AddButton(group, CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER, 38336, SettingLevel::Basic);
+ }
+}
+
+void CGUIDialogInfoProviderSettings::SetLabel2(const std::string &settingid, const std::string &label)
+{
+ BaseSettingControlPtr settingControl = GetSettingControl(settingid);
+ if (settingControl != NULL && settingControl->GetControl() != NULL)
+ SET_CONTROL_LABEL2(settingControl->GetID(), label);
+}
+
+void CGUIDialogInfoProviderSettings::ToggleState(const std::string &settingid, bool enabled)
+{
+ BaseSettingControlPtr settingControl = GetSettingControl(settingid);
+ if (settingControl != NULL && settingControl->GetControl() != NULL)
+ {
+ if (enabled)
+ CONTROL_ENABLE(settingControl->GetID());
+ else
+ CONTROL_DISABLE(settingControl->GetID());
+ }
+}
+
+void CGUIDialogInfoProviderSettings::SetFocus(const std::string &settingid)
+{
+ BaseSettingControlPtr settingControl = GetSettingControl(settingid);
+ if (settingControl != NULL && settingControl->GetControl() != NULL)
+ SET_CONTROL_FOCUS(settingControl->GetID(), 0);
+}
+
+void CGUIDialogInfoProviderSettings::ResetDefaults()
+{
+ m_showSingleScraper = false;
+ m_singleScraperType = CONTENT_NONE;
+ m_applyToItems = INFOPROVIDER_THISITEM;
+}