From 7f352d24d261ca1de2aa746b86cbcc4257e2c60b Mon Sep 17 00:00:00 2001 From: Garrett Brown Date: Sat, 16 Mar 2019 17:11:48 -0700 Subject: [PATCH 1/2] Controller dialog: Update controller list after controller add-on installation --- xbmc/games/controllers/windows/GUIControllerList.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xbmc/games/controllers/windows/GUIControllerList.cpp b/xbmc/games/controllers/windows/GUIControllerList.cpp index 43770f8f1b0d7..caa57bbe571f9 100644 --- a/xbmc/games/controllers/windows/GUIControllerList.cpp +++ b/xbmc/games/controllers/windows/GUIControllerList.cpp @@ -146,7 +146,9 @@ void CGUIControllerList::ResetController(void) void CGUIControllerList::OnEvent(const ADDON::AddonEvent& event) { - if (typeid(event) == typeid(ADDON::AddonEvents::ReInstalled) || + if (typeid(event) == typeid(ADDON::AddonEvents::Enabled) || // also called on install, + typeid(event) == typeid(ADDON::AddonEvents::Disabled) || // not called on uninstall + typeid(event) == typeid(ADDON::AddonEvents::ReInstalled) || typeid(event) == typeid(ADDON::AddonEvents::UnInstalled)) { using namespace MESSAGING; From f411c4491db2d9d6d8fff435bc31c2667ff7d21b Mon Sep 17 00:00:00 2001 From: Garrett Brown Date: Sat, 16 Mar 2019 18:00:32 -0700 Subject: [PATCH 2/2] Controller dialog: Focus installed controller --- .../controllers/windows/GUIControllerList.cpp | 25 +++++++++++++++++-- .../controllers/windows/GUIControllerList.h | 2 +- .../windows/GUIControllerWindow.cpp | 3 ++- .../windows/IConfigurationWindow.h | 3 ++- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/xbmc/games/controllers/windows/GUIControllerList.cpp b/xbmc/games/controllers/windows/GUIControllerList.cpp index caa57bbe571f9..e86fe3246b0ab 100644 --- a/xbmc/games/controllers/windows/GUIControllerList.cpp +++ b/xbmc/games/controllers/windows/GUIControllerList.cpp @@ -59,7 +59,7 @@ bool CGUIControllerList::Initialize(void) m_controllerButton->SetVisible(false); CServiceBroker::GetAddonMgr().Events().Subscribe(this, &CGUIControllerList::OnEvent); - Refresh(); + Refresh(""); return m_controllerList != nullptr && m_controllerButton != nullptr; @@ -75,8 +75,17 @@ void CGUIControllerList::Deinitialize(void) m_controllerButton = nullptr; } -bool CGUIControllerList::Refresh(void) +bool CGUIControllerList::Refresh(const std::string& controllerId) { + // Focus specified controller after refresh + std::string focusController = controllerId; + + if (focusController.empty() && m_focusedController >= 0) + { + // If controller ID wasn't provided, focus current controller + focusController = m_controllers[m_focusedController]->ID(); + } + if (!RefreshControllers()) return false; @@ -92,6 +101,12 @@ bool CGUIControllerList::Refresh(void) CGUIButtonControl* pButton = new CGUIControllerButton(*m_controllerButton, controller->Layout().Label(), buttonId++); m_controllerList->AddControl(pButton); + if (!focusController.empty() && controller->ID() == focusController) + { + CGUIMessage msg(GUI_MSG_SETFOCUS, m_guiWindow->GetID(), pButton->GetID()); + m_guiWindow->OnMessage(msg); + } + // Just in case if (buttonId >= MAX_CONTROLLER_COUNT) break; @@ -153,6 +168,12 @@ void CGUIControllerList::OnEvent(const ADDON::AddonEvent& event) { using namespace MESSAGING; CGUIMessage msg(GUI_MSG_REFRESH_LIST, m_guiWindow->GetID(), CONTROL_CONTROLLER_LIST); + + // Focus installed add-on + if (typeid(event) == typeid(ADDON::AddonEvents::Enabled) || + typeid(event) == typeid(ADDON::AddonEvents::ReInstalled)) + msg.SetStringParam(event.id); + CApplicationMessenger::GetInstance().SendGUIMessage(msg, m_guiWindow->GetID()); } } diff --git a/xbmc/games/controllers/windows/GUIControllerList.h b/xbmc/games/controllers/windows/GUIControllerList.h index c78ca25f8759a..5403fd31382a7 100644 --- a/xbmc/games/controllers/windows/GUIControllerList.h +++ b/xbmc/games/controllers/windows/GUIControllerList.h @@ -35,7 +35,7 @@ namespace GAME // implementation of IControllerList virtual bool Initialize(void) override; virtual void Deinitialize(void) override; - virtual bool Refresh(void) override; + virtual bool Refresh(const std::string& controllerId) override; virtual void OnFocus(unsigned int controllerIndex) override; virtual void OnSelect(unsigned int controllerIndex) override; virtual int GetFocusedController() const override { return m_focusedController; } diff --git a/xbmc/games/controllers/windows/GUIControllerWindow.cpp b/xbmc/games/controllers/windows/GUIControllerWindow.cpp index 65cfba056314c..afab9e26f6c93 100644 --- a/xbmc/games/controllers/windows/GUIControllerWindow.cpp +++ b/xbmc/games/controllers/windows/GUIControllerWindow.cpp @@ -165,7 +165,8 @@ bool CGUIControllerWindow::OnMessage(CGUIMessage& message) if (controlId == CONTROL_CONTROLLER_LIST) { - if (m_controllerList && m_controllerList->Refresh()) + const std::string controllerId = message.GetStringParam(); + if (m_controllerList && m_controllerList->Refresh(controllerId)) { CGUIDialog::OnMessage(message); bHandled = true; diff --git a/xbmc/games/controllers/windows/IConfigurationWindow.h b/xbmc/games/controllers/windows/IConfigurationWindow.h index 86b7d52577712..da2307bf5d702 100644 --- a/xbmc/games/controllers/windows/IConfigurationWindow.h +++ b/xbmc/games/controllers/windows/IConfigurationWindow.h @@ -64,9 +64,10 @@ namespace GAME /*! * \brief Refresh the contents of the list + * \param controllerId The controller to focus, or empty to leave focus unchanged * \return True if the list was changed */ - virtual bool Refresh(void) = 0; + virtual bool Refresh(const std::string& controllerId) = 0; /* * \brief The specified controller has been focused