#include "runeaspektbuttongroup.h" #include "runeaspektbutton.h" #include const int RuneAspektButtonGroup::INVALID_ASPEKT_ID = 0; RuneAspektButtonGroup::RuneAspektButtonGroup(QObject* parent, uint32_t size) : QObject(parent), selectedRune(), size(size) { selectedRune.reserve(size*2); } RuneAspektButtonGroup::~RuneAspektButtonGroup() {} void RuneAspektButtonGroup::addButton(RuneAspektButton* button) { QObject::connect(this, &RuneAspektButtonGroup::changed, button, &RuneAspektButton::dataChanged); QObject::connect(button, &RuneAspektButton::aspektToggled, this, &RuneAspektButtonGroup::buttonPressed); button->setButtonGroup(this); } void RuneAspektButtonGroup::setSelectedRunes(const QVector& newRunes) { selectedRune = newRunes; qDebug() << "selectedRunes changed to: " << selectedRune << " refesching buttons"; 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) { selectedRune.removeFirst(); } } 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; }