mirror of
https://github.com/OpenMW/openmw.git
synced 2025-11-08 22:16:41 +00:00
Better controller support for journal; mouse for topic index A-Z
This commit is contained in:
parent
fa52fea59b
commit
07be682b88
2 changed files with 139 additions and 28 deletions
|
|
@ -248,6 +248,8 @@ namespace
|
|||
}
|
||||
updateShowingPages();
|
||||
|
||||
mSelectedQuest = 0;
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(getWidget<MyGUI::Widget>(CloseBTN));
|
||||
}
|
||||
|
||||
|
|
@ -469,6 +471,20 @@ namespace
|
|||
MWBase::Environment::get().getWindowManager()->playSound(ESM::RefId::stringRefId("book page"));
|
||||
}
|
||||
|
||||
void addControllerButtons(Gui::MWList* _list, int _selectedIndex)
|
||||
{
|
||||
mButtons.clear();
|
||||
for (int i = 0; i < _list->getItemCount(); i++)
|
||||
{
|
||||
MyGUI::Button* listItem = _list->getItemWidget(_list->getItemNameAt(i));
|
||||
if (listItem)
|
||||
{
|
||||
listItem->setStateSelected(mButtons.size() == _selectedIndex);
|
||||
mButtons.push_back(listItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void notifyIndexLinkClicked(MWGui::TypesetBook::InteractiveId index)
|
||||
{
|
||||
setVisible(LeftTopicIndex, false);
|
||||
|
|
@ -487,6 +503,9 @@ namespace
|
|||
|
||||
list->adjustSize();
|
||||
|
||||
if (Settings::gui().mControllerMenus)
|
||||
addControllerButtons(list, mSelectedQuest);
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->playSound(ESM::RefId::stringRefId("book page"));
|
||||
}
|
||||
|
||||
|
|
@ -554,6 +573,9 @@ namespace
|
|||
list->sort();
|
||||
list->adjustSize();
|
||||
|
||||
if (Settings::gui().mControllerMenus)
|
||||
addControllerButtons(list, mSelectedQuest);
|
||||
|
||||
if (mAllQuests)
|
||||
{
|
||||
SetNamesInactive setInactive(list);
|
||||
|
|
@ -642,64 +664,149 @@ namespace
|
|||
|
||||
bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override
|
||||
{
|
||||
if (arg.button == SDL_CONTROLLER_BUTTON_A)
|
||||
if (arg.button == SDL_CONTROLLER_BUTTON_A) // A: Mouse click or Select
|
||||
{
|
||||
// Fall through to mouse click
|
||||
if (mUsingGamepadGuiCursor)
|
||||
return false;
|
||||
|
||||
if (mOptionsMode && mQuestMode)
|
||||
{
|
||||
// Choose a quest
|
||||
Gui::MWList* list = getWidget<Gui::MWList>(QuestsList);
|
||||
notifyQuestClicked(list->getItemNameAt(mSelectedQuest), 0);
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_B)
|
||||
else if (mOptionsMode && mTopicsMode)
|
||||
{
|
||||
// Choose a topic
|
||||
Gui::MWList* list = getWidget<Gui::MWList>(TopicsList);
|
||||
notifyTopicSelected(list->getItemNameAt(mSelectedQuest), 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_B) // B: Back
|
||||
{
|
||||
if (mOptionsMode)
|
||||
notifyCancel(getWidget<MyGUI::Widget>(CancelBTN));
|
||||
else if (mStates.size() > 1)
|
||||
notifyJournal(getWidget<MyGUI::Widget>(JournalBTN));
|
||||
else
|
||||
notifyClose(getWidget<MyGUI::Widget>(CloseBTN));
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_X)
|
||||
{
|
||||
// Hide the options overlay
|
||||
notifyCancel(getWidget<MyGUI::Widget>(CancelBTN));
|
||||
mQuestMode = false;
|
||||
}
|
||||
else if (mStates.size() > 1)
|
||||
{
|
||||
// Pop the current book. If in quest mode, reopen the quest list.
|
||||
notifyJournal(getWidget<MyGUI::Widget>(JournalBTN));
|
||||
if (mQuestMode)
|
||||
{
|
||||
if (!mOptionsMode)
|
||||
notifyOptions(getWidget<MyGUI::Widget>(OptionsBTN));
|
||||
notifyTopics(getWidget<MyGUI::Widget>(TopicsBTN));
|
||||
notifyQuests(getWidget<MyGUI::Widget>(QuestsBTN));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Close the journal window
|
||||
notifyClose(getWidget<MyGUI::Widget>(CloseBTN));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_Y)
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_Y) // Y: Quests
|
||||
{
|
||||
if (!mQuestMode)
|
||||
if (mOptionsMode && mQuestMode)
|
||||
{
|
||||
// Hide the quest overlay if visible
|
||||
notifyCancel(getWidget<MyGUI::Widget>(CancelBTN));
|
||||
mQuestMode = false;
|
||||
}
|
||||
else {
|
||||
// Show the quest overlay if viewing a journal entry or the topics
|
||||
if (!mOptionsMode)
|
||||
notifyOptions(getWidget<MyGUI::Widget>(OptionsBTN));
|
||||
if (!mQuestMode)
|
||||
notifyQuests(getWidget<MyGUI::Widget>(QuestsBTN));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_X) // X: Topics
|
||||
{
|
||||
if (mOptionsMode && !mQuestMode)
|
||||
{
|
||||
// Hide the topics overlay if visible
|
||||
notifyCancel(getWidget<MyGUI::Widget>(CancelBTN));
|
||||
mQuestMode = false;
|
||||
}
|
||||
else {
|
||||
// Show the topics overlay if viewing a journal entry or the quest list
|
||||
if (!mOptionsMode)
|
||||
notifyOptions(getWidget<MyGUI::Widget>(OptionsBTN));
|
||||
if (mQuestMode)
|
||||
notifyTopics(getWidget<MyGUI::Widget>(TopicsBTN));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP)
|
||||
{
|
||||
if (mOptionsMode && (mQuestMode || mTopicsMode))
|
||||
{
|
||||
// Scroll through the list of quests or topics
|
||||
mButtons[mSelectedQuest]->setStateSelected(false);
|
||||
mSelectedQuest--;
|
||||
if (mSelectedQuest < 0)
|
||||
mSelectedQuest = mButtons.size() - 1;
|
||||
mButtons[mSelectedQuest]->setStateSelected(true);
|
||||
}
|
||||
mUsingGamepadGuiCursor = false;
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN)
|
||||
{
|
||||
if (mOptionsMode && (mQuestMode || mTopicsMode))
|
||||
{
|
||||
// Scroll through the list of quests or topics
|
||||
mButtons[mSelectedQuest]->setStateSelected(false);
|
||||
mSelectedQuest++;
|
||||
if (mSelectedQuest > mButtons.size() - 1)
|
||||
mSelectedQuest = 0;
|
||||
mButtons[mSelectedQuest]->setStateSelected(true);
|
||||
}
|
||||
mUsingGamepadGuiCursor = false;
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER ||
|
||||
arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT)
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT)
|
||||
{
|
||||
if (!mOptionsMode)
|
||||
notifyPrevPage(getWidget<MyGUI::Widget>(PrevPageBTN));
|
||||
mUsingGamepadGuiCursor = false;
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT)
|
||||
{
|
||||
if (!mOptionsMode)
|
||||
notifyNextPage(getWidget<MyGUI::Widget>(NextPageBTN));
|
||||
mUsingGamepadGuiCursor = false;
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER) // LB: Previous Page
|
||||
{
|
||||
if (!mOptionsMode)
|
||||
notifyPrevPage(getWidget<MyGUI::Widget>(PrevPageBTN));
|
||||
return true;
|
||||
}
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_RIGHTSHOULDER ||
|
||||
arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT)
|
||||
else if (arg.button == SDL_CONTROLLER_BUTTON_RIGHTSHOULDER) // RB: Next Page
|
||||
{
|
||||
if (!mOptionsMode)
|
||||
notifyNextPage(getWidget<MyGUI::Widget>(NextPageBTN));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool onControllerThumbstickEvent(const SDL_ControllerAxisEvent& arg) override
|
||||
{
|
||||
if (arg.axis == SDL_CONTROLLER_AXIS_LEFTX || arg.axis == SDL_CONTROLLER_AXIS_LEFTY)
|
||||
mUsingGamepadGuiCursor = true;
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ namespace MWGui
|
|||
void setVisible(bool newValue) override = 0;
|
||||
|
||||
std::string_view getWindowIdForLua() const override { return "Journal"; }
|
||||
|
||||
std::vector<MyGUI::Button*> mButtons;
|
||||
int mSelectedQuest = 0;
|
||||
bool mUsingGamepadGuiCursor = false;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue