summaryrefslogtreecommitdiffstats
path: root/xbmc/programs/GUIWindowPrograms.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/programs/GUIWindowPrograms.cpp')
-rw-r--r--xbmc/programs/GUIWindowPrograms.cpp185
1 files changed, 185 insertions, 0 deletions
diff --git a/xbmc/programs/GUIWindowPrograms.cpp b/xbmc/programs/GUIWindowPrograms.cpp
new file mode 100644
index 0000000..1e79c34
--- /dev/null
+++ b/xbmc/programs/GUIWindowPrograms.cpp
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2005-2020 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 "GUIWindowPrograms.h"
+
+#include "Autorun.h"
+#include "FileItem.h"
+#include "GUIPassword.h"
+#include "ServiceBroker.h"
+#include "Util.h"
+#include "addons/gui/GUIDialogAddonInfo.h"
+#include "dialogs/GUIDialogMediaSource.h"
+#include "guilib/GUIComponent.h"
+#include "guilib/GUIWindowManager.h"
+#include "input/Key.h"
+#include "media/MediaLockState.h"
+#include "settings/MediaSourceSettings.h"
+#include "utils/StringUtils.h"
+
+#define CONTROL_BTNVIEWASICONS 2
+#define CONTROL_BTNSORTBY 3
+#define CONTROL_BTNSORTASC 4
+#define CONTROL_LABELFILES 12
+
+CGUIWindowPrograms::CGUIWindowPrograms(void)
+ : CGUIMediaWindow(WINDOW_PROGRAMS, "MyPrograms.xml")
+{
+ m_thumbLoader.SetObserver(this);
+ m_dlgProgress = NULL;
+ m_rootDir.AllowNonLocalSources(false); // no nonlocal shares for this window please
+}
+
+
+CGUIWindowPrograms::~CGUIWindowPrograms(void) = default;
+
+bool CGUIWindowPrograms::OnMessage(CGUIMessage& message)
+{
+ switch ( message.GetMessage() )
+ {
+ case GUI_MSG_WINDOW_DEINIT:
+ {
+ if (m_thumbLoader.IsLoading())
+ m_thumbLoader.StopThread();
+ }
+ break;
+
+ case GUI_MSG_WINDOW_INIT:
+ {
+ m_dlgProgress = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogProgress>(WINDOW_DIALOG_PROGRESS);
+
+ // is this the first time accessing this window?
+ if (m_vecItems->GetPath() == "?" && message.GetStringParam().empty())
+ message.SetStringParam(CMediaSourceSettings::GetInstance().GetDefaultSource("programs"));
+
+ return CGUIMediaWindow::OnMessage(message);
+ }
+ break;
+
+ case GUI_MSG_CLICKED:
+ {
+ if (m_viewControl.HasControl(message.GetSenderId())) // list/thumb control
+ {
+ int iAction = message.GetParam1();
+ int iItem = m_viewControl.GetSelectedItem();
+ if (iAction == ACTION_PLAYER_PLAY)
+ {
+ OnPlayMedia(iItem);
+ return true;
+ }
+ else if (iAction == ACTION_SHOW_INFO)
+ {
+ OnItemInfo(iItem);
+ return true;
+ }
+ }
+ }
+ break;
+ }
+
+ return CGUIMediaWindow::OnMessage(message);
+}
+
+void CGUIWindowPrograms::GetContextButtons(int itemNumber, CContextButtons &buttons)
+{
+ if (itemNumber < 0 || itemNumber >= m_vecItems->Size())
+ return;
+ CFileItemPtr item = m_vecItems->Get(itemNumber);
+ if (item)
+ {
+ if ( m_vecItems->IsVirtualDirectoryRoot() || m_vecItems->GetPath() == "sources://programs/" )
+ {
+ CGUIDialogContextMenu::GetContextButtons("programs", item, buttons);
+ }
+ }
+ CGUIMediaWindow::GetContextButtons(itemNumber, buttons);
+}
+
+bool CGUIWindowPrograms::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
+{
+ CFileItemPtr item = (itemNumber >= 0 && itemNumber < m_vecItems->Size()) ? m_vecItems->Get(itemNumber) : CFileItemPtr();
+
+ if (CGUIDialogContextMenu::OnContextButton("programs", item, button))
+ {
+ Update("");
+ return true;
+ }
+ return CGUIMediaWindow::OnContextButton(itemNumber, button);
+}
+
+bool CGUIWindowPrograms::OnAddMediaSource()
+{
+ return CGUIDialogMediaSource::ShowAndAddMediaSource("programs");
+}
+
+bool CGUIWindowPrograms::Update(const std::string &strDirectory, bool updateFilterPath /* = true */)
+{
+ if (m_thumbLoader.IsLoading())
+ m_thumbLoader.StopThread();
+
+ if (!CGUIMediaWindow::Update(strDirectory, updateFilterPath))
+ return false;
+
+ m_thumbLoader.Load(*m_vecItems);
+ return true;
+}
+
+bool CGUIWindowPrograms::OnPlayMedia(int iItem, const std::string&)
+{
+ if ( iItem < 0 || iItem >= m_vecItems->Size() ) return false;
+ CFileItemPtr pItem = m_vecItems->Get(iItem);
+
+#ifdef HAS_DVD_DRIVE
+ if (pItem->IsDVD())
+ return MEDIA_DETECT::CAutorun::PlayDiscAskResume(m_vecItems->Get(iItem)->GetPath());
+#endif
+
+ if (pItem->m_bIsFolder) return false;
+
+ return false;
+}
+
+std::string CGUIWindowPrograms::GetStartFolder(const std::string &dir)
+{
+ std::string lower(dir); StringUtils::ToLower(lower);
+ if (lower == "plugins" || lower == "addons")
+ return "addons://sources/executable/";
+ else if (lower == "androidapps")
+ return "androidapp://sources/apps/";
+
+ SetupShares();
+ VECSOURCES shares;
+ m_rootDir.GetSources(shares);
+ bool bIsSourceName = false;
+ int iIndex = CUtil::GetMatchingSource(dir, shares, bIsSourceName);
+ if (iIndex > -1)
+ {
+ if (iIndex < static_cast<int>(shares.size()) && shares[iIndex].m_iHasLock == LOCK_STATE_LOCKED)
+ {
+ CFileItem item(shares[iIndex]);
+ if (!g_passwordManager.IsItemUnlocked(&item,"programs"))
+ return "";
+ }
+ if (bIsSourceName)
+ return shares[iIndex].strPath;
+ return dir;
+ }
+ return CGUIMediaWindow::GetStartFolder(dir);
+}
+
+void CGUIWindowPrograms::OnItemInfo(int iItem)
+{
+ if (iItem < 0 || iItem >= m_vecItems->Size())
+ return;
+
+ CFileItemPtr item = m_vecItems->Get(iItem);
+ if (!m_vecItems->IsPlugin() && (item->IsPlugin() || item->IsScript()))
+ {
+ CGUIDialogAddonInfo::ShowForItem(item);
+ }
+}