diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index eeb46edce0..399514cab4 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -44,7 +44,7 @@ add_openmw_dir (mwgui tradeitemmodel companionitemmodel pickpocketitemmodel controllers savegamedialog recharge mode videowidget backgroundimage itemwidget screenfader debugwindow spellmodel spellview draganddrop timeadvancer jailscreen itemchargeview keyboardnavigation textcolours statswatcher - postprocessorhud settings controllerbuttonsoverlay + postprocessorhud settings controllerbuttonsoverlay inventorytabsoverlay ) add_openmw_dir (mwdialogue diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index 27331699cf..180c9bfee3 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -389,6 +389,7 @@ namespace MWBase virtual MWGui::WindowBase* getActiveControllerWindow() = 0; /// Cycle to the next window to receive controller events virtual void cycleActiveControllerWindow(bool next) = 0; + virtual void setActiveControllerWindow(MWGui::GuiMode mode, int activeIndex) = 0; virtual void updateControllerButtonsOverlay() = 0; // Used in Lua bindings diff --git a/apps/openmw/mwgui/inventorytabsoverlay.cpp b/apps/openmw/mwgui/inventorytabsoverlay.cpp new file mode 100644 index 0000000000..21254c7840 --- /dev/null +++ b/apps/openmw/mwgui/inventorytabsoverlay.cpp @@ -0,0 +1,49 @@ +#include "inventorytabsoverlay.hpp" + +#include "../mwbase/environment.hpp" +#include "../mwbase/windowmanager.hpp" + +namespace MWGui +{ + InventoryTabsOverlay::InventoryTabsOverlay() + : WindowBase("openmw_inventory_tabs.layout") + { + MyGUI::Button* tab; + + getWidget(tab, "TabMap"); + tab->eventMouseButtonClick += MyGUI::newDelegate(this, &InventoryTabsOverlay::onTabClicked); + mTabs.push_back(tab); + + getWidget(tab, "TabInventory"); + tab->eventMouseButtonClick += MyGUI::newDelegate(this, &InventoryTabsOverlay::onTabClicked); + mTabs.push_back(tab); + + getWidget(tab, "TabSpells"); + tab->eventMouseButtonClick += MyGUI::newDelegate(this, &InventoryTabsOverlay::onTabClicked); + mTabs.push_back(tab); + + getWidget(tab, "TabStats"); + tab->eventMouseButtonClick += MyGUI::newDelegate(this, &InventoryTabsOverlay::onTabClicked); + mTabs.push_back(tab); + } + + void InventoryTabsOverlay::onTabClicked(MyGUI::Widget* sender) + { + for (int i = 0; i < mTabs.size(); i++) + { + if (mTabs[i] == sender) + { + Log(Debug::Verbose) << "InventoryTabsOverlay::onTabClicked " << i; + MWBase::Environment::get().getWindowManager()->setActiveControllerWindow(GM_Inventory, i); + //setTab(i); + break; + } + } + } + + void InventoryTabsOverlay::setTab(int index) + { + for (int i = 0; i < mTabs.size(); i++) + mTabs[i]->setStateSelected(i == index); + } +} diff --git a/apps/openmw/mwgui/inventorytabsoverlay.hpp b/apps/openmw/mwgui/inventorytabsoverlay.hpp new file mode 100644 index 0000000000..5368d9710f --- /dev/null +++ b/apps/openmw/mwgui/inventorytabsoverlay.hpp @@ -0,0 +1,24 @@ +#ifndef MWGUI_INVENTORYTABSSOVERLAY_H +#define MWGUI_INVENTORYTABSSOVERLAY_H + +#include + +#include "windowbase.hpp" + +namespace MWGui +{ + class InventoryTabsOverlay : public WindowBase + { + public: + InventoryTabsOverlay(); + + void setTab(int index); + + private: + std::vector mTabs; + + void onTabClicked(MyGUI::Widget* sender); + }; +} + +#endif diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp index 27c4bbf57d..6b5bbde324 100644 --- a/apps/openmw/mwgui/inventorywindow.cpp +++ b/apps/openmw/mwgui/inventorywindow.cpp @@ -1012,7 +1012,7 @@ namespace MWGui { MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); MyGUI::Window* window = mMainWidget->castType(); - window->setCoord(0, active ? 0 : viewSize.height + 1, viewSize.width, viewSize.height - 48); + window->setCoord(0, active ? 48 : viewSize.height + 49, viewSize.width, viewSize.height - 48 - 48); adjustPanes(); updatePreviewSize(); diff --git a/apps/openmw/mwgui/mapwindow.cpp b/apps/openmw/mwgui/mapwindow.cpp index ec9c509797..ce3524d052 100644 --- a/apps/openmw/mwgui/mapwindow.cpp +++ b/apps/openmw/mwgui/mapwindow.cpp @@ -1417,7 +1417,7 @@ namespace MWGui { MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); MyGUI::Window* window = mMainWidget->castType(); - window->setCoord(0, active ? 0 : viewSize.height + 1, viewSize.width, viewSize.height - 48); + window->setCoord(0, active ? 48 : viewSize.height + 49, viewSize.width, viewSize.height - 48 - 48); WindowBase::setActiveControllerWindow(active); } diff --git a/apps/openmw/mwgui/spellwindow.cpp b/apps/openmw/mwgui/spellwindow.cpp index 63ba83a895..fb61b59ed9 100644 --- a/apps/openmw/mwgui/spellwindow.cpp +++ b/apps/openmw/mwgui/spellwindow.cpp @@ -283,7 +283,7 @@ namespace MWGui { MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); MyGUI::Window* window = mMainWidget->castType(); - window->setCoord(0, active ? 0 : viewSize.height + 1, viewSize.width, viewSize.height - 48); + window->setCoord(0, active ? 48 : viewSize.height + 49, viewSize.width, viewSize.height - 48 - 48); WindowBase::setActiveControllerWindow(active); } diff --git a/apps/openmw/mwgui/statswindow.cpp b/apps/openmw/mwgui/statswindow.cpp index cc5c934662..e67417f60e 100644 --- a/apps/openmw/mwgui/statswindow.cpp +++ b/apps/openmw/mwgui/statswindow.cpp @@ -742,7 +742,7 @@ namespace MWGui { MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); MyGUI::Window* window = mMainWidget->castType(); - window->setCoord(0, active ? 0 : viewSize.height + 1, viewSize.width, viewSize.height - 48); + window->setCoord(0, active ? 48 : viewSize.height + 49, viewSize.width, viewSize.height - 48 - 48); onWindowResize(window); diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index ac58f1e589..732ff405d3 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -182,6 +182,7 @@ namespace MWGui , mJailScreen(nullptr) , mContainerWindow(nullptr) , mControllerButtonsOverlay(nullptr) + , mInventoryTabsOverlay(nullptr) , mTranslationDataStorage(translationDataStorage) , mInputBlocker(nullptr) , mHudEnabled(true) @@ -510,6 +511,10 @@ namespace MWGui mControllerButtonsOverlay = controllerButtonsOverlay.get(); mWindows.push_back(std::move(controllerButtonsOverlay)); + auto inventoryTabsOverlay = std::make_unique(); + mInventoryTabsOverlay = inventoryTabsOverlay.get(); + mWindows.push_back(std::move(inventoryTabsOverlay)); + mInputBlocker = MyGUI::Gui::getInstance().createWidget( {}, 0, 0, w, h, MyGUI::Align::Stretch, "InputBlocker"); @@ -668,8 +673,13 @@ namespace MWGui mSpellWindow->setVisible( mSpellWindow->pinned() && !isConsoleMode() && !(mForceHidden & GW_Magic) && (mAllowed & GW_Magic)); - if (Settings::gui().mControllerMenus && mControllerButtonsOverlay) - mControllerButtonsOverlay->setVisible(false); + if (Settings::gui().mControllerMenus) + { + if (mControllerButtonsOverlay) + mControllerButtonsOverlay->setVisible(false); + if (mInventoryTabsOverlay) + mInventoryTabsOverlay->setVisible(false); + } return; } else if (getMode() != GM_Inventory) @@ -929,19 +939,27 @@ namespace MWGui } // REMOVEME - Log(Debug::Error) << "focusNextWindow: mode=" << mode << ", activeIndex=" << activeIndex; + Log(Debug::Error) << "cycleActiveControllerWindow: mode=" << mode << ", activeIndex=" << activeIndex; if (mActiveControllerWindows[mode] != activeIndex) - { - mActiveControllerWindows[mode] = activeIndex; - for (int i = 0; i < winCount; i++) - { - mGuiModeStates[mode].mWindows[i]->setActiveControllerWindow(i == activeIndex); - } - updateControllerButtonsOverlay(); - if (winCount > 1) - playSound(ESM::RefId::stringRefId("Menu Size")); - } + setActiveControllerWindow(mode, activeIndex); + } + + void WindowManager::setActiveControllerWindow(GuiMode mode, int activeIndex) + { + int winCount = mGuiModeStates[mode].mWindows.size(); + if (winCount == 0) + return; + + mActiveControllerWindows[mode] = std::clamp(activeIndex, 0, winCount - 1); + + for (int i = 0; i < winCount; i++) + mGuiModeStates[mode].mWindows[i]->setActiveControllerWindow(i == activeIndex); + + updateControllerButtonsOverlay(); + + if (winCount > 1) + playSound(ESM::RefId::stringRefId("Menu Size")); } void WindowManager::update(float frameDuration) @@ -1010,6 +1028,9 @@ namespace MWGui if (mControllerButtonsOverlay && mControllerButtonsOverlay->isVisible()) mControllerButtonsOverlay->onFrame(frameDuration); + if (mInventoryTabsOverlay && mInventoryTabsOverlay->isVisible()) + mInventoryTabsOverlay->onFrame(frameDuration); + if (!gameRunning) return; @@ -2560,19 +2581,24 @@ namespace MWGui void WindowManager::updateControllerButtonsOverlay() { - if (!Settings::gui().mControllerMenus ||!mControllerButtonsOverlay) + if (!Settings::gui().mControllerMenus || !mControllerButtonsOverlay) return; WindowBase* topWin = this->getActiveControllerWindow(); if (!topWin || !topWin->isVisible()) { - // REMOVEME - Log(Debug::Error) << "WindowManager::updateControllerButtonsOverlay: hiding overlay"; mControllerButtonsOverlay->setVisible(false); + mInventoryTabsOverlay->setVisible(false); return; } // setButtons will handle setting visibility based on if any buttons are defined. mControllerButtonsOverlay->setButtons(topWin->getControllerButtons()); + if (getMode() == GM_Inventory) { + mInventoryTabsOverlay->setVisible(true); + mInventoryTabsOverlay->setTab(mActiveControllerWindows[GM_Inventory]); + } + else + mInventoryTabsOverlay->setVisible(false); } } diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index 54695e8234..d5e36a0971 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -27,6 +27,7 @@ #include "charactercreation.hpp" #include "controllerbuttonsoverlay.hpp" #include "draganddrop.hpp" +#include "inventorytabsoverlay.hpp" #include "mapwindow.hpp" #include "messagebox.hpp" #include "settings.hpp" @@ -120,6 +121,7 @@ namespace MWGui class JailScreen; class KeyboardNavigation; class ControllerButtonsOverlay; + class InventoryTabsOverlay; class WindowManager : public MWBase::WindowManager { @@ -393,6 +395,7 @@ namespace MWGui WindowBase* getActiveControllerWindow() override; void cycleActiveControllerWindow(bool next) override; + void setActiveControllerWindow(GuiMode mode, int activeIndex) override; void updateControllerButtonsOverlay() override; // Used in Lua bindings @@ -463,6 +466,7 @@ namespace MWGui JailScreen* mJailScreen; ContainerWindow* mContainerWindow; ControllerButtonsOverlay* mControllerButtonsOverlay; + InventoryTabsOverlay* mInventoryTabsOverlay; std::vector> mWindows; diff --git a/files/data/CMakeLists.txt b/files/data/CMakeLists.txt index 6339344500..2b8ea7a568 100644 --- a/files/data/CMakeLists.txt +++ b/files/data/CMakeLists.txt @@ -172,6 +172,7 @@ set(BUILTIN_DATA_FILES mygui/openmw_infobox.layout mygui/openmw_interactive_messagebox.layout mygui/openmw_interactive_messagebox_notransp.layout + mygui/openmw_inventory_tabs.layout mygui/openmw_inventory_window.layout mygui/openmw_journal.layout mygui/openmw_journal.skin.xml diff --git a/files/data/mygui/openmw_inventory_tabs.layout b/files/data/mygui/openmw_inventory_tabs.layout new file mode 100644 index 0000000000..3787452586 --- /dev/null +++ b/files/data/mygui/openmw_inventory_tabs.layout @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +