From 61d73805ad529eac9a36fe8e336f1a6aa3f7a9ed Mon Sep 17 00:00:00 2001 From: Kai Sommerfeld Date: Thu, 12 Sep 2019 20:26:03 +0200 Subject: [PATCH] [PVR] Fix: we must close all open modal dialogs before we can activate the PVR search window. --- xbmc/pvr/PVRGUIActions.cpp | 24 ++++++++++++++++--- xbmc/pvr/PVRGUIActions.h | 3 +-- xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp | 5 +++- .../pvr/dialogs/GUIDialogPVRItemsViewBase.cpp | 9 +++---- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/xbmc/pvr/PVRGUIActions.cpp b/xbmc/pvr/PVRGUIActions.cpp index d6d2f01bd93bb..b604dab968b28 100644 --- a/xbmc/pvr/PVRGUIActions.cpp +++ b/xbmc/pvr/PVRGUIActions.cpp @@ -228,7 +228,7 @@ namespace PVR return true; } - bool CPVRGUIActions::FindSimilar(const CFileItemPtr &item, CGUIWindow *windowToClose /* = nullptr */) const + bool CPVRGUIActions::FindSimilar(const std::shared_ptr& item) const { const bool bRadio(CPVRItem(item).IsRadio()); @@ -245,8 +245,26 @@ namespace PVR return false; } - if (windowToClose) - windowToClose->Close(); + //! @todo If we want dialogs to spawn program search in a clean way - without having to force-close any + // other dialogs - we must introduce a search dialog with functionality similar to the search window. + + for (int iId = CServiceBroker::GetGUI()->GetWindowManager().GetTopmostModalDialog(true /* ignoreClosing */); + iId != WINDOW_INVALID; + iId = CServiceBroker::GetGUI()->GetWindowManager().GetTopmostModalDialog(true /* ignoreClosing */)) + { + CLog::LogF(LOGWARNING, "Have to close modal dialog with id %d before search window can be opened.", iId); + + CGUIWindow* window = CServiceBroker::GetGUI()->GetWindowManager().GetWindow(iId); + if (window) + { + window->Close(); + } + else + { + CLog::LogF(LOGERROR, "Unable to get window instance %d! Cannot open search window.", iId); + return false; // return, otherwise we run into an endless loop + } + } windowSearch->SetItemToSearch(item); CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(windowSearchId); diff --git a/xbmc/pvr/PVRGUIActions.h b/xbmc/pvr/PVRGUIActions.h index 39a02dfdef46d..23cbbd58135eb 100644 --- a/xbmc/pvr/PVRGUIActions.h +++ b/xbmc/pvr/PVRGUIActions.h @@ -84,10 +84,9 @@ namespace PVR /*! * @brief Open a window containing a list of epg tags 'similar' to a given item. * @param item containing epg data for matching. item must be an epg tag, a channel or a recording. - * @param windowToClose is the window to close before opening the window with the search results. * @return true on success, false otherwise. */ - bool FindSimilar(const CFileItemPtr &item, CGUIWindow *windowToClose = nullptr) const; + bool FindSimilar(const std::shared_ptr& item) const; /*! * @brief Open the timer settings dialog to create a new tv or radio timer. diff --git a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp index e2ae28ed9de89..f71cf28136013 100644 --- a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp +++ b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp @@ -139,7 +139,10 @@ bool CGUIDialogPVRGuideInfo::OnClickButtonFind(CGUIMessage &message) bool bReturn = false; if (message.GetSenderId() == CONTROL_BTN_FIND) - return CServiceBroker::GetPVRManager().GUIActions()->FindSimilar(CFileItemPtr(new CFileItem(m_progItem)), this); + { + Close(); + return CServiceBroker::GetPVRManager().GUIActions()->FindSimilar(std::make_shared(m_progItem)); + } return bReturn; } diff --git a/xbmc/pvr/dialogs/GUIDialogPVRItemsViewBase.cpp b/xbmc/pvr/dialogs/GUIDialogPVRItemsViewBase.cpp index e0e7c9ee82530..19ef61abf60ae 100644 --- a/xbmc/pvr/dialogs/GUIDialogPVRItemsViewBase.cpp +++ b/xbmc/pvr/dialogs/GUIDialogPVRItemsViewBase.cpp @@ -90,10 +90,11 @@ void CGUIDialogPVRItemsViewBase::ShowInfo(int itemIdx) if (itemIdx < 0 || itemIdx >= m_vecItems->Size()) return; - // Preserve the item before closing self, because this will clear m_vecItems - const CFileItemPtr itemptr = m_vecItems->Get(itemIdx); - Close(); - CServiceBroker::GetPVRManager().GUIActions()->ShowEPGInfo(itemptr); + const std::shared_ptr item = m_vecItems->Get(itemIdx); + if (!item) + return; + + CServiceBroker::GetPVRManager().GUIActions()->ShowEPGInfo(item); } bool CGUIDialogPVRItemsViewBase::ContextMenu(int itemIdx)