From 7d5f61dba89ecb6153a1264244c946bb52fc8e84 Mon Sep 17 00:00:00 2001 From: mrbesen Date: Mon, 19 Jun 2023 20:58:55 +0200 Subject: [PATCH] implement subgroups in rune editor --- include/runeaspektbuttongroup.h | 8 ++++++++ src/runeaspektbuttongroup.cpp | 33 +++++++++++++++++++++++++++++++++ src/runeeditor.cpp | 9 +++++++++ 3 files changed, 50 insertions(+) diff --git a/include/runeaspektbuttongroup.h b/include/runeaspektbuttongroup.h index 7af4f63..3b1d2eb 100644 --- a/include/runeaspektbuttongroup.h +++ b/include/runeaspektbuttongroup.h @@ -19,6 +19,9 @@ public: constexpr const QVector& getSelectedRunes() const { return selectedRune; } constexpr uint32_t getSize() const { return size; } + void setSubgroups(const QVector>& newSubgroups); + + static const int INVALID_ASPEKT_ID; signals: void changed(); // signal that the group was changed -> all buttons should refresh @@ -26,6 +29,11 @@ private slots: void buttonPressed(int aspektId); private: + // try to fetch a aspektId, that is in selectedRune and in the same subgroup as aspektId + // return 0 when no suitable candidate is found + int getOtherSubgroupMemeber(int aspketId); + QVector selectedRune; + QVector> subgroups; // might be empty uint32_t size = 0; }; diff --git a/src/runeaspektbuttongroup.cpp b/src/runeaspektbuttongroup.cpp index 609fc84..b3e5df0 100644 --- a/src/runeaspektbuttongroup.cpp +++ b/src/runeaspektbuttongroup.cpp @@ -4,6 +4,8 @@ #include +const int RuneAspektButtonGroup::INVALID_ASPEKT_ID = 0; + RuneAspektButtonGroup::RuneAspektButtonGroup(QObject* parent, uint32_t size) : QObject(parent), selectedRune(), size(size) { selectedRune.reserve(size*2); } @@ -25,10 +27,21 @@ void RuneAspektButtonGroup::setSelectedRunes(const QVector& newRunes) { emit changed(); } +void RuneAspektButtonGroup::setSubgroups(const QVector>& newSubgroups) { + subgroups = newSubgroups; +} + void RuneAspektButtonGroup::buttonPressed(int aspektId) { if(selectedRune.contains(aspektId)) { selectedRune.removeAll(aspektId); } else { + // check subgroups first + int otherSubgroupMember = getOtherSubgroupMemeber(aspektId); + if(otherSubgroupMember != INVALID_ASPEKT_ID) { + // collision in subgroup -> remove other member + selectedRune.removeAll(otherSubgroupMember); + } + selectedRune.push_back(aspektId); if((uint32_t) selectedRune.size() > size) { @@ -38,3 +51,23 @@ void RuneAspektButtonGroup::buttonPressed(int aspektId) { emit changed(); } + +int RuneAspektButtonGroup::getOtherSubgroupMemeber(int aspektId) { + if(subgroups.empty()) { + return INVALID_ASPEKT_ID; + } + + for(const QVector& subgroup : subgroups) { + if(subgroup.contains(aspektId)) { + for(const int& subgroupMember : subgroup) { + if(aspektId != subgroupMember && selectedRune.contains(subgroupMember)) { + return subgroupMember; + } + } + + break; + } + } + + return INVALID_ASPEKT_ID; +} diff --git a/src/runeeditor.cpp b/src/runeeditor.cpp index 716f3d0..3f5db09 100644 --- a/src/runeeditor.cpp +++ b/src/runeeditor.cpp @@ -126,15 +126,21 @@ void RuneEditor::selectSubStyle(uint32_t id) { clearLayout(ui->substylePerks); delete groups.at(4); + QVector> subgroups; + subgroups.reserve(substyle->runeSlots.size()); + // populate perks RuneAspektButtonGroup* group = new RuneAspektButtonGroup(this, 2); for(size_t idx = 0; idx < substyle->runeSlots.size(); ++idx) { const RuneStyleSlot& rss = substyle->runeSlots.at(idx); + QVector subgroup; + subgroup.reserve(rss.perks.size()); if(rss.type != "kMixedRegularSplashable") continue; for(int perkNr = 0; perkNr < (int) rss.perks.size(); ++perkNr) { uint32_t perk = rss.perks.at(perkNr); + subgroup.append((int) perk); RuneAspektButton* aspektBtn = createAspektButton(perk); if(!aspektBtn) continue; @@ -143,7 +149,10 @@ void RuneEditor::selectSubStyle(uint32_t id) { ui->substylePerks->addWidget(aspektBtn, idx, perkNr); } + + subgroups.append(subgroup); } + group->setSubgroups(subgroups); groups.replace(4, group); } }