diff --git a/apps/openmw/mwgui/levelupdialog.cpp b/apps/openmw/mwgui/levelupdialog.cpp index 30981be4ee..e02679d229 100644 --- a/apps/openmw/mwgui/levelupdialog.cpp +++ b/apps/openmw/mwgui/levelupdialog.cpp @@ -3,8 +3,10 @@ #include #include #include +#include #include +#include #include "../mwbase/environment.hpp" #include "../mwbase/soundmanager.hpp" @@ -12,6 +14,7 @@ #include "../mwbase/world.hpp" #include "../mwworld/class.hpp" +#include "../mwworld/esmstore.hpp" #include "../mwmechanics/actorutil.hpp" #include "../mwmechanics/creaturestats.hpp" @@ -20,9 +23,13 @@ #include "class.hpp" #include "ustring.hpp" +namespace +{ + constexpr unsigned int sMaxCoins = 3; + constexpr int sCols[] = { 32, 218 }; +} namespace MWGui { - const unsigned int LevelupDialog::sMaxCoins = 3; LevelupDialog::LevelupDialog() : WindowBase("openmw_levelup_dialog.layout") , mCoinCount(sMaxCoins) @@ -36,23 +43,36 @@ namespace MWGui mOkButton->eventMouseButtonClick += MyGUI::newDelegate(this, &LevelupDialog::onOkButtonClicked); - for (int i = 1; i < 9; ++i) { - MyGUI::TextBox* t; - getWidget(t, "AttribVal" + MyGUI::utility::toString(i)); - mAttributeValues.push_back(t); - - MyGUI::Button* b; - getWidget(b, "Attrib" + MyGUI::utility::toString(i)); - b->setUserData(i - 1); - b->eventMouseButtonClick += MyGUI::newDelegate(this, &LevelupDialog::onAttributeClicked); - mAttributes.push_back(b); - - getWidget(t, "AttribMultiplier" + MyGUI::utility::toString(i)); - mAttributeMultipliers.push_back(t); + const auto& store = MWBase::Environment::get().getESMStore()->get(); + const size_t perCol + = static_cast(std::ceil(store.getSize() / static_cast(std::size(sCols)))); + size_t i = 0; + for (const ESM::Attribute& attribute : store) + { + auto& widgets = mAttributeWidgets.emplace_back(); + const int offset = sCols[i / perCol]; + const int row = static_cast(i % perCol); + widgets.mMultiplier = mAssignWidget->createWidget( + "SandTextVCenter", { offset, 20 * row, 100, 20 }, MyGUI::Align::Default); + auto* hbox = mAssignWidget->createWidget( + {}, { offset + 20, 20 * row, 200, 20 }, MyGUI::Align::Default); + widgets.mButton = hbox->createWidget("SandTextButton", {}, MyGUI::Align::Default); + widgets.mButton->setUserData(attribute.mId); + widgets.mButton->eventMouseButtonClick += MyGUI::newDelegate(this, &LevelupDialog::onAttributeClicked); + widgets.mButton->setUserString("TextPadding", "0 0"); + widgets.mButton->setUserString("ToolTipType", "Layout"); + widgets.mButton->setUserString("ToolTipLayout", "AttributeToolTip"); + widgets.mButton->setUserString("Caption_AttributeName", attribute.mName); + widgets.mButton->setUserString("Caption_AttributeDescription", attribute.mDescription); + widgets.mButton->setUserString("ImageTexture_AttributeImage", attribute.mIcon); + widgets.mButton->setCaption(attribute.mName); + widgets.mValue = hbox->createWidget("SandText", {}, MyGUI::Align::Default); + ++i; + } } - for (unsigned int i = 0; i < mCoinCount; ++i) + for (unsigned int i = 0; i < sMaxCoins; ++i) { MyGUI::ImageBox* image = mCoinBox->createWidget( "ImageBox", MyGUI::IntCoord(0, 0, 16, 16), MyGUI::Align::Default); @@ -69,24 +89,24 @@ namespace MWGui MWMechanics::CreatureStats& creatureStats = player.getClass().getCreatureStats(player); MWMechanics::NpcStats& pcStats = player.getClass().getNpcStats(player); - for (int i = 0; i < ESM::Attribute::Length; ++i) + for (const ESM::Attribute& attribute : MWBase::Environment::get().getESMStore()->get()) { - int val = creatureStats.getAttribute(i).getBase(); - if (std::find(mSpentAttributes.begin(), mSpentAttributes.end(), i) != mSpentAttributes.end()) + int val = creatureStats.getAttribute(attribute.mId).getBase(); + if (std::find(mSpentAttributes.begin(), mSpentAttributes.end(), attribute.mId) != mSpentAttributes.end()) { - val += pcStats.getLevelupAttributeMultiplier(i); + val += pcStats.getLevelupAttributeMultiplier(attribute.mId); } if (val >= 100) val = 100; - mAttributeValues[i]->setCaption(MyGUI::utility::toString(val)); + mAttributeWidgets[attribute.mId].mValue->setCaption(MyGUI::utility::toString(val)); } } void LevelupDialog::resetCoins() { - const int coinSpacing = 33; + constexpr int coinSpacing = 33; int curX = mCoinBox->getWidth() / 2 - (coinSpacing * (mCoinCount - 1) + 16 * mCoinCount) / 2; for (unsigned int i = 0; i < sMaxCoins; ++i) { @@ -113,13 +133,14 @@ namespace MWGui image->detachFromWidget(); image->attachToWidget(mAssignWidget); - int attribute = mSpentAttributes[i]; + const auto& attribute = mSpentAttributes[i]; + const auto& widgets = mAttributeWidgets[attribute]; - int xdiff = mAttributeMultipliers[attribute]->getCaption().empty() ? 0 : 20; + int xdiff = widgets.mMultiplier->getCaption().empty() ? 0 : 20; - MyGUI::IntPoint pos = mAttributes[attribute]->getAbsolutePosition() - mAssignWidget->getAbsolutePosition() + MyGUI::IntPoint pos = widgets.mButton->getAbsolutePosition() - mAssignWidget->getAbsolutePosition() - MyGUI::IntPoint(22 + xdiff, 0); - pos.top += (mAttributes[attribute]->getHeight() - image->getHeight()) / 2; + pos.top += (widgets.mButton->getHeight() - image->getHeight()) / 2; image->setPosition(pos); } @@ -130,8 +151,8 @@ namespace MWGui { MWBase::World* world = MWBase::Environment::get().getWorld(); MWWorld::Ptr player = world->getPlayerPtr(); - MWMechanics::CreatureStats& creatureStats = player.getClass().getCreatureStats(player); - MWMechanics::NpcStats& pcStats = player.getClass().getNpcStats(player); + const MWMechanics::CreatureStats& creatureStats = player.getClass().getCreatureStats(player); + const MWMechanics::NpcStats& pcStats = player.getClass().getNpcStats(player); setClassImage(mClassImage, ESM::RefId::stringRefId(getLevelupClassImage(pcStats.getSkillIncreasesForSpecialization(0), @@ -149,28 +170,28 @@ namespace MWGui mLevelDescription->setCaption(toUString(levelupdescription)); unsigned int availableAttributes = 0; - for (int i = 0; i < ESM::Attribute::Length; ++i) + for (const ESM::Attribute& attribute : MWBase::Environment::get().getESMStore()->get()) { - MyGUI::TextBox* text = mAttributeMultipliers[i]; - if (pcStats.getAttribute(i).getBase() < 100) + const auto& widgets = mAttributeWidgets[attribute.mId]; + if (pcStats.getAttribute(attribute.mId).getBase() < 100) { - mAttributes[i]->setEnabled(true); - mAttributeValues[i]->setEnabled(true); + widgets.mButton->setEnabled(true); + widgets.mValue->setEnabled(true); availableAttributes++; - float mult = pcStats.getLevelupAttributeMultiplier(i); - mult = std::min(mult, 100 - pcStats.getAttribute(i).getBase()); + float mult = pcStats.getLevelupAttributeMultiplier(attribute.mId); + mult = std::min(mult, 100 - pcStats.getAttribute(attribute.mId).getBase()); if (mult <= 1) - text->setCaption({}); + widgets.mMultiplier->setCaption({}); else - text->setCaption("x" + MyGUI::utility::toString(mult)); + widgets.mMultiplier->setCaption("x" + MyGUI::utility::toString(mult)); } else { - mAttributes[i]->setEnabled(false); - mAttributeValues[i]->setEnabled(false); + widgets.mButton->setEnabled(false); + widgets.mValue->setEnabled(false); - text->setCaption({}); + widgets.mMultiplier->setCaption({}); } } @@ -215,9 +236,9 @@ namespace MWGui void LevelupDialog::onAttributeClicked(MyGUI::Widget* sender) { - int attribute = *sender->getUserData(); + auto attribute = *sender->getUserData(); - std::vector::iterator found = std::find(mSpentAttributes.begin(), mSpentAttributes.end(), attribute); + auto found = std::find(mSpentAttributes.begin(), mSpentAttributes.end(), attribute); if (found != mSpentAttributes.end()) mSpentAttributes.erase(found); else diff --git a/apps/openmw/mwgui/levelupdialog.hpp b/apps/openmw/mwgui/levelupdialog.hpp index 790db888cb..b01cc14a96 100644 --- a/apps/openmw/mwgui/levelupdialog.hpp +++ b/apps/openmw/mwgui/levelupdialog.hpp @@ -1,6 +1,8 @@ #ifndef MWGUI_LEVELUPDIALOG_H #define MWGUI_LEVELUPDIALOG_H +#include + #include "windowbase.hpp" namespace MWGui @@ -14,6 +16,12 @@ namespace MWGui void onOpen() override; private: + struct Widgets + { + MyGUI::Button* mButton; + MyGUI::TextBox* mValue; + MyGUI::TextBox* mMultiplier; + }; MyGUI::Button* mOkButton; MyGUI::ImageBox* mClassImage; MyGUI::TextBox* mLevelText; @@ -22,15 +30,12 @@ namespace MWGui MyGUI::Widget* mCoinBox; MyGUI::Widget* mAssignWidget; - std::vector mAttributes; - std::vector mAttributeValues; - std::vector mAttributeMultipliers; + std::vector mAttributeWidgets; std::vector mCoins; - std::vector mSpentAttributes; + std::vector mSpentAttributes; unsigned int mCoinCount; - static const unsigned int sMaxCoins; void onOkButtonClicked(MyGUI::Widget* sender); void onAttributeClicked(MyGUI::Widget* sender); diff --git a/files/data/mygui/openmw_levelup_dialog.layout b/files/data/mygui/openmw_levelup_dialog.layout index ef161d7f58..5375f0d22e 100644 --- a/files/data/mygui/openmw_levelup_dialog.layout +++ b/files/data/mygui/openmw_levelup_dialog.layout @@ -30,128 +30,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -