diff --git a/src/advancebuttondialog.cpp b/src/advancebuttondialog.cpp index 0e3e06c2..8eb97de2 100755 --- a/src/advancebuttondialog.cpp +++ b/src/advancebuttondialog.cpp @@ -585,35 +585,38 @@ void AdvanceButtonDialog::joinSlot() SimpleKeyGrabberButton *blankButton = new SimpleKeyGrabberButton(this); QList listItems = ui->slotListWidget->selectedItems(); - QList els; for(auto item : listItems) { if (!firstTime) text += "+"; firstTime = false; - int indexInner = ui->slotListWidget->row(item); - auto currItem = ui->slotListWidget->takeItem(indexInner); + SimpleKeyGrabberButton* firstGrabBtn = item->data(Qt::UserRole).value(); - SimpleKeyGrabberButton* firstGrabBtn = currItem->data(Qt::UserRole).value(); - - JoyButtonSlot* slotmini = new JoyButtonSlot(firstGrabBtn->getValue()->getSlotCode(), firstGrabBtn->getValue()->getSlotCodeAlias(), firstGrabBtn->getValue()->getSlotMode()); if (firstGrabBtn->getValue()->getMixSlots()->count() > 0) { - blankButton->getValue()->appendMiniSlot>(*firstGrabBtn->getValue()->getMixSlots()); + QList slotsList; + + for(auto mini : *firstGrabBtn->getValue()->getMixSlots()) + slotsList.append(new JoyButtonSlot(mini->getSlotCode(), mini->getSlotCodeAlias(), mini->getSlotMode())); + + blankButton->getValue()->appendMiniSlot>(slotsList); } else { + JoyButtonSlot* slotmini = new JoyButtonSlot(firstGrabBtn->getValue()->getSlotCode(), firstGrabBtn->getValue()->getSlotCodeAlias(), firstGrabBtn->getValue()->getSlotMode()); + blankButton->getValue()->appendMiniSlot(slotmini); } text += firstGrabBtn->getValue()->getSlotString(); - (&helper)->removeAssignedSlot(indexInner); - delete currItem; + } + deleteSlot(false); + for(auto x : *blankButton->getValue()->getMixSlots()) { qDebug() << "JOINED MINI: " << x->getSlotCode() << " - " << x->getSlotMode() << " - " << x->getSlotString(); @@ -639,27 +642,12 @@ void AdvanceButtonDialog::joinSlot() connectButtonEvents(blankButton); blankButton->refreshButtonLabel(); // instead of blankButton->setText(text); - // it can be used as reusable code - - // emit slotsChanged(); - - QMetaObject::invokeMethod(&helper, "insertAssignedSlot", Qt::BlockingQueuedConnection, Q_ARG(JoyButtonSlot*, blankButton->getValue()), Q_ARG(int, index), Q_ARG(bool, false)); } - int j = 1; - qDebug() << "Assigned list slots after joining"; - for(auto el : *getButton()->getAssignedSlots()) - { - qDebug() << j << ")"; - qDebug() << "code: " << el->getSlotCode(); - qDebug() << "mode: " << el->getSlotMode(); - qDebug() << "string: " << el->getSlotString(); - j++; - } joinLock.unlock(); } @@ -713,8 +701,18 @@ void AdvanceButtonDialog::splitSlot() ui->slotListWidget->insertItem(qMax(0,indexKeyboardSlot), splittedItem); + // blankButton->setValue(slotmini->getSlotCode(), + // slotmini->getSlotCodeAlias(), + // slotmini->getSlotMode()); + + + + blankButton->setValue(slotmini); + delete slotmini; + slotmini = nullptr; + splittedItem->setData(Qt::UserRole, QVariant::fromValue(blankButton)); @@ -730,10 +728,10 @@ void AdvanceButtonDialog::splitSlot() blankButton->refreshButtonLabel(); // instead of blankButton->setText(text); QMetaObject::invokeMethod(&helper, "insertAssignedSlot", Qt::BlockingQueuedConnection, - Q_ARG(int, slotmini->getSlotCode()), - Q_ARG(int, slotmini->getSlotCodeAlias()), + Q_ARG(int, blankButton->getValue()->getSlotCode()), + Q_ARG(int, blankButton->getValue()->getSlotCodeAlias()), Q_ARG(int, indexKeyboardSlot), - Q_ARG(JoyButtonSlot::JoySlotInputAction, slotmini->getSlotMode())); + Q_ARG(JoyButtonSlot::JoySlotInputAction, blankButton->getValue()->getSlotMode())); indexKeyboardSlot++; } diff --git a/src/inputdaemon.cpp b/src/inputdaemon.cpp index b3398dbf..484739f5 100755 --- a/src/inputdaemon.cpp +++ b/src/inputdaemon.cpp @@ -307,6 +307,11 @@ void InputDaemon::deleteJoysticks() { InputDevice *joystick = iter.next().value(); + for (auto el : joystick->getJoystick_sets().values()) + { + + } + if (joystick != nullptr) { delete joystick; diff --git a/src/joybutton.cpp b/src/joybutton.cpp index ffd3e5ec..9179ae02 100755 --- a/src/joybutton.cpp +++ b/src/joybutton.cpp @@ -687,10 +687,11 @@ void JoyButton::activateSlots() JoyButtonSlot *slotmini = it->next(); qDebug() << "Run activated mini slot - name - deviceCode - mode: " << slotmini->getSlotString() << " - " << slotmini->getSlotCode() << " - " << slotmini->getSlotMode(); - MiniSlotRun* minijob = new MiniSlotRun(slot, slotmini, this, timeBetweenMiniSlots * timeX); + MiniSlotRun* minijob = new MiniSlotRun(slotmini, this, timeBetweenMiniSlots * timeX); minijob->setAutoDelete(false); + threadPool->start(minijob); timeX--; @@ -717,7 +718,7 @@ void JoyButton::activateSlots() else { qDebug() << "Check now simple slots"; - addEachSlotToActives(slot, firstTime, i, delaySequence, exit, slotiter); + addEachSlotToActives(slot, i, delaySequence, exit, slotiter); firstTime = false; } } @@ -734,7 +735,7 @@ void JoyButton::activateSlots() } -void JoyButton::activateMiniSlots(JoyButtonSlot* slot, JoyButtonSlot* mix) +void JoyButton::activateMiniSlots(JoyButtonSlot* slot) { int tempcode = slot->getSlotCode(); JoyButtonSlot::JoySlotInputAction mode = slot->getSlotMode(); @@ -745,39 +746,18 @@ void JoyButton::activateMiniSlots(JoyButtonSlot* slot, JoyButtonSlot* mix) { sendevent(slot, true); - getActiveSlotsLocal().append(slot); + getActiveSlotsLocal().append(slot); int oldvalue = GlobalVariables::JoyButton::JoyButton::activeKeys.value(tempcode, 0) + 1; GlobalVariables::JoyButton::JoyButton::activeKeys.insert(tempcode, oldvalue); - //qDebug() << "There has been assigned a lastActiveKey: " << mix->getSlotString(); - - if (!slot->isModifierKey()) - { - qDebug() << "There has been assigned a lastActiveKey " << slot->getSlotString(); - - lastActiveKey = slot; - } - else - { - qDebug() << "It's not modifier key. lastActiveKey is null pointer"; - - lastActiveKey = nullptr; - } - - break; + break; } } } -void JoyButton::addEachSlotToActives(JoyButtonSlot* slot, bool firstTime, int& i, bool& delaySequence, bool& exit, QListIterator* slotiter) +void JoyButton::addEachSlotToActives(JoyButtonSlot* slot, int& i, bool& delaySequence, bool& exit, QListIterator* slotiter) { - /* if (firstTime) - { - getActiveSlotsLocal().clear(); - GlobalVariables::JoyButton::JoyButton::activeKeys.clear(); - }*/ - int tempcode = slot->getSlotCode(); JoyButtonSlot::JoySlotInputAction mode = slot->getSlotMode(); @@ -3351,21 +3331,7 @@ void JoyButton::clearAssignedSlots(bool signalEmit) { if (slot->getMixSlots() != nullptr && slot->getMixSlots() != NULL) { - if (!slot->getMixSlots()->isEmpty()) - { - QListIterator i(*slot->getMixSlots()); - while (i.hasNext()) - { - auto el = i.next(); - delete el; - } - - slot->getMixSlots()->clear(); - } - - delete slot->getMixSlots(); - slot->assignMixSlotsToNull(); - qDebug() << "list of mix slots is a null pointer? " << ((slot->getMixSlots() == nullptr) ? "yes" : "no"); + slot->cleanMixSlots(); } @@ -3410,20 +3376,14 @@ void JoyButton::removeAssignedSlot(int index) slot->getMixSlots()->clear(); delete slot->getMixSlots(); slot->assignMixSlotsToNull(); + + getAssignedSlots()->removeAt(index); } - - - // there is such problem: - // splitting after joining without saving joining action - // bases on data on SimpleKeyGrabberButton which has JoyButtonSlot not dynamically allocated - // so when we do "delete slot" here, exception will occur because JoyButtonSlot is automatically - // deleted as a class member that has QObject as an ancestor - // but when we try to split after start of the application - // there is no problem to do "delete slot" - + else + { delete slot; slot = nullptr; - + } tempAssignLocker.unlock(); buildActiveZoneSummaryString(); diff --git a/src/joybutton.h b/src/joybutton.h index 5c50480c..e3c9aaa1 100755 --- a/src/joybutton.h +++ b/src/joybutton.h @@ -94,7 +94,7 @@ public: void setStartAccelMultiplier(double value); void setMaxAccelThreshold(double value); void setChangeSetSelection(int index, bool updateActiveString=true); - void activateMiniSlots(JoyButtonSlot* slot, JoyButtonSlot* mix); + void activateMiniSlots(JoyButtonSlot* slot); bool hasPendingEvent(); // JoyButtonEvents class bool getToggleState(); @@ -598,7 +598,7 @@ private: QThreadPool *threadPool; - void addEachSlotToActives(JoyButtonSlot *slot, bool firstTime, int &i, bool &delaySequence, bool &exit, QListIterator *slotiter); + void addEachSlotToActives(JoyButtonSlot *slot, int &i, bool &delaySequence, bool &exit, QListIterator *slotiter); }; @@ -606,8 +606,7 @@ class MiniSlotRun : public QRunnable, public QObject { public: - MiniSlotRun(JoyButtonSlot* slot, JoyButtonSlot* slotmini, JoyButton* btn, int milisec) : - m_slot(slot), + MiniSlotRun(JoyButtonSlot* slotmini, JoyButton* btn, int milisec) : m_slotmini(slotmini), m_btn(btn), m_miliseconds(milisec), @@ -618,26 +617,16 @@ public: ~MiniSlotRun() { - // m_slot = nullptr; - // m_slotmini = nullptr; - // m_btn = nullptr; } void run() { - this->thread()->wait(m_miliseconds); - /* QDeadlineTimer deadline(m_miliseconds); - while(!deadline.hasExpired()) - { - // wait - }*/ - m_btn->activateMiniSlots(m_slotmini, m_slot); + m_btn->activateMiniSlots(m_slotmini); } private: - JoyButtonSlot* m_slot; JoyButtonSlot* m_slotmini; JoyButton* m_btn; int m_miliseconds; diff --git a/src/joybuttonslot.cpp b/src/joybuttonslot.cpp index 9b9ffbb5..e66a7c62 100755 --- a/src/joybuttonslot.cpp +++ b/src/joybuttonslot.cpp @@ -93,7 +93,7 @@ JoyButtonSlot::JoyButtonSlot(JoyButtonSlot *slot, QObject *parent) : easingActive = false; m_textData = slot->m_textData; extraData = slot->extraData; - //setMixSlots(slot->mix_slots); + // setMixSlots(slot->mix_slots); } @@ -563,13 +563,12 @@ QVariant JoyButtonSlot::getExtraData() return extraData; } - void JoyButtonSlot::secureMixSlotsInit() { if (mix_slots == nullptr) { mix_slots = new QList(); - // connect(qApp, &QApplication::aboutToQuit, this, &JoyButtonSlot::cleanMixSlots); + // connect(qApp, &QApplication::aboutToQuit, this, &JoyButtonSlot::cleanMixSlots); } } @@ -587,9 +586,9 @@ void JoyButtonSlot::assignMixSlotsToNull() } -//void JoyButtonSlot::cleanMixSlots() -//{ - /*if (mix_slots != nullptr) +void JoyButtonSlot::cleanMixSlots() +{ + if (mix_slots != nullptr) { // disconnect(qApp, &QApplication::aboutToQuit, this, &JoyButtonSlot::cleanMixSlots); @@ -601,27 +600,13 @@ void JoyButtonSlot::assignMixSlotsToNull() delete mix_slots; mix_slots = nullptr; - }*/ -//} + } +} void JoyButtonSlot::setMixSlots(QList *mixSlots) { - //cleanMixSlots(); - - /* for(auto el : *mixSlots) - { - JoyButtonSlot* slot = new JoyButtonSlot(el->getSlotCode(), el->getSlotCodeAlias(), el->getSlotMode(), this); - mix_slots->append(slot); - }*/ - mix_slots = mixSlots; - - if (mix_slots != nullptr) - { - // disconnect(qApp, &QApplication::aboutToQuit, this, &JoyButtonSlot::cleanMixSlots); - // connect(qApp, &QApplication::aboutToQuit, this, &JoyButtonSlot::cleanMixSlots); - } } diff --git a/src/joybuttonslot.h b/src/joybuttonslot.h index b4387842..2a28c332 100755 --- a/src/joybuttonslot.h +++ b/src/joybuttonslot.h @@ -94,11 +94,11 @@ public: bool isValidSlot(); + void cleanMixSlots(); + JoyButtonSlot& operator=(JoyButtonSlot* slot); -//private slots: - // void cleanMixSlots(); private: diff --git a/src/joycontrolstick.cpp b/src/joycontrolstick.cpp index bc300e08..fecad959 100755 --- a/src/joycontrolstick.cpp +++ b/src/joycontrolstick.cpp @@ -1251,6 +1251,8 @@ void JoyControlStick::writeConfig(QXmlStreamWriter *xml) JoyControlStickButton *button = iter.next().value(); JoyButtonXml* joyButtonXml = new JoyButtonXml(button); joyButtonXml->writeConfig(xml); + delete joyButtonXml; + joyButtonXml = nullptr; } if (!modifierButton->isDefault()) diff --git a/src/xml/joybuttonxml.cpp b/src/xml/joybuttonxml.cpp index 2b137e8a..f02bc4c6 100644 --- a/src/xml/joybuttonxml.cpp +++ b/src/xml/joybuttonxml.cpp @@ -532,6 +532,8 @@ void JoyButtonXml::writeConfig(QXmlStreamWriter *xml) JoyButtonSlot *buttonslot = iter.next(); JoyButtonSlotXml* buttonslotxml = new JoyButtonSlotXml(buttonslot); buttonslotxml->writeConfig(xml); + delete buttonslotxml; + buttonslotxml = nullptr; } xml->writeEndElement(); diff --git a/src/xml/setjoystickxml.cpp b/src/xml/setjoystickxml.cpp index d3ded148..eff200da 100644 --- a/src/xml/setjoystickxml.cpp +++ b/src/xml/setjoystickxml.cpp @@ -149,6 +149,8 @@ void SetJoystickXml::writeConfig(QXmlStreamWriter *xml) { JoyDPadXml* joydpadXml = new JoyDPadXml(vdpad.next()); joydpadXml->writeConfig(xml); + delete joydpadXml; + joydpadXml = nullptr; } @@ -163,6 +165,9 @@ void SetJoystickXml::writeConfig(QXmlStreamWriter *xml) { joyAxisXml->writeConfig(xml); } + + delete joyAxisXml; + joyAxisXml = nullptr; } @@ -172,6 +177,8 @@ void SetJoystickXml::writeConfig(QXmlStreamWriter *xml) { JoyDPadXml* joydpadXml = new JoyDPadXml(dpad.next()); joydpadXml->writeConfig(xml); + delete joydpadXml; + joydpadXml = nullptr; } @@ -184,6 +191,8 @@ void SetJoystickXml::writeConfig(QXmlStreamWriter *xml) { JoyButtonXml* joyButtonXml = new JoyButtonXml(buttonCurr); joyButtonXml->writeConfig(xml); + delete joyButtonXml; + joyButtonXml = nullptr; } }