diff options
Diffstat (limited to 'xbmc/dialogs/GUIDialogSimpleMenu.cpp')
-rw-r--r-- | xbmc/dialogs/GUIDialogSimpleMenu.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/xbmc/dialogs/GUIDialogSimpleMenu.cpp b/xbmc/dialogs/GUIDialogSimpleMenu.cpp new file mode 100644 index 0000000..0d4d11a --- /dev/null +++ b/xbmc/dialogs/GUIDialogSimpleMenu.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2005-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 "GUIDialogSimpleMenu.h" + +#include "FileItem.h" +#include "GUIDialogSelect.h" +#include "ServiceBroker.h" +#include "URL.h" +#include "dialogs/GUIDialogBusy.h" +#include "filesystem/Directory.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" +#include "settings/DiscSettings.h" +#include "settings/Settings.h" +#include "settings/SettingsComponent.h" +#include "threads/IRunnable.h" +#include "utils/FileUtils.h" +#include "utils/URIUtils.h" +#include "utils/Variant.h" +#include "utils/log.h" +#include "video/VideoInfoTag.h" + +namespace +{ +class CGetDirectoryItems : public IRunnable +{ +public: + CGetDirectoryItems(const std::string &path, CFileItemList &items, const XFILE::CDirectory::CHints &hints) + : m_path(path), m_items(items), m_hints(hints) + { + } + void Run() override + { + m_result = XFILE::CDirectory::GetDirectory(m_path, m_items, m_hints); + } + bool m_result; +protected: + std::string m_path; + CFileItemList &m_items; + XFILE::CDirectory::CHints m_hints; +}; +} + + +bool CGUIDialogSimpleMenu::ShowPlaySelection(CFileItem& item) +{ + if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt(CSettings::SETTING_DISC_PLAYBACK) != BD_PLAYBACK_SIMPLE_MENU) + return true; + + if (item.IsBDFile()) + { + std::string root = URIUtils::GetParentPath(item.GetDynPath()); + URIUtils::RemoveSlashAtEnd(root); + if (URIUtils::GetFileName(root) == "BDMV") + { + CURL url("bluray://"); + url.SetHostName(URIUtils::GetParentPath(root)); + url.SetFileName("root"); + return ShowPlaySelection(item, url.Get()); + } + } + + if (item.IsDiscImage()) + { + CURL url2("udf://"); + url2.SetHostName(item.GetDynPath()); + url2.SetFileName("BDMV/index.bdmv"); + if (CFileUtils::Exists(url2.Get())) + { + url2.SetFileName(""); + + CURL url("bluray://"); + url.SetHostName(url2.Get()); + url.SetFileName("root"); + return ShowPlaySelection(item, url.Get()); + } + } + return true; +} + +bool CGUIDialogSimpleMenu::ShowPlaySelection(CFileItem& item, const std::string& directory) +{ + + CFileItemList items; + + if (!GetDirectoryItems(directory, items, XFILE::CDirectory::CHints())) + { + CLog::Log(LOGERROR, + "CGUIWindowVideoBase::ShowPlaySelection - Failed to get play directory for {}", + directory); + return true; + } + + if (items.IsEmpty()) + { + CLog::Log(LOGERROR, "CGUIWindowVideoBase::ShowPlaySelection - Failed to get any items {}", + directory); + return true; + } + + CGUIDialogSelect* dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogSelect>(WINDOW_DIALOG_SELECT); + while (true) + { + dialog->Reset(); + dialog->SetHeading(CVariant{25006}); // Select playback item + dialog->SetItems(items); + dialog->SetUseDetails(true); + dialog->Open(); + + CFileItemPtr item_new = dialog->GetSelectedFileItem(); + if (!item_new || dialog->GetSelectedItem() < 0) + { + CLog::Log(LOGDEBUG, "CGUIWindowVideoBase::ShowPlaySelection - User aborted {}", directory); + break; + } + + if (item_new->m_bIsFolder == false) + { + std::string original_path = item.GetDynPath(); + item.SetDynPath(item_new->GetDynPath()); + item.SetProperty("get_stream_details_from_player", true); + item.SetProperty("original_listitem_url", original_path); + return true; + } + + items.Clear(); + if (!GetDirectoryItems(item_new->GetDynPath(), items, XFILE::CDirectory::CHints()) || items.IsEmpty()) + { + CLog::Log(LOGERROR, "CGUIWindowVideoBase::ShowPlaySelection - Failed to get any items {}", + item_new->GetPath()); + break; + } + } + + return false; +} + +bool CGUIDialogSimpleMenu::GetDirectoryItems(const std::string &path, CFileItemList &items, + const XFILE::CDirectory::CHints &hints) +{ + CGetDirectoryItems getItems(path, items, hints); + if (!CGUIDialogBusy::Wait(&getItems, 100, true)) + { + return false; + } + return getItems.m_result; +} |