mirror of
https://github.com/OpenMW/openmw.git
synced 2025-12-06 16:04:32 +00:00
Add controller support to repair and recharge menus
This commit is contained in:
parent
d3c7904e64
commit
cbe74cdab4
10 changed files with 113 additions and 2 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
#include "itemchargeview.hpp"
|
#include "itemchargeview.hpp"
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include <MyGUI_FactoryManager.h>
|
#include <MyGUI_FactoryManager.h>
|
||||||
|
|
@ -9,8 +10,11 @@
|
||||||
#include <MyGUI_UString.h>
|
#include <MyGUI_UString.h>
|
||||||
|
|
||||||
#include <components/esm3/loadench.hpp>
|
#include <components/esm3/loadench.hpp>
|
||||||
|
#include <components/settings/values.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
|
#include "../mwbase/inputmanager.hpp"
|
||||||
|
#include "../mwbase/windowmanager.hpp"
|
||||||
|
|
||||||
#include "../mwmechanics/spellutil.hpp"
|
#include "../mwmechanics/spellutil.hpp"
|
||||||
|
|
||||||
|
|
@ -19,6 +23,7 @@
|
||||||
|
|
||||||
#include "itemmodel.hpp"
|
#include "itemmodel.hpp"
|
||||||
#include "itemwidget.hpp"
|
#include "itemwidget.hpp"
|
||||||
|
#include "textcolours.hpp"
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
{
|
{
|
||||||
|
|
@ -156,11 +161,20 @@ namespace MWGui
|
||||||
mScrollView->setCanvasSize(
|
mScrollView->setCanvasSize(
|
||||||
MyGUI::IntSize(mScrollView->getWidth(), std::max(mScrollView->getHeight(), currentY)));
|
MyGUI::IntSize(mScrollView->getWidth(), std::max(mScrollView->getHeight(), currentY)));
|
||||||
mScrollView->setVisibleVScroll(true);
|
mScrollView->setVisibleVScroll(true);
|
||||||
|
|
||||||
|
if (Settings::gui().mControllerMenus)
|
||||||
|
updateControllerFocus(-1, mControllerFocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemChargeView::resetScrollbars()
|
void ItemChargeView::resetScrollbars()
|
||||||
{
|
{
|
||||||
mScrollView->setViewOffset(MyGUI::IntPoint(0, 0));
|
mScrollView->setViewOffset(MyGUI::IntPoint(0, 0));
|
||||||
|
|
||||||
|
if (Settings::gui().mControllerMenus)
|
||||||
|
{
|
||||||
|
updateControllerFocus(mControllerFocus, 0);
|
||||||
|
mControllerFocus = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemChargeView::setSize(const MyGUI::IntSize& value)
|
void ItemChargeView::setSize(const MyGUI::IntSize& value)
|
||||||
|
|
@ -224,4 +238,52 @@ namespace MWGui
|
||||||
mScrollView->setViewOffset(
|
mScrollView->setViewOffset(
|
||||||
MyGUI::IntPoint(0, static_cast<int>(mScrollView->getViewOffset().top + rel * 0.3f)));
|
MyGUI::IntPoint(0, static_cast<int>(mScrollView->getViewOffset().top + rel * 0.3f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ItemChargeView::onControllerButton(const unsigned char button)
|
||||||
|
{
|
||||||
|
if (mLines.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
int prevFocus = mControllerFocus;
|
||||||
|
|
||||||
|
if (button == SDL_CONTROLLER_BUTTON_A)
|
||||||
|
{
|
||||||
|
// Select the focused item, if any.
|
||||||
|
if (mControllerFocus >= 0 && mControllerFocus < mLines.size())
|
||||||
|
onIconClicked(mLines[mControllerFocus].mIcon);
|
||||||
|
}
|
||||||
|
else if (button == SDL_CONTROLLER_BUTTON_DPAD_UP)
|
||||||
|
mControllerFocus = wrap(mControllerFocus - 1, mLines.size());
|
||||||
|
else if (button == SDL_CONTROLLER_BUTTON_DPAD_DOWN)
|
||||||
|
mControllerFocus = wrap(mControllerFocus + 1, mLines.size());
|
||||||
|
|
||||||
|
if (prevFocus != mControllerFocus)
|
||||||
|
updateControllerFocus(prevFocus, mControllerFocus);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItemChargeView::updateControllerFocus(int prevFocus, int newFocus)
|
||||||
|
{
|
||||||
|
if (mLines.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const TextColours& textColours{ MWBase::Environment::get().getWindowManager()->getTextColours() };
|
||||||
|
|
||||||
|
if (prevFocus >= 0 && prevFocus < mLines.size())
|
||||||
|
{
|
||||||
|
mLines[prevFocus].mText->setTextColour(textColours.normal);
|
||||||
|
mLines[prevFocus].mIcon->setControllerFocus(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newFocus >= 0 && newFocus < mLines.size())
|
||||||
|
{
|
||||||
|
mLines[newFocus].mText->setTextColour(textColours.link);
|
||||||
|
mLines[newFocus].mIcon->setControllerFocus(true);
|
||||||
|
|
||||||
|
// Scroll the list to keep the active item in view
|
||||||
|
if (mControllerFocus <= 3)
|
||||||
|
mScrollView->setViewOffset(MyGUI::IntPoint(0, 0));
|
||||||
|
else
|
||||||
|
mScrollView->setViewOffset(MyGUI::IntPoint(-55 * (mControllerFocus - 3), 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,8 @@ namespace MWGui
|
||||||
|
|
||||||
MyGUI::delegates::MultiDelegate<MyGUI::Widget*, const MWWorld::Ptr&> eventItemClicked;
|
MyGUI::delegates::MultiDelegate<MyGUI::Widget*, const MWWorld::Ptr&> eventItemClicked;
|
||||||
|
|
||||||
|
void onControllerButton(const unsigned char button);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Line
|
struct Line
|
||||||
{
|
{
|
||||||
|
|
@ -72,6 +74,9 @@ namespace MWGui
|
||||||
std::unique_ptr<ItemModel> mModel;
|
std::unique_ptr<ItemModel> mModel;
|
||||||
MyGUI::ScrollView* mScrollView;
|
MyGUI::ScrollView* mScrollView;
|
||||||
DisplayMode mDisplayMode;
|
DisplayMode mDisplayMode;
|
||||||
|
|
||||||
|
int mControllerFocus;
|
||||||
|
void updateControllerFocus(int prevFocus, int newFocus);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ namespace MWGui
|
||||||
|
|
||||||
mControllerButtons.a = "#{sSelect}";
|
mControllerButtons.a = "#{sSelect}";
|
||||||
mControllerButtons.b = "#{sBack}";
|
mControllerButtons.b = "#{sBack}";
|
||||||
|
mControllerButtons.r3 = "#{sInfo}";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ItemSelectionDialog::exit()
|
bool ItemSelectionDialog::exit()
|
||||||
|
|
|
||||||
|
|
@ -454,7 +454,7 @@ namespace MWGui
|
||||||
if (mButtons.size() == 1)
|
if (mButtons.size() == 1)
|
||||||
buttonActivated(mButtons[0]);
|
buttonActivated(mButtons[0]);
|
||||||
}
|
}
|
||||||
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT)
|
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP || arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT)
|
||||||
{
|
{
|
||||||
if (mButtons.size() <= 1)
|
if (mButtons.size() <= 1)
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -465,7 +465,7 @@ namespace MWGui
|
||||||
mControllerFocus = wrap(mControllerFocus - 1, mButtons.size());
|
mControllerFocus = wrap(mControllerFocus - 1, mButtons.size());
|
||||||
mButtons[mControllerFocus]->setStateSelected(true);
|
mButtons[mControllerFocus]->setStateSelected(true);
|
||||||
}
|
}
|
||||||
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT)
|
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN || arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT)
|
||||||
{
|
{
|
||||||
if (mButtons.size() <= 1)
|
if (mButtons.size() <= 1)
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,10 @@ namespace MWGui
|
||||||
mBox->setDisplayMode(ItemChargeView::DisplayMode_EnchantmentCharge);
|
mBox->setDisplayMode(ItemChargeView::DisplayMode_EnchantmentCharge);
|
||||||
|
|
||||||
mGemIcon->eventMouseButtonClick += MyGUI::newDelegate(this, &Recharge::onSelectItem);
|
mGemIcon->eventMouseButtonClick += MyGUI::newDelegate(this, &Recharge::onSelectItem);
|
||||||
|
|
||||||
|
mControllerButtons.a = "Recharge";
|
||||||
|
mControllerButtons.b = "#{sBack}";
|
||||||
|
mControllerButtons.y = "#{sSoulGem}";
|
||||||
}
|
}
|
||||||
|
|
||||||
void Recharge::onOpen()
|
void Recharge::onOpen()
|
||||||
|
|
@ -136,4 +140,16 @@ namespace MWGui
|
||||||
updateView();
|
updateView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Recharge::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg)
|
||||||
|
{
|
||||||
|
if ((arg.button == SDL_CONTROLLER_BUTTON_A && !mGemBox->getVisible())
|
||||||
|
|| arg.button == SDL_CONTROLLER_BUTTON_Y)
|
||||||
|
onSelectItem(mGemIcon);
|
||||||
|
else if (arg.button == SDL_CONTROLLER_BUTTON_B)
|
||||||
|
onCancel(mCancelButton);
|
||||||
|
else
|
||||||
|
mBox->onControllerButton(arg.button);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,8 @@ namespace MWGui
|
||||||
void onItemClicked(MyGUI::Widget* sender, const MWWorld::Ptr& item);
|
void onItemClicked(MyGUI::Widget* sender, const MWWorld::Ptr& item);
|
||||||
void onCancel(MyGUI::Widget* sender);
|
void onCancel(MyGUI::Widget* sender);
|
||||||
void onMouseWheel(MyGUI::Widget* _sender, int _rel);
|
void onMouseWheel(MyGUI::Widget* _sender, int _rel);
|
||||||
|
|
||||||
|
bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,10 @@ namespace MWGui
|
||||||
mRepairBox->setDisplayMode(ItemChargeView::DisplayMode_Health);
|
mRepairBox->setDisplayMode(ItemChargeView::DisplayMode_Health);
|
||||||
|
|
||||||
mToolIcon->eventMouseButtonClick += MyGUI::newDelegate(this, &Repair::onSelectItem);
|
mToolIcon->eventMouseButtonClick += MyGUI::newDelegate(this, &Repair::onSelectItem);
|
||||||
|
|
||||||
|
mControllerButtons.a = "#{sRepair}";
|
||||||
|
mControllerButtons.b = "#{sBack}";
|
||||||
|
mControllerButtons.y = "Tool";
|
||||||
}
|
}
|
||||||
|
|
||||||
void Repair::onOpen()
|
void Repair::onOpen()
|
||||||
|
|
@ -150,4 +154,16 @@ namespace MWGui
|
||||||
updateRepairView();
|
updateRepairView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Repair::onControllerButtonEvent(const SDL_ControllerButtonEvent& arg)
|
||||||
|
{
|
||||||
|
if ((arg.button == SDL_CONTROLLER_BUTTON_A && !mToolBox->getVisible())
|
||||||
|
|| arg.button == SDL_CONTROLLER_BUTTON_Y)
|
||||||
|
onSelectItem(mToolIcon);
|
||||||
|
else if (arg.button == SDL_CONTROLLER_BUTTON_B)
|
||||||
|
onCancel(mCancelButton);
|
||||||
|
else
|
||||||
|
mRepairBox->onControllerButton(arg.button);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,8 @@ namespace MWGui
|
||||||
|
|
||||||
void onRepairItem(MyGUI::Widget* sender, const MWWorld::Ptr& ptr);
|
void onRepairItem(MyGUI::Widget* sender, const MWWorld::Ptr& ptr);
|
||||||
void onCancel(MyGUI::Widget* sender);
|
void onCancel(MyGUI::Widget* sender);
|
||||||
|
|
||||||
|
bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -952,6 +952,9 @@ namespace MWGui
|
||||||
for (int i = 0; i < winCount; i++)
|
for (int i = 0; i < winCount; i++)
|
||||||
mGuiModeStates[mode].mWindows[i]->setActiveControllerWindow(i == activeIndex);
|
mGuiModeStates[mode].mWindows[i]->setActiveControllerWindow(i == activeIndex);
|
||||||
|
|
||||||
|
MWBase::Environment::get().getInputManager()->setGamepadGuiCursorEnabled(
|
||||||
|
mGuiModeStates[mode].mWindows[activeIndex]->isGamepadCursorAllowed());
|
||||||
|
|
||||||
updateControllerButtonsOverlay();
|
updateControllerButtonsOverlay();
|
||||||
setCursorActive(false);
|
setCursorActive(false);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,10 @@
|
||||||
<Property key="Alpha" value="0.5"/>
|
<Property key="Alpha" value="0.5"/>
|
||||||
</Widget>
|
</Widget>
|
||||||
</Widget>
|
</Widget>
|
||||||
|
<Widget type="ImageBox" skin="ImageBox" position="0 0 32 32" align="Stretch" name="ControllerBorder">
|
||||||
|
<Property key="ImageTexture" value="textures\omw_menu_icon_active.dds"/>
|
||||||
|
<Property key="Visible" value="false"/>
|
||||||
|
</Widget>
|
||||||
</Widget>
|
</Widget>
|
||||||
</Resource>
|
</Resource>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue