int Interface_GUIDialogSelect::open(void* kodiBase, const char *heading, const char *entries[], unsigned int size, int selected, unsigned int autoclose) { CAddonDll* addon = static_cast<CAddonDll*>(kodiBase); if (!addon) { CLog::Log(LOGERROR, "Interface_GUIDialogSelect::%s - invalid data", __FUNCTION__); return -1; } CGUIDialogSelect* dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (!heading || !entries || !dialog) { CLog::Log(LOGERROR, "Interface_GUIDialogSelect::%s - invalid handler data (heading='%p', entries='%p', " "dialog='%p') on addon '%s'", __FUNCTION__, heading, static_cast<const void*>(entries), static_cast<void*>(dialog), addon->ID().c_str()); return -1; } dialog->Reset(); dialog->SetHeading(CVariant{heading}); for (unsigned int i = 0; i < size; ++i) dialog->Add(entries[i]); if (selected > 0) dialog->SetSelected(selected); if (autoclose > 0) dialog->SetAutoClose(autoclose); dialog->Open(); return dialog->GetSelectedItem(); }
void CGUIDialogSmartPlaylistRule::OnField() { const auto fields = CSmartPlaylistRule::GetFields(m_type); CGUIDialogSelect* dialog = g_windowManager.GetWindow<CGUIDialogSelect>(); dialog->Reset(); dialog->SetHeading(CVariant{20427}); int selected = -1; for (auto field = fields.begin(); field != fields.end(); field++) { dialog->Add(CSmartPlaylistRule::GetLocalizedField(*field)); if (*field == m_rule.m_field) selected = std::distance(fields.begin(), field); } if (selected > -1) dialog->SetSelected(selected); dialog->Open(); int newSelected = dialog->GetSelectedItem(); // check if selection has changed if (!dialog->IsConfirmed() || newSelected < 0 || newSelected == selected) return; m_rule.m_field = fields[newSelected]; // check if operator is still valid. if not, reset to first valid one std::vector< std::pair<std::string, int> > validOperators = GetValidOperators(m_rule); bool isValid = false; for (auto op : validOperators) if (std::get<0>(op) == std::get<0>(OperatorLabel(m_rule.m_operator))) isValid = true; if (!isValid) m_rule.m_operator = (CDatabaseQueryRule::SEARCH_OPERATOR)std::get<1>(validOperators[0]); m_rule.SetParameter(""); UpdateButtons(); }
bool CGUIWindowPVRBase::OpenGroupSelectionDialog(void) { CGUIDialogSelect *dialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (!dialog) return false; CFileItemList options; g_PVRChannelGroups->Get(m_bRadio)->GetGroupList(&options, true); dialog->Reset(); dialog->SetHeading(CVariant{g_localizeStrings.Get(19146)}); dialog->SetItems(options); dialog->SetMultiSelection(false); dialog->SetSelected(m_group->GroupName()); dialog->Open(); if (!dialog->IsConfirmed()) return false; const CFileItemPtr item = dialog->GetSelectedItem(); if (!item) return false; SetGroup(g_PVRChannelGroups->Get(m_bRadio)->GetByName(item->m_strTitle)); return true; }
bool CGUIWindowPVRBase::OpenChannelGroupSelectionDialog(void) { CGUIDialogSelect *dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (!dialog) return false; CFileItemList options; CServiceBroker::GetPVRManager().ChannelGroups()->Get(m_bRadio)->GetGroupList(&options, true); dialog->Reset(); dialog->SetHeading(CVariant{g_localizeStrings.Get(19146)}); dialog->SetItems(options); dialog->SetMultiSelection(false); dialog->SetSelected(m_channelGroup->GroupName()); dialog->Open(); if (!dialog->IsConfirmed()) return false; const CFileItemPtr item = dialog->GetSelectedFileItem(); if (!item) return false; SetChannelGroup(CServiceBroker::GetPVRManager().ChannelGroups()->Get(m_bRadio)->GetByName(item->m_strTitle)); return true; }
bool Interface_GUIDialogSelect::open_multi_select(void* kodiBase, const char *heading, const char *entryIDs[], const char *entryNames[], bool entriesSelected[], unsigned int size, unsigned int autoclose) { CAddonDll* addon = static_cast<CAddonDll*>(kodiBase); if (!addon) { CLog::Log(LOGERROR, "Interface_GUIDialogMultiSelect::%s - invalid data", __FUNCTION__); return false; } CGUIDialogSelect* dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (!heading || !entryIDs || !entryNames || !entriesSelected || !dialog) { CLog::Log(LOGERROR, "Interface_GUIDialogMultiSelect::%s - invalid handler data (heading='%p', " "entryIDs='%p', entryNames='%p', entriesSelected='%p', dialog='%p') on addon '%s'", __FUNCTION__, heading, static_cast<const void*>(entryIDs), static_cast<const void*>(entryNames), static_cast<void*>(entriesSelected), static_cast<void*>(dialog), addon->ID().c_str()); return false; } dialog->Reset(); dialog->SetMultiSelection(true); dialog->SetHeading(CVariant{heading}); std::vector<int> selectedIndexes; for (unsigned int i = 0; i < size; ++i) { dialog->Add(entryNames[i]); if (entriesSelected[i]) selectedIndexes.push_back(i); } dialog->SetSelected(selectedIndexes); if (autoclose > 0) dialog->SetAutoClose(autoclose); dialog->Open(); if (dialog->IsConfirmed()) { for (unsigned int i = 0; i < size; ++i) entriesSelected[i] = false; selectedIndexes = dialog->GetSelectedItems(); for (unsigned int i = 0; i < selectedIndexes.size(); ++i) { if (selectedIndexes[i]) entriesSelected[selectedIndexes[i]] = true; } } return true; }
bool CGUIDialogMusicOSD::OnAction(const CAction &action) { switch (action.GetID()) { case ACTION_SHOW_OSD: Close(); return true; case ACTION_SET_RATING: { CGUIDialogSelect *dialog = g_windowManager.GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (dialog) { dialog->SetHeading(CVariant{ 38023 }); dialog->Add(g_localizeStrings.Get(38022)); for (int i = 1; i <= 10; i++) dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i)); auto track = g_application.CurrentFileItemPtr(); dialog->SetSelected(track->GetMusicInfoTag()->GetUserrating()); dialog->Open(); int userrating = dialog->GetSelectedItem(); if (userrating < 0) userrating = 0; if (userrating > 10) userrating = 10; if (userrating != track->GetMusicInfoTag()->GetUserrating()) { track->GetMusicInfoTag()->SetUserrating(userrating); // send a message to all windows to tell them to update the fileitem (eg playlistplayer, media windows) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_ITEM, 0, track); g_windowManager.SendMessage(msg); CMusicDatabase db; if (db.Open()) { db.SetSongUserrating(track->GetMusicInfoTag()->GetURL(), userrating); db.Close(); } } } return true; } default: break; } return CGUIDialog::OnAction(action); }
void CPeripherals::OnSettingAction(const CSetting *setting) { if (setting == NULL) return; const std::string &settingId = setting->GetId(); if (settingId == CSettings::SETTING_INPUT_PERIPHERALS) { CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); CFileItemList items; GetDirectory("peripherals://all/", items); int iPos = -1; do { pDialog->Reset(); pDialog->SetHeading(CVariant{35000}); pDialog->SetUseDetails(true); pDialog->SetItems(items); pDialog->SetSelected(iPos); pDialog->Open(); iPos = pDialog->IsConfirmed() ? pDialog->GetSelectedLabel() : -1; if (iPos >= 0) { CFileItemPtr pItem = items.Get(iPos); CGUIDialogPeripheralSettings *pSettingsDialog = (CGUIDialogPeripheralSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PERIPHERAL_SETTINGS); if (pItem && pSettingsDialog) { // pass peripheral item properties to settings dialog so skin authors // can use it to show more detailed information about the device pSettingsDialog->SetProperty("vendor", pItem->GetProperty("vendor")); pSettingsDialog->SetProperty("product", pItem->GetProperty("product")); pSettingsDialog->SetProperty("bus", pItem->GetProperty("bus")); pSettingsDialog->SetProperty("location", pItem->GetProperty("location")); pSettingsDialog->SetProperty("class", pItem->GetProperty("class")); pSettingsDialog->SetProperty("version", pItem->GetProperty("version")); // open settings dialog pSettingsDialog->SetFileItem(pItem.get()); pSettingsDialog->Open(); } } } while (pDialog->IsConfirmed()); } }
RENDER_STEREO_MODE CStereoscopicsManager::GetStereoModeByUserChoice(const std::string &heading) { RENDER_STEREO_MODE mode = GetStereoMode(); // if no stereo mode is set already, suggest mode of current video by preselecting it if (mode == RENDER_STEREO_MODE_OFF && g_infoManager.EvaluateBool("videoplayer.isstereoscopic")) mode = GetStereoModeOfPlayingVideo(); CGUIDialogSelect* pDlgSelect = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDlgSelect->Reset(); if (heading.empty()) pDlgSelect->SetHeading(CVariant{g_localizeStrings.Get(36528)}); else pDlgSelect->SetHeading(CVariant{heading}); // prepare selectable stereo modes std::vector<RENDER_STEREO_MODE> selectableModes; for (int i = RENDER_STEREO_MODE_OFF; i < RENDER_STEREO_MODE_COUNT; i++) { RENDER_STEREO_MODE selectableMode = (RENDER_STEREO_MODE) i; if (g_Windowing.SupportsStereo(selectableMode)) { selectableModes.push_back(selectableMode); std::string label = GetLabelForStereoMode((RENDER_STEREO_MODE) i); pDlgSelect->Add( label ); if (mode == selectableMode) pDlgSelect->SetSelected( label ); } // inject AUTO pseudo mode after OFF if (i == RENDER_STEREO_MODE_OFF) { selectableModes.push_back(RENDER_STEREO_MODE_AUTO); pDlgSelect->Add(GetLabelForStereoMode(RENDER_STEREO_MODE_AUTO)); } } pDlgSelect->Open(); int iItem = pDlgSelect->GetSelectedLabel(); if (iItem > -1 && pDlgSelect->IsConfirmed()) mode = (RENDER_STEREO_MODE) selectableModes[iItem]; else mode = GetStereoMode(); return mode; }
void CGUIDialogSmartPlaylistRule::OnOperator() { const auto labels = GetValidOperators(m_rule); CGUIDialogSelect* dialog = g_windowManager.GetWindow<CGUIDialogSelect>(); dialog->Reset(); dialog->SetHeading(CVariant{ 16023 }); for (auto label : labels) dialog->Add(std::get<0>(label)); dialog->SetSelected(CSmartPlaylistRule::GetLocalizedOperator(m_rule.m_operator)); dialog->Open(); int newSelected = dialog->GetSelectedItem(); // check if selection has changed if (!dialog->IsConfirmed() || newSelected < 0) return; m_rule.m_operator = (CDatabaseQueryRule::SEARCH_OPERATOR)std::get<1>(labels[newSelected]); UpdateButtons(); }
bool CGUIWindowSettingsProfile::GetAutoLoginProfileChoice(int &iProfile) { CGUIDialogSelect *dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (!dialog) return false; const CProfilesManager &profileManager = CServiceBroker::GetProfileManager(); // add items // "Last used profile" option comes first, so up indices by 1 int autoLoginProfileId = profileManager.GetAutoLoginProfileId() + 1; CFileItemList items; CFileItemPtr item(new CFileItem()); item->SetLabel(g_localizeStrings.Get(37014)); // Last used profile item->SetIconImage("DefaultUser.png"); items.Add(item); for (unsigned int i = 0; i < profileManager.GetNumberOfProfiles(); i++) { const CProfile *profile = profileManager.GetProfile(i); std::string locked = g_localizeStrings.Get(profile->getLockMode() > 0 ? 20166 : 20165); CFileItemPtr item(new CFileItem(profile->getName())); item->SetLabel2(locked); // lock setting std::string thumb = profile->getThumb(); if (thumb.empty()) thumb = "DefaultUser.png"; item->SetIconImage(thumb); items.Add(item); } dialog->SetHeading(CVariant{20093}); // Profile name dialog->Reset(); dialog->SetUseDetails(true); dialog->SetItems(items); dialog->SetSelected(autoLoginProfileId); dialog->Open(); if (dialog->IsButtonPressed() || dialog->GetSelectedItem() < 0) return false; // user cancelled iProfile = dialog->GetSelectedItem() - 1; return true; }
bool CGUIWindowSettingsProfile::GetAutoLoginProfileChoice(int &iProfile) { CGUIDialogSelect *dialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (!dialog) return false; // add items // "Most recent" option comes first, so up indices by 1 int autoLoginProfileId = CProfilesManager::Get().GetAutoLoginProfileId() + 1; CFileItemList items; CFileItemPtr item(new CFileItem()); item->SetLabel(g_localizeStrings.Get(37014)); // Most recent item->SetIconImage("unknown-user.png"); items.Add(item); for (unsigned int i = 0; i < CProfilesManager::Get().GetNumberOfProfiles(); i++) { const CProfile *profile = CProfilesManager::Get().GetProfile(i); CStdString locked = g_localizeStrings.Get(profile->getLockMode() > 0 ? 20166 : 20165); CFileItemPtr item(new CFileItem(profile->getName())); item->SetProperty("Addon.Summary", locked); // lock setting CStdString thumb = profile->getThumb(); if (thumb.IsEmpty()) thumb = "unknown-user.png"; item->SetIconImage(thumb); items.Add(item); } dialog->SetHeading(20093); // Profile name dialog->Reset(); dialog->SetUseDetails(true); dialog->EnableButton(true, 222); // Cancel dialog->SetItems(&items); dialog->SetSelected(autoLoginProfileId); dialog->DoModal(); if (dialog->IsButtonPressed() || dialog->GetSelectedLabel() < 0) return false; // user cancelled iProfile = dialog->GetSelectedLabel() - 1; return true; }
void CGUIDialogMusicInfo::OnSetUserrating() { CGUIDialogSelect *dialog = (CGUIDialogSelect *)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (dialog) { dialog->SetHeading(CVariant{ 38023 }); dialog->Add(g_localizeStrings.Get(38022)); for (int i = 1; i <= 10; i++) dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i)); dialog->SetSelected(m_albumItem->GetMusicInfoTag()->GetUserrating()); dialog->Open(); int iItem = dialog->GetSelectedItem(); if (iItem < 0) return; SetUserrating(iItem); } }
bool CGUIViewState::ChooseSortMethod() { CGUIDialogSelect *dialog = g_windowManager.GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (!dialog) return false; dialog->Reset(); dialog->SetHeading(CVariant{ 39010 }); // Label "Sort by" for (auto &sortMethod : m_sortMethods) dialog->Add(g_localizeStrings.Get(sortMethod.m_buttonLabel)); dialog->SetSelected(m_currentSortMethod); dialog->Open(); int newSelected = dialog->GetSelectedItem(); // check if selection has changed if (!dialog->IsConfirmed() || newSelected < 0 || newSelected == m_currentSortMethod) return false; m_currentSortMethod = newSelected; SaveViewState(); return true; }
void CGUIDialogSongInfo::OnSetUserrating() { CGUIDialogSelect *dialog = (CGUIDialogSelect *)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (dialog) { dialog->SetHeading(CVariant{ 38023 }); dialog->Add(g_localizeStrings.Get(38022)); for (int i = 1; i <= 5; i++) dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i)); dialog->SetSelected(m_song->GetMusicInfoTag()->GetUserrating()); dialog->Open(); int iItem = dialog->GetSelectedLabel(); if (iItem < 0) return; SetUserrating('0' + iItem); // This is casting the int rating to char } }
void CGUIDialogMusicInfo::OnSetUserrating() const { CGUIDialogSelect *dialog = g_windowManager.GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (dialog) { // If we refresh and then try to set the rating there will be an items already here... dialog->Reset(); dialog->SetHeading(CVariant{ 38023 }); dialog->Add(g_localizeStrings.Get(38022)); for (int i = 1; i <= 10; i++) dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i)); dialog->SetSelected(m_albumItem->GetMusicInfoTag()->GetUserrating()); dialog->Open(); int iItem = dialog->GetSelectedItem(); if (iItem < 0) return; SetUserrating(iItem); } }
void CGUIDialogMediaFilter::OnBrowse(const Filter &filter, CFileItemList &items, bool countOnly /* = false */) { CFileItemList selectItems; if (m_mediaType == "movies" || m_mediaType == "tvshows" || m_mediaType == "episodes" || m_mediaType == "musicvideos") { CVideoDatabase videodb; if (!videodb.Open()) return; CSmartPlaylist tmpFilter = *m_filter; for (vector<CSmartPlaylistRule>::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++) { if (rule->m_field == filter.field) { tmpFilter.m_ruleCombination.m_rules.erase(rule); break; } } std::set<CStdString> playlists; CDatabase::Filter dbfilter; dbfilter.where = tmpFilter.GetWhereClause(videodb, playlists); VIDEODB_CONTENT_TYPE type = VIDEODB_CONTENT_MOVIES; if (m_mediaType == "tvshows") type = VIDEODB_CONTENT_TVSHOWS; else if (m_mediaType == "episodes") type = VIDEODB_CONTENT_EPISODES; else if (m_mediaType == "musicvideos") type = VIDEODB_CONTENT_MUSICVIDEOS; if (filter.field == FieldGenre) videodb.GetGenresNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); else if (filter.field == FieldActor || filter.field == FieldArtist) videodb.GetActorsNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); else if (filter.field == FieldDirector) videodb.GetDirectorsNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); else if (filter.field == FieldStudio) videodb.GetStudiosNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); else if (filter.field == FieldAlbum) videodb.GetMusicVideoAlbumsNav(m_dbUrl->ToString(), selectItems, -1, dbfilter, countOnly); else if (filter.field == FieldTag) videodb.GetTagsNav(m_dbUrl->ToString(), selectItems, type, dbfilter, countOnly); } else if (m_mediaType == "artists" || m_mediaType == "albums" || m_mediaType == "songs") { CMusicDatabase musicdb; if (!musicdb.Open()) return; CSmartPlaylist tmpFilter = *m_filter; for (vector<CSmartPlaylistRule>::iterator rule = tmpFilter.m_ruleCombination.m_rules.begin(); rule != tmpFilter.m_ruleCombination.m_rules.end(); rule++) { if (rule->m_field == filter.field) { tmpFilter.m_ruleCombination.m_rules.erase(rule); break; } } std::set<CStdString> playlists; CDatabase::Filter dbfilter; dbfilter.where = tmpFilter.GetWhereClause(musicdb, playlists); if (filter.field == FieldGenre) musicdb.GetGenresNav(m_dbUrl->ToString(), selectItems, dbfilter, countOnly); else if (filter.field == FieldArtist) musicdb.GetArtistsNav(m_dbUrl->ToString(), selectItems, m_mediaType == "albums", -1, -1, -1, dbfilter, SortDescription(), countOnly); else if (filter.field == FieldAlbum) musicdb.GetAlbumsNav(m_dbUrl->ToString(), selectItems, -1, -1, dbfilter, SortDescription(), countOnly); else if (filter.field == FieldAlbumType) musicdb.GetAlbumTypesNav(m_dbUrl->ToString(), selectItems, dbfilter, countOnly); else if (filter.field == FieldMusicLabel) musicdb.GetMusicLabelsNav(m_dbUrl->ToString(), selectItems, dbfilter, countOnly); } if (selectItems.Size() <= 0) return; if (countOnly) { items.Copy(selectItems); return; } // sort the items selectItems.Sort(SORT_METHOD_LABEL, SortOrderAscending); CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); pDialog->SetItems(&selectItems); CStdString strHeading; strHeading.Format(g_localizeStrings.Get(13401), g_localizeStrings.Get(filter.label)); pDialog->SetHeading(strHeading); pDialog->SetMultiSelection(true); if (filter.rule != NULL && !filter.rule->m_parameter.empty()) pDialog->SetSelected(filter.rule->m_parameter); pDialog->DoModal(); if (pDialog->IsConfirmed()) items.Copy(pDialog->GetSelectedItems()); else items.Clear(); pDialog->Reset(); }
void CGUIDialogContentSettings::OnSettingAction(std::shared_ptr<const CSetting> setting) { if (setting == NULL) return; CGUIDialogSettingsManualBase::OnSettingAction(setting); const std::string &settingId = setting->GetId(); if (settingId == SETTING_CONTENT_TYPE) { std::vector<std::pair<std::string, int>> labels; if (m_content == CONTENT_ALBUMS || m_content == CONTENT_ARTISTS) { labels.push_back(std::make_pair(ADDON::TranslateContent(m_content, true), m_content)); } else { labels.push_back(std::make_pair(ADDON::TranslateContent(CONTENT_NONE, true), CONTENT_NONE)); labels.push_back(std::make_pair(ADDON::TranslateContent(CONTENT_MOVIES, true), CONTENT_MOVIES)); labels.push_back(std::make_pair(ADDON::TranslateContent(CONTENT_TVSHOWS, true), CONTENT_TVSHOWS)); labels.push_back(std::make_pair(ADDON::TranslateContent(CONTENT_MUSICVIDEOS, true), CONTENT_MUSICVIDEOS)); } std::sort(labels.begin(), labels.end()); CGUIDialogSelect *dialog = g_windowManager.GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (dialog) { dialog->SetHeading(CVariant{ 20344 }); //Label "This directory contains" int iIndex = 0; int iSelected = 0; for (const auto &label : labels) { dialog->Add(label.first); if (m_content == label.second) iSelected = iIndex; iIndex++; } dialog->SetSelected(iSelected); dialog->Open(); // Selected item has not changes - in case of cancel or the user selecting the same item int newSelected = dialog->GetSelectedItem(); if (!dialog->IsConfirmed() || newSelected < 0 || newSelected == iSelected) return; auto selected = labels.at(newSelected); m_content = static_cast<CONTENT_TYPE>(selected.second); AddonPtr scraperAddon; if (!CAddonSystemSettings::GetInstance().GetActive(ADDON::ScraperTypeFromContent(m_content), scraperAddon) && m_content != CONTENT_NONE) return; m_scraper = std::dynamic_pointer_cast<CScraper>(scraperAddon); SetupView(); SetFocus(SETTING_CONTENT_TYPE); } } else if (settingId == SETTING_SCRAPER_LIST) { ADDON::TYPE type = ADDON::ScraperTypeFromContent(m_content); std::string currentScraperId; if (m_scraper != nullptr) currentScraperId = m_scraper->ID(); std::string selectedAddonId = currentScraperId; if (CGUIWindowAddonBrowser::SelectAddonID(type, selectedAddonId, false) == 1 && selectedAddonId != currentScraperId) { AddonPtr scraperAddon; CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon); m_scraper = std::dynamic_pointer_cast<CScraper>(scraperAddon); SetupView(); SetFocus(SETTING_SCRAPER_LIST); } } else if (settingId == SETTING_SCRAPER_SETTINGS) CGUIDialogAddonSettings::ShowForAddon(m_scraper, false); }
void CGUIDialogSmartPlaylistRule::OnBrowse() { CFileItemList items; CMusicDatabase database; database.Open(); CVideoDatabase videodatabase; videodatabase.Open(); std::string basePath; if (CSmartPlaylist::IsMusicType(m_type)) basePath = "musicdb://"; else basePath = "videodb://"; VIDEODB_CONTENT_TYPE type = VIDEODB_CONTENT_MOVIES; if (m_type == "movies") basePath += "movies/"; else if (m_type == "tvshows") { type = VIDEODB_CONTENT_TVSHOWS; basePath += "tvshows/"; } else if (m_type == "musicvideos") { type = VIDEODB_CONTENT_MUSICVIDEOS; basePath += "musicvideos/"; } else if (m_type == "episodes") { if (m_rule.m_field == FieldGenre || m_rule.m_field == FieldYear || m_rule.m_field == FieldStudio) type = VIDEODB_CONTENT_TVSHOWS; else type = VIDEODB_CONTENT_EPISODES; basePath += "tvshows/"; } int iLabel = 0; if (m_rule.m_field == FieldGenre) { if (m_type == "tvshows" || m_type == "episodes" || m_type == "movies") videodatabase.GetGenresNav(basePath + "genres/", items, type); else if (m_type == "songs" || m_type == "albums" || m_type == "artists" || m_type == "mixed") database.GetGenresNav("musicdb://genres/",items); if (m_type == "musicvideos" || m_type == "mixed") { CFileItemList items2; videodatabase.GetGenresNav("videodb://musicvideos/genres/",items2,VIDEODB_CONTENT_MUSICVIDEOS); items.Append(items2); } iLabel = 515; } else if (m_rule.m_field == FieldCountry) { videodatabase.GetCountriesNav(basePath, items, type); iLabel = 574; } else if (m_rule.m_field == FieldArtist || m_rule.m_field == FieldAlbumArtist) { if (CSmartPlaylist::IsMusicType(m_type)) database.GetArtistsNav("musicdb://artists/", items, m_rule.m_field == FieldAlbumArtist, -1); if (m_type == "musicvideos" || m_type == "mixed") { CFileItemList items2; videodatabase.GetMusicVideoArtistsByName("", items2); items.Append(items2); } iLabel = 557; } else if (m_rule.m_field == FieldAlbum) { if (CSmartPlaylist::IsMusicType(m_type)) database.GetAlbumsNav("musicdb://albums/", items); if (m_type == "musicvideos" || m_type == "mixed") { CFileItemList items2; videodatabase.GetMusicVideoAlbumsByName("", items2); items.Append(items2); } iLabel = 558; } else if (m_rule.m_field == FieldActor) { videodatabase.GetActorsNav(basePath + "actors/",items,type); iLabel = 20337; } else if (m_rule.m_field == FieldYear) { if (CSmartPlaylist::IsMusicType(m_type)) database.GetYearsNav("musicdb://years/", items); if (CSmartPlaylist::IsVideoType(m_type)) { CFileItemList items2; videodatabase.GetYearsNav(basePath + "years/", items2, type); items.Append(items2); } iLabel = 562; } else if (m_rule.m_field == FieldDirector) { videodatabase.GetDirectorsNav(basePath + "directors/", items, type); iLabel = 20339; } else if (m_rule.m_field == FieldStudio) { videodatabase.GetStudiosNav(basePath + "studios/", items, type); iLabel = 572; } else if (m_rule.m_field == FieldWriter) { videodatabase.GetWritersNav(basePath, items, type); iLabel = 20417; } else if (m_rule.m_field == FieldTvShowTitle || (m_type == "tvshows" && m_rule.m_field == FieldTitle)) { videodatabase.GetTvShowsNav(basePath + "titles/", items); iLabel = 20343; } else if (m_rule.m_field == FieldTitle) { if (m_type == "songs" || m_type == "mixed") { database.GetSongsNav("musicdb://songs/", items, -1, -1, -1); iLabel = 134; } if (m_type == "movies") { videodatabase.GetMoviesNav(basePath + "titles/", items); iLabel = 20342; } if (m_type == "episodes") { videodatabase.GetEpisodesNav(basePath + "titles/-1/-1/", items); // we need to replace the db label (<season>x<episode> <title>) with the title only CLabelFormatter format("%T", ""); for (int i = 0; i < items.Size(); i++) format.FormatLabel(items[i].get()); iLabel = 20360; } if (m_type == "musicvideos" || m_type == "mixed") { videodatabase.GetMusicVideosNav(basePath + "titles/", items); iLabel = 20389; } } else if (m_rule.m_field == FieldPlaylist || m_rule.m_field == FieldVirtualFolder) { // use filebrowser to grab another smart playlist // Note: This can cause infinite loops (playlist that refers to the same playlist) but I don't // think there's any decent way to deal with this, as the infinite loop may be an arbitrary // number of playlists deep, eg playlist1 -> playlist2 -> playlist3 ... -> playlistn -> playlist1 if (CSmartPlaylist::IsVideoType(m_type)) XFILE::CDirectory::GetDirectory("special://videoplaylists/", items, ".xsp", XFILE::DIR_FLAG_NO_FILE_DIRS); if (CSmartPlaylist::IsMusicType(m_type)) { CFileItemList items2; XFILE::CDirectory::GetDirectory("special://musicplaylists/", items2, ".xsp", XFILE::DIR_FLAG_NO_FILE_DIRS); items.Append(items2); } for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; CSmartPlaylist playlist; // don't list unloadable smartplaylists or any referencable smartplaylists // which do not match the type of the current smartplaylist if (!playlist.Load(item->GetPath()) || (m_rule.m_field == FieldPlaylist && (!CSmartPlaylist::CheckTypeCompatibility(m_type, playlist.GetType()) || (!playlist.GetGroup().empty() || playlist.IsGroupMixed())))) { items.Remove(i); i -= 1; continue; } if (!playlist.GetName().empty()) item->SetLabel(playlist.GetName()); } iLabel = 559; } else if (m_rule.m_field == FieldPath) { VECSOURCES sources; if (m_type == "songs" || m_type == "mixed") sources = *CMediaSourceSettings::GetInstance().GetSources("music"); if (CSmartPlaylist::IsVideoType(m_type)) { VECSOURCES sources2 = *CMediaSourceSettings::GetInstance().GetSources("video"); sources.insert(sources.end(),sources2.begin(),sources2.end()); } g_mediaManager.GetLocalDrives(sources); std::string path = m_rule.GetParameter(); CGUIDialogFileBrowser::ShowAndGetDirectory(sources, g_localizeStrings.Get(657), path, false); if (m_rule.m_parameter.size() > 0) m_rule.m_parameter.clear(); if (!path.empty()) m_rule.m_parameter.push_back(path); UpdateButtons(); return; } else if (m_rule.m_field == FieldSet) { videodatabase.GetSetsNav("videodb://movies/sets/", items, VIDEODB_CONTENT_MOVIES); iLabel = 20434; } else if (m_rule.m_field == FieldTag) { VIDEODB_CONTENT_TYPE type = VIDEODB_CONTENT_MOVIES; if (m_type == "tvshows" || m_type == "episodes") type = VIDEODB_CONTENT_TVSHOWS; else if (m_type == "musicvideos") type = VIDEODB_CONTENT_MUSICVIDEOS; else if (m_type != "movies") return; videodatabase.GetTagsNav(basePath + "tags/", items, type); iLabel = 20459; } else { // TODO: Add browseability in here. assert(false); } // sort the items items.Sort(SortByLabel, SortOrderAscending, CSettings::GetInstance().GetBool(CSettings::SETTING_FILELISTS_IGNORETHEWHENSORTING) ? SortAttributeIgnoreArticle : SortAttributeNone); CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); pDialog->SetItems(&items); std::string strHeading = StringUtils::Format(g_localizeStrings.Get(13401).c_str(), g_localizeStrings.Get(iLabel).c_str()); pDialog->SetHeading(CVariant{std::move(strHeading)}); pDialog->SetMultiSelection(m_rule.m_field != FieldPlaylist && m_rule.m_field != FieldVirtualFolder); if (!m_rule.m_parameter.empty()) pDialog->SetSelected(m_rule.m_parameter); pDialog->Open(); if (pDialog->IsConfirmed()) { m_rule.m_parameter.clear(); for (int i : pDialog->GetSelectedItems()) m_rule.m_parameter.push_back(items.Get(i)->GetLabel()); UpdateButtons(); } pDialog->Reset(); }
std::string CGUIDialogSelectGameClient::ShowAndGetGameClient(const std::string &gamePath, const GameClientVector& candidates, const GameClientVector& installable) { std::string gameClient; LogGameClients(candidates, installable); std::string extension = URIUtils::GetExtension(gamePath); std::string xmlPath = CSavestateUtils::MakeMetadataPath(gamePath); // Load savestate CSavestate save; CSavestateDatabase db; CLog::Log(LOGDEBUG, "Select game client dialog: Loading savestate metadata %s", CURL::GetRedacted(xmlPath).c_str()); const bool bLoaded = db.GetSavestate(xmlPath, save); // Get savestate game client std::string saveGameClient; if (bLoaded) { saveGameClient = save.GameClient(); CLog::Log(LOGDEBUG, "Select game client dialog: Auto-selecting %s", saveGameClient.c_str()); } // "Select emulator for {0:s}" CGUIDialogSelect *dialog = GetDialog(StringUtils::Format(g_localizeStrings.Get(35258), extension)); if (dialog != nullptr) { // Turn the addons into items CFileItemList items; for (const auto &candidate : candidates) { CFileItemPtr item(XFILE::CAddonsDirectory::FileItemFromAddon(candidate, candidate->ID())); item->SetLabel2(g_localizeStrings.Get(35257)); // "Installed" if (item->GetPath() == saveGameClient) item->SetLabel2(item->GetLabel2() + ", " + g_localizeStrings.Get(35259)); // "Saved" items.Add(std::move(item)); } for (const auto &addon : installable) { CFileItemPtr item(XFILE::CAddonsDirectory::FileItemFromAddon(addon, addon->ID())); items.Add(std::move(item)); } items.Sort(SortByLabel, SortOrderAscending); dialog->SetItems(items); for (int i = 0; i < items.Size(); i++) { if (items[i]->GetPath() == saveGameClient) dialog->SetSelected(i); } dialog->Open(); // If the "Get More" button has been pressed, show a list of installable addons if (dialog->IsConfirmed()) { int selectedIndex = dialog->GetSelectedItem(); if (0 <= selectedIndex && selectedIndex < items.Size()) { gameClient = items[selectedIndex]->GetPath(); CLog::Log(LOGDEBUG, "Select game client dialog: User selected emulator %s", gameClient.c_str()); if (Install(gameClient)) { // If the addon is disabled we need to enable it if (!Enable(gameClient)) CLog::Log(LOGDEBUG, "Failed to enable game client %s", gameClient.c_str()); } else CLog::Log(LOGDEBUG, "Failed to install game client: %s", gameClient.c_str()); } else { CLog::Log(LOGDEBUG, "Select game client dialog: User selected invalid emulator %d", selectedIndex); } } else { CLog::Log(LOGDEBUG, "Select game client dialog: User cancelled game client installation"); } } return gameClient; }
bool CPlayerController::OnAction(const CAction &action) { const unsigned int MsgTime = 300; const unsigned int DisplTime = 2000; if (g_application.GetAppPlayer().IsPlayingVideo()) { switch (action.GetID()) { case ACTION_SHOW_SUBTITLES: { if (g_application.GetAppPlayer().GetSubtitleCount() == 0) return true; bool subsOn = !g_application.GetAppPlayer().GetSubtitleVisible(); g_application.GetAppPlayer().SetSubtitleVisible(subsOn); std::string sub, lang; if (subsOn) { SubtitleStreamInfo info; g_application.GetAppPlayer().GetSubtitleStreamInfo(g_application.GetAppPlayer().GetSubtitle(), info); if (!g_LangCodeExpander.Lookup(info.language, lang)) lang = g_localizeStrings.Get(13205); // Unknown if (info.name.length() == 0) sub = lang; else sub = StringUtils::Format("%s - %s", lang.c_str(), info.name.c_str()); } else sub = g_localizeStrings.Get(1223); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime); return true; } case ACTION_NEXT_SUBTITLE: case ACTION_CYCLE_SUBTITLE: { if (g_application.GetAppPlayer().GetSubtitleCount() == 0) return true; int currentSub = g_application.GetAppPlayer().GetSubtitle(); bool currentSubVisible = true; if (g_application.GetAppPlayer().GetSubtitleVisible()) { if (++currentSub >= g_application.GetAppPlayer().GetSubtitleCount()) { currentSub = 0; if (action.GetID() == ACTION_NEXT_SUBTITLE) { g_application.GetAppPlayer().SetSubtitleVisible(false); currentSubVisible = false; } } g_application.GetAppPlayer().SetSubtitle(currentSub); } else if (action.GetID() == ACTION_NEXT_SUBTITLE) { g_application.GetAppPlayer().SetSubtitleVisible(true); } std::string sub, lang; if (currentSubVisible) { SubtitleStreamInfo info; g_application.GetAppPlayer().GetSubtitleStreamInfo(currentSub, info); if (!g_LangCodeExpander.Lookup(info.language, lang)) lang = g_localizeStrings.Get(13205); // Unknown if (info.name.length() == 0) sub = lang; else sub = StringUtils::Format("%s - %s", lang.c_str(), info.name.c_str()); } else sub = g_localizeStrings.Get(1223); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime); return true; } case ACTION_SUBTITLE_DELAY_MIN: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_SubtitleDelay -= 0.1f; if (vs.m_SubtitleDelay < -g_advancedSettings.m_videoSubsDelayRange) vs.m_SubtitleDelay = -g_advancedSettings.m_videoSubsDelayRange; g_application.GetAppPlayer().SetSubTitleDelay(vs.m_SubtitleDelay); ShowSlider(action.GetID(), 22006, g_application.GetAppPlayer().GetVideoSettings().m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; } case ACTION_SUBTITLE_DELAY_PLUS: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_SubtitleDelay += 0.1f; if (vs.m_SubtitleDelay > g_advancedSettings.m_videoSubsDelayRange) vs.m_SubtitleDelay = g_advancedSettings.m_videoSubsDelayRange; g_application.GetAppPlayer().SetSubTitleDelay(vs.m_SubtitleDelay); ShowSlider(action.GetID(), 22006, g_application.GetAppPlayer().GetVideoSettings().m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange); return true; } case ACTION_SUBTITLE_DELAY: { ShowSlider(action.GetID(), 22006, g_application.GetAppPlayer().GetVideoSettings().m_SubtitleDelay, -g_advancedSettings.m_videoSubsDelayRange, 0.1f, g_advancedSettings.m_videoSubsDelayRange, true); return true; } case ACTION_AUDIO_DELAY: { ShowSlider(action.GetID(), 297, g_application.GetAppPlayer().GetVideoSettings().m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange, true); return true; } case ACTION_AUDIO_DELAY_MIN: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_AudioDelay -= 0.025f; if (vs.m_AudioDelay < -g_advancedSettings.m_videoAudioDelayRange) vs.m_AudioDelay = -g_advancedSettings.m_videoAudioDelayRange; g_application.GetAppPlayer().SetAVDelay(vs.m_AudioDelay); ShowSlider(action.GetID(), 297, g_application.GetAppPlayer().GetVideoSettings().m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; } case ACTION_AUDIO_DELAY_PLUS: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_AudioDelay += 0.025f; if (vs.m_AudioDelay > g_advancedSettings.m_videoAudioDelayRange) vs.m_AudioDelay = g_advancedSettings.m_videoAudioDelayRange; g_application.GetAppPlayer().SetAVDelay(vs.m_AudioDelay); ShowSlider(action.GetID(), 297, g_application.GetAppPlayer().GetVideoSettings().m_AudioDelay, -g_advancedSettings.m_videoAudioDelayRange, 0.025f, g_advancedSettings.m_videoAudioDelayRange); return true; } case ACTION_AUDIO_NEXT_LANGUAGE: { if (g_application.GetAppPlayer().GetAudioStreamCount() == 1) return true; int currentAudio = g_application.GetAppPlayer().GetAudioStream(); if (++currentAudio >= g_application.GetAppPlayer().GetAudioStreamCount()) currentAudio = 0; g_application.GetAppPlayer().SetAudioStream(currentAudio); // Set the audio stream to the one selected std::string aud; std::string lan; AudioStreamInfo info; g_application.GetAppPlayer().GetAudioStreamInfo(currentAudio, info); if (!g_LangCodeExpander.Lookup(info.language, lan)) lan = g_localizeStrings.Get(13205); // Unknown if (info.name.empty()) aud = lan; else aud = StringUtils::Format("%s - %s", lan.c_str(), info.name.c_str()); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(460), aud, DisplTime, false, MsgTime); return true; } case ACTION_ZOOM_IN: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_CustomZoomAmount += 0.01f; if (vs.m_CustomZoomAmount > 2.f) vs.m_CustomZoomAmount = 2.f; vs.m_ViewMode = ViewModeCustom; g_application.GetAppPlayer().SetRenderViewMode(ViewModeCustom, vs.m_CustomZoomAmount, vs.m_CustomPixelRatio, vs.m_CustomVerticalShift, vs.m_CustomNonLinStretch); ShowSlider(action.GetID(), 216, vs.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); return true; } case ACTION_ZOOM_OUT: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_CustomZoomAmount -= 0.01f; if (vs.m_CustomZoomAmount < 0.5f) vs.m_CustomZoomAmount = 0.5f; vs.m_ViewMode = ViewModeCustom; g_application.GetAppPlayer().SetRenderViewMode(ViewModeCustom, vs.m_CustomZoomAmount, vs.m_CustomPixelRatio, vs.m_CustomVerticalShift, vs.m_CustomNonLinStretch); ShowSlider(action.GetID(), 216, vs.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f); return true; } case ACTION_INCREASE_PAR: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_CustomPixelRatio += 0.01f; if (vs.m_CustomPixelRatio > 2.f) vs.m_CustomPixelRatio = 2.f; vs.m_ViewMode = ViewModeCustom; g_application.GetAppPlayer().SetRenderViewMode(ViewModeCustom, vs.m_CustomZoomAmount, vs.m_CustomPixelRatio, vs.m_CustomVerticalShift, vs.m_CustomNonLinStretch); ShowSlider(action.GetID(), 217, vs.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); return true; } case ACTION_DECREASE_PAR: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_CustomPixelRatio -= 0.01f; if (vs.m_CustomPixelRatio < 0.5f) vs.m_CustomPixelRatio = 0.5f; vs.m_ViewMode = ViewModeCustom; g_application.GetAppPlayer().SetRenderViewMode(ViewModeCustom, vs.m_CustomZoomAmount, vs.m_CustomPixelRatio, vs.m_CustomVerticalShift, vs.m_CustomNonLinStretch); ShowSlider(action.GetID(), 217, vs.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f); return true; } case ACTION_VSHIFT_UP: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_CustomVerticalShift -= 0.01f; if (vs.m_CustomVerticalShift < -2.0f) vs.m_CustomVerticalShift = -2.0f; vs.m_ViewMode = ViewModeCustom; g_application.GetAppPlayer().SetRenderViewMode(ViewModeCustom, vs.m_CustomZoomAmount, vs.m_CustomPixelRatio, vs.m_CustomVerticalShift, vs.m_CustomNonLinStretch); ShowSlider(action.GetID(), 225, vs.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); return true; } case ACTION_VSHIFT_DOWN: { CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); vs.m_CustomVerticalShift += 0.01f; if (vs.m_CustomVerticalShift > 2.0f) vs.m_CustomVerticalShift = 2.0f; vs.m_ViewMode = ViewModeCustom; g_application.GetAppPlayer().SetRenderViewMode(ViewModeCustom, vs.m_CustomZoomAmount, vs.m_CustomPixelRatio, vs.m_CustomVerticalShift, vs.m_CustomNonLinStretch); ShowSlider(action.GetID(), 225, vs.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f); return true; } case ACTION_SUBTITLE_VSHIFT_UP: { RESOLUTION_INFO res_info = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(); int subalign = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE)) { res_info.iSubtitles ++; if (res_info.iSubtitles >= res_info.iHeight) res_info.iSubtitles = res_info.iHeight - 1; ShowSlider(action.GetID(), 274, (float) res_info.iHeight - res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); } else { res_info.iSubtitles --; if (res_info.iSubtitles < 0) res_info.iSubtitles = 0; if (subalign == SUBTITLE_ALIGN_MANUAL) ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); else ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles - res_info.iHeight, (float) -res_info.iHeight, -1.0f, 0.0f); } CServiceBroker::GetWinSystem()->GetGfxContext().SetResInfo(CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(), res_info); return true; } case ACTION_SUBTITLE_VSHIFT_DOWN: { RESOLUTION_INFO res_info = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(); int subalign = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE)) { res_info.iSubtitles--; if (res_info.iSubtitles < 0) res_info.iSubtitles = 0; ShowSlider(action.GetID(), 274, (float) res_info.iHeight - res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); } else { res_info.iSubtitles++; if (res_info.iSubtitles >= res_info.iHeight) res_info.iSubtitles = res_info.iHeight - 1; if (subalign == SUBTITLE_ALIGN_MANUAL) ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight); else ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles - res_info.iHeight, (float) -res_info.iHeight, -1.0f, 0.0f); } CServiceBroker::GetWinSystem()->GetGfxContext().SetResInfo(CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(), res_info); return true; } case ACTION_SUBTITLE_ALIGN: { RESOLUTION_INFO res_info = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(); int subalign = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); subalign++; if (subalign > SUBTITLE_ALIGN_TOP_OUTSIDE) subalign = SUBTITLE_ALIGN_MANUAL; res_info.iSubtitles = res_info.iHeight - 1; CServiceBroker::GetSettings().SetInt(CSettings::SETTING_SUBTITLES_ALIGN, subalign); CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(21460), g_localizeStrings.Get(21461 + subalign), TOAST_DISPLAY_TIME, false); CServiceBroker::GetWinSystem()->GetGfxContext().SetResInfo(CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(), res_info); return true; } case ACTION_VOLAMP_UP: case ACTION_VOLAMP_DOWN: { // Don't allow change with passthrough audio if (g_application.GetAppPlayer().IsPassthrough()) { CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(660), g_localizeStrings.Get(29802), TOAST_DISPLAY_TIME, false); return false; } float sliderMax = VOLUME_DRC_MAXIMUM / 100.0f; float sliderMin = VOLUME_DRC_MINIMUM / 100.0f; CVideoSettings vs = g_application.GetAppPlayer().GetVideoSettings(); if (action.GetID() == ACTION_VOLAMP_UP) vs.m_VolumeAmplification += 1.0f; else vs.m_VolumeAmplification -= 1.0f; vs.m_VolumeAmplification = std::max(std::min(vs.m_VolumeAmplification, sliderMax), sliderMin); g_application.GetAppPlayer().SetDynamicRangeCompression((long)(vs.m_VolumeAmplification * 100)); ShowSlider(action.GetID(), 660, vs.m_VolumeAmplification, sliderMin, 1.0f, sliderMax); return true; } case ACTION_VOLAMP: { float sliderMax = VOLUME_DRC_MAXIMUM / 100.0f; float sliderMin = VOLUME_DRC_MINIMUM / 100.0f; ShowSlider(action.GetID(), 660, g_application.GetAppPlayer().GetVideoSettings().m_VolumeAmplification, sliderMin, 1.0f, sliderMax, true); return true; } case ACTION_PLAYER_PROGRAM_SELECT: { std::vector<ProgramInfo> programs; g_application.GetAppPlayer().GetPrograms(programs); CGUIDialogSelect *dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (dialog) { int playing = 0; int idx = 0; for (auto prog : programs) { dialog->Add(prog.name); if (prog.playing) playing = idx; idx++; } dialog->SetHeading(CVariant{g_localizeStrings.Get(39109)}); dialog->SetSelected(playing); dialog->Open(); idx = dialog->GetSelectedItem(); if (idx > 0) g_application.GetAppPlayer().SetProgram(programs[idx].id); } return true; } case ACTION_PLAYER_RESOLUTION_SELECT: { std::vector<CVariant> indexList = CServiceBroker::GetSettings().GetList(CSettings::SETTING_VIDEOSCREEN_WHITELIST); CGUIDialogSelect *dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); if (dialog) { int current = 0; int idx = 0; auto currentRes = CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(); for (const CVariant &mode : indexList) { auto res = CDisplaySettings::GetInstance().GetResFromString(mode.asString()); const RESOLUTION_INFO info = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(res); dialog->Add(info.strMode); if (res == currentRes) current = idx; idx++; } dialog->SetHeading(CVariant{g_localizeStrings.Get(39110)}); dialog->SetSelected(current); dialog->Open(); idx = dialog->GetSelectedItem(); if (idx >= 0) { auto res = CDisplaySettings::GetInstance().GetResFromString(indexList[idx].asString()); CServiceBroker::GetWinSystem()->GetGfxContext().SetVideoResolution(res, false); } } return true; } default: break; } } return false; }
bool CGUIDialogAddonSettings::ShowVirtualKeyboard(int iControl) { int controlId = CONTROL_START_SETTING; bool bCloseDialog = false; const TiXmlElement *setting = GetFirstSetting(); while (setting) { if (controlId == iControl) { const CGUIControl* control = GetControl(controlId); const std::string id = XMLUtils::GetAttribute(setting, "id"); const std::string type = XMLUtils::GetAttribute(setting, "type"); //Special handling for actions: does not require id attribute. TODO: refactor me. if (control && control->GetControlType() == CGUIControl::GUICONTROL_BUTTON && type == "action") { const char *option = setting->Attribute("option"); std::string action = XMLUtils::GetAttribute(setting, "action"); if (!action.empty()) { // replace $CWD with the url of plugin/script StringUtils::Replace(action, "$CWD", m_addon->Path()); StringUtils::Replace(action, "$ID", m_addon->ID()); if (option) bCloseDialog = (strcmpi(option, "close") == 0); CApplicationMessenger::Get().ExecBuiltIn(action); } break; } if (control && control->GetControlType() == CGUIControl::GUICONTROL_BUTTON && !id.empty() && !type.empty()) { const char *option = setting->Attribute("option"); const char *source = setting->Attribute("source"); std::string value = m_buttonValues[id]; std::string label = GetString(setting->Attribute("label")); if (type == "text") { // get any options bool bHidden = false; bool bEncoded = false; if (option) { bHidden = (strstr(option, "hidden") != NULL); bEncoded = (strstr(option, "urlencoded") != NULL); } if (bEncoded) value = CURL::Decode(value); if (CGUIKeyboardFactory::ShowAndGetInput(value, label, true, bHidden)) { // if hidden hide input if (bHidden) { std::string hiddenText; hiddenText.append(value.size(), L'*'); ((CGUIButtonControl *)control)->SetLabel2(hiddenText); } else ((CGUIButtonControl*) control)->SetLabel2(value); if (bEncoded) value = CURL::Encode(value); } } else if (type == "number" && CGUIDialogNumeric::ShowAndGetNumber(value, label)) { ((CGUIButtonControl*) control)->SetLabel2(value); } else if (type == "ipaddress" && CGUIDialogNumeric::ShowAndGetIPAddress(value, label)) { ((CGUIButtonControl*) control)->SetLabel2(value); } else if (type == "select") { CGUIDialogSelect *pDlg = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (pDlg) { pDlg->SetHeading(label.c_str()); pDlg->Reset(); int selected = -1; vector<std::string> valuesVec; if (setting->Attribute("values")) StringUtils::Tokenize(setting->Attribute("values"), valuesVec, "|"); else if (setting->Attribute("lvalues")) { // localize StringUtils::Tokenize(setting->Attribute("lvalues"), valuesVec, "|"); for (unsigned int i = 0; i < valuesVec.size(); i++) { if (i == (unsigned int)atoi(value.c_str())) selected = i; std::string localized = m_addon->GetString(atoi(valuesVec[i].c_str())); if (localized.empty()) localized = g_localizeStrings.Get(atoi(valuesVec[i].c_str())); valuesVec[i] = localized; } } else if (source) { valuesVec = GetFileEnumValues(source, XMLUtils::GetAttribute(setting, "mask"), XMLUtils::GetAttribute(setting, "option")); } for (unsigned int i = 0; i < valuesVec.size(); i++) { pDlg->Add(valuesVec[i]); if (selected == (int)i || (selected < 0 && StringUtils::EqualsNoCase(valuesVec[i], value))) pDlg->SetSelected(i); // FIXME: the SetSelected() does not select "i", it always defaults to the first position } pDlg->DoModal(); int iSelected = pDlg->GetSelectedLabel(); if (iSelected >= 0) { if (setting->Attribute("lvalues")) value = StringUtils::Format("%i", iSelected); else value = valuesVec[iSelected]; ((CGUIButtonControl*) control)->SetLabel2(valuesVec[iSelected]); } } } else if (type == "audio" || type == "video" || type == "image" || type == "executable" || type == "file" || type == "folder") { // setup the shares VECSOURCES *shares = NULL; if (source && strcmpi(source, "") != 0) shares = CMediaSourceSettings::Get().GetSources(source); VECSOURCES localShares; if (!shares) { g_mediaManager.GetLocalDrives(localShares); if (!source || strcmpi(source, "local") != 0) g_mediaManager.GetNetworkLocations(localShares); } else // always append local drives { localShares = *shares; g_mediaManager.GetLocalDrives(localShares); } if (type == "folder") { // get any options bool bWriteOnly = false; if (option) bWriteOnly = (strcmpi(option, "writeable") == 0); if (CGUIDialogFileBrowser::ShowAndGetDirectory(localShares, label, value, bWriteOnly)) ((CGUIButtonControl*) control)->SetLabel2(value); } else if (type == "image") { if (CGUIDialogFileBrowser::ShowAndGetImage(localShares, label, value)) ((CGUIButtonControl*) control)->SetLabel2(value); } else { // set the proper mask std::string strMask; if (setting->Attribute("mask")) { strMask = setting->Attribute("mask"); // convert mask qualifiers StringUtils::Replace(strMask, "$AUDIO", g_advancedSettings.GetMusicExtensions()); StringUtils::Replace(strMask, "$VIDEO", g_advancedSettings.m_videoExtensions); StringUtils::Replace(strMask, "$IMAGE", g_advancedSettings.m_pictureExtensions); #if defined(_WIN32_WINNT) StringUtils::Replace(strMask, "$EXECUTABLE", ".exe|.bat|.cmd|.py"); #else StringUtils::Replace(strMask, "$EXECUTABLE", ""); #endif } else { if (type == "video") strMask = g_advancedSettings.m_videoExtensions; else if (type == "audio") strMask = g_advancedSettings.GetMusicExtensions(); else if (type == "executable") #if defined(_WIN32_WINNT) strMask = ".exe|.bat|.cmd|.py"; #else strMask = ""; #endif } // get any options bool bUseThumbs = false; bool bUseFileDirectories = false; if (option) { vector<string> options = StringUtils::Split(option, '|'); bUseThumbs = find(options.begin(), options.end(), "usethumbs") != options.end(); bUseFileDirectories = find(options.begin(), options.end(), "treatasfolder") != options.end(); } if (CGUIDialogFileBrowser::ShowAndGetFile(localShares, strMask, label, value, bUseThumbs, bUseFileDirectories)) ((CGUIButtonControl*) control)->SetLabel2(value); } } else if (type == "date") { CDateTime date; if (!value.empty()) date.SetFromDBDate(value); SYSTEMTIME timedate; date.GetAsSystemTime(timedate); if(CGUIDialogNumeric::ShowAndGetDate(timedate, label)) { date = timedate; value = date.GetAsDBDate(); ((CGUIButtonControl*) control)->SetLabel2(value); } } else if (type == "time") { SYSTEMTIME timedate; if (value.size() >= 5) { // assumes HH:MM timedate.wHour = atoi(value.substr(0, 2).c_str()); timedate.wMinute = atoi(value.substr(3, 2).c_str()); } if (CGUIDialogNumeric::ShowAndGetTime(timedate, label)) { value = StringUtils::Format("%02d:%02d", timedate.wHour, timedate.wMinute); ((CGUIButtonControl*) control)->SetLabel2(value); } } else if (type == "addon") { const char *strType = setting->Attribute("addontype"); if (strType) { vector<string> addonTypes = StringUtils::Split(strType, ','); vector<ADDON::TYPE> types; for (vector<string>::iterator i = addonTypes.begin(); i != addonTypes.end(); ++i) { StringUtils::Trim(*i); ADDON::TYPE type = TranslateType(*i); if (type != ADDON_UNKNOWN) types.push_back(type); } if (types.size() > 0) { const char *strMultiselect = setting->Attribute("multiselect"); bool multiSelect = strMultiselect && strcmpi(strMultiselect, "true") == 0; if (multiSelect) { // construct vector of addon IDs (IDs are comma seperated in single string) vector<string> addonIDs = StringUtils::Split(value, ','); if (CGUIWindowAddonBrowser::SelectAddonID(types, addonIDs, false) == 1) { value = StringUtils::Join(addonIDs, ","); ((CGUIButtonControl*) control)->SetLabel2(GetAddonNames(value)); } } else // no need of string splitting/joining if we select only 1 addon if (CGUIWindowAddonBrowser::SelectAddonID(types, value, false) == 1) ((CGUIButtonControl*) control)->SetLabel2(GetAddonNames(value)); } } } m_buttonValues[id] = value; break; } } setting = setting->NextSiblingElement("setting"); controlId++; } EnableControls(); return bCloseDialog; }
void CGUIDialogSmartPlaylistRule::OnBrowse() { CFileItemList items; CMusicDatabase database; database.Open(); CVideoDatabase videodatabase; videodatabase.Open(); VIDEODB_CONTENT_TYPE type = VIDEODB_CONTENT_MOVIES; if (m_type.Equals("tvshows")) type = VIDEODB_CONTENT_TVSHOWS; else if (m_type.Equals("musicvideos")) type = VIDEODB_CONTENT_MUSICVIDEOS; else if (m_type.Equals("episodes")) type = VIDEODB_CONTENT_EPISODES; int iLabel = 0; if (m_rule.m_field == FieldGenre) { if (m_type.Equals("tvshows") || m_type.Equals("episodes") || m_type.Equals("movies")) videodatabase.GetGenresNav("videodb://2/1/",items,type); else if (m_type.Equals("songs") || m_type.Equals("albums") || m_type.Equals("artists") || m_type.Equals("mixed")) database.GetGenresNav("musicdb://1/",items); if (m_type.Equals("musicvideos") || m_type.Equals("mixed")) { CFileItemList items2; videodatabase.GetGenresNav("videodb://3/1/",items2,VIDEODB_CONTENT_MUSICVIDEOS); items.Append(items2); } iLabel = 515; } else if (m_rule.m_field == FieldCountry) { videodatabase.GetCountriesNav("videodb://2/1/",items,type); iLabel = 574; } else if (m_rule.m_field == FieldArtist || m_rule.m_field == FieldAlbumArtist) { if (m_type.Equals("songs") || m_type.Equals("mixed") || m_type.Equals("albums") || m_type.Equals("artists")) database.GetArtistsNav("musicdb://2/", items, m_rule.m_field == FieldAlbumArtist, -1); if (m_type.Equals("musicvideos") || m_type.Equals("mixed")) { CFileItemList items2; videodatabase.GetMusicVideoArtistsByName("",items2); items.Append(items2); } iLabel = 557; } else if (m_rule.m_field == FieldAlbum) { if (m_type.Equals("songs") || m_type.Equals("mixed") || m_type.Equals("albums")) database.GetAlbumsNav("musicdb://3/", items); if (m_type.Equals("musicvideos") || m_type.Equals("mixed")) { CFileItemList items2; videodatabase.GetMusicVideoAlbumsByName("",items2); items.Append(items2); } iLabel = 558; } else if (m_rule.m_field == FieldActor) { videodatabase.GetActorsNav("",items,type); iLabel = 20337; } else if (m_rule.m_field == FieldYear) { if (m_type.Equals("songs") || m_type.Equals("mixed") || m_type.Equals("albums")) database.GetYearsNav("musicdb://9/", items); if (!m_type.Equals("songs") && !m_type.Equals("albums")) { CFileItemList items2; videodatabase.GetYearsNav("", items2, type); items.Append(items2); } iLabel = 562; } else if (m_rule.m_field == FieldDirector) { videodatabase.GetDirectorsNav("",items,type); iLabel = 20339; } else if (m_rule.m_field == FieldStudio) { videodatabase.GetStudiosNav("",items,type); iLabel = 572; } else if (m_rule.m_field == FieldWriter) { videodatabase.GetWritersNav("",items,type); iLabel = 20417; } else if (m_rule.m_field == FieldTvShowTitle) { videodatabase.GetTvShowsNav("videodb://2/2/",items); iLabel = 20343; } else if (m_rule.m_field == FieldPlaylist) { // use filebrowser to grab another smart playlist // Note: This can cause infinite loops (playlist that refers to the same playlist) but I don't // think there's any decent way to deal with this, as the infinite loop may be an arbitrary // number of playlists deep, eg playlist1 -> playlist2 -> playlist3 ... -> playlistn -> playlist1 CStdString path = "special://videoplaylists/"; if (m_type.Equals("songs") || m_type.Equals("albums")) path = "special://musicplaylists/"; XFILE::CDirectory::GetDirectory(path, items, ".xsp", XFILE::DIR_FLAG_NO_FILE_DIRS); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; CSmartPlaylist playlist; if (playlist.OpenAndReadName(item->GetPath())) item->SetLabel(playlist.GetName()); } iLabel = 559; } else if (m_rule.m_field == FieldPath) { VECSOURCES sources; if (m_type == "songs" || m_type == "mixed") sources = *g_settings.GetSourcesFromType("music"); if (m_type != "songs") { VECSOURCES sources2 = *g_settings.GetSourcesFromType("video"); sources.insert(sources.end(),sources2.begin(),sources2.end()); } g_mediaManager.GetLocalDrives(sources); CStdString path = m_rule.GetLocalizedParameter(m_type); CGUIDialogFileBrowser::ShowAndGetDirectory(sources, g_localizeStrings.Get(657), path, false); if (m_rule.m_parameter.size() > 0) m_rule.m_parameter.clear(); if (!path.empty()) m_rule.m_parameter.push_back(path); UpdateButtons(); return; } else if (m_rule.m_field == FieldSet) { videodatabase.GetSetsNav("videodb://1/7/", items, VIDEODB_CONTENT_MOVIES); iLabel = 20434; } else if (m_rule.m_field == FieldTag) { if (m_type == "movies") videodatabase.GetTagsNav("videodb://1/9/", items, VIDEODB_CONTENT_MOVIES); else return; iLabel = 20459; } else { // TODO: Add browseability in here. assert(false); } // sort the items items.Sort(SORT_METHOD_LABEL, SortOrderAscending); CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); pDialog->Reset(); pDialog->SetItems(&items); CStdString strHeading; strHeading.Format(g_localizeStrings.Get(13401),g_localizeStrings.Get(iLabel)); pDialog->SetHeading(strHeading); pDialog->SetMultiSelection(true); if (!m_rule.m_parameter.empty()) pDialog->SetSelected(m_rule.m_parameter); pDialog->DoModal(); if (pDialog->IsConfirmed()) { const CFileItemList &items = pDialog->GetSelectedItems(); m_rule.m_parameter.clear(); for (int index = 0; index < items.Size(); index++) m_rule.m_parameter.push_back(items[index]->GetLabel()); UpdateButtons(); } pDialog->Reset(); }
void CPeripherals::OnSettingAction(const CSetting *setting) { if (setting == nullptr) return; const std::string &settingId = setting->GetId(); if (settingId == CSettings::SETTING_INPUT_PERIPHERALS) { CGUIDialogSelect* pDialog = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); CFileItemList items; GetDirectory("peripherals://all/", items); int iPos = -1; do { pDialog->Reset(); pDialog->SetHeading(CVariant{35000}); pDialog->SetUseDetails(true); pDialog->SetItems(items); pDialog->SetSelected(iPos); pDialog->Open(); iPos = pDialog->IsConfirmed() ? pDialog->GetSelectedItem() : -1; if (iPos >= 0) { CFileItemPtr pItem = items.Get(iPos); // show an error if the peripheral doesn't have any settings PeripheralPtr peripheral = GetByPath(pItem->GetPath()); if (!peripheral || peripheral->GetSettings().empty()) { CGUIDialogOK::ShowAndGetInput(CVariant{35000}, CVariant{35004}); continue; } CGUIDialogPeripheralSettings *pSettingsDialog = (CGUIDialogPeripheralSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PERIPHERAL_SETTINGS); if (pItem && pSettingsDialog) { // pass peripheral item properties to settings dialog so skin authors // can use it to show more detailed information about the device pSettingsDialog->SetProperty("vendor", pItem->GetProperty("vendor")); pSettingsDialog->SetProperty("product", pItem->GetProperty("product")); pSettingsDialog->SetProperty("bus", pItem->GetProperty("bus")); pSettingsDialog->SetProperty("location", pItem->GetProperty("location")); pSettingsDialog->SetProperty("class", pItem->GetProperty("class")); pSettingsDialog->SetProperty("version", pItem->GetProperty("version")); // open settings dialog pSettingsDialog->SetFileItem(pItem.get()); pSettingsDialog->Open(); } } } while (pDialog->IsConfirmed()); } else if (settingId == CSettings::SETTING_INPUT_CONTROLLERCONFIG) g_windowManager.ActivateWindow(WINDOW_DIALOG_GAME_CONTROLLERS); else if (settingId == CSettings::SETTING_INPUT_TESTRUMBLE) TestFeature(FEATURE_RUMBLE); }