From fab4cfecb13d90e1ac8a8cf7278f82ca78628d48 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 26 Aug 2012 10:52:06 +0200 Subject: [PATCH 1/9] some unfinished work on quick keys window --- apps/openmw/CMakeLists.txt | 3 +- apps/openmw/mwgui/class.cpp | 19 +- apps/openmw/mwgui/class.hpp | 8 +- apps/openmw/mwgui/confirmationdialog.cpp | 13 +- apps/openmw/mwgui/confirmationdialog.hpp | 4 +- apps/openmw/mwgui/countdialog.cpp | 15 +- apps/openmw/mwgui/countdialog.hpp | 4 +- apps/openmw/mwgui/itemselection.cpp | 39 +++ apps/openmw/mwgui/itemselection.hpp | 28 +++ apps/openmw/mwgui/mode.hpp | 4 +- apps/openmw/mwgui/quickkeysmenu.cpp | 237 ++++++++++++++++++ apps/openmw/mwgui/quickkeysmenu.hpp | 84 +++++++ apps/openmw/mwgui/window_base.cpp | 23 +- apps/openmw/mwgui/window_base.hpp | 17 +- apps/openmw/mwgui/windowmanagerimp.cpp | 7 + apps/openmw/mwgui/windowmanagerimp.hpp | 2 + apps/openmw/mwinput/inputmanagerimp.cpp | 82 +++++- apps/openmw/mwinput/inputmanagerimp.hpp | 16 ++ files/mygui/CMakeLists.txt | 4 + .../mygui/openmw_itemselection_dialog.layout | 20 ++ .../mygui/openmw_magicselection_dialog.layout | 19 ++ files/mygui/openmw_quickkeys_menu.layout | 38 +++ .../mygui/openmw_quickkeys_menu_assign.layout | 28 +++ 23 files changed, 655 insertions(+), 59 deletions(-) create mode 100644 apps/openmw/mwgui/itemselection.cpp create mode 100644 apps/openmw/mwgui/itemselection.hpp create mode 100644 apps/openmw/mwgui/quickkeysmenu.cpp create mode 100644 apps/openmw/mwgui/quickkeysmenu.hpp create mode 100644 files/mygui/openmw_itemselection_dialog.layout create mode 100644 files/mygui/openmw_magicselection_dialog.layout create mode 100644 files/mygui/openmw_quickkeys_menu.layout create mode 100644 files/mygui/openmw_quickkeys_menu_assign.layout diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 1b4ae209d..fae76dd64 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -28,7 +28,8 @@ add_openmw_dir (mwgui dialogue_history window_base stats_window messagebox journalwindow charactercreation map_window window_pinnable_base cursorreplace tooltips scrollwindow bookwindow list formatting inventorywindow container hud countdialog tradewindow settingswindow - confirmationdialog alchemywindow referenceinterface spellwindow mainmenu + confirmationdialog alchemywindow referenceinterface spellwindow mainmenu quickkeysmenu + itemselection ) add_openmw_dir (mwdialogue diff --git a/apps/openmw/mwgui/class.cpp b/apps/openmw/mwgui/class.cpp index eaf191819..971740b5e 100644 --- a/apps/openmw/mwgui/class.cpp +++ b/apps/openmw/mwgui/class.cpp @@ -695,7 +695,7 @@ void CreateClassDialog::onBackClicked(MyGUI::Widget* _sender) /* SelectSpecializationDialog */ SelectSpecializationDialog::SelectSpecializationDialog(MWBase::WindowManager& parWindowManager) - : WindowBase("openmw_chargen_select_specialization.layout", parWindowManager) + : WindowModal("openmw_chargen_select_specialization.layout", parWindowManager) { // Centre dialog center(); @@ -727,13 +727,10 @@ SelectSpecializationDialog::SelectSpecializationDialog(MWBase::WindowManager& pa cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectSpecializationDialog::onCancelClicked); int buttonWidth = cancelButton->getTextSize().width + 24; cancelButton->setCoord(216 - buttonWidth, 90, buttonWidth, 21); - - MyGUI::InputManager::getInstance().addWidgetModal(mMainWidget); } SelectSpecializationDialog::~SelectSpecializationDialog() { - MyGUI::InputManager::getInstance().removeWidgetModal(mMainWidget); } // widget controls @@ -760,7 +757,7 @@ void SelectSpecializationDialog::onCancelClicked(MyGUI::Widget* _sender) /* SelectAttributeDialog */ SelectAttributeDialog::SelectAttributeDialog(MWBase::WindowManager& parWindowManager) - : WindowBase("openmw_chargen_select_attribute.layout", parWindowManager) + : WindowModal("openmw_chargen_select_attribute.layout", parWindowManager) { // Centre dialog center(); @@ -785,13 +782,10 @@ SelectAttributeDialog::SelectAttributeDialog(MWBase::WindowManager& parWindowMan cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectAttributeDialog::onCancelClicked); int buttonWidth = cancelButton->getTextSize().width + 24; cancelButton->setCoord(186 - buttonWidth, 180, buttonWidth, 21); - - MyGUI::InputManager::getInstance().addWidgetModal(mMainWidget); } SelectAttributeDialog::~SelectAttributeDialog() { - MyGUI::InputManager::getInstance().removeWidgetModal(mMainWidget); } // widget controls @@ -812,7 +806,7 @@ void SelectAttributeDialog::onCancelClicked(MyGUI::Widget* _sender) /* SelectSkillDialog */ SelectSkillDialog::SelectSkillDialog(MWBase::WindowManager& parWindowManager) - : WindowBase("openmw_chargen_select_skill.layout", parWindowManager) + : WindowModal("openmw_chargen_select_skill.layout", parWindowManager) { // Centre dialog center(); @@ -884,12 +878,10 @@ SelectSkillDialog::SelectSkillDialog(MWBase::WindowManager& parWindowManager) int buttonWidth = cancelButton->getTextSize().width + 24; cancelButton->setCoord(447 - buttonWidth, 218, buttonWidth, 21); - MyGUI::InputManager::getInstance().addWidgetModal(mMainWidget); } SelectSkillDialog::~SelectSkillDialog() { - MyGUI::InputManager::getInstance().removeWidgetModal(mMainWidget); } // widget controls @@ -908,7 +900,7 @@ void SelectSkillDialog::onCancelClicked(MyGUI::Widget* _sender) /* DescriptionDialog */ DescriptionDialog::DescriptionDialog(MWBase::WindowManager& parWindowManager) - : WindowBase("openmw_chargen_class_description.layout", parWindowManager) + : WindowModal("openmw_chargen_class_description.layout", parWindowManager) { // Centre dialog center(); @@ -924,13 +916,10 @@ DescriptionDialog::DescriptionDialog(MWBase::WindowManager& parWindowManager) // Make sure the edit box has focus MyGUI::InputManager::getInstance().setKeyFocusWidget(mTextEdit); - - MyGUI::InputManager::getInstance().addWidgetModal(mMainWidget); } DescriptionDialog::~DescriptionDialog() { - MyGUI::InputManager::getInstance().removeWidgetModal(mMainWidget); } // widget controls diff --git a/apps/openmw/mwgui/class.hpp b/apps/openmw/mwgui/class.hpp index 4baceed1e..bcb5c2627 100644 --- a/apps/openmw/mwgui/class.hpp +++ b/apps/openmw/mwgui/class.hpp @@ -134,7 +134,7 @@ namespace MWGui std::string mCurrentClassId; }; - class SelectSpecializationDialog : public WindowBase + class SelectSpecializationDialog : public WindowModal { public: SelectSpecializationDialog(MWBase::WindowManager& parWindowManager); @@ -165,7 +165,7 @@ namespace MWGui ESM::Class::Specialization mSpecializationId; }; - class SelectAttributeDialog : public WindowBase + class SelectAttributeDialog : public WindowModal { public: SelectAttributeDialog(MWBase::WindowManager& parWindowManager); @@ -198,7 +198,7 @@ namespace MWGui ESM::Attribute::AttributeID mAttributeId; }; - class SelectSkillDialog : public WindowBase + class SelectSkillDialog : public WindowModal { public: SelectSkillDialog(MWBase::WindowManager& parWindowManager); @@ -234,7 +234,7 @@ namespace MWGui ESM::Skill::SkillEnum mSkillId; }; - class DescriptionDialog : public WindowBase + class DescriptionDialog : public WindowModal { public: DescriptionDialog(MWBase::WindowManager& parWindowManager); diff --git a/apps/openmw/mwgui/confirmationdialog.cpp b/apps/openmw/mwgui/confirmationdialog.cpp index 1c68da9e5..d22181d60 100644 --- a/apps/openmw/mwgui/confirmationdialog.cpp +++ b/apps/openmw/mwgui/confirmationdialog.cpp @@ -8,7 +8,7 @@ namespace MWGui { ConfirmationDialog::ConfirmationDialog(MWBase::WindowManager& parWindowManager) : - WindowBase("openmw_confirmation_dialog.layout", parWindowManager) + WindowModal("openmw_confirmation_dialog.layout", parWindowManager) { getWidget(mMessage, "Message"); getWidget(mOkButton, "OkButton"); @@ -32,9 +32,6 @@ namespace MWGui center(); - // make other gui elements inaccessible while this dialog is open - MyGUI::InputManager::getInstance().addWidgetModal(mMainWidget); - int okButtonWidth = mOkButton->getTextSize().width + 24; mOkButton->setCoord(mMainWidget->getWidth() - 30 - okButtonWidth, mOkButton->getTop(), @@ -52,19 +49,13 @@ namespace MWGui { eventCancelClicked(); - close(); + setVisible(false); } void ConfirmationDialog::onOkButtonClicked(MyGUI::Widget* _sender) { eventOkClicked(); - close(); - } - - void ConfirmationDialog::close() - { setVisible(false); - MyGUI::InputManager::getInstance().removeWidgetModal(mMainWidget); } } diff --git a/apps/openmw/mwgui/confirmationdialog.hpp b/apps/openmw/mwgui/confirmationdialog.hpp index a78028b1c..45941f2ad 100644 --- a/apps/openmw/mwgui/confirmationdialog.hpp +++ b/apps/openmw/mwgui/confirmationdialog.hpp @@ -5,7 +5,7 @@ namespace MWGui { - class ConfirmationDialog : public WindowBase + class ConfirmationDialog : public WindowModal { public: ConfirmationDialog(MWBase::WindowManager& parWindowManager); @@ -26,8 +26,6 @@ namespace MWGui void onCancelButtonClicked(MyGUI::Widget* _sender); void onOkButtonClicked(MyGUI::Widget* _sender); - - void close(); }; } diff --git a/apps/openmw/mwgui/countdialog.cpp b/apps/openmw/mwgui/countdialog.cpp index 6d9415354..0ed9cf8ca 100644 --- a/apps/openmw/mwgui/countdialog.cpp +++ b/apps/openmw/mwgui/countdialog.cpp @@ -8,7 +8,7 @@ namespace MWGui { CountDialog::CountDialog(MWBase::WindowManager& parWindowManager) : - WindowBase("openmw_count_window.layout", parWindowManager) + WindowModal("openmw_count_window.layout", parWindowManager) { getWidget(mSlider, "CountSlider"); getWidget(mItemEdit, "ItemEdit"); @@ -40,9 +40,6 @@ namespace MWGui width, mMainWidget->getHeight()); - // make other gui elements inaccessible while this dialog is open - MyGUI::InputManager::getInstance().addWidgetModal(mMainWidget); - MyGUI::InputManager::getInstance().setKeyFocusWidget(mItemEdit); mSlider->setScrollPosition(maxCount-1); @@ -63,14 +60,14 @@ namespace MWGui void CountDialog::onCancelButtonClicked(MyGUI::Widget* _sender) { - close(); + setVisible(false); } void CountDialog::onOkButtonClicked(MyGUI::Widget* _sender) { eventOkClicked(NULL, mSlider->getScrollPosition()+1); - close(); + setVisible(false); } void CountDialog::onEditTextChange(MyGUI::EditBox* _sender) @@ -99,10 +96,4 @@ namespace MWGui { mItemEdit->setCaption(boost::lexical_cast(_position+1)); } - - void CountDialog::close() - { - setVisible(false); - MyGUI::InputManager::getInstance().removeWidgetModal(mMainWidget); - } } diff --git a/apps/openmw/mwgui/countdialog.hpp b/apps/openmw/mwgui/countdialog.hpp index 6002dadfe..80da6eea0 100644 --- a/apps/openmw/mwgui/countdialog.hpp +++ b/apps/openmw/mwgui/countdialog.hpp @@ -5,7 +5,7 @@ namespace MWGui { - class CountDialog : public WindowBase + class CountDialog : public WindowModal { public: CountDialog(MWBase::WindowManager& parWindowManager); @@ -30,8 +30,6 @@ namespace MWGui void onOkButtonClicked(MyGUI::Widget* _sender); void onEditTextChange(MyGUI::EditBox* _sender); void onSliderMoved(MyGUI::ScrollBar* _sender, size_t _position); - - void close(); }; } diff --git a/apps/openmw/mwgui/itemselection.cpp b/apps/openmw/mwgui/itemselection.cpp new file mode 100644 index 000000000..14b1cf8ee --- /dev/null +++ b/apps/openmw/mwgui/itemselection.cpp @@ -0,0 +1,39 @@ +#include "itemselection.hpp" + +namespace MWGui +{ + + ItemSelectionDialog::ItemSelectionDialog(const std::string &label, ContainerBase::Filter filter, MWBase::WindowManager& parWindowManager) + : ContainerBase(NULL) + , WindowModal("openmw_itemselection_dialog.layout", parWindowManager) + { + mFilter = filter; + + MyGUI::ScrollView* itemView; + MyGUI::Widget* containerWidget; + getWidget(containerWidget, "Items"); + getWidget(itemView, "ItemView"); + setWidgets(containerWidget, itemView); + + MyGUI::TextBox* l; + getWidget(l, "Label"); + l->setCaptionWithReplacing (label); + + MyGUI::Button* cancelButton; + getWidget(cancelButton, "CancelButton"); + cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &ItemSelectionDialog::onCancelButtonClicked); + + center(); + } + + void ItemSelectionDialog::onSelectedItemImpl(MWWorld::Ptr item) + { + eventItemSelected(item); + } + + void ItemSelectionDialog::onCancelButtonClicked(MyGUI::Widget* sender) + { + eventDialogCanceled(); + } + +} diff --git a/apps/openmw/mwgui/itemselection.hpp b/apps/openmw/mwgui/itemselection.hpp new file mode 100644 index 000000000..cab125f1f --- /dev/null +++ b/apps/openmw/mwgui/itemselection.hpp @@ -0,0 +1,28 @@ +#include "container.hpp" + +#include "../mwworld/ptr.hpp" + +namespace MWGui +{ + + class ItemSelectionDialog : public ContainerBase, public WindowModal + { + public: + ItemSelectionDialog(const std::string& label, ContainerBase::Filter filter, MWBase::WindowManager& parWindowManager); + + typedef MyGUI::delegates::CMultiDelegate0 EventHandle_Void; + typedef MyGUI::delegates::CMultiDelegate1 EventHandle_Item; + + EventHandle_Item eventItemSelected; + EventHandle_Void eventDialogCanceled; + + + private: + virtual void onReferenceUnavailable() { ; } + + virtual void onSelectedItemImpl(MWWorld::Ptr item); + + void onCancelButtonClicked(MyGUI::Widget* sender); + }; + +} diff --git a/apps/openmw/mwgui/mode.hpp b/apps/openmw/mwgui/mode.hpp index 8b502ce7c..2d6f69871 100644 --- a/apps/openmw/mwgui/mode.hpp +++ b/apps/openmw/mwgui/mode.hpp @@ -32,7 +32,9 @@ namespace MWGui GM_Review, // interactive MessageBox - GM_InterMessageBox + GM_InterMessageBox, + + GM_QuickKeysMenu }; // Windows shown in inventory mode diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp new file mode 100644 index 000000000..a9aa3e616 --- /dev/null +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -0,0 +1,237 @@ +#include "quickkeysmenu.hpp" + +#include + +#include "../mwbase/environment.hpp" +#include "../mwbase/world.hpp" +#include "../mwworld/player.hpp" + +#include "windowmanagerimp.hpp" +#include "itemselection.hpp" + +namespace MWGui +{ + + QuickKeysMenu::QuickKeysMenu(MWBase::WindowManager& parWindowManager) + : WindowBase("openmw_quickkeys_menu.layout", parWindowManager) + , mAssignDialog(0) + , mItemSelectionDialog(0) + , mMagicSelectionDialog(0) + { + getWidget(mOkButton, "OKButton"); + getWidget(mInstructionLabel, "InstructionLabel"); + + mMainWidget->setSize(mMainWidget->getWidth(), + mMainWidget->getHeight() + (mInstructionLabel->getTextSize().height - mInstructionLabel->getHeight())); + + int okButtonWidth = mOkButton->getTextSize ().width + 24; + mOkButton->setCoord(mOkButton->getLeft() - (okButtonWidth - mOkButton->getWidth()), + mOkButton->getTop(), + okButtonWidth, + mOkButton->getHeight()); + mOkButton->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onOkButtonClicked); + + center(); + + + for (int i = 0; i < 10; ++i) + { + MyGUI::Button* button; + getWidget(button, "QuickKey" + boost::lexical_cast(i+1)); + + if (i != 9) // 10th quick key is always set to hand-to-hand + button->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + + unassign(button, i); + + mQuickKeyButtons.push_back(button); + + } + } + + QuickKeysMenu::~QuickKeysMenu() + { + delete mAssignDialog; + } + + void QuickKeysMenu::unassign(MyGUI::Widget* key, int index) + { + while (key->getChildCount ()) + MyGUI::Gui::getInstance ().destroyWidget (key->getChildAt(0)); + + MyGUI::TextBox* textBox = key->createWidgetReal("SandText", MyGUI::FloatCoord(0,0,1,1), MyGUI::Align::Default); + textBox->setTextAlign (MyGUI::Align::Center); + textBox->setCaption (boost::lexical_cast(index+1)); + textBox->setNeedMouseFocus (false); + } + + void QuickKeysMenu::onQuickKeyButtonClicked(MyGUI::Widget* sender) + { + int index = -1; + for (int i = 0; i < 10; ++i) + { + if (sender == mQuickKeyButtons[i] || sender->getParent () == mQuickKeyButtons[i]) + { + index = i; + break; + } + } + assert(index != -1); + mSelectedIndex = index; + + { + // open assign dialog + if (!mAssignDialog) + mAssignDialog = new QuickKeysMenuAssign(mWindowManager, this); + mAssignDialog->setVisible (true); + } + } + + void QuickKeysMenu::onOkButtonClicked (MyGUI::Widget *sender) + { + mWindowManager.removeGuiMode(GM_QuickKeysMenu); + } + + + void QuickKeysMenu::onItemButtonClicked(MyGUI::Widget* sender) + { + if (!mItemSelectionDialog ) + { + mItemSelectionDialog = new ItemSelectionDialog("#{sQuickMenu6}", ContainerBase::Filter_All, mWindowManager); + mItemSelectionDialog->eventItemSelected += MyGUI::newDelegate(this, &QuickKeysMenu::onAssignItem); + mItemSelectionDialog->eventDialogCanceled += MyGUI::newDelegate(this, &QuickKeysMenu::onAssignItemCancel); + } + mItemSelectionDialog->setVisible(true); + mItemSelectionDialog->openContainer(MWBase::Environment::get().getWorld()->getPlayer().getPlayer()); + mItemSelectionDialog->drawItems (); + + mAssignDialog->setVisible (false); + } + + void QuickKeysMenu::onMagicButtonClicked(MyGUI::Widget* sender) + { + if (!mMagicSelectionDialog ) + { + mMagicSelectionDialog = new MagicSelectionDialog(mWindowManager, this); + } + mMagicSelectionDialog->setVisible(true); + + mAssignDialog->setVisible (false); + } + + void QuickKeysMenu::onUnassignButtonClicked(MyGUI::Widget* sender) + { + unassign(mQuickKeyButtons[mSelectedIndex], mSelectedIndex); + mAssignDialog->setVisible (false); + } + + void QuickKeysMenu::onCancelButtonClicked(MyGUI::Widget* sender) + { + mAssignDialog->setVisible (false); + } + + void QuickKeysMenu::onAssignItem(MWWorld::Ptr item) + { + MyGUI::Button* button = mQuickKeyButtons[mSelectedIndex]; + while (button->getChildCount ()) + MyGUI::Gui::getInstance ().destroyWidget (button->getChildAt(0)); + + MyGUI::ImageBox* image = button->createWidget("ImageBox", MyGUI::IntCoord(9, 8, 42, 42), MyGUI::Align::Default); + image->setUserString ("ToolTipType", "ItemPtr"); + image->setUserData(item); + std::string path = std::string("icons\\"); + path += MWWorld::Class::get(item).getInventoryIcon(item); + int pos = path.rfind("."); + path.erase(pos); + path.append(".dds"); + image->setImageTexture (path); + image->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + + mItemSelectionDialog->setVisible(false); + } + + void QuickKeysMenu::onAssignItemCancel() + { + mItemSelectionDialog->setVisible(false); + } + + void QuickKeysMenu::onAssignMagicItem (MWWorld::Ptr item) + { + + } + + void QuickKeysMenu::onAssignMagic (const std::string& spellId) + { + + } + + void QuickKeysMenu::onAssignMagicCancel () + { + mMagicSelectionDialog->setVisible(false); + } + + // --------------------------------------------------------------------------------------------------------- + + QuickKeysMenuAssign::QuickKeysMenuAssign (MWBase::WindowManager &parWindowManager, QuickKeysMenu* parent) + : WindowModal("openmw_quickkeys_menu_assign.layout", parWindowManager) + , mParent(parent) + { + getWidget(mLabel, "Label"); + getWidget(mItemButton, "ItemButton"); + getWidget(mMagicButton, "MagicButton"); + getWidget(mUnassignButton, "UnassignButton"); + getWidget(mCancelButton, "CancelButton"); + + mItemButton->eventMouseButtonClick += MyGUI::newDelegate(mParent, &QuickKeysMenu::onItemButtonClicked); + mMagicButton->eventMouseButtonClick += MyGUI::newDelegate(mParent, &QuickKeysMenu::onMagicButtonClicked); + mUnassignButton->eventMouseButtonClick += MyGUI::newDelegate(mParent, &QuickKeysMenu::onUnassignButtonClicked); + mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(mParent, &QuickKeysMenu::onCancelButtonClicked); + + + int maxWidth = mItemButton->getTextSize ().width + 24; + maxWidth = std::max(maxWidth, mMagicButton->getTextSize ().width + 24); + maxWidth = std::max(maxWidth, mUnassignButton->getTextSize ().width + 24); + maxWidth = std::max(maxWidth, mCancelButton->getTextSize ().width + 24); + + mMainWidget->setSize(maxWidth + 24, mMainWidget->getHeight()); + mLabel->setSize(maxWidth, mLabel->getHeight()); + + mItemButton->setCoord((maxWidth - mItemButton->getTextSize().width-24)/2 + 8, + mItemButton->getTop(), + mItemButton->getTextSize().width + 24, + mItemButton->getHeight()); + mMagicButton->setCoord((maxWidth - mMagicButton->getTextSize().width-24)/2 + 8, + mMagicButton->getTop(), + mMagicButton->getTextSize().width + 24, + mMagicButton->getHeight()); + mUnassignButton->setCoord((maxWidth - mUnassignButton->getTextSize().width-24)/2 + 8, + mUnassignButton->getTop(), + mUnassignButton->getTextSize().width + 24, + mUnassignButton->getHeight()); + mCancelButton->setCoord((maxWidth - mCancelButton->getTextSize().width-24)/2 + 8, + mCancelButton->getTop(), + mCancelButton->getTextSize().width + 24, + mCancelButton->getHeight()); + + center(); + } + + + // --------------------------------------------------------------------------------------------------------- + + MagicSelectionDialog::MagicSelectionDialog(MWBase::WindowManager &parWindowManager, QuickKeysMenu* parent) + : WindowModal("openmw_magicselection_dialog.layout", parWindowManager) + , mParent(parent) + { + getWidget(mCancelButton, "CancelButton"); + mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &MagicSelectionDialog::onCancelButtonClicked); + + center(); + } + + void MagicSelectionDialog::onCancelButtonClicked (MyGUI::Widget *sender) + { + mParent->onAssignMagicCancel (); + } + +} diff --git a/apps/openmw/mwgui/quickkeysmenu.hpp b/apps/openmw/mwgui/quickkeysmenu.hpp new file mode 100644 index 000000000..496806109 --- /dev/null +++ b/apps/openmw/mwgui/quickkeysmenu.hpp @@ -0,0 +1,84 @@ +#ifndef MWGUI_QUICKKEYS_H +#define MWGUI_QUICKKEYS_H + + +#include "../mwworld/ptr.hpp" + +#include "window_base.hpp" + +namespace MWGui +{ + + class QuickKeysMenuAssign; + class ItemSelectionDialog; + class MagicSelectionDialog; + + class QuickKeysMenu : public WindowBase + { + public: + QuickKeysMenu(MWBase::WindowManager& parWindowManager); + ~QuickKeysMenu(); + + + void onItemButtonClicked(MyGUI::Widget* sender); + void onMagicButtonClicked(MyGUI::Widget* sender); + void onUnassignButtonClicked(MyGUI::Widget* sender); + void onCancelButtonClicked(MyGUI::Widget* sender); + + void onAssignItem (MWWorld::Ptr item); + void onAssignItemCancel (); + void onAssignMagicItem (MWWorld::Ptr item); + void onAssignMagic (const std::string& spellId); + void onAssignMagicCancel (); + + + private: + MyGUI::EditBox* mInstructionLabel; + MyGUI::Button* mOkButton; + + std::vector mQuickKeyButtons; + + QuickKeysMenuAssign* mAssignDialog; + ItemSelectionDialog* mItemSelectionDialog; + MagicSelectionDialog* mMagicSelectionDialog; + + int mSelectedIndex; + + + void onQuickKeyButtonClicked(MyGUI::Widget* sender); + void onOkButtonClicked(MyGUI::Widget* sender); + + void unassign(MyGUI::Widget* key, int index); + }; + + class QuickKeysMenuAssign : public WindowModal + { + public: + QuickKeysMenuAssign(MWBase::WindowManager& parWindowManager, QuickKeysMenu* parent); + + private: + MyGUI::TextBox* mLabel; + MyGUI::Button* mItemButton; + MyGUI::Button* mMagicButton; + MyGUI::Button* mUnassignButton; + MyGUI::Button* mCancelButton; + + QuickKeysMenu* mParent; + }; + + class MagicSelectionDialog : public WindowModal + { + public: + MagicSelectionDialog(MWBase::WindowManager& parWindowManager, QuickKeysMenu* parent); + + private: + MyGUI::Button* mCancelButton; + + QuickKeysMenu* mParent; + + void onCancelButtonClicked (MyGUI::Widget* sender); + }; +} + + +#endif diff --git a/apps/openmw/mwgui/window_base.cpp b/apps/openmw/mwgui/window_base.cpp index dbb37efbb..38bee9ea3 100644 --- a/apps/openmw/mwgui/window_base.cpp +++ b/apps/openmw/mwgui/window_base.cpp @@ -12,17 +12,15 @@ WindowBase::WindowBase(const std::string& parLayout, MWBase::WindowManager& parW { } -void WindowBase::open() -{ -} - void WindowBase::setVisible(bool visible) { bool wasVisible = mMainWidget->getVisible(); mMainWidget->setVisible(visible); - if (!wasVisible && visible) + if (visible) open(); + else if (wasVisible && !visible) + close(); } void WindowBase::center() @@ -40,3 +38,18 @@ void WindowBase::center() coord.top = (gameWindowSize.height - coord.height)/2; mMainWidget->setCoord(coord); } + +WindowModal::WindowModal(const std::string& parLayout, MWBase::WindowManager& parWindowManager) + : WindowBase(parLayout, parWindowManager) +{ +} + +void WindowModal::open() +{ + MyGUI::InputManager::getInstance ().addWidgetModal (mMainWidget); +} + +void WindowModal::close() +{ + MyGUI::InputManager::getInstance ().removeWidgetModal (mMainWidget); +} diff --git a/apps/openmw/mwgui/window_base.hpp b/apps/openmw/mwgui/window_base.hpp index 74d874bb8..afdf4d065 100644 --- a/apps/openmw/mwgui/window_base.hpp +++ b/apps/openmw/mwgui/window_base.hpp @@ -20,8 +20,9 @@ namespace MWGui // Events typedef MyGUI::delegates::CMultiDelegate1 EventHandle_WindowBase; - virtual void open(); - virtual void setVisible(bool visible); // calls open() if visible is true and was false before + virtual void open() {} + virtual void close () {} + virtual void setVisible(bool visible); void center(); /** Event : Dialog finished, OK button clicked.\n @@ -33,6 +34,18 @@ namespace MWGui /// \todo remove MWBase::WindowManager& mWindowManager; }; + + + /* + * "Modal" windows cause the rest of the interface to be unaccessible while they are visible + */ + class WindowModal : public WindowBase + { + public: + WindowModal(const std::string& parLayout, MWBase::WindowManager& parWindowManager); + virtual void open(); + virtual void close(); + }; } #endif diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 676eb2046..f1ee01c4d 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -41,6 +41,7 @@ #include "confirmationdialog.hpp" #include "alchemywindow.hpp" #include "spellwindow.hpp" +#include "quickkeysmenu.hpp" using namespace MWGui; @@ -133,6 +134,7 @@ WindowManager::WindowManager( mConfirmationDialog = new ConfirmationDialog(*this); mAlchemyWindow = new AlchemyWindow(*this); mSpellWindow = new SpellWindow(*this); + mQuickKeysMenu = new QuickKeysMenu(*this); mInputBlocker = mGui->createWidget("",0,0,w,h,MyGUI::Align::Default,"Windows",""); @@ -226,6 +228,7 @@ void WindowManager::updateVisible() mSettingsWindow->setVisible(false); mAlchemyWindow->setVisible(false); mSpellWindow->setVisible(false); + mQuickKeysMenu->setVisible(false); // Mouse is visible whenever we're not in game mode MyGUI::PointerManager::getInstance().setVisible(isGuiMode()); @@ -254,6 +257,9 @@ void WindowManager::updateVisible() GuiMode mode = mGuiModes.back(); switch(mode) { + case GM_QuickKeysMenu: + mQuickKeysMenu->setVisible (true); + break; case GM_MainMenu: mMenu->setVisible(true); break; @@ -652,6 +658,7 @@ void WindowManager::processChangedSettings(const Settings::CategorySettingVector mAlchemyWindow->center(); mScrollWindow->center(); mBookWindow->center(); + mQuickKeysMenu->center(); mDragAndDrop->mDragAndDropWidget->setSize(MyGUI::IntSize(x, y)); mInputBlocker->setSize(MyGUI::IntSize(x,y)); } diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index 391305594..f27522986 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -60,6 +60,7 @@ namespace MWGui class MessageBoxManager; class SettingsWindow; class AlchemyWindow; + class QuickKeysMenu; class WindowManager : public MWBase::WindowManager { @@ -209,6 +210,7 @@ namespace MWGui ConfirmationDialog* mConfirmationDialog; AlchemyWindow* mAlchemyWindow; SpellWindow* mSpellWindow; + QuickKeysMenu* mQuickKeysMenu; CharacterCreation* mCharGen; diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index a7cce25c0..8f4fde7a4 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -188,7 +188,40 @@ namespace MWInput case A_ToggleSpell: toggleSpell (); break; - } + case A_QuickKey1: + quickKey(1); + break; + case A_QuickKey2: + quickKey(2); + break; + case A_QuickKey3: + quickKey(3); + break; + case A_QuickKey4: + quickKey(4); + break; + case A_QuickKey5: + quickKey(5); + break; + case A_QuickKey6: + quickKey(6); + break; + case A_QuickKey7: + quickKey(7); + break; + case A_QuickKey8: + quickKey(8); + break; + case A_QuickKey9: + quickKey(9); + break; + case A_QuickKey10: + quickKey(10); + break; + case A_QuickKeysMenu: + showQuickKeysMenu(); + break; + } } } @@ -545,6 +578,17 @@ namespace MWInput // .. but don't touch any other mode. } + void InputManager::quickKey (int index) + { + std::cout << "quick key " << index << std::endl; + } + + void InputManager::showQuickKeysMenu() + { + if (!mWindows.isGuiMode ()) + mWindows.pushGuiMode (MWGui::GM_QuickKeysMenu); + } + void InputManager::activate() { mEngine.activate(); @@ -587,7 +631,8 @@ namespace MWInput defaultKeyBindings[A_MoveRight] = OIS::KC_D; defaultKeyBindings[A_ToggleWeapon] = OIS::KC_F; defaultKeyBindings[A_ToggleSpell] = OIS::KC_R; - defaultKeyBindings[A_Console] = OIS::KC_F1; + defaultKeyBindings[A_QuickKeysMenu] = OIS::KC_F1; + defaultKeyBindings[A_Console] = OIS::KC_F2; defaultKeyBindings[A_Crouch] = OIS::KC_LCONTROL; defaultKeyBindings[A_AutoMove] = OIS::KC_Q; defaultKeyBindings[A_Jump] = OIS::KC_E; @@ -595,9 +640,20 @@ namespace MWInput defaultKeyBindings[A_Rest] = OIS::KC_T; defaultKeyBindings[A_GameMenu] = OIS::KC_ESCAPE; defaultKeyBindings[A_TogglePOV] = OIS::KC_TAB; + defaultKeyBindings[A_QuickKey1] = OIS::KC_1; + defaultKeyBindings[A_QuickKey2] = OIS::KC_2; + defaultKeyBindings[A_QuickKey3] = OIS::KC_3; + defaultKeyBindings[A_QuickKey4] = OIS::KC_4; + defaultKeyBindings[A_QuickKey5] = OIS::KC_5; + defaultKeyBindings[A_QuickKey6] = OIS::KC_6; + defaultKeyBindings[A_QuickKey7] = OIS::KC_7; + defaultKeyBindings[A_QuickKey8] = OIS::KC_8; + defaultKeyBindings[A_QuickKey9] = OIS::KC_9; + defaultKeyBindings[A_QuickKey10] = OIS::KC_0; std::map defaultMouseButtonBindings; defaultMouseButtonBindings[A_Inventory] = OIS::MB_Right; + defaultMouseButtonBindings[A_Use] = OIS::MB_Left; for (int i = 0; i < A_Last; ++i) { @@ -645,6 +701,17 @@ namespace MWInput descriptions[A_Rest] = "sRestKey"; descriptions[A_Inventory] = "sInventory"; descriptions[A_TogglePOV] = "sTogglePOVCmd"; + descriptions[A_QuickKeysMenu] = "sQuickMenu"; + descriptions[A_QuickKey1] = "sQuick1Cmd"; + descriptions[A_QuickKey2] = "sQuick2Cmd"; + descriptions[A_QuickKey3] = "sQuick3Cmd"; + descriptions[A_QuickKey4] = "sQuick4Cmd"; + descriptions[A_QuickKey5] = "sQuick5Cmd"; + descriptions[A_QuickKey6] = "sQuick6Cmd"; + descriptions[A_QuickKey7] = "sQuick7Cmd"; + descriptions[A_QuickKey8] = "sQuick8Cmd"; + descriptions[A_QuickKey9] = "sQuick9Cmd"; + descriptions[A_QuickKey10] = "sQuick10Cmd"; if (descriptions[action] == "") return ""; // not configurable @@ -685,6 +752,17 @@ namespace MWInput ret.push_back(A_Journal); ret.push_back(A_Rest); ret.push_back(A_Console); + ret.push_back(A_QuickKeysMenu); + ret.push_back(A_QuickKey1); + ret.push_back(A_QuickKey2); + ret.push_back(A_QuickKey3); + ret.push_back(A_QuickKey4); + ret.push_back(A_QuickKey5); + ret.push_back(A_QuickKey6); + ret.push_back(A_QuickKey7); + ret.push_back(A_QuickKey8); + ret.push_back(A_QuickKey9); + ret.push_back(A_QuickKey10); return ret; } diff --git a/apps/openmw/mwinput/inputmanagerimp.hpp b/apps/openmw/mwinput/inputmanagerimp.hpp index 71d43b8d5..a7a2df852 100644 --- a/apps/openmw/mwinput/inputmanagerimp.hpp +++ b/apps/openmw/mwinput/inputmanagerimp.hpp @@ -168,6 +168,9 @@ namespace MWInput void toggleAutoMove(); void exitNow(); + void quickKey (int index); + void showQuickKeysMenu(); + bool actionIsActive (int id); void loadKeyDefaults(bool force = false); @@ -220,6 +223,19 @@ namespace MWInput A_TogglePOV, + A_QuickKey1, + A_QuickKey2, + A_QuickKey3, + A_QuickKey4, + A_QuickKey5, + A_QuickKey6, + A_QuickKey7, + A_QuickKey8, + A_QuickKey9, + A_QuickKey10, + + A_QuickKeysMenu, + A_Last // Marker for the last item }; }; diff --git a/files/mygui/CMakeLists.txt b/files/mygui/CMakeLists.txt index 3a5430c6f..2e448a369 100644 --- a/files/mygui/CMakeLists.txt +++ b/files/mygui/CMakeLists.txt @@ -65,6 +65,10 @@ set(MYGUI_FILES openmw_tooltips.layout openmw_trade_window.layout openmw_windows.skin.xml + openmw_quickkeys_menu.layout + openmw_quickkeys_menu_assign.layout + openmw_itemselection_dialog.layout + openmw_magicselection_dialog.layout smallbars.png VeraMono.ttf ) diff --git a/files/mygui/openmw_itemselection_dialog.layout b/files/mygui/openmw_itemselection_dialog.layout new file mode 100644 index 000000000..93681e69e --- /dev/null +++ b/files/mygui/openmw_itemselection_dialog.layout @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/files/mygui/openmw_magicselection_dialog.layout b/files/mygui/openmw_magicselection_dialog.layout new file mode 100644 index 000000000..7834b0ed9 --- /dev/null +++ b/files/mygui/openmw_magicselection_dialog.layout @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/files/mygui/openmw_quickkeys_menu.layout b/files/mygui/openmw_quickkeys_menu.layout new file mode 100644 index 000000000..a45f2896f --- /dev/null +++ b/files/mygui/openmw_quickkeys_menu.layout @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/files/mygui/openmw_quickkeys_menu_assign.layout b/files/mygui/openmw_quickkeys_menu_assign.layout new file mode 100644 index 000000000..4bbd9f1fa --- /dev/null +++ b/files/mygui/openmw_quickkeys_menu_assign.layout @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c0f27bd5ef3f1420dd88aef367bc49d4788c9879 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 26 Aug 2012 11:37:33 +0200 Subject: [PATCH 2/9] magic selection window --- apps/openmw/mwgui/quickkeysmenu.cpp | 257 +++++++++++++++++- apps/openmw/mwgui/quickkeysmenu.hpp | 13 + .../mygui/openmw_magicselection_dialog.layout | 2 +- 3 files changed, 270 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp index a9aa3e616..6739b3d1b 100644 --- a/apps/openmw/mwgui/quickkeysmenu.cpp +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -5,10 +5,33 @@ #include "../mwbase/environment.hpp" #include "../mwbase/world.hpp" #include "../mwworld/player.hpp" +#include "../mwworld/inventorystore.hpp" +#include "../mwmechanics/spells.hpp" +#include "../mwmechanics/creaturestats.hpp" #include "windowmanagerimp.hpp" #include "itemselection.hpp" + +namespace +{ + bool sortItems(const MWWorld::Ptr& left, const MWWorld::Ptr& right) + { + int cmp = MWWorld::Class::get(left).getName(left).compare( + MWWorld::Class::get(right).getName(right)); + return cmp < 0; + } + + bool sortSpells(const std::string& left, const std::string& right) + { + const ESM::Spell* a = MWBase::Environment::get().getWorld()->getStore().spells.find(left); + const ESM::Spell* b = MWBase::Environment::get().getWorld()->getStore().spells.find(right); + + int cmp = a->name.compare(b->name); + return cmp < 0; + } +} + namespace MWGui { @@ -157,12 +180,35 @@ namespace MWGui void QuickKeysMenu::onAssignMagicItem (MWWorld::Ptr item) { - + onAssignItem(item); + mMagicSelectionDialog->setVisible(false); } void QuickKeysMenu::onAssignMagic (const std::string& spellId) { + MyGUI::Button* button = mQuickKeyButtons[mSelectedIndex]; + while (button->getChildCount ()) + MyGUI::Gui::getInstance ().destroyWidget (button->getChildAt(0)); + MyGUI::ImageBox* image = button->createWidget("ImageBox", MyGUI::IntCoord(9, 8, 42, 42), MyGUI::Align::Default); + image->setUserString ("ToolTipType", "Spell"); + image->setUserString ("Spell", spellId); + + // use the icon of the first effect + const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().spells.find(spellId); + const ESM::MagicEffect* effect = MWBase::Environment::get().getWorld()->getStore().magicEffects.find(spell->effects.list.front().effectID); + std::string path = effect->icon; + int slashPos = path.find("\\"); + path.insert(slashPos+1, "b_"); + path = std::string("icons\\") + path; + int pos = path.rfind("."); + path.erase(pos); + path.append(".dds"); + + image->setImageTexture (path); + image->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + + mMagicSelectionDialog->setVisible(false); } void QuickKeysMenu::onAssignMagicCancel () @@ -222,8 +268,11 @@ namespace MWGui MagicSelectionDialog::MagicSelectionDialog(MWBase::WindowManager &parWindowManager, QuickKeysMenu* parent) : WindowModal("openmw_magicselection_dialog.layout", parWindowManager) , mParent(parent) + , mWidth(0) + , mHeight(0) { getWidget(mCancelButton, "CancelButton"); + getWidget(mMagicList, "MagicList"); mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &MagicSelectionDialog::onCancelButtonClicked); center(); @@ -234,4 +283,210 @@ namespace MWGui mParent->onAssignMagicCancel (); } + void MagicSelectionDialog::open () + { + WindowModal::open(); + + while (mMagicList->getChildCount ()) + MyGUI::Gui::getInstance ().destroyWidget (mMagicList->getChildAt (0)); + + mHeight = 0; + + const int spellHeight = 18; + + MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer(); + MWWorld::InventoryStore& store = MWWorld::Class::get(player).getInventoryStore(player); + MWMechanics::CreatureStats& stats = MWWorld::Class::get(player).getCreatureStats(player); + MWMechanics::Spells& spells = stats.getSpells(); + + /// \todo lots of copy&pasted code from SpellWindow + + // retrieve powers & spells, sort by name + std::vector spellList; + + for (MWMechanics::Spells::TIterator it = spells.begin(); it != spells.end(); ++it) + { + spellList.push_back(*it); + } + + std::vector powers; + std::vector::iterator it = spellList.begin(); + while (it != spellList.end()) + { + const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().spells.find(*it); + if (spell->data.type == ESM::Spell::ST_Power) + { + powers.push_back(*it); + it = spellList.erase(it); + } + else if (spell->data.type == ESM::Spell::ST_Ability + || spell->data.type == ESM::Spell::ST_Blight + || spell->data.type == ESM::Spell::ST_Curse + || spell->data.type == ESM::Spell::ST_Disease) + { + it = spellList.erase(it); + } + else + ++it; + } + std::sort(powers.begin(), powers.end(), sortSpells); + std::sort(spellList.begin(), spellList.end(), sortSpells); + + // retrieve usable magic items & sort + std::vector items; + for (MWWorld::ContainerStoreIterator it(store.begin()); it != store.end(); ++it) + { + std::string enchantId = MWWorld::Class::get(*it).getEnchantment(*it); + if (enchantId != "") + { + // only add items with "Cast once" or "Cast on use" + const ESM::Enchantment* enchant = MWBase::Environment::get().getWorld()->getStore().enchants.find(enchantId); + int type = enchant->data.type; + if (type != ESM::Enchantment::CastOnce + && type != ESM::Enchantment::WhenUsed) + continue; + + items.push_back(*it); + } + } + std::sort(items.begin(), items.end(), sortItems); + + + int height = estimateHeight(items.size() + powers.size() + spellList.size()); + bool scrollVisible = height > mMagicList->getHeight(); + mWidth = mMagicList->getWidth() - scrollVisible * 18; + + + // powers + addGroup("#{sPowers}", ""); + + for (std::vector::const_iterator it = powers.begin(); it != powers.end(); ++it) + { + const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().spells.find(*it); + MyGUI::Button* t = mMagicList->createWidget("SpellText", + MyGUI::IntCoord(4, mHeight, mWidth-8, spellHeight), MyGUI::Align::Left | MyGUI::Align::Top); + t->setCaption(spell->name); + t->setTextAlign(MyGUI::Align::Left); + t->setUserString("ToolTipType", "Spell"); + t->setUserString("Spell", *it); + t->eventMouseWheel += MyGUI::newDelegate(this, &MagicSelectionDialog::onMouseWheel); + t->eventMouseButtonClick += MyGUI::newDelegate(this, &MagicSelectionDialog::onSpellSelected); + + mHeight += spellHeight; + } + + // other spells + addGroup("#{sSpells}", ""); + for (std::vector::const_iterator it = spellList.begin(); it != spellList.end(); ++it) + { + const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().spells.find(*it); + MyGUI::Button* t = mMagicList->createWidget("SpellText", + MyGUI::IntCoord(4, mHeight, mWidth-8, spellHeight), MyGUI::Align::Left | MyGUI::Align::Top); + t->setCaption(spell->name); + t->setTextAlign(MyGUI::Align::Left); + t->setUserString("ToolTipType", "Spell"); + t->setUserString("Spell", *it); + t->eventMouseWheel += MyGUI::newDelegate(this, &MagicSelectionDialog::onMouseWheel); + t->eventMouseButtonClick += MyGUI::newDelegate(this, &MagicSelectionDialog::onSpellSelected); + + mHeight += spellHeight; + } + + + // enchanted items + addGroup("#{sMagicItem}", ""); + + for (std::vector::const_iterator it = items.begin(); it != items.end(); ++it) + { + MWWorld::Ptr item = *it; + + // check if the item is currently equipped (will display in a different color) + bool equipped = false; + for (int i=0; i < MWWorld::InventoryStore::Slots; ++i) + { + if (store.getSlot(i) != store.end() && *store.getSlot(i) == item) + { + equipped = true; + break; + } + } + + MyGUI::Button* t = mMagicList->createWidget(equipped ? "SpellText" : "SpellTextUnequipped", + MyGUI::IntCoord(4, mHeight, mWidth-8, spellHeight), MyGUI::Align::Left | MyGUI::Align::Top); + t->setCaption(MWWorld::Class::get(item).getName(item)); + t->setTextAlign(MyGUI::Align::Left); + t->setUserData(item); + t->setUserString("ToolTipType", "ItemPtr"); + t->eventMouseButtonClick += MyGUI::newDelegate(this, &MagicSelectionDialog::onEnchantedItemSelected); + t->eventMouseWheel += MyGUI::newDelegate(this, &MagicSelectionDialog::onMouseWheel); + + mHeight += spellHeight; + } + + + mMagicList->setCanvasSize (mWidth, std::max(mMagicList->getHeight(), mHeight)); + + } + + void MagicSelectionDialog::addGroup(const std::string &label, const std::string& label2) + { + if (mMagicList->getChildCount() > 0) + { + MyGUI::ImageBox* separator = mMagicList->createWidget("MW_HLine", + MyGUI::IntCoord(4, mHeight, mWidth-8, 18), + MyGUI::Align::Left | MyGUI::Align::Top); + separator->setNeedMouseFocus(false); + mHeight += 18; + } + + MyGUI::TextBox* groupWidget = mMagicList->createWidget("SandBrightText", + MyGUI::IntCoord(0, mHeight, mWidth, 24), + MyGUI::Align::Left | MyGUI::Align::Top | MyGUI::Align::HStretch); + groupWidget->setCaptionWithReplacing(label); + groupWidget->setTextAlign(MyGUI::Align::Left); + groupWidget->setNeedMouseFocus(false); + + if (label2 != "") + { + MyGUI::TextBox* groupWidget2 = mMagicList->createWidget("SandBrightText", + MyGUI::IntCoord(0, mHeight, mWidth-4, 24), + MyGUI::Align::Left | MyGUI::Align::Top); + groupWidget2->setCaptionWithReplacing(label2); + groupWidget2->setTextAlign(MyGUI::Align::Right); + groupWidget2->setNeedMouseFocus(false); + } + + mHeight += 24; + } + + + void MagicSelectionDialog::onMouseWheel(MyGUI::Widget* _sender, int _rel) + { + if (mMagicList->getViewOffset().top + _rel*0.3 > 0) + mMagicList->setViewOffset(MyGUI::IntPoint(0, 0)); + else + mMagicList->setViewOffset(MyGUI::IntPoint(0, mMagicList->getViewOffset().top + _rel*0.3)); + } + + void MagicSelectionDialog::onEnchantedItemSelected(MyGUI::Widget* _sender) + { + MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer(); + MWWorld::Ptr item = *_sender->getUserData(); + + mParent->onAssignMagicItem (item); + } + + void MagicSelectionDialog::onSpellSelected(MyGUI::Widget* _sender) + { + mParent->onAssignMagic (_sender->getUserString("Spell")); + } + + int MagicSelectionDialog::estimateHeight(int numSpells) const + { + int height = 0; + height += 24 * 3 + 18 * 2; // group headings + height += numSpells * 18; + return height; + } + } diff --git a/apps/openmw/mwgui/quickkeysmenu.hpp b/apps/openmw/mwgui/quickkeysmenu.hpp index 496806109..44e48d3b0 100644 --- a/apps/openmw/mwgui/quickkeysmenu.hpp +++ b/apps/openmw/mwgui/quickkeysmenu.hpp @@ -71,12 +71,25 @@ namespace MWGui public: MagicSelectionDialog(MWBase::WindowManager& parWindowManager, QuickKeysMenu* parent); + virtual void open(); + private: MyGUI::Button* mCancelButton; + MyGUI::ScrollView* mMagicList; + + int mWidth; + int mHeight; QuickKeysMenu* mParent; void onCancelButtonClicked (MyGUI::Widget* sender); + void onMouseWheel(MyGUI::Widget* _sender, int _rel); + void onEnchantedItemSelected(MyGUI::Widget* _sender); + void onSpellSelected(MyGUI::Widget* _sender); + int estimateHeight(int numSpells) const; + + + void addGroup(const std::string& label, const std::string& label2); }; } diff --git a/files/mygui/openmw_magicselection_dialog.layout b/files/mygui/openmw_magicselection_dialog.layout index 7834b0ed9..bf942b32f 100644 --- a/files/mygui/openmw_magicselection_dialog.layout +++ b/files/mygui/openmw_magicselection_dialog.layout @@ -7,7 +7,7 @@ - + From b1a394552dd6c2f5b406a68514591d41340ab343 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Aug 2012 10:01:53 +0200 Subject: [PATCH 3/9] mouse click sounds --- apps/openmw/mwinput/inputmanagerimp.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index 8f4fde7a4..40091f358 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -13,6 +13,8 @@ #include #include +#include +#include #include @@ -21,6 +23,7 @@ #include "../mwworld/player.hpp" #include "../mwbase/world.hpp" #include "../mwbase/windowmanager.hpp" +#include "../mwbase/soundmanager.hpp" namespace MWInput { @@ -442,6 +445,15 @@ namespace MWInput MyGUI::InputManager::getInstance().injectMousePress(mMouseX, mMouseY, MyGUI::MouseButton::Enum(id)); + if (MyGUI::InputManager::getInstance ().getMouseFocusWidget () != 0) + { + MyGUI::Button* b = MyGUI::InputManager::getInstance ().getMouseFocusWidget ()->castType(false); + if (b) + { + MWBase::Environment::get().getSoundManager ()->playSound ("Menu Click", 1.f, 1.f); + } + } + return true; } From c5e55d3cac140872de52455bdf1b9f658632d01d Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Aug 2012 15:51:01 +0200 Subject: [PATCH 4/9] fix screenshot function --- apps/openmw/mwbase/windowmanager.hpp | 2 + apps/openmw/mwgui/quickkeysmenu.cpp | 82 +++++++++++++++++-- apps/openmw/mwgui/quickkeysmenu.hpp | 10 +++ apps/openmw/mwgui/windowmanagerimp.cpp | 5 ++ apps/openmw/mwgui/windowmanagerimp.hpp | 2 + apps/openmw/mwinput/inputmanagerimp.cpp | 8 +- .../mygui/openmw_itemselection_dialog.layout | 8 +- 7 files changed, 102 insertions(+), 15 deletions(-) diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index fde965256..589ab4a4b 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -171,6 +171,8 @@ namespace MWBase virtual void setWeaponVisibility(bool visible) = 0; virtual void setSpellVisibility(bool visible) = 0; + virtual void activateQuickKey (int index) = 0; + virtual void setSelectedSpell(const std::string& spellId, int successChancePercent) = 0; virtual void setSelectedEnchantItem(const MWWorld::Ptr& item, int chargePercent) = 0; virtual void setSelectedWeapon(const MWWorld::Ptr& item, int durabilityPercent) = 0; diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp index 6739b3d1b..853e2ed14 100644 --- a/apps/openmw/mwgui/quickkeysmenu.cpp +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -82,6 +82,8 @@ namespace MWGui while (key->getChildCount ()) MyGUI::Gui::getInstance ().destroyWidget (key->getChildAt(0)); + key->setUserData(Type_Unassigned); + MyGUI::TextBox* textBox = key->createWidgetReal("SandText", MyGUI::FloatCoord(0,0,1,1), MyGUI::Align::Default); textBox->setTextAlign (MyGUI::Align::Center); textBox->setCaption (boost::lexical_cast(index+1)); @@ -159,16 +161,25 @@ namespace MWGui while (button->getChildCount ()) MyGUI::Gui::getInstance ().destroyWidget (button->getChildAt(0)); - MyGUI::ImageBox* image = button->createWidget("ImageBox", MyGUI::IntCoord(9, 8, 42, 42), MyGUI::Align::Default); - image->setUserString ("ToolTipType", "ItemPtr"); - image->setUserData(item); + button->setUserData(Type_Item); + + MyGUI::ImageBox* frame = button->createWidget("ImageBox", MyGUI::IntCoord(9, 8, 42, 42), MyGUI::Align::Default); + std::string backgroundTex = "textures\\menu_icon_barter.dds"; + frame->setImageTexture (backgroundTex); + frame->setImageCoord (MyGUI::IntCoord(4, 4, 40, 40)); + frame->setUserString ("ToolTipType", "ItemPtr"); + frame->setUserData(item); + frame->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + + + MyGUI::ImageBox* image = frame->createWidget("ImageBox", MyGUI::IntCoord(5, 5, 32, 32), MyGUI::Align::Default); std::string path = std::string("icons\\"); path += MWWorld::Class::get(item).getInventoryIcon(item); int pos = path.rfind("."); path.erase(pos); path.append(".dds"); image->setImageTexture (path); - image->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + image->setNeedMouseFocus (false); mItemSelectionDialog->setVisible(false); } @@ -180,7 +191,29 @@ namespace MWGui void QuickKeysMenu::onAssignMagicItem (MWWorld::Ptr item) { - onAssignItem(item); + MyGUI::Button* button = mQuickKeyButtons[mSelectedIndex]; + while (button->getChildCount ()) + MyGUI::Gui::getInstance ().destroyWidget (button->getChildAt(0)); + + button->setUserData(Type_MagicItem); + + MyGUI::ImageBox* frame = button->createWidget("ImageBox", MyGUI::IntCoord(9, 8, 42, 42), MyGUI::Align::Default); + std::string backgroundTex = "textures\\menu_icon_select_magic_magic.dds"; + frame->setImageTexture (backgroundTex); + frame->setImageCoord (MyGUI::IntCoord(2, 2, 40, 40)); + frame->setUserString ("ToolTipType", "ItemPtr"); + frame->setUserData(item); + frame->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + + MyGUI::ImageBox* image = frame->createWidget("ImageBox", MyGUI::IntCoord(5, 5, 32, 32), MyGUI::Align::Default); + std::string path = std::string("icons\\"); + path += MWWorld::Class::get(item).getInventoryIcon(item); + int pos = path.rfind("."); + path.erase(pos); + path.append(".dds"); + image->setImageTexture (path); + image->setNeedMouseFocus (false); + mMagicSelectionDialog->setVisible(false); } @@ -190,9 +223,17 @@ namespace MWGui while (button->getChildCount ()) MyGUI::Gui::getInstance ().destroyWidget (button->getChildAt(0)); - MyGUI::ImageBox* image = button->createWidget("ImageBox", MyGUI::IntCoord(9, 8, 42, 42), MyGUI::Align::Default); - image->setUserString ("ToolTipType", "Spell"); - image->setUserString ("Spell", spellId); + button->setUserData(Type_Magic); + + MyGUI::ImageBox* frame = button->createWidget("ImageBox", MyGUI::IntCoord(9, 8, 42, 42), MyGUI::Align::Default); + std::string backgroundTex = "textures\\menu_icon_select_magic.dds"; + frame->setImageTexture (backgroundTex); + frame->setImageCoord (MyGUI::IntCoord(2, 2, 40, 40)); + frame->setUserString ("ToolTipType", "Spell"); + frame->setUserString ("Spell", spellId); + frame->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + + MyGUI::ImageBox* image = frame->createWidget("ImageBox", MyGUI::IntCoord(5, 5, 32, 32), MyGUI::Align::Default); // use the icon of the first effect const ESM::Spell* spell = MWBase::Environment::get().getWorld()->getStore().spells.find(spellId); @@ -206,7 +247,7 @@ namespace MWGui path.append(".dds"); image->setImageTexture (path); - image->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + image->setNeedMouseFocus (false); mMagicSelectionDialog->setVisible(false); } @@ -216,6 +257,29 @@ namespace MWGui mMagicSelectionDialog->setVisible(false); } + void QuickKeysMenu::activateQuickKey(int index) + { + MyGUI::Button* button = mQuickKeyButtons[index-1]; + + QuickKeyType type = *button->getUserData(); + + if (type == Type_Magic) + { + std::string spellId = button->getChildAt(0)->getUserString("Spell"); + MWBase::Environment::get().getWindowManager ()->setSelectedSpell (spellId, 100); + } + else if (type == Type_Item) + { + MWWorld::Ptr item = *button->getChildAt (0)->getUserData(); + MWBase::Environment::get().getWindowManager ()->setSelectedWeapon(item, 100); + } + else if (type == Type_MagicItem) + { + MWWorld::Ptr item = *button->getChildAt (0)->getUserData(); + MWBase::Environment::get().getWindowManager ()->setSelectedEnchantItem (item, 100); + } + } + // --------------------------------------------------------------------------------------------------------- QuickKeysMenuAssign::QuickKeysMenuAssign (MWBase::WindowManager &parWindowManager, QuickKeysMenu* parent) diff --git a/apps/openmw/mwgui/quickkeysmenu.hpp b/apps/openmw/mwgui/quickkeysmenu.hpp index 44e48d3b0..345ffa0c8 100644 --- a/apps/openmw/mwgui/quickkeysmenu.hpp +++ b/apps/openmw/mwgui/quickkeysmenu.hpp @@ -31,6 +31,16 @@ namespace MWGui void onAssignMagic (const std::string& spellId); void onAssignMagicCancel (); + void activateQuickKey(int index); + + enum QuickKeyType + { + Type_Item, + Type_Magic, + Type_MagicItem, + Type_Unassigned + }; + private: MyGUI::EditBox* mInstructionLabel; diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index f1ee01c4d..138349c2e 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -854,3 +854,8 @@ void WindowManager::notifyInputActionBound () mSettingsWindow->updateControlsBox (); allowMouse(); } + +void WindowManager::activateQuickKey (int index) +{ + mQuickKeysMenu->activateQuickKey(index); +} diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index f27522986..8b011e259 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -152,6 +152,8 @@ namespace MWGui virtual void setWeaponVisibility(bool visible); virtual void setSpellVisibility(bool visible); + virtual void activateQuickKey (int index); + virtual void setSelectedSpell(const std::string& spellId, int successChancePercent); virtual void setSelectedEnchantItem(const MWWorld::Ptr& item, int chargePercent); virtual void setSelectedWeapon(const MWWorld::Ptr& item, int durabilityPercent); diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index 49b9a08a8..7daafc726 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -599,7 +599,7 @@ namespace MWInput void InputManager::quickKey (int index) { - std::cout << "quick key " << index << std::endl; + mWindows.activateQuickKey (index); } void InputManager::showQuickKeysMenu() @@ -669,6 +669,7 @@ namespace MWInput defaultKeyBindings[A_QuickKey8] = OIS::KC_8; defaultKeyBindings[A_QuickKey9] = OIS::KC_9; defaultKeyBindings[A_QuickKey10] = OIS::KC_0; + defaultKeyBindings[A_Screenshot] = OIS::KC_SYSRQ; std::map defaultMouseButtonBindings; defaultMouseButtonBindings[A_Inventory] = OIS::MB_Right; @@ -689,7 +690,10 @@ namespace MWInput control = mInputCtrl->getChannel(i)->getAttachedControls ().front().control; } - if (!controlExists || force) + if (!controlExists || force || + ( mInputCtrl->getKeyBinding (control, ICS::Control::INCREASE) == OIS::KC_UNASSIGNED + && mInputCtrl->getMouseButtonBinding (control, ICS::Control::INCREASE) == ICS_MAX_DEVICE_BUTTONS + )) { clearAllBindings (control); diff --git a/files/mygui/openmw_itemselection_dialog.layout b/files/mygui/openmw_itemselection_dialog.layout index 93681e69e..81376d6d5 100644 --- a/files/mygui/openmw_itemselection_dialog.layout +++ b/files/mygui/openmw_itemselection_dialog.layout @@ -4,14 +4,14 @@ - - + + - + - + From 6161f81c2475550feea994b405b6adb8df0ea762 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Aug 2012 20:44:14 +0200 Subject: [PATCH 5/9] last bits of the quick key menu. --- apps/openmw/mwgui/itemselection.cpp | 6 ++ apps/openmw/mwgui/quickkeysmenu.cpp | 79 ++++++++++++++++++- apps/openmw/mwgui/spellwindow.cpp | 29 +------ apps/openmw/mwmechanics/spellsuccess.hpp | 2 + .../mygui/openmw_magicselection_dialog.layout | 8 +- 5 files changed, 91 insertions(+), 33 deletions(-) diff --git a/apps/openmw/mwgui/itemselection.cpp b/apps/openmw/mwgui/itemselection.cpp index 14b1cf8ee..d93a621ac 100644 --- a/apps/openmw/mwgui/itemselection.cpp +++ b/apps/openmw/mwgui/itemselection.cpp @@ -23,6 +23,12 @@ namespace MWGui getWidget(cancelButton, "CancelButton"); cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &ItemSelectionDialog::onCancelButtonClicked); + int dx = (cancelButton->getTextSize().width + 24) - cancelButton->getWidth(); + cancelButton->setCoord(cancelButton->getLeft() - dx, + cancelButton->getTop(), + cancelButton->getTextSize ().width + 24, + cancelButton->getHeight()); + center(); } diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp index 853e2ed14..fcfac8d5d 100644 --- a/apps/openmw/mwgui/quickkeysmenu.cpp +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -6,8 +6,13 @@ #include "../mwbase/world.hpp" #include "../mwworld/player.hpp" #include "../mwworld/inventorystore.hpp" +#include "../mwworld/actionequip.hpp" #include "../mwmechanics/spells.hpp" #include "../mwmechanics/creaturestats.hpp" +#include "../mwmechanics/spellsuccess.hpp" +#include "../mwgui/inventorywindow.hpp" +#include "../mwgui/bookwindow.hpp" +#include "../mwgui/scrollwindow.hpp" #include "windowmanagerimp.hpp" #include "itemselection.hpp" @@ -263,20 +268,82 @@ namespace MWGui QuickKeyType type = *button->getUserData(); + MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer(); + MWWorld::InventoryStore& store = MWWorld::Class::get(player).getInventoryStore(player); + MWMechanics::CreatureStats& stats = MWWorld::Class::get(player).getCreatureStats(player); + MWMechanics::Spells& spells = stats.getSpells(); + if (type == Type_Magic) { std::string spellId = button->getChildAt(0)->getUserString("Spell"); - MWBase::Environment::get().getWindowManager ()->setSelectedSpell (spellId, 100); + spells.setSelectedSpell(spellId); + store.setSelectedEnchantItem(store.end()); + mWindowManager.setSelectedSpell(spellId, int(MWMechanics::getSpellSuccessChance(spellId, player))); } else if (type == Type_Item) { MWWorld::Ptr item = *button->getChildAt (0)->getUserData(); - MWBase::Environment::get().getWindowManager ()->setSelectedWeapon(item, 100); + + // make sure the item is available + if (item.getRefData ().getCount() == 0) + { + MWBase::Environment::get().getWindowManager ()->messageBox ( + "#{sQuickMenu5} " + MWWorld::Class::get(item).getName(item), std::vector()); + return; + } + + boost::shared_ptr action = MWWorld::Class::get(item).use(item); + + action->execute (MWBase::Environment::get().getWorld()->getPlayer().getPlayer()); + + // this is necessary for books/scrolls: if they are already in the player's inventory, + // the "Take" button should not be visible. + // NOTE: the take button is "reset" when the window opens, so we can safely do the following + // without screwing up future book windows + mWindowManager.getBookWindow()->setTakeButtonShow(false); + mWindowManager.getScrollWindow()->setTakeButtonShow(false); + + // since we changed equipping status, update the inventory window + mWindowManager.getInventoryWindow()->drawItems(); } else if (type == Type_MagicItem) { MWWorld::Ptr item = *button->getChildAt (0)->getUserData(); - MWBase::Environment::get().getWindowManager ()->setSelectedEnchantItem (item, 100); + + // make sure the item is available + if (item.getRefData ().getCount() == 0) + { + MWBase::Environment::get().getWindowManager ()->messageBox ( + "#{sQuickMenu5} " + MWWorld::Class::get(item).getName(item), std::vector()); + return; + } + + // retrieve ContainerStoreIterator to the item + MWWorld::ContainerStoreIterator it = store.begin(); + for (; it != store.end(); ++it) + { + if (*it == item) + { + break; + } + } + assert(it != store.end()); + + // equip, if it can be equipped + if (!MWWorld::Class::get(item).getEquipmentSlots(item).first.empty()) + { + // Note: can't use Class::use here because enchanted scrolls for example would then open the scroll window instead of equipping + + MWWorld::ActionEquip action(item); + action.execute (MWBase::Environment::get().getWorld ()->getPlayer ().getPlayer ()); + + // since we changed equipping status, update the inventory window + mWindowManager.getInventoryWindow()->drawItems(); + } + + store.setSelectedEnchantItem(it); + spells.setSelectedSpell(""); + mWindowManager.setSelectedEnchantItem(item, 100); /// \todo track charge % } } @@ -339,6 +406,12 @@ namespace MWGui getWidget(mMagicList, "MagicList"); mCancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &MagicSelectionDialog::onCancelButtonClicked); + int dx = (mCancelButton->getTextSize().width + 24) - mCancelButton->getWidth(); + mCancelButton->setCoord(mCancelButton->getLeft() - dx, + mCancelButton->getTop(), + mCancelButton->getTextSize ().width + 24, + mCancelButton->getHeight()); + center(); } diff --git a/apps/openmw/mwgui/spellwindow.cpp b/apps/openmw/mwgui/spellwindow.cpp index 8754f5d10..bd671cab6 100644 --- a/apps/openmw/mwgui/spellwindow.cpp +++ b/apps/openmw/mwgui/spellwindow.cpp @@ -13,6 +13,7 @@ #include "../mwworld/player.hpp" #include "../mwworld/inventorystore.hpp" +#include "../mwworld/actionequip.hpp" #include "../mwmechanics/spells.hpp" #include "../mwmechanics/creaturestats.hpp" @@ -350,34 +351,10 @@ namespace MWGui if (_sender->getUserString("Equipped") == "false" && !MWWorld::Class::get(item).getEquipmentSlots(item).first.empty()) { - // sound - MWBase::Environment::get().getSoundManager()->playSound(MWWorld::Class::get(item).getUpSoundId(item), 1.0, 1.0); - // Note: can't use Class::use here because enchanted scrolls for example would then open the scroll window instead of equipping - /// \todo the following code is pretty much copy&paste from ActionEquip, put it in a function? - // slots that this item can be equipped in - std::pair, bool> slots = MWWorld::Class::get(item).getEquipmentSlots(item); - - // equip the item in the first free slot - for (std::vector::const_iterator slot=slots.first.begin(); - slot!=slots.first.end(); ++slot) - { - // if all slots are occupied, replace the last slot - if (slot == --slots.first.end()) - { - store.equip(*slot, it); - break; - } - - if (store.getSlot(*slot) == store.end()) - { - // slot is not occupied - store.equip(*slot, it); - break; - } - } - /// \todo scripts? + MWWorld::ActionEquip action(item); + action.execute (MWBase::Environment::get().getWorld ()->getPlayer ().getPlayer ()); // since we changed equipping status, update the inventory window mWindowManager.getInventoryWindow()->drawItems(); diff --git a/apps/openmw/mwmechanics/spellsuccess.hpp b/apps/openmw/mwmechanics/spellsuccess.hpp index 1ab1bb11f..e4778be69 100644 --- a/apps/openmw/mwmechanics/spellsuccess.hpp +++ b/apps/openmw/mwmechanics/spellsuccess.hpp @@ -8,6 +8,8 @@ #include "../mwworld/class.hpp" #include "../mwmechanics/creaturestats.hpp" +#include + #include "npcstats.hpp" namespace MWMechanics diff --git a/files/mygui/openmw_magicselection_dialog.layout b/files/mygui/openmw_magicselection_dialog.layout index bf942b32f..31ad7b4c9 100644 --- a/files/mygui/openmw_magicselection_dialog.layout +++ b/files/mygui/openmw_magicselection_dialog.layout @@ -2,16 +2,16 @@ - + - - + + - + From bc36b0e2bda5e2aba63bd634a055321d3201e48c Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Aug 2012 20:51:13 +0200 Subject: [PATCH 6/9] remove the restriction on the last quick key --- apps/openmw/mwgui/quickkeysmenu.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp index fcfac8d5d..8bc441c65 100644 --- a/apps/openmw/mwgui/quickkeysmenu.cpp +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -67,9 +67,6 @@ namespace MWGui MyGUI::Button* button; getWidget(button, "QuickKey" + boost::lexical_cast(i+1)); - if (i != 9) // 10th quick key is always set to hand-to-hand - button->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); - unassign(button, i); mQuickKeyButtons.push_back(button); From 4f19b7fb9b0fb2baaae45cda5196e420e173610a Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Aug 2012 20:52:32 +0200 Subject: [PATCH 7/9] fix leaks. --- apps/openmw/mwgui/quickkeysmenu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp index 8bc441c65..3c05e6327 100644 --- a/apps/openmw/mwgui/quickkeysmenu.cpp +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -77,6 +77,8 @@ namespace MWGui QuickKeysMenu::~QuickKeysMenu() { delete mAssignDialog; + delete mItemSelectionDialog; + delete mMagicSelectionDialog; } void QuickKeysMenu::unassign(MyGUI::Widget* key, int index) From 5c28a6720307cfa2fdab09293d043e93d3099522 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Aug 2012 20:55:39 +0200 Subject: [PATCH 8/9] broke something in the last commit. --- apps/openmw/mwgui/quickkeysmenu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp index 3c05e6327..5b7115dbe 100644 --- a/apps/openmw/mwgui/quickkeysmenu.cpp +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -67,6 +67,8 @@ namespace MWGui MyGUI::Button* button; getWidget(button, "QuickKey" + boost::lexical_cast(i+1)); + button->eventMouseButtonClick += MyGUI::newDelegate(this, &QuickKeysMenu::onQuickKeyButtonClicked); + unassign(button, i); mQuickKeyButtons.push_back(button); From 321f7c3419099d824c18a6b2b82b7e69bd60716e Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Aug 2012 21:29:04 +0200 Subject: [PATCH 9/9] fix an infinite recursion regression on several dialogs. --- apps/openmw/mwgui/birth.cpp | 2 +- apps/openmw/mwgui/birth.hpp | 2 +- apps/openmw/mwgui/charactercreation.cpp | 18 +++++++++--------- apps/openmw/mwgui/class.cpp | 12 ------------ apps/openmw/mwgui/class.hpp | 7 ++----- apps/openmw/mwgui/journalwindow.hpp | 2 +- apps/openmw/mwgui/race.cpp | 1 - apps/openmw/mwgui/race.hpp | 2 +- apps/openmw/mwgui/review.cpp | 1 - apps/openmw/mwgui/review.hpp | 2 +- apps/openmw/mwgui/text_input.cpp | 1 - apps/openmw/mwgui/text_input.hpp | 2 +- apps/openmw/mwgui/windowmanagerimp.cpp | 1 - 13 files changed, 17 insertions(+), 36 deletions(-) diff --git a/apps/openmw/mwgui/birth.cpp b/apps/openmw/mwgui/birth.cpp index 05a337cbc..1a5c2d0f6 100644 --- a/apps/openmw/mwgui/birth.cpp +++ b/apps/openmw/mwgui/birth.cpp @@ -65,9 +65,9 @@ void BirthDialog::setNextButtonShow(bool shown) void BirthDialog::open() { + WindowBase::open(); updateBirths(); updateSpells(); - setVisible(true); } diff --git a/apps/openmw/mwgui/birth.hpp b/apps/openmw/mwgui/birth.hpp index 92665081d..5bd36e828 100644 --- a/apps/openmw/mwgui/birth.hpp +++ b/apps/openmw/mwgui/birth.hpp @@ -28,7 +28,7 @@ namespace MWGui void setBirthId(const std::string &raceId); void setNextButtonShow(bool shown); - void open(); + virtual void open(); // Events typedef delegates::CMultiDelegate0 EventHandle_Void; diff --git a/apps/openmw/mwgui/charactercreation.cpp b/apps/openmw/mwgui/charactercreation.cpp index 8c82b3e43..7d63f6922 100644 --- a/apps/openmw/mwgui/charactercreation.cpp +++ b/apps/openmw/mwgui/charactercreation.cpp @@ -194,7 +194,7 @@ void CharacterCreation::spawnDialog(const char id) mNameDialog->setTextInput(mPlayerName); mNameDialog->setNextButtonShow(mCreationStage >= CSE_NameChosen); mNameDialog->eventDone += MyGUI::newDelegate(this, &CharacterCreation::onNameDialogDone); - mNameDialog->open(); + mNameDialog->setVisible(true); break; case GM_Race: @@ -205,7 +205,7 @@ void CharacterCreation::spawnDialog(const char id) mRaceDialog->setRaceId(mPlayerRaceId); mRaceDialog->eventDone += MyGUI::newDelegate(this, &CharacterCreation::onRaceDialogDone); mRaceDialog->eventBack += MyGUI::newDelegate(this, &CharacterCreation::onRaceDialogBack); - mRaceDialog->open(); + mRaceDialog->setVisible(true);; break; case GM_Class: @@ -213,7 +213,7 @@ void CharacterCreation::spawnDialog(const char id) mClassChoiceDialog = 0; mClassChoiceDialog = new ClassChoiceDialog(*mWM); mClassChoiceDialog->eventButtonSelected += MyGUI::newDelegate(this, &CharacterCreation::onClassChoice); - mClassChoiceDialog->open(); + mClassChoiceDialog->setVisible(true); break; case GM_ClassPick: @@ -224,7 +224,7 @@ void CharacterCreation::spawnDialog(const char id) mPickClassDialog->setClassId(mPlayerClass.name); mPickClassDialog->eventDone += MyGUI::newDelegate(this, &CharacterCreation::onPickClassDialogDone); mPickClassDialog->eventBack += MyGUI::newDelegate(this, &CharacterCreation::onPickClassDialogBack); - mPickClassDialog->open(); + mPickClassDialog->setVisible(true); break; case GM_Birth: @@ -234,7 +234,7 @@ void CharacterCreation::spawnDialog(const char id) mBirthSignDialog->setNextButtonShow(mCreationStage >= CSE_BirthSignChosen); mBirthSignDialog->eventDone += MyGUI::newDelegate(this, &CharacterCreation::onBirthSignDialogDone); mBirthSignDialog->eventBack += MyGUI::newDelegate(this, &CharacterCreation::onBirthSignDialogBack); - mBirthSignDialog->open(); + mBirthSignDialog->setVisible(true); break; case GM_ClassCreate: @@ -244,7 +244,7 @@ void CharacterCreation::spawnDialog(const char id) mCreateClassDialog->setNextButtonShow(mCreationStage >= CSE_ClassChosen); mCreateClassDialog->eventDone += MyGUI::newDelegate(this, &CharacterCreation::onCreateClassDialogDone); mCreateClassDialog->eventBack += MyGUI::newDelegate(this, &CharacterCreation::onCreateClassDialogBack); - mCreateClassDialog->open(); + mCreateClassDialog->setVisible(true); break; case GM_ClassGenerate: mGenerateClassStep = 0; @@ -289,7 +289,7 @@ void CharacterCreation::spawnDialog(const char id) mReviewDialog->eventDone += MyGUI::newDelegate(this, &CharacterCreation::onReviewDialogDone); mReviewDialog->eventBack += MyGUI::newDelegate(this, &CharacterCreation::onReviewDialogBack); mReviewDialog->eventActivateDialog += MyGUI::newDelegate(this, &CharacterCreation::onReviewActivateDialog); - mReviewDialog->open(); + mReviewDialog->setVisible(true); break; } } @@ -680,7 +680,7 @@ void CharacterCreation::showClassQuestionDialog() mGenerateClassResultDialog->setClassId(mGenerateClass); mGenerateClassResultDialog->eventBack += MyGUI::newDelegate(this, &CharacterCreation::onGenerateClassBack); mGenerateClassResultDialog->eventDone += MyGUI::newDelegate(this, &CharacterCreation::onGenerateClassDone); - mGenerateClassResultDialog->open(); + mGenerateClassResultDialog->setVisible(true); return; } @@ -703,7 +703,7 @@ void CharacterCreation::showClassQuestionDialog() buttons.push_back(sGenerateClassSteps[mGenerateClassStep].mButtons[2]); mGenerateClassQuestionDialog->setButtons(buttons); mGenerateClassQuestionDialog->eventButtonSelected += MyGUI::newDelegate(this, &CharacterCreation::onClassQuestionChosen); - mGenerateClassQuestionDialog->open(); + mGenerateClassQuestionDialog->setVisible(true); MWBase::Environment::get().getSoundManager()->say(sGenerateClassSteps[mGenerateClassStep].mSound); } diff --git a/apps/openmw/mwgui/class.cpp b/apps/openmw/mwgui/class.cpp index 971740b5e..9ea7b8052 100644 --- a/apps/openmw/mwgui/class.cpp +++ b/apps/openmw/mwgui/class.cpp @@ -46,11 +46,6 @@ GenerateClassResultDialog::GenerateClassResultDialog(MWBase::WindowManager& parW backButton->setCoord(315 - okButtonWidth - backButtonWidth - 6, 219, backButtonWidth, 23); } -void GenerateClassResultDialog::open() -{ - setVisible(true); -} - std::string GenerateClassResultDialog::getClassId() const { return mClassName->getCaption(); @@ -143,7 +138,6 @@ void PickClassDialog::open() { updateClasses(); updateStats(); - setVisible(true); } @@ -341,7 +335,6 @@ void InfoBoxDialog::open() layoutVertically(mMainWidget, 4 + 6); center(); - setVisible(true); } int InfoBoxDialog::getChosenButton() const @@ -549,11 +542,6 @@ void CreateClassDialog::setNextButtonShow(bool shown) descriptionButton->setCoord(459 - okButtonWidth - backButtonWidth - descriptionButtonWidth - 12, 158, descriptionButtonWidth, 23); } -void CreateClassDialog::open() -{ - setVisible(true); -} - // widget controls void CreateClassDialog::onDialogCancel() diff --git a/apps/openmw/mwgui/class.hpp b/apps/openmw/mwgui/class.hpp index bcb5c2627..43511ccca 100644 --- a/apps/openmw/mwgui/class.hpp +++ b/apps/openmw/mwgui/class.hpp @@ -26,7 +26,7 @@ namespace MWGui std::string getText() const; void setButtons(ButtonList &buttons); - void open(); + virtual void open(); int getChosenButton() const; // Events @@ -74,8 +74,6 @@ namespace MWGui std::string getClassId() const; void setClassId(const std::string &classId); - void open(); - // Events typedef delegates::CMultiDelegate0 EventHandle_Void; @@ -104,7 +102,7 @@ namespace MWGui void setClassId(const std::string &classId); void setNextButtonShow(bool shown); - void open(); + virtual void open(); // Events typedef delegates::CMultiDelegate0 EventHandle_Void; @@ -264,7 +262,6 @@ namespace MWGui std::vector getMinorSkills() const; void setNextButtonShow(bool shown); - void open(); // Events typedef delegates::CMultiDelegate0 EventHandle_Void; diff --git a/apps/openmw/mwgui/journalwindow.hpp b/apps/openmw/mwgui/journalwindow.hpp index fc05bbdbc..a62e48803 100644 --- a/apps/openmw/mwgui/journalwindow.hpp +++ b/apps/openmw/mwgui/journalwindow.hpp @@ -14,7 +14,7 @@ namespace MWGui { public: JournalWindow(MWBase::WindowManager& parWindowManager); - void open(); + virtual void open(); virtual void setVisible(bool visible); // only used to play close sound diff --git a/apps/openmw/mwgui/race.cpp b/apps/openmw/mwgui/race.cpp index ceb0452fb..a597dcadb 100644 --- a/apps/openmw/mwgui/race.cpp +++ b/apps/openmw/mwgui/race.cpp @@ -113,7 +113,6 @@ void RaceDialog::open() updateRaces(); updateSkills(); updateSpellPowers(); - setVisible(true); } diff --git a/apps/openmw/mwgui/race.hpp b/apps/openmw/mwgui/race.hpp index 3da6b0ace..2e9e09a3e 100644 --- a/apps/openmw/mwgui/race.hpp +++ b/apps/openmw/mwgui/race.hpp @@ -43,7 +43,7 @@ namespace MWGui // setHair() void setNextButtonShow(bool shown); - void open(); + virtual void open(); // Events typedef delegates::CMultiDelegate0 EventHandle_Void; diff --git a/apps/openmw/mwgui/review.cpp b/apps/openmw/mwgui/review.cpp index 8dd894c25..4a9cc778a 100644 --- a/apps/openmw/mwgui/review.cpp +++ b/apps/openmw/mwgui/review.cpp @@ -110,7 +110,6 @@ ReviewDialog::ReviewDialog(MWBase::WindowManager& parWindowManager) void ReviewDialog::open() { updateSkillArea(); - setVisible(true); } void ReviewDialog::onScrollChangePosition(MyGUI::ScrollBar* scroller, size_t pos) diff --git a/apps/openmw/mwgui/review.hpp b/apps/openmw/mwgui/review.hpp index f0bde6ecd..f6d373232 100644 --- a/apps/openmw/mwgui/review.hpp +++ b/apps/openmw/mwgui/review.hpp @@ -46,7 +46,7 @@ namespace MWGui void configureSkills(const SkillList& major, const SkillList& minor); void setSkillValue(ESM::Skill::SkillEnum skillId, const MWMechanics::Stat& value); - void open(); + virtual void open(); // Events typedef delegates::CMultiDelegate0 EventHandle_Void; diff --git a/apps/openmw/mwgui/text_input.cpp b/apps/openmw/mwgui/text_input.cpp index 802cd3063..b724bab15 100644 --- a/apps/openmw/mwgui/text_input.cpp +++ b/apps/openmw/mwgui/text_input.cpp @@ -45,7 +45,6 @@ void TextInputDialog::open() { // Make sure the edit box has focus MyGUI::InputManager::getInstance().setKeyFocusWidget(mTextEdit); - setVisible(true); } // widget controls diff --git a/apps/openmw/mwgui/text_input.hpp b/apps/openmw/mwgui/text_input.hpp index 7a3325722..8fb0e5819 100644 --- a/apps/openmw/mwgui/text_input.hpp +++ b/apps/openmw/mwgui/text_input.hpp @@ -25,7 +25,7 @@ namespace MWGui void setNextButtonShow(bool shown); void setTextLabel(const std::string &label); - void open(); + virtual void open(); protected: void onOkClicked(MyGUI::Widget* _sender); diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 138349c2e..60a574b3c 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -318,7 +318,6 @@ void WindowManager::updateVisible() break; case GM_Journal: mJournal->setVisible(true); - mJournal->open(); break; default: // Unsupported mode, switch back to game