diff --git a/src/autoprofilewatcher.cpp b/src/autoprofilewatcher.cpp index 14db7abd..759c6580 100755 --- a/src/autoprofilewatcher.cpp +++ b/src/autoprofilewatcher.cpp @@ -508,13 +508,19 @@ void AutoProfileWatcher::syncProfileAssignment() exe = settings->value(QString("AutoProfile%1Exe").arg(i), "").toString(); exe = QDir::toNativeSeparators(exe); //guid = settings->value(QString("AutoProfile%1GUID").arg(i), "").toString(); - uniqueID = settings->value(QString("AutoProfile%UniqueID").arg(i), "").toString(); + + convToUniqueIDAutoProfGroupSett(settings, QString("AutoProfile%1GUID").arg(i), QString("AutoProfile%1UniqueID").arg(i)); + + uniqueID = settings->value(QString("AutoProfile%1UniqueID").arg(i), "").toString(); profile = settings->value(QString("AutoProfile%1Profile").arg(i), "").toString(); active = settings->value(QString("AutoProfile%1Active").arg(i), 0).toString(); windowName = settings->value(QString("AutoProfile%1WindowName").arg(i), "").toString(); QString partialTitle = settings->value(QString("AutoProfile%1PartialTitle").arg(i), 0).toString(); bool partialTitleBool = partialTitle == "1" ? true : false; + + + #ifdef Q_OS_UNIX windowClass = settings->value(QString("AutoProfile%1WindowClass").arg(i), "").toString(); #else @@ -614,6 +620,8 @@ void AutoProfileWatcher::syncProfileAssignment() settings->getLock()->unlock(); } + + void AutoProfileWatcher::clearProfileAssignments() { qInstallMessageHandler(MessageHandler::myMessageOutput); @@ -772,3 +780,13 @@ QSet& AutoProfileWatcher::getUniqeIDSetLocal() { return uniqueIDSet; } + + +void AutoProfileWatcher::convToUniqueIDAutoProfGroupSett(QSettings* sett, QString guidAutoProfSett, QString uniqueAutoProfSett) +{ + if (sett->contains(guidAutoProfSett)) + { + sett->setValue(uniqueAutoProfSett, sett->value(guidAutoProfSett)); + sett->remove(guidAutoProfSett); + } +} diff --git a/src/autoprofilewatcher.h b/src/autoprofilewatcher.h index bbd42969..5eebce9b 100755 --- a/src/autoprofilewatcher.h +++ b/src/autoprofilewatcher.h @@ -26,6 +26,7 @@ class AntiMicroSettings; class AutoProfileInfo; +class QSettings; class AutoProfileWatcher : public QObject { @@ -54,6 +55,7 @@ public: protected: QString findAppLocation(); void clearProfileAssignments(); + void convToUniqueIDAutoProfGroupSett(QSettings* sett, QString guidAutoProfSett, QString uniqueAutoProfSett); signals: void foundApplicableProfile(AutoProfileInfo *info); diff --git a/src/gamecontrollermappingdialog.cpp b/src/gamecontrollermappingdialog.cpp index af5960f1..4f1457d4 100755 --- a/src/gamecontrollermappingdialog.cpp +++ b/src/gamecontrollermappingdialog.cpp @@ -347,6 +347,7 @@ void GameControllerMappingDialog::saveChanges() settings->getLock()->lock(); // settings->setValue(QString("Mappings/").append(device->getGUIDString()), mappingString); // settings->setValue(QString("Mappings/%1%2").arg(device->getGUIDString()).arg("Disable"), "0"); + settings->setValue(QString("Mappings/").append(device->getUniqueIDString()), mappingString); settings->setValue(QString("Mappings/%1%2").arg(device->getUniqueIDString()).arg("Disable"), "0"); settings->sync(); diff --git a/src/inputdaemon.cpp b/src/inputdaemon.cpp index 5d8503f0..ccabc0d4 100755 --- a/src/inputdaemon.cpp +++ b/src/inputdaemon.cpp @@ -611,6 +611,12 @@ void InputDaemon::addInputDevice(int index) productID = QString(buffer); } + if (m_settings->contains(QString("%1Disable").arg(guidText))) + { + m_settings->setValue(QString("%1Disable").arg(guidText + vendor + productID), m_settings->value(QString("%1Disable").arg(guidText))); + m_settings->remove(QString("%1Disable").arg(guidText)); + } + bool disableGameController = m_settings->value(QString("%1Disable").arg(guidText + vendor + productID), false).toBool(); if (SDL_IsGameController(index) && !disableGameController) diff --git a/src/inputdevice.cpp b/src/inputdevice.cpp index 87c1de8b..8292b096 100755 --- a/src/inputdevice.cpp +++ b/src/inputdevice.cpp @@ -1322,11 +1322,12 @@ QString InputDevice::getStringIdentifier() qInstallMessageHandler(MessageHandler::myMessageOutput); QString identifier = QString(); - //QString tempGUID = getGUIDString(); + // QString tempGUID = getGUIDString(); QString tempUniqueID = getUniqueIDString(); QString tempName = getSDLName(); if (!tempUniqueID.isEmpty()) identifier = tempUniqueID; + // else if (!tempGUID.isEmpty()) identifier = tempGUID; else if (!tempName.isEmpty()) identifier = tempName; return identifier; @@ -1540,6 +1541,8 @@ bool InputDevice::isKnownController() // if (m_settings->contains(getGUIDString())) result = true; // else if (m_settings->contains(QString("%1%2").arg(getGUIDString()).arg("Disabled"))) result = true; + convertToUniqueMappSett(m_settings, getGUIDString(), getUniqueIDString()); + convertToUniqueMappSett(m_settings, (QString("%1%2").arg(getGUIDString()).arg("Disabled")), (QString("%1%2").arg(getUniqueIDString()).arg("Disabled"))); if (m_settings->contains(getUniqueIDString())) result = true; else if (m_settings->contains(QString("%1%2").arg(getUniqueIDString()).arg("Disabled"))) result = true; @@ -1867,6 +1870,27 @@ void InputDevice::rawAxisEvent(int index, int value) emit rawAxisMoved(index, value); } +void InputDevice::convertToUniqueMappSett(QSettings* sett, QString gUIDmappGroupSett, QString uniqueIDGroupSett) +{ + if (sett->contains(gUIDmappGroupSett)) + { + if (sett->contains(getGUIDString()) && (sett->value(getGUIDString()).toString().split(",").first() == getGUIDString())) + { + QStringList gg = sett->value(getGUIDString()).toString().split(","); + gg.removeFirst(); + gg.prepend(getUniqueIDString()); + sett->setValue(uniqueIDGroupSett, sett->value(gg.join(","))); + } + else + { + sett->setValue(uniqueIDGroupSett, sett->value(gUIDmappGroupSett)); + } + + sett->remove(gUIDmappGroupSett); + } + +} + QHash& InputDevice::getJoystick_sets() { return joystick_sets; diff --git a/src/inputdevice.h b/src/inputdevice.h index e96c9566..af51d22a 100755 --- a/src/inputdevice.h +++ b/src/inputdevice.h @@ -31,7 +31,7 @@ class AntiMicroSettings; class SetJoystick; class QXmlStreamReader; class QXmlStreamWriter; - +class QSettings; class InputDevice : public QObject { @@ -122,6 +122,7 @@ public: void activatePossibleDPadEvents(); // InputDeviceHat class void activatePossibleVDPadEvents(); // InputDeviceVDPad class void activatePossibleButtonEvents(); // InputDeviceButton class + void convertToUniqueMappSett(QSettings* sett, QString gUIDmappGroupSett, QString uniqueIDGroupSett); //bool isEmptyGUID(QString tempGUID); bool isEmptyUniqueID(QString tempUniqueID); diff --git a/src/joytabwidget.cpp b/src/joytabwidget.cpp index 05d34699..27b2d050 100755 --- a/src/joytabwidget.cpp +++ b/src/joytabwidget.cpp @@ -997,6 +997,11 @@ void JoyTabWidget::saveSettings() QString identifier = m_joystick->getStringIdentifier(); +// convToUniqueIDControllerGroupSett(m_settings, QString("Controller%1").arg(m_joystick->getGUIDString()), QString("Controller%1").arg(m_joystick->getUniqueIDString())); +// convToUniqueIDControllerGroupSett(m_settings, QString("Controller%1ConfigFile%2").arg(m_joystick->getGUIDString()), QString("Controller%1ConfigFile%2").arg(m_joystick->getUniqueIDString())); +// convToUniqueIDControllerGroupSett(m_settings, QString("Controller%1LastSelected").arg(m_joystick->getGUIDString()), QString("Controller%1LastSelected").arg(m_joystick->getUniqueIDString())); +// convToUniqueIDControllerGroupSett(m_settings, QString("Controller%1ProfileName%2").arg(m_joystick->getGUIDString()), QString("Controller%1ProfileName%2").arg(m_joystick->getUniqueIDString())); + QString controlEntryPrefix = QString("Controller%1").arg(identifier); QString controlEntryString = QString("Controller%1ConfigFile%2").arg(identifier); QString controlEntryLastSelected = QString("Controller%1LastSelected").arg(identifier); @@ -1005,6 +1010,7 @@ void JoyTabWidget::saveSettings() // Remove current settings for a controller QStringList tempkeys = m_settings->allKeys(); QStringListIterator iter(tempkeys); + while (iter.hasNext()) { QString tempstring = iter.next(); @@ -1146,10 +1152,13 @@ void JoyTabWidget::loadSettings(bool forceRefresh) m_settings->beginGroup("Controllers"); + convToUniqueIDControllerGroupSett(m_settings, QString("Controller%1LastSelected").arg(m_joystick->getGUIDString()), QString("Controller%1LastSelected").arg(m_joystick->getUniqueIDString())); + QString controlEntryString = QString("Controller%1ConfigFile%2").arg(m_joystick->getStringIdentifier()); QString controlEntryLastSelected = QString("Controller%1LastSelected").arg(m_joystick->getStringIdentifier()); QString controlEntryProfileName = QString("Controller%1ProfileName%2").arg(m_joystick->getStringIdentifier()); + bool finished = false; for (int i=1; !finished; i++) { @@ -1157,6 +1166,7 @@ void JoyTabWidget::loadSettings(bool forceRefresh) if (!m_joystick->getStringIdentifier().isEmpty()) { + convToUniqueIDControllerGroupSett(m_settings, QString("Controller%1ConfigFile%2").arg(m_joystick->getGUIDString()).arg(i), QString("Controller%1ConfigFile%2").arg(m_joystick->getUniqueIDString()).arg(i)); tempfilepath = m_settings->value(controlEntryString.arg(i), "").toString(); } @@ -1166,6 +1176,7 @@ void JoyTabWidget::loadSettings(bool forceRefresh) if (fileInfo.exists() && (configBox->findData(fileInfo.absoluteFilePath()) == -1)) { + convToUniqueIDControllerGroupSett(m_settings, QString("Controller%1ProfileName%2").arg(m_joystick->getGUIDString()).arg(i), QString("Controller%1ProfileName%2").arg(m_joystick->getUniqueIDString()).arg(i)); QString profileName = m_settings->value(controlEntryProfileName.arg(i), "").toString(); profileName = !profileName.isEmpty() ? profileName : PadderCommon::getProfileName(fileInfo); configBox->addItem(profileName, fileInfo.absoluteFilePath()); @@ -1518,10 +1529,9 @@ void JoyTabWidget::saveDeviceSettings(bool sync) m_settings->getLock()->lock(); m_settings->endGroup(); - if (sync) - { - m_settings->sync(); - } + + if (sync) m_settings->sync(); + m_settings->getLock()->unlock(); } @@ -2634,3 +2644,11 @@ void JoyTabWidget::changeEvent(QEvent *event) QWidget::changeEvent(event); } +void JoyTabWidget::convToUniqueIDControllerGroupSett(QSettings* sett, QString guidControllerSett, QString uniqueControllerSett) +{ + if (sett->contains(guidControllerSett)) + { + sett->setValue(uniqueControllerSett, sett->value(guidControllerSett)); + sett->remove(guidControllerSett); + } +} diff --git a/src/joytabwidget.h b/src/joytabwidget.h index f880763e..5bec8ce3 100755 --- a/src/joytabwidget.h +++ b/src/joytabwidget.h @@ -41,6 +41,7 @@ class AxisEditDialog; class QAction; class QMenu; class QStackedWidget; +class QSettings; class JoyTabWidget : public QWidget { @@ -55,6 +56,7 @@ public: void unloadConfig(); // JoyTabSettings class void checkHideEmptyOption(); void refreshHelperThread(); + void convToUniqueIDControllerGroupSett(QSettings* sett, QString guidControllerSett, QString uniqueControllerSett); bool isDisplayingNames(); bool discardUnsavedProfileChanges(); diff --git a/src/main.cpp b/src/main.cpp index fd565504..0fc2f5c2 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -109,6 +109,7 @@ static void deleteInputDevices(QMap *joysticks) while (iter.hasNext()) { InputDevice *joystick = iter.next().value(); + if (joystick != nullptr) { delete joystick; @@ -119,6 +120,7 @@ static void deleteInputDevices(QMap *joysticks) joysticks->clear(); } + int main(int argc, char *argv[]) { qInstallMessageHandler(MessageHandler::myMessageOutput); diff --git a/src/mainsettingsdialog.cpp b/src/mainsettingsdialog.cpp index b55b7d10..3c08c0df 100755 --- a/src/mainsettingsdialog.cpp +++ b/src/mainsettingsdialog.cpp @@ -931,6 +931,15 @@ void MainSettingsDialog::populateAutoProfiles() //QStringList registeredGUIDs = settings->value("GUIDs", QStringList()).toStringList(); QStringList registeredGUIDs = settings->value("Uniques", QStringList()).toStringList(); +// void MainSettingsDialog::convToUniqueIDAutoprofileGroupSett(QSettings* sett, QString guidControllerSett, QString uniqueControllerSett) +// { +// if (sett->contains(guidControllerSett)) +// { +// sett->setValue(uniqueControllerSett, sett->value(guidControllerSett)); +// sett->remove(guidControllerSett); +// } +// } + settings->endGroup(); QString allProfile = settings->value(QString("DefaultAutoProfileAll/Profile"), "").toString(); @@ -986,7 +995,9 @@ void MainSettingsDialog::populateAutoProfiles() #endif //QString guid = settings->value(QString("AutoProfile%1GUID").arg(i), "").toString(); - QString guid = settings->value(QString("AutoProfile%UniqueID").arg(i), "").toString(); + convToUniqueIDAutoProfGroupSett(settings, QString("AutoProfile%1GUID").arg(i), QString("AutoProfile%1UniqueID").arg(i)); + + QString guid = settings->value(QString("AutoProfile%1UniqueID").arg(i), "").toString(); QString profile = settings->value(QString("AutoProfile%1Profile").arg(i), "").toString(); QString active = settings->value(QString("AutoProfile%1Active").arg(i), 0).toString(); QString partialTitle = settings->value(QString("AutoProfile%1PartialTitle").arg(i), 0).toString(); @@ -1331,7 +1342,9 @@ void MainSettingsDialog::saveAutoProfileSettings() } // settings->setValue(QString("AutoProfile%1GUID").arg(i), info->getGUID()); - settings->setValue(QString("AutoProfile%UniqueID").arg(i), info->getUniqueID()); + convToUniqueIDAutoProfGroupSett(settings, QString("AutoProfile%1GUID").arg(i), QString("AutoProfile%1UniqueID").arg(i)); + + settings->setValue(QString("AutoProfile%1UniqueID").arg(i), info->getUniqueID()); settings->setValue(QString("AutoProfile%1Profile").arg(i), info->getProfileLocation()); settings->setValue(QString("AutoProfile%1Active").arg(i), defaultActive); settings->setValue(QString("AutoProfile%1PartialTitle").arg(i), partialTitle); @@ -1549,11 +1562,11 @@ void MainSettingsDialog::openAddAutoProfileDialog() QList reservedGUIDs = defaultAutoProfiles.keys(); AutoProfileInfo *info = new AutoProfileInfo(this); AddEditAutoProfileDialog *dialog = new AddEditAutoProfileDialog(info, settings, connectedDevices, reservedGUIDs, false, this); - connect(dialog, &AddEditAutoProfileDialog::accepted, this, [this]{ - addNewAutoProfile(); - }); + // connect(dialog, &AddEditAutoProfileDialog::accepted, this, [this]{ + // addNewAutoProfile(); + // }); - //connect(dialog, SIGNAL(accepted()), this, SLOT(addNewAutoProfile())); + connect(dialog, SIGNAL(accepted()), this, SLOT(addNewAutoProfile())); connect(dialog, &AddEditAutoProfileDialog::rejected, info, &AutoProfileInfo::deleteLater); dialog->show(); } @@ -2271,3 +2284,13 @@ void MainSettingsDialog::resetAdvancedSett() ui->logFilePathEdit->setText(""); ui->logLevelComboBox->setCurrentIndex(0); } + + +void MainSettingsDialog::convToUniqueIDAutoProfGroupSett(QSettings* sett, QString guidAutoProfSett, QString uniqueAutoProfSett) +{ + if (sett->contains(guidAutoProfSett)) + { + sett->setValue(uniqueAutoProfSett, sett->value(guidAutoProfSett)); + sett->remove(guidAutoProfSett); + } +} diff --git a/src/mainsettingsdialog.h b/src/mainsettingsdialog.h index 3071fc6a..72047b8a 100755 --- a/src/mainsettingsdialog.h +++ b/src/mainsettingsdialog.h @@ -67,6 +67,7 @@ protected: void changePresetLanguage(); // MainSettingsLang class void fillSpringScreenPresets(); // MainSettingsMouse class void refreshExtraMouseInfo(); // MainSettingsMouse class + void convToUniqueIDAutoProfGroupSett(QSettings* sett, QString guidAutoProfSett, QString uniqueAutoProfSett); signals: void changeLanguage(QString language); // MainSettingsLang class diff --git a/src/mainsettingsdialog.ui b/src/mainsettingsdialog.ui index 49a87664..d7e75aab 100755 --- a/src/mainsettingsdialog.ui +++ b/src/mainsettingsdialog.ui @@ -92,7 +92,7 @@ - 3 + 1 @@ -514,6 +514,18 @@ Settings will not take affect until you either refresh all joysticks or unplug t false + + 200 + + + 70 + + + 50 + + + 50 + GUID diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 0c44d750..d682f8dd 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -71,6 +71,7 @@ #include #include #include +#include #ifdef Q_OS_WIN #include @@ -461,9 +462,11 @@ void MainWindow::fillButtonsMap(QMap *joysticks) joytabName.append(" ").append(trUtf8("(%1)").arg(joystick->getName())); ui->tabWidget->addTab(tabwidget, joytabName); tabwidget->refreshButtons(); + connect(tabwidget, &JoyTabWidget::namesDisplayChanged, this, [this, tabwidget](bool displayNames) { propogateNameDisplayStatus(tabwidget, displayNames); }); + connect(tabwidget, &JoyTabWidget::mappingUpdated, this, &MainWindow::propogateMappingUpdate); if (showTrayIcon) @@ -546,12 +549,11 @@ void MainWindow::populateTrayIcon() { QMapIterator iter(*m_joysticks); bool useSingleList = m_settings->value("TrayProfileList", false).toBool(); - if (!useSingleList && (joystickCount == 1)) - { - useSingleList = true; - } + + if (!useSingleList && (joystickCount == 1)) useSingleList = true; int i = 0; + while (iter.hasNext()) { iter.next(); @@ -563,10 +565,8 @@ void MainWindow::populateTrayIcon() .arg(current->getName())); QMenu *joysticksubMenu = nullptr; - if (!useSingleList) - { - joysticksubMenu = trayIconMenu->addMenu(joytabName); - } + if (!useSingleList) joysticksubMenu = trayIconMenu->addMenu(joytabName); + JoyTabWidget *widget = qobject_cast(ui->tabWidget->widget(i)); // static_cast @@ -594,11 +594,11 @@ void MainWindow::populateTrayIcon() newaction->setChecked(false); QString identifier = current->getStringIdentifier(); + widget->convToUniqueIDControllerGroupSett(m_settings, QString("Controller%1LastSelected").arg(current->getGUIDString()), QString("Controller%1LastSelected").arg(current->getUniqueIDString())); QString controlEntryLastSelected = QString("Controller%1LastSelected").arg(identifier); QFileInfo fileInfo(m_settings->value(controlEntryLastSelected).toString()); - if ((configIter.value() == fileInfo.baseName()) || (configIter.value() == widget->getCurrentConfigName())) { newaction->setChecked(true); @@ -627,6 +627,7 @@ void MainWindow::populateTrayIcon() configs = nullptr; QAction *newaction = nullptr; + if (joysticksubMenu != nullptr) { newaction = new QAction(trUtf8("Open File"), joysticksubMenu); @@ -1666,7 +1667,9 @@ void MainWindow::testMappingUpdateNow(int index, InputDevice *device) connect(tabwidget, &JoyTabWidget::namesDisplayChanged, this, [this, tabwidget](bool displayNames) { propogateNameDisplayStatus(tabwidget, displayNames); }); + connect(tabwidget, &JoyTabWidget::mappingUpdated, this, &MainWindow::propogateMappingUpdate); + if (showTrayIcon) { connect(tabwidget, &JoyTabWidget::joystickConfigChanged, this, &MainWindow::populateTrayIcon); @@ -2078,6 +2081,7 @@ QMap > const& MainWindow::getProfileActions() { return profileActions; } + bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::Hide && (obj != nullptr)) { @@ -2086,3 +2090,35 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event) return false; } + + +void MainWindow::convertGUIDtoUniqueID(InputDevice* currentDevice, QString controlEntryLastSelectedGUID) +{ + int exec = QMessageBox::information(this, trUtf8("Reading old profile"), trUtf8("This profile uses controllers' GUID numbers. Would you like to change GUID numbers to UniqueID in this file for use in identical gamecontrollers? Such old file cannot be loaded in antimicro since version 2.24.2"), QMessageBox::Yes, QMessageBox::No); + + switch (exec) + { + case QMessageBox::Yes: + + QFile data(m_settings->value(controlEntryLastSelectedGUID).toString()); + data.open(QIODevice::Text | QIODevice::ReadOnly); + QString dataText = data.readAll(); + + QRegularExpression re(currentDevice->getGUIDString()); + QString replacementText(currentDevice->getUniqueIDString()); + + dataText.replace(re, replacementText); + + QFile newData(m_settings->value(controlEntryLastSelectedGUID).toString()); + + if (newData.open(QFile::WriteOnly | QFile::Truncate)) + { + QTextStream out(&newData); + out << dataText; + } + + newData.close(); + + break; + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index f3e090df..c599896d 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -82,6 +82,7 @@ protected: void unloadCurrentConfig(QString controllerID); // MainConfiguration class void changeStartSetNumber(int startSetNumber, QString controllerID); // MainConfiguration class void changeStartSetNumber(int startSetNumber, int joystickIndex=0); // MainConfiguration class + void convertGUIDtoUniqueID(InputDevice* currentDevice, QString controlEntryLastSelectedGUID); signals: void joystickRefreshRequested();