forked from MrBesen/lolautoaccept
implement subgroups in rune editor
This commit is contained in:
parent
df78570e51
commit
7d5f61dba8
|
@ -19,6 +19,9 @@ public:
|
|||
constexpr const QVector<int>& getSelectedRunes() const { return selectedRune; }
|
||||
constexpr uint32_t getSize() const { return size; }
|
||||
|
||||
void setSubgroups(const QVector<QVector<int>>& 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<int> selectedRune;
|
||||
QVector<QVector<int>> subgroups; // might be empty
|
||||
uint32_t size = 0;
|
||||
};
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
#include <QDebug>
|
||||
|
||||
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<int>& newRunes) {
|
|||
emit changed();
|
||||
}
|
||||
|
||||
void RuneAspektButtonGroup::setSubgroups(const QVector<QVector<int>>& 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<int>& subgroup : subgroups) {
|
||||
if(subgroup.contains(aspektId)) {
|
||||
for(const int& subgroupMember : subgroup) {
|
||||
if(aspektId != subgroupMember && selectedRune.contains(subgroupMember)) {
|
||||
return subgroupMember;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return INVALID_ASPEKT_ID;
|
||||
}
|
||||
|
|
|
@ -126,15 +126,21 @@ void RuneEditor::selectSubStyle(uint32_t id) {
|
|||
clearLayout(ui->substylePerks);
|
||||
delete groups.at(4);
|
||||
|
||||
QVector<QVector<int>> 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<int> 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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue