mirror of
https://github.com/OpenMW/openmw.git
synced 2025-11-09 06:46:39 +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();
|
updateShowingPages();
|
||||||
|
|
||||||
|
mSelectedQuest = 0;
|
||||||
|
|
||||||
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(getWidget<MyGUI::Widget>(CloseBTN));
|
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(getWidget<MyGUI::Widget>(CloseBTN));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -469,6 +471,20 @@ namespace
|
||||||
MWBase::Environment::get().getWindowManager()->playSound(ESM::RefId::stringRefId("book page"));
|
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)
|
void notifyIndexLinkClicked(MWGui::TypesetBook::InteractiveId index)
|
||||||
{
|
{
|
||||||
setVisible(LeftTopicIndex, false);
|
setVisible(LeftTopicIndex, false);
|
||||||
|
|
@ -487,6 +503,9 @@ namespace
|
||||||
|
|
||||||
list->adjustSize();
|
list->adjustSize();
|
||||||
|
|
||||||
|
if (Settings::gui().mControllerMenus)
|
||||||
|
addControllerButtons(list, mSelectedQuest);
|
||||||
|
|
||||||
MWBase::Environment::get().getWindowManager()->playSound(ESM::RefId::stringRefId("book page"));
|
MWBase::Environment::get().getWindowManager()->playSound(ESM::RefId::stringRefId("book page"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -554,6 +573,9 @@ namespace
|
||||||
list->sort();
|
list->sort();
|
||||||
list->adjustSize();
|
list->adjustSize();
|
||||||
|
|
||||||
|
if (Settings::gui().mControllerMenus)
|
||||||
|
addControllerButtons(list, mSelectedQuest);
|
||||||
|
|
||||||
if (mAllQuests)
|
if (mAllQuests)
|
||||||
{
|
{
|
||||||
SetNamesInactive setInactive(list);
|
SetNamesInactive setInactive(list);
|
||||||
|
|
@ -642,64 +664,149 @@ namespace
|
||||||
|
|
||||||
bool onControllerButtonEvent(const SDL_ControllerButtonEvent& arg) override
|
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
|
// Fall through to mouse click
|
||||||
return false;
|
if (mUsingGamepadGuiCursor)
|
||||||
}
|
return false;
|
||||||
else if (arg.button == SDL_CONTROLLER_BUTTON_B)
|
|
||||||
{
|
if (mOptionsMode && mQuestMode)
|
||||||
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)
|
|
||||||
{
|
|
||||||
if (mQuestMode)
|
|
||||||
{
|
{
|
||||||
if (!mOptionsMode)
|
// Choose a quest
|
||||||
notifyOptions(getWidget<MyGUI::Widget>(OptionsBTN));
|
Gui::MWList* list = getWidget<Gui::MWList>(QuestsList);
|
||||||
notifyTopics(getWidget<MyGUI::Widget>(TopicsBTN));
|
notifyQuestClicked(list->getItemNameAt(mSelectedQuest), 0);
|
||||||
|
}
|
||||||
|
else if (mOptionsMode && mTopicsMode)
|
||||||
|
{
|
||||||
|
// Choose a topic
|
||||||
|
Gui::MWList* list = getWidget<Gui::MWList>(TopicsList);
|
||||||
|
notifyTopicSelected(list->getItemNameAt(mSelectedQuest), 0);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (arg.button == SDL_CONTROLLER_BUTTON_Y)
|
else if (arg.button == SDL_CONTROLLER_BUTTON_B) // B: Back
|
||||||
{
|
{
|
||||||
if (!mQuestMode)
|
if (mOptionsMode)
|
||||||
{
|
{
|
||||||
|
// 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)
|
||||||
|
{
|
||||||
|
notifyOptions(getWidget<MyGUI::Widget>(OptionsBTN));
|
||||||
|
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) // Y: Quests
|
||||||
|
{
|
||||||
|
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)
|
if (!mOptionsMode)
|
||||||
notifyOptions(getWidget<MyGUI::Widget>(OptionsBTN));
|
notifyOptions(getWidget<MyGUI::Widget>(OptionsBTN));
|
||||||
notifyQuests(getWidget<MyGUI::Widget>(QuestsBTN));
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_UP)
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN)
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
else if (arg.button == SDL_CONTROLLER_BUTTON_LEFTSHOULDER ||
|
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT)
|
||||||
arg.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT)
|
|
||||||
{
|
{
|
||||||
notifyPrevPage(getWidget<MyGUI::Widget>(PrevPageBTN));
|
if (!mOptionsMode)
|
||||||
|
notifyPrevPage(getWidget<MyGUI::Widget>(PrevPageBTN));
|
||||||
|
mUsingGamepadGuiCursor = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (arg.button == SDL_CONTROLLER_BUTTON_RIGHTSHOULDER ||
|
else if (arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT)
|
||||||
arg.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT)
|
|
||||||
{
|
{
|
||||||
notifyNextPage(getWidget<MyGUI::Widget>(NextPageBTN));
|
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) // RB: Next Page
|
||||||
|
{
|
||||||
|
if (!mOptionsMode)
|
||||||
|
notifyNextPage(getWidget<MyGUI::Widget>(NextPageBTN));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
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;
|
void setVisible(bool newValue) override = 0;
|
||||||
|
|
||||||
std::string_view getWindowIdForLua() const override { return "Journal"; }
|
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