From 6c96b5653b63bcda2b52912272b3c593de72669a Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Wed, 24 Apr 2019 19:22:47 -0400 Subject: [PATCH 1/7] Add a button to delete spells from spellwindow --- apps/openmw/mwgui/spellmodel.cpp | 11 +++++++++++ apps/openmw/mwgui/spellmodel.hpp | 2 ++ apps/openmw/mwgui/spellwindow.cpp | 25 +++++++++++++++++++------ apps/openmw/mwgui/spellwindow.hpp | 1 + files/mygui/openmw_spell_window.layout | 12 ++++++++++-- 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwgui/spellmodel.cpp b/apps/openmw/mwgui/spellmodel.cpp index 6dadebca27..d6424c08bc 100644 --- a/apps/openmw/mwgui/spellmodel.cpp +++ b/apps/openmw/mwgui/spellmodel.cpp @@ -148,6 +148,17 @@ namespace MWGui return mSpells.size(); } + SpellModel::ModelIndex SpellModel::getSelectedIndex() const + { + ModelIndex selected = -1; + for (SpellModel::ModelIndex i = 0; i= int(mSpells.size())) diff --git a/apps/openmw/mwgui/spellmodel.hpp b/apps/openmw/mwgui/spellmodel.hpp index 4aa1f9d2a7..d191cba0e0 100644 --- a/apps/openmw/mwgui/spellmodel.hpp +++ b/apps/openmw/mwgui/spellmodel.hpp @@ -48,6 +48,8 @@ namespace MWGui ///< throws for invalid index size_t getItemCount() const; + ModelIndex getSelectedIndex() const; + ///< returns -1 if nothing is selected private: MWWorld::Ptr mActor; diff --git a/apps/openmw/mwgui/spellwindow.cpp b/apps/openmw/mwgui/spellwindow.cpp index 254e731d0e..2b1056797e 100644 --- a/apps/openmw/mwgui/spellwindow.cpp +++ b/apps/openmw/mwgui/spellwindow.cpp @@ -1,5 +1,6 @@ #include "spellwindow.hpp" +#include #include #include @@ -36,14 +37,18 @@ namespace MWGui { mSpellIcons = new SpellIcons(); + MyGUI::Button *deleteSpellBtn = nullptr; + getWidget(mSpellView, "SpellView"); getWidget(mEffectBox, "EffectsBox"); getWidget(mFilterEdit, "FilterEdit"); + getWidget(deleteSpellBtn, "DeleteSpellButton"); mFilterEdit->setUserString("IgnoreTabKey", "y"); mSpellView->eventSpellClicked += MyGUI::newDelegate(this, &SpellWindow::onModelIndexSelected); mFilterEdit->eventEditTextChange += MyGUI::newDelegate(this, &SpellWindow::onFilterChanged); + deleteSpellBtn->eventMouseButtonClick += MyGUI::newDelegate(this, &SpellWindow::onDeleteClicked); setCoord(498, 300, 302, 300); } @@ -185,6 +190,17 @@ namespace MWGui mSpellView->setModel(new SpellModel(MWMechanics::getPlayer(), sender->getCaption())); } + void SpellWindow::onDeleteClicked(MyGUI::Widget *widget) + { + SpellModel::ModelIndex selected = mSpellView->getModel()->getSelectedIndex(); + if (selected < 0) + return; + + const Spell& spell = mSpellView->getModel()->getItem(selected); + if (spell.mType != Spell::Type_EnchantedItem) + askDeleteSpell(spell.mId); + } + void SpellWindow::onSpellSelected(const std::string& spellId) { MWWorld::Ptr player = MWMechanics::getPlayer(); @@ -222,12 +238,9 @@ namespace MWGui mSpellView->setModel(new SpellModel(MWMechanics::getPlayer(), "")); - SpellModel::ModelIndex selected = 0; - for (SpellModel::ModelIndex i = 0; igetModel()->getItemCount()); ++i) - { - if (mSpellView->getModel()->getItem(i).mSelected) - selected = i; - } + SpellModel::ModelIndex selected = mSpellView->getModel()->getSelectedIndex(); + if (selected < 0) + selected = 0; selected += next ? 1 : -1; int itemcount = mSpellView->getModel()->getItemCount(); diff --git a/apps/openmw/mwgui/spellwindow.hpp b/apps/openmw/mwgui/spellwindow.hpp index ce10770f55..01a9c7392f 100644 --- a/apps/openmw/mwgui/spellwindow.hpp +++ b/apps/openmw/mwgui/spellwindow.hpp @@ -33,6 +33,7 @@ namespace MWGui void onSpellSelected(const std::string& spellId); void onModelIndexSelected(SpellModel::ModelIndex index); void onFilterChanged(MyGUI::EditBox *sender); + void onDeleteClicked(MyGUI::Widget *widget); void onDeleteSpellAccept(); void askDeleteSpell(const std::string& spellId); diff --git a/files/mygui/openmw_spell_window.layout b/files/mygui/openmw_spell_window.layout index 8a98c47b23..9959aeb4ea 100644 --- a/files/mygui/openmw_spell_window.layout +++ b/files/mygui/openmw_spell_window.layout @@ -13,8 +13,16 @@ - - + + + + + + + + + + From 04de2fcc54d2db0caf4322b273de4a4a3605ae1f Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Wed, 24 Apr 2019 19:57:15 -0400 Subject: [PATCH 2/7] spell window: Use sDeleteSpell instead of hardcoding string caption --- files/mygui/openmw_spell_window.layout | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/mygui/openmw_spell_window.layout b/files/mygui/openmw_spell_window.layout index 9959aeb4ea..49b38dffa0 100644 --- a/files/mygui/openmw_spell_window.layout +++ b/files/mygui/openmw_spell_window.layout @@ -16,7 +16,7 @@ - + From 2ee0b1287b7457223b51336f7de2cce20ec7b62a Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 25 Apr 2019 06:14:12 -0400 Subject: [PATCH 3/7] spellmodel: add a break to getSelectedIndex --- apps/openmw/mwgui/spellmodel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwgui/spellmodel.cpp b/apps/openmw/mwgui/spellmodel.cpp index d6424c08bc..2dd6cdc00a 100644 --- a/apps/openmw/mwgui/spellmodel.cpp +++ b/apps/openmw/mwgui/spellmodel.cpp @@ -153,8 +153,10 @@ namespace MWGui ModelIndex selected = -1; for (SpellModel::ModelIndex i = 0; i Date: Thu, 25 Apr 2019 06:24:32 -0400 Subject: [PATCH 4/7] spell window layout: make longer to fit russian translation --- files/mygui/openmw_spell_window.layout | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/mygui/openmw_spell_window.layout b/files/mygui/openmw_spell_window.layout index 49b38dffa0..6a975008a2 100644 --- a/files/mygui/openmw_spell_window.layout +++ b/files/mygui/openmw_spell_window.layout @@ -15,13 +15,13 @@ - + - + From 26ac7412a07f773456b2ff16914eab26981d0387 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 25 Apr 2019 08:46:11 -0400 Subject: [PATCH 5/7] Spell window: dynamically resize the edit box, change delete button caption --- apps/openmw/mwgui/spellwindow.cpp | 18 ++++++++++++++---- apps/openmw/mwgui/spellwindow.hpp | 2 ++ files/mygui/openmw_spell_window.layout | 5 +++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwgui/spellwindow.cpp b/apps/openmw/mwgui/spellwindow.cpp index 2b1056797e..3ae6813907 100644 --- a/apps/openmw/mwgui/spellwindow.cpp +++ b/apps/openmw/mwgui/spellwindow.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -33,22 +34,25 @@ namespace MWGui : WindowPinnableBase("openmw_spell_window.layout") , NoDrop(drag, mMainWidget) , mSpellView(nullptr) + , mDeleteButton(nullptr) , mUpdateTimer(0.0f) { mSpellIcons = new SpellIcons(); - MyGUI::Button *deleteSpellBtn = nullptr; - getWidget(mSpellView, "SpellView"); getWidget(mEffectBox, "EffectsBox"); getWidget(mFilterEdit, "FilterEdit"); - getWidget(deleteSpellBtn, "DeleteSpellButton"); + getWidget(mDeleteButton, "DeleteSpellButton"); mFilterEdit->setUserString("IgnoreTabKey", "y"); mSpellView->eventSpellClicked += MyGUI::newDelegate(this, &SpellWindow::onModelIndexSelected); mFilterEdit->eventEditTextChange += MyGUI::newDelegate(this, &SpellWindow::onFilterChanged); - deleteSpellBtn->eventMouseButtonClick += MyGUI::newDelegate(this, &SpellWindow::onDeleteClicked); + mDeleteButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SpellWindow::onDeleteClicked); + + MyGUI::Window* t = mMainWidget->castType(); + t->eventWindowChangeCoord += MyGUI::newDelegate(this, &SpellWindow::onWindowResize); + onWindowResize(t); setCoord(498, 300, 302, 300); } @@ -254,4 +258,10 @@ namespace MWGui else onSpellSelected(spell.mId); } + + void SpellWindow::onWindowResize(MyGUI::Window* window) { + MyGUI::IntSize sz = mFilterEdit->getSize(); + sz.width = window->getSize().width - mDeleteButton->getSize().width - 40; + mFilterEdit->setSize(sz); + } } diff --git a/apps/openmw/mwgui/spellwindow.hpp b/apps/openmw/mwgui/spellwindow.hpp index 01a9c7392f..fed480b210 100644 --- a/apps/openmw/mwgui/spellwindow.hpp +++ b/apps/openmw/mwgui/spellwindow.hpp @@ -36,6 +36,7 @@ namespace MWGui void onDeleteClicked(MyGUI::Widget *widget); void onDeleteSpellAccept(); void askDeleteSpell(const std::string& spellId); + void onWindowResize(MyGUI::Window* window); virtual void onPinToggled(); virtual void onTitleDoubleClicked(); @@ -44,6 +45,7 @@ namespace MWGui SpellView* mSpellView; SpellIcons* mSpellIcons; MyGUI::EditBox* mFilterEdit; + MyGUI::Button* mDeleteButton; private: float mUpdateTimer; diff --git a/files/mygui/openmw_spell_window.layout b/files/mygui/openmw_spell_window.layout index 6a975008a2..ffc7ab48fb 100644 --- a/files/mygui/openmw_spell_window.layout +++ b/files/mygui/openmw_spell_window.layout @@ -15,8 +15,9 @@ - - + + + From e1ce15efb5dab25256faaa1fe4a0f7ab8ec5e805 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 25 Apr 2019 08:51:57 -0400 Subject: [PATCH 6/7] spellwindow: do onWindowResize in ctor after dimensions are set --- apps/openmw/mwgui/spellwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwgui/spellwindow.cpp b/apps/openmw/mwgui/spellwindow.cpp index 3ae6813907..cb163b6483 100644 --- a/apps/openmw/mwgui/spellwindow.cpp +++ b/apps/openmw/mwgui/spellwindow.cpp @@ -50,11 +50,11 @@ namespace MWGui mFilterEdit->eventEditTextChange += MyGUI::newDelegate(this, &SpellWindow::onFilterChanged); mDeleteButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SpellWindow::onDeleteClicked); + setCoord(498, 300, 302, 300); + MyGUI::Window* t = mMainWidget->castType(); t->eventWindowChangeCoord += MyGUI::newDelegate(this, &SpellWindow::onWindowResize); onWindowResize(t); - - setCoord(498, 300, 302, 300); } SpellWindow::~SpellWindow() From e057ea171f8cc7b014a143a5743a62b09c316c1d Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 25 Apr 2019 09:10:43 -0400 Subject: [PATCH 7/7] spell window: don't manually recalculate edit box width every update --- apps/openmw/mwgui/spellwindow.cpp | 19 +++++++------------ apps/openmw/mwgui/spellwindow.hpp | 2 -- files/mygui/openmw_spell_window.layout | 12 ++++++------ 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/apps/openmw/mwgui/spellwindow.cpp b/apps/openmw/mwgui/spellwindow.cpp index cb163b6483..f535c66c33 100644 --- a/apps/openmw/mwgui/spellwindow.cpp +++ b/apps/openmw/mwgui/spellwindow.cpp @@ -34,27 +34,28 @@ namespace MWGui : WindowPinnableBase("openmw_spell_window.layout") , NoDrop(drag, mMainWidget) , mSpellView(nullptr) - , mDeleteButton(nullptr) , mUpdateTimer(0.0f) { mSpellIcons = new SpellIcons(); + MyGUI::Widget* deleteButton; + getWidget(deleteButton, "DeleteSpellButton"); + getWidget(mSpellView, "SpellView"); getWidget(mEffectBox, "EffectsBox"); getWidget(mFilterEdit, "FilterEdit"); - getWidget(mDeleteButton, "DeleteSpellButton"); mFilterEdit->setUserString("IgnoreTabKey", "y"); mSpellView->eventSpellClicked += MyGUI::newDelegate(this, &SpellWindow::onModelIndexSelected); mFilterEdit->eventEditTextChange += MyGUI::newDelegate(this, &SpellWindow::onFilterChanged); - mDeleteButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SpellWindow::onDeleteClicked); + deleteButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SpellWindow::onDeleteClicked); setCoord(498, 300, 302, 300); - MyGUI::Window* t = mMainWidget->castType(); - t->eventWindowChangeCoord += MyGUI::newDelegate(this, &SpellWindow::onWindowResize); - onWindowResize(t); + // Adjust the spell filtering widget size because of MyGUI limitations. + int filterWidth = mSpellView->getSize().width - deleteButton->getSize().width - 3; + mFilterEdit->setSize(filterWidth, mFilterEdit->getSize().height); } SpellWindow::~SpellWindow() @@ -258,10 +259,4 @@ namespace MWGui else onSpellSelected(spell.mId); } - - void SpellWindow::onWindowResize(MyGUI::Window* window) { - MyGUI::IntSize sz = mFilterEdit->getSize(); - sz.width = window->getSize().width - mDeleteButton->getSize().width - 40; - mFilterEdit->setSize(sz); - } } diff --git a/apps/openmw/mwgui/spellwindow.hpp b/apps/openmw/mwgui/spellwindow.hpp index fed480b210..01a9c7392f 100644 --- a/apps/openmw/mwgui/spellwindow.hpp +++ b/apps/openmw/mwgui/spellwindow.hpp @@ -36,7 +36,6 @@ namespace MWGui void onDeleteClicked(MyGUI::Widget *widget); void onDeleteSpellAccept(); void askDeleteSpell(const std::string& spellId); - void onWindowResize(MyGUI::Window* window); virtual void onPinToggled(); virtual void onTitleDoubleClicked(); @@ -45,7 +44,6 @@ namespace MWGui SpellView* mSpellView; SpellIcons* mSpellIcons; MyGUI::EditBox* mFilterEdit; - MyGUI::Button* mDeleteButton; private: float mUpdateTimer; diff --git a/files/mygui/openmw_spell_window.layout b/files/mygui/openmw_spell_window.layout index ffc7ab48fb..9a6e39cd12 100644 --- a/files/mygui/openmw_spell_window.layout +++ b/files/mygui/openmw_spell_window.layout @@ -13,17 +13,17 @@ - + + - - + + - - - + +