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 const QVector<int>& getSelectedRunes() const { return selectedRune; }
|
||||||
constexpr uint32_t getSize() const { return size; }
|
constexpr uint32_t getSize() const { return size; }
|
||||||
|
|
||||||
|
void setSubgroups(const QVector<QVector<int>>& newSubgroups);
|
||||||
|
|
||||||
|
static const int INVALID_ASPEKT_ID;
|
||||||
signals:
|
signals:
|
||||||
void changed(); // signal that the group was changed -> all buttons should refresh
|
void changed(); // signal that the group was changed -> all buttons should refresh
|
||||||
|
|
||||||
|
@ -26,6 +29,11 @@ private slots:
|
||||||
void buttonPressed(int aspektId);
|
void buttonPressed(int aspektId);
|
||||||
|
|
||||||
private:
|
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<int> selectedRune;
|
||||||
|
QVector<QVector<int>> subgroups; // might be empty
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
|
const int RuneAspektButtonGroup::INVALID_ASPEKT_ID = 0;
|
||||||
|
|
||||||
RuneAspektButtonGroup::RuneAspektButtonGroup(QObject* parent, uint32_t size) : QObject(parent), selectedRune(), size(size) {
|
RuneAspektButtonGroup::RuneAspektButtonGroup(QObject* parent, uint32_t size) : QObject(parent), selectedRune(), size(size) {
|
||||||
selectedRune.reserve(size*2);
|
selectedRune.reserve(size*2);
|
||||||
}
|
}
|
||||||
|
@ -25,10 +27,21 @@ void RuneAspektButtonGroup::setSelectedRunes(const QVector<int>& newRunes) {
|
||||||
emit changed();
|
emit changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RuneAspektButtonGroup::setSubgroups(const QVector<QVector<int>>& newSubgroups) {
|
||||||
|
subgroups = newSubgroups;
|
||||||
|
}
|
||||||
|
|
||||||
void RuneAspektButtonGroup::buttonPressed(int aspektId) {
|
void RuneAspektButtonGroup::buttonPressed(int aspektId) {
|
||||||
if(selectedRune.contains(aspektId)) {
|
if(selectedRune.contains(aspektId)) {
|
||||||
selectedRune.removeAll(aspektId);
|
selectedRune.removeAll(aspektId);
|
||||||
} else {
|
} 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);
|
selectedRune.push_back(aspektId);
|
||||||
|
|
||||||
if((uint32_t) selectedRune.size() > size) {
|
if((uint32_t) selectedRune.size() > size) {
|
||||||
|
@ -38,3 +51,23 @@ void RuneAspektButtonGroup::buttonPressed(int aspektId) {
|
||||||
|
|
||||||
emit changed();
|
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);
|
clearLayout(ui->substylePerks);
|
||||||
delete groups.at(4);
|
delete groups.at(4);
|
||||||
|
|
||||||
|
QVector<QVector<int>> subgroups;
|
||||||
|
subgroups.reserve(substyle->runeSlots.size());
|
||||||
|
|
||||||
// populate perks
|
// populate perks
|
||||||
RuneAspektButtonGroup* group = new RuneAspektButtonGroup(this, 2);
|
RuneAspektButtonGroup* group = new RuneAspektButtonGroup(this, 2);
|
||||||
for(size_t idx = 0; idx < substyle->runeSlots.size(); ++idx) {
|
for(size_t idx = 0; idx < substyle->runeSlots.size(); ++idx) {
|
||||||
const RuneStyleSlot& rss = substyle->runeSlots.at(idx);
|
const RuneStyleSlot& rss = substyle->runeSlots.at(idx);
|
||||||
|
QVector<int> subgroup;
|
||||||
|
subgroup.reserve(rss.perks.size());
|
||||||
|
|
||||||
if(rss.type != "kMixedRegularSplashable") continue;
|
if(rss.type != "kMixedRegularSplashable") continue;
|
||||||
|
|
||||||
for(int perkNr = 0; perkNr < (int) rss.perks.size(); ++perkNr) {
|
for(int perkNr = 0; perkNr < (int) rss.perks.size(); ++perkNr) {
|
||||||
uint32_t perk = rss.perks.at(perkNr);
|
uint32_t perk = rss.perks.at(perkNr);
|
||||||
|
subgroup.append((int) perk);
|
||||||
|
|
||||||
RuneAspektButton* aspektBtn = createAspektButton(perk);
|
RuneAspektButton* aspektBtn = createAspektButton(perk);
|
||||||
if(!aspektBtn) continue;
|
if(!aspektBtn) continue;
|
||||||
|
@ -143,7 +149,10 @@ void RuneEditor::selectSubStyle(uint32_t id) {
|
||||||
|
|
||||||
ui->substylePerks->addWidget(aspektBtn, idx, perkNr);
|
ui->substylePerks->addWidget(aspektBtn, idx, perkNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
subgroups.append(subgroup);
|
||||||
}
|
}
|
||||||
|
group->setSubgroups(subgroups);
|
||||||
groups.replace(4, group);
|
groups.replace(4, group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue