change the select attribute/skill dialogs to be reusable

This commit is contained in:
scrawl 2012-09-24 22:09:38 +02:00
parent d393f551ed
commit b63d205c6e
5 changed files with 40 additions and 31 deletions

View file

@ -565,7 +565,7 @@ void CreateClassDialog::onAttributeClicked(Widgets::MWAttributePtr _sender)
{ {
delete mAttribDialog; delete mAttribDialog;
mAttribDialog = new SelectAttributeDialog(mWindowManager); mAttribDialog = new SelectAttributeDialog(mWindowManager);
mAttribDialog->setAffectedWidget(_sender); mAffectedAttribute = _sender;
mAttribDialog->eventCancel += MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel); mAttribDialog->eventCancel += MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel);
mAttribDialog->eventItemSelected += MyGUI::newDelegate(this, &CreateClassDialog::onAttributeSelected); mAttribDialog->eventItemSelected += MyGUI::newDelegate(this, &CreateClassDialog::onAttributeSelected);
mAttribDialog->setVisible(true); mAttribDialog->setVisible(true);
@ -574,18 +574,17 @@ void CreateClassDialog::onAttributeClicked(Widgets::MWAttributePtr _sender)
void CreateClassDialog::onAttributeSelected() void CreateClassDialog::onAttributeSelected()
{ {
ESM::Attribute::AttributeID id = mAttribDialog->getAttributeId(); ESM::Attribute::AttributeID id = mAttribDialog->getAttributeId();
Widgets::MWAttributePtr attribute = mAttribDialog->getAffectedWidget(); if (mAffectedAttribute == mFavoriteAttribute0)
if (attribute == mFavoriteAttribute0)
{ {
if (mFavoriteAttribute1->getAttributeId() == id) if (mFavoriteAttribute1->getAttributeId() == id)
mFavoriteAttribute1->setAttributeId(mFavoriteAttribute0->getAttributeId()); mFavoriteAttribute1->setAttributeId(mFavoriteAttribute0->getAttributeId());
} }
else if (attribute == mFavoriteAttribute1) else if (mAffectedAttribute == mFavoriteAttribute1)
{ {
if (mFavoriteAttribute0->getAttributeId() == id) if (mFavoriteAttribute0->getAttributeId() == id)
mFavoriteAttribute0->setAttributeId(mFavoriteAttribute1->getAttributeId()); mFavoriteAttribute0->setAttributeId(mFavoriteAttribute1->getAttributeId());
} }
attribute->setAttributeId(id); mAffectedAttribute->setAttributeId(id);
mWindowManager.removeDialog(mAttribDialog); mWindowManager.removeDialog(mAttribDialog);
mAttribDialog = 0; mAttribDialog = 0;
@ -596,7 +595,7 @@ void CreateClassDialog::onSkillClicked(Widgets::MWSkillPtr _sender)
{ {
delete mSkillDialog; delete mSkillDialog;
mSkillDialog = new SelectSkillDialog(mWindowManager); mSkillDialog = new SelectSkillDialog(mWindowManager);
mSkillDialog->setAffectedWidget(_sender); mAffectedSkill = _sender;
mSkillDialog->eventCancel += MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel); mSkillDialog->eventCancel += MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel);
mSkillDialog->eventItemSelected += MyGUI::newDelegate(this, &CreateClassDialog::onSkillSelected); mSkillDialog->eventItemSelected += MyGUI::newDelegate(this, &CreateClassDialog::onSkillSelected);
mSkillDialog->setVisible(true); mSkillDialog->setVisible(true);
@ -605,22 +604,21 @@ void CreateClassDialog::onSkillClicked(Widgets::MWSkillPtr _sender)
void CreateClassDialog::onSkillSelected() void CreateClassDialog::onSkillSelected()
{ {
ESM::Skill::SkillEnum id = mSkillDialog->getSkillId(); ESM::Skill::SkillEnum id = mSkillDialog->getSkillId();
Widgets::MWSkillPtr skill = mSkillDialog->getAffectedWidget();
// Avoid duplicate skills by swapping any skill field that matches the selected one // Avoid duplicate skills by swapping any skill field that matches the selected one
std::vector<Widgets::MWSkillPtr>::const_iterator end = mSkills.end(); std::vector<Widgets::MWSkillPtr>::const_iterator end = mSkills.end();
for (std::vector<Widgets::MWSkillPtr>::const_iterator it = mSkills.begin(); it != end; ++it) for (std::vector<Widgets::MWSkillPtr>::const_iterator it = mSkills.begin(); it != end; ++it)
{ {
if (*it == skill) if (*it == mAffectedSkill)
continue; continue;
if ((*it)->getSkillId() == id) if ((*it)->getSkillId() == id)
{ {
(*it)->setSkillId(skill->getSkillId()); (*it)->setSkillId(mAffectedSkill->getSkillId());
break; break;
} }
} }
skill->setSkillId(mSkillDialog->getSkillId()); mAffectedSkill->setSkillId(mSkillDialog->getSkillId());
mWindowManager.removeDialog(mSkillDialog); mWindowManager.removeDialog(mSkillDialog);
mSkillDialog = 0; mSkillDialog = 0;
update(); update();

View file

@ -167,8 +167,6 @@ namespace MWGui
~SelectAttributeDialog(); ~SelectAttributeDialog();
ESM::Attribute::AttributeID getAttributeId() const { return mAttributeId; } ESM::Attribute::AttributeID getAttributeId() const { return mAttributeId; }
Widgets::MWAttributePtr getAffectedWidget() const { return mAffectedWidget; }
void setAffectedWidget(Widgets::MWAttributePtr widget) { mAffectedWidget = widget; }
// Events // Events
typedef MyGUI::delegates::CMultiDelegate0 EventHandle_Void; typedef MyGUI::delegates::CMultiDelegate0 EventHandle_Void;
@ -188,8 +186,6 @@ namespace MWGui
void onCancelClicked(MyGUI::Widget* _sender); void onCancelClicked(MyGUI::Widget* _sender);
private: private:
Widgets::MWAttributePtr mAffectedWidget;
ESM::Attribute::AttributeID mAttributeId; ESM::Attribute::AttributeID mAttributeId;
}; };
@ -200,8 +196,6 @@ namespace MWGui
~SelectSkillDialog(); ~SelectSkillDialog();
ESM::Skill::SkillEnum getSkillId() const { return mSkillId; } ESM::Skill::SkillEnum getSkillId() const { return mSkillId; }
Widgets::MWSkillPtr getAffectedWidget() const { return mAffectedWidget; }
void setAffectedWidget(Widgets::MWSkillPtr widget) { mAffectedWidget = widget; }
// Events // Events
typedef MyGUI::delegates::CMultiDelegate0 EventHandle_Void; typedef MyGUI::delegates::CMultiDelegate0 EventHandle_Void;
@ -224,7 +218,6 @@ namespace MWGui
Widgets::MWSkillPtr mCombatSkill[9]; Widgets::MWSkillPtr mCombatSkill[9];
Widgets::MWSkillPtr mMagicSkill[9]; Widgets::MWSkillPtr mMagicSkill[9];
Widgets::MWSkillPtr mStealthSkill[9]; Widgets::MWSkillPtr mStealthSkill[9];
Widgets::MWSkillPtr mAffectedWidget;
ESM::Skill::SkillEnum mSkillId; ESM::Skill::SkillEnum mSkillId;
}; };
@ -301,6 +294,9 @@ namespace MWGui
DescriptionDialog *mDescDialog; DescriptionDialog *mDescDialog;
ESM::Class::Specialization mSpecializationId; ESM::Class::Specialization mSpecializationId;
Widgets::MWAttributePtr mAffectedAttribute;
Widgets::MWSkillPtr mAffectedSkill;
}; };
} }
#endif #endif

View file

@ -31,7 +31,6 @@ namespace MWGui
EditEffectDialog::EditEffectDialog(MWBase::WindowManager &parWindowManager) EditEffectDialog::EditEffectDialog(MWBase::WindowManager &parWindowManager)
: WindowModal("openmw_edit_effect.layout", parWindowManager) : WindowModal("openmw_edit_effect.layout", parWindowManager)
, mRange(ESM::RT_Touch)
{ {
getWidget(mCancelButton, "CancelButton"); getWidget(mCancelButton, "CancelButton");
getWidget(mOkButton, "OkButton"); getWidget(mOkButton, "OkButton");
@ -59,6 +58,10 @@ namespace MWGui
{ {
WindowModal::open(); WindowModal::open();
center(); center();
mEffect.range = ESM::RT_Self;
onRangeButtonClicked(mRangeButton);
} }
void EditEffectDialog::setEffect (const ESM::MagicEffect *effect) void EditEffectDialog::setEffect (const ESM::MagicEffect *effect)
@ -76,17 +79,17 @@ namespace MWGui
void EditEffectDialog::onRangeButtonClicked (MyGUI::Widget* sender) void EditEffectDialog::onRangeButtonClicked (MyGUI::Widget* sender)
{ {
mRange = (mRange+1)%3; mEffect.range = (mEffect.range+1)%3;
if (mRange == ESM::RT_Self) if (mEffect.range == ESM::RT_Self)
mRangeButton->setCaptionWithReplacing ("#{sRangeSelf}"); mRangeButton->setCaptionWithReplacing ("#{sRangeSelf}");
else if (mRange == ESM::RT_Target) else if (mEffect.range == ESM::RT_Target)
mRangeButton->setCaptionWithReplacing ("#{sRangeTarget}"); mRangeButton->setCaptionWithReplacing ("#{sRangeTarget}");
else if (mRange == ESM::RT_Touch) else if (mEffect.range == ESM::RT_Touch)
mRangeButton->setCaptionWithReplacing ("#{sRangeTouch}"); mRangeButton->setCaptionWithReplacing ("#{sRangeTouch}");
mAreaSlider->setVisible (mRange != ESM::RT_Self); mAreaSlider->setVisible (mEffect.range != ESM::RT_Self);
mAreaText->setVisible (mRange != ESM::RT_Self); mAreaText->setVisible (mEffect.range != ESM::RT_Self);
} }
void EditEffectDialog::onDeleteButtonClicked (MyGUI::Widget* sender) void EditEffectDialog::onDeleteButtonClicked (MyGUI::Widget* sender)
@ -109,6 +112,8 @@ namespace MWGui
SpellCreationDialog::SpellCreationDialog(MWBase::WindowManager &parWindowManager) SpellCreationDialog::SpellCreationDialog(MWBase::WindowManager &parWindowManager)
: WindowBase("openmw_spellcreation_dialog.layout", parWindowManager) : WindowBase("openmw_spellcreation_dialog.layout", parWindowManager)
, mAddEffectDialog(parWindowManager) , mAddEffectDialog(parWindowManager)
, mSelectAttributeDialog(NULL)
, mSelectSkillDialog(NULL)
{ {
getWidget(mNameEdit, "NameEdit"); getWidget(mNameEdit, "NameEdit");
getWidget(mMagickaCost, "MagickaCost"); getWidget(mMagickaCost, "MagickaCost");
@ -202,10 +207,12 @@ namespace MWGui
void SpellCreationDialog::onAvailableEffectClicked (MyGUI::Widget* sender) void SpellCreationDialog::onAvailableEffectClicked (MyGUI::Widget* sender)
{ {
mAddEffectDialog.setVisible(true);
short effectId = *sender->getUserData<short>(); short effectId = *sender->getUserData<short>();
const ESM::MagicEffect* effect = MWBase::Environment::get().getWorld()->getStore().magicEffects.find(effectId); const ESM::MagicEffect* effect = MWBase::Environment::get().getWorld()->getStore().magicEffects.find(effectId);
mAddEffectDialog.setVisible(true);
mAddEffectDialog.setEffect (effect); mAddEffectDialog.setEffect (effect);
} }

View file

@ -8,6 +8,9 @@
namespace MWGui namespace MWGui
{ {
class SelectSkillDialog;
class SelectAttributeDialog;
class EditEffectDialog : public WindowModal class EditEffectDialog : public WindowModal
{ {
public: public:
@ -34,7 +37,7 @@ namespace MWGui
MyGUI::ScrollBar* mDurationSlider; MyGUI::ScrollBar* mDurationSlider;
MyGUI::ScrollBar* mAreaSlider; MyGUI::ScrollBar* mAreaSlider;
MyGUI::ScrollBar* mAreaText; MyGUI::TextBox* mAreaText;
MyGUI::ImageBox* mEffectImage; MyGUI::ImageBox* mEffectImage;
MyGUI::TextBox* mEffectName; MyGUI::TextBox* mEffectName;
@ -46,7 +49,7 @@ namespace MWGui
void onCancelButtonClicked (MyGUI::Widget* sender); void onCancelButtonClicked (MyGUI::Widget* sender);
protected: protected:
int mRange; ESM::ENAMstruct mEffect;
}; };
class SpellCreationDialog : public WindowBase, public ReferenceInterface class SpellCreationDialog : public WindowBase, public ReferenceInterface
@ -77,6 +80,9 @@ namespace MWGui
EditEffectDialog mAddEffectDialog; EditEffectDialog mAddEffectDialog;
SelectAttributeDialog* mSelectAttributeDialog;
SelectSkillDialog* mSelectSkillDialog;
}; };
} }

View file

@ -250,10 +250,12 @@ namespace MWGui
void setSpellEffect(const SpellEffectParams& params); void setSpellEffect(const SpellEffectParams& params);
static std::string effectIDToString(const short effectID); static std::string effectIDToString(const short effectID);
bool effectHasMagnitude (const std::string& effect);
bool effectHasDuration (const std::string& effect); /// \todo Remove all of these! The information can be obtained via the ESM::MagicEffect's flags!
bool effectInvolvesAttribute (const std::string& effect); static bool effectHasMagnitude (const std::string& effect);
bool effectInvolvesSkill (const std::string& effect); static bool effectHasDuration (const std::string& effect);
static bool effectInvolvesAttribute (const std::string& effect);
static bool effectInvolvesSkill (const std::string& effect);
int getRequestedWidth() const { return mRequestedWidth; } int getRequestedWidth() const { return mRequestedWidth; }