/* * 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(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(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); } }