From 5fb26b2dcbfae9d6a1aaac9d61f017bacf572f09 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 17:15:44 -0400 Subject: made Executable members private, added member function to get and set them --- src/editexecutablesdialog.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 177661ff..67fbff31 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -71,7 +71,7 @@ void EditExecutablesDialog::refreshExecutablesWidget() m_ExecutablesList.getExecutables(current, end); for(; current != end; ++current) { - QListWidgetItem *newItem = new QListWidgetItem(current->m_Title); + QListWidgetItem *newItem = new QListWidgetItem(current->title()); newItem->setTextColor(current->isCustom() ? QColor(Qt::black) : QColor(Qt::darkGray)); ui->executablesListBox->addItem(newItem); } @@ -284,10 +284,10 @@ bool EditExecutablesDialog::executableChanged() if (m_CurrentItem != nullptr) { Executable const &selectedExecutable(m_ExecutablesList.find(m_CurrentItem->text())); - QString storedCustomOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.m_Title).toString(); + QString storedCustomOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.title()).toString(); bool forcedLibrariesDirty = false; - auto forcedLibaries = m_Profile->determineForcedLibraries(selectedExecutable.m_Title); + auto forcedLibaries = m_Profile->determineForcedLibraries(selectedExecutable.title()); forcedLibrariesDirty |= !std::equal(forcedLibaries.begin(), forcedLibaries.end(), m_ForcedLibraries.begin(), m_ForcedLibraries.end(), [](const ExecutableForcedLoadSetting &lhs, const ExecutableForcedLoadSetting &rhs) @@ -300,13 +300,13 @@ bool EditExecutablesDialog::executableChanged() forcedLibrariesDirty |= m_Profile->setting("forced_libraries", ui->titleEdit->text() + "/enabled", false).toBool() != ui->forceLoadCheckBox->isChecked(); - return selectedExecutable.m_Title != ui->titleEdit->text() - || selectedExecutable.m_Arguments != ui->argumentsEdit->text() - || selectedExecutable.m_SteamAppID != ui->appIDOverwriteEdit->text() + return selectedExecutable.title() != ui->titleEdit->text() + || selectedExecutable.arguments() != ui->argumentsEdit->text() + || selectedExecutable.steamAppID() != ui->appIDOverwriteEdit->text() || !storedCustomOverwrite.isEmpty() != ui->newFilesModCheckBox->isChecked() || !storedCustomOverwrite.isEmpty() && (storedCustomOverwrite != ui->newFilesModBox->currentText()) - || selectedExecutable.m_WorkingDirectory != QDir::fromNativeSeparators(ui->workingDirEdit->text()) - || selectedExecutable.m_BinaryInfo.absoluteFilePath() != QDir::fromNativeSeparators(ui->binaryEdit->text()) + || selectedExecutable.workingDirectory() != QDir::fromNativeSeparators(ui->workingDirEdit->text()) + || selectedExecutable.binaryInfo().absoluteFilePath() != QDir::fromNativeSeparators(ui->binaryEdit->text()) || selectedExecutable.usesOwnIcon() != ui->useAppIconCheckBox->isChecked() || forcedLibrariesDirty ; @@ -376,14 +376,14 @@ void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex &cur Executable const &selectedExecutable(m_ExecutablesList.find(m_CurrentItem->text())); - ui->titleEdit->setText(selectedExecutable.m_Title); - ui->binaryEdit->setText(QDir::toNativeSeparators(selectedExecutable.m_BinaryInfo.absoluteFilePath())); - ui->argumentsEdit->setText(selectedExecutable.m_Arguments); - ui->workingDirEdit->setText(QDir::toNativeSeparators(selectedExecutable.m_WorkingDirectory)); + ui->titleEdit->setText(selectedExecutable.title()); + ui->binaryEdit->setText(QDir::toNativeSeparators(selectedExecutable.binaryInfo().absoluteFilePath())); + ui->argumentsEdit->setText(selectedExecutable.arguments()); + ui->workingDirEdit->setText(QDir::toNativeSeparators(selectedExecutable.workingDirectory())); ui->removeButton->setEnabled(selectedExecutable.isCustom()); - ui->overwriteAppIDBox->setChecked(!selectedExecutable.m_SteamAppID.isEmpty()); - if (!selectedExecutable.m_SteamAppID.isEmpty()) { - ui->appIDOverwriteEdit->setText(selectedExecutable.m_SteamAppID); + ui->overwriteAppIDBox->setChecked(!selectedExecutable.steamAppID().isEmpty()); + if (!selectedExecutable.steamAppID().isEmpty()) { + ui->appIDOverwriteEdit->setText(selectedExecutable.steamAppID()); } else { ui->appIDOverwriteEdit->clear(); } @@ -391,7 +391,7 @@ void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex &cur int index = -1; - QString customOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.m_Title).toString(); + QString customOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.title()).toString(); if (!customOverwrite.isEmpty()) { index = ui->newFilesModBox->findText(customOverwrite); qDebug("find %s -> %d", qUtf8Printable(customOverwrite), index); -- cgit v1.3.1 From 4f01b94f01180989abbdf0407cdf95483970dba8 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 17:53:42 -0400 Subject: replaced ExecutablesList::getExecutables() by a standard container interface renamed ExecutablesList::init() to addFromPlugin() renamed ExecutablesList::find() to get() and added a find() that returns an iterator changed some calls from get() to find() so they can handle failure because they didn't seem to handle std::runtime_error at all --- src/editexecutablesdialog.cpp | 43 ++++++++++++++++---- src/executableslist.cpp | 84 +++++++++++++++++++-------------------- src/executableslist.h | 63 +++++++++++------------------ src/mainwindow.cpp | 92 ++++++++++++++++++++++++++----------------- src/organizercore.cpp | 16 ++++---- 5 files changed, 164 insertions(+), 134 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 67fbff31..9dbc6bae 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -59,20 +59,29 @@ ExecutablesList EditExecutablesDialog::getExecutablesList() const { ExecutablesList newList; for (int i = 0; i < ui->executablesListBox->count(); ++i) { - newList.addExecutable(m_ExecutablesList.find(ui->executablesListBox->item(i)->text())); + const auto& title = ui->executablesListBox->item(i)->text(); + auto itor = m_ExecutablesList.find(title); + + if (itor == m_ExecutablesList.end()) { + qWarning().nospace() + << "getExecutablesList(): executable '" << title << "' not found"; + + continue; + } + + newList.addExecutable(*itor); } + return newList; } void EditExecutablesDialog::refreshExecutablesWidget() { ui->executablesListBox->clear(); - std::vector::const_iterator current, end; - m_ExecutablesList.getExecutables(current, end); - for(; current != end; ++current) { - QListWidgetItem *newItem = new QListWidgetItem(current->title()); - newItem->setTextColor(current->isCustom() ? QColor(Qt::black) : QColor(Qt::darkGray)); + for(const auto& exe : m_ExecutablesList) { + QListWidgetItem *newItem = new QListWidgetItem(exe.title()); + newItem->setTextColor(exe.isCustom() ? QColor(Qt::black) : QColor(Qt::darkGray)); ui->executablesListBox->addItem(newItem); } @@ -282,7 +291,17 @@ void EditExecutablesDialog::on_titleEdit_textChanged(const QString &arg1) bool EditExecutablesDialog::executableChanged() { if (m_CurrentItem != nullptr) { - Executable const &selectedExecutable(m_ExecutablesList.find(m_CurrentItem->text())); + const auto& title = m_CurrentItem->text(); + auto itor = m_ExecutablesList.find(title); + + if (itor == m_ExecutablesList.end()) { + qWarning().nospace() + << "executableChanged(): title '" << title << "' not found"; + + return false; + } + + const Executable& selectedExecutable = *itor; QString storedCustomOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.title()).toString(); @@ -374,7 +393,15 @@ void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex &cur m_CurrentItem = ui->executablesListBox->item(current.row()); - Executable const &selectedExecutable(m_ExecutablesList.find(m_CurrentItem->text())); + const auto& title = m_CurrentItem->text(); + auto itor = m_ExecutablesList.find(title); + + if (itor == m_ExecutablesList.end()) { + qWarning().nospace() << "selection: executable '" << title << "' not found"; + return; + } + + const Executable& selectedExecutable = *itor; ui->titleEdit->setText(selectedExecutable.title()); ui->binaryEdit->setText(QDir::toNativeSeparators(selectedExecutable.binaryInfo().absoluteFilePath())); diff --git a/src/executableslist.cpp b/src/executableslist.cpp index 79b17f5b..2ea9c3d9 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -33,19 +33,40 @@ along with Mod Organizer. If not, see . using namespace MOBase; +ExecutablesList::iterator ExecutablesList::begin() +{ + return m_Executables.begin(); +} + +ExecutablesList::const_iterator ExecutablesList::begin() const +{ + return m_Executables.begin(); +} + +ExecutablesList::iterator ExecutablesList::end() +{ + return m_Executables.end(); +} + +ExecutablesList::const_iterator ExecutablesList::end() const +{ + return m_Executables.end(); +} -ExecutablesList::ExecutablesList() +std::size_t ExecutablesList::size() const { + return m_Executables.size(); } -ExecutablesList::~ExecutablesList() +bool ExecutablesList::empty() const { + return m_Executables.empty(); } -void ExecutablesList::init(IPluginGame const *game) +void ExecutablesList::addFromPlugin(IPluginGame const *game) { Q_ASSERT(game != nullptr); - m_Executables.clear(); + for (const ExecutableInfo &info : game->executables()) { if (info.isValid()) { addExecutableInternal(info.title(), @@ -55,6 +76,7 @@ void ExecutablesList::init(IPluginGame const *game) info.steamAppID()); } } + ExecutableInfo explorerpp = ExecutableInfo("Explore Virtual Folder", QFileInfo(QCoreApplication::applicationDirPath() + "/explorer++/Explorer++.exe" )) .withArgument(QString("\"%1\"").arg(QDir::toNativeSeparators(game->dataDirectory().absolutePath()))); @@ -65,45 +87,25 @@ void ExecutablesList::init(IPluginGame const *game) explorerpp.workingDirectory().absolutePath(), explorerpp.steamAppID()); } - } -void ExecutablesList::getExecutables(std::vector::iterator &begin, std::vector::iterator &end) +const Executable &ExecutablesList::get(const QString &title) const { - begin = m_Executables.begin(); - end = m_Executables.end(); -} - -void ExecutablesList::getExecutables(std::vector::const_iterator &begin, - std::vector::const_iterator &end) const -{ - begin = m_Executables.begin(); - end = m_Executables.end(); -} - -const Executable &ExecutablesList::find(const QString &title) const -{ - for (Executable const &exe : m_Executables) { + for (const auto& exe : m_Executables) { if (exe.title() == title) { return exe; } } - throw std::runtime_error(QString("invalid executable name: %1").arg(title).toLocal8Bit().constData()); -} + throw std::runtime_error(QString("executable not found: %1").arg(title).toLocal8Bit().constData()); +} -Executable &ExecutablesList::find(const QString &title) +Executable &ExecutablesList::get(const QString &title) { - for (Executable &exe : m_Executables) { - if (exe.title() == title) { - return exe; - } - } - throw std::runtime_error(QString("invalid executable name: %1").arg(title).toLocal8Bit().constData()); + return const_cast(std::as_const(*this).get(title)); } - -Executable &ExecutablesList::findByBinary(const QFileInfo &info) +Executable &ExecutablesList::getByBinary(const QFileInfo &info) { for (Executable &exe : m_Executables) { if (exe.binaryInfo() == info) { @@ -113,17 +115,15 @@ Executable &ExecutablesList::findByBinary(const QFileInfo &info) throw std::runtime_error("invalid info"); } - -std::vector::iterator ExecutablesList::findExe(const QString &title) +ExecutablesList::iterator ExecutablesList::find(const QString &title) { - for (std::vector::iterator iter = m_Executables.begin(); iter != m_Executables.end(); ++iter) { - if (iter->title() == title) { - return iter; - } - } - return m_Executables.end(); + return std::find_if(begin(), end(), [&](auto&& e) { return e.title() == title; }); } +ExecutablesList::const_iterator ExecutablesList::find(const QString &title) const +{ + return std::find_if(begin(), end(), [&](auto&& e) { return e.title() == title; }); +} bool ExecutablesList::titleExists(const QString &title) const { @@ -131,10 +131,9 @@ bool ExecutablesList::titleExists(const QString &title) const return std::find_if(m_Executables.begin(), m_Executables.end(), test) != m_Executables.end(); } - void ExecutablesList::addExecutable(const Executable &executable) { - auto existingExe = findExe(executable.title()); + auto existingExe = find(executable.title()); if (existingExe != m_Executables.end()) { *existingExe = executable; } else { @@ -142,7 +141,6 @@ void ExecutablesList::addExecutable(const Executable &executable) } } - void ExecutablesList::updateExecutable(const QString &title, const QString &executableName, const QString &arguments, @@ -153,7 +151,7 @@ void ExecutablesList::updateExecutable(const QString &title, { QFileInfo file(executableName); QDir dir(workingDirectory); - auto existingExe = findExe(title); + auto existingExe = find(title); flags &= mask; if (existingExe != m_Executables.end()) { diff --git a/src/executableslist.h b/src/executableslist.h index 0e43b337..b8e4cf77 100644 --- a/src/executableslist.h +++ b/src/executableslist.h @@ -88,28 +88,33 @@ private: **/ class ExecutablesList { public: + using vector_type = std::vector; + using iterator = vector_type::iterator; + using const_iterator = vector_type::const_iterator; /** - * @brief constructor - * - **/ - ExecutablesList(); - - ~ExecutablesList(); + * standard container interface + */ + iterator begin(); + const_iterator begin() const; + iterator end(); + const_iterator end() const; + std::size_t size() const; + bool empty() const; /** - * @brief initialise the list with the executables preconfigured for this game + * @brief add the executables preconfigured for this game **/ - void init(MOBase::IPluginGame const *game); + void addFromPlugin(MOBase::IPluginGame const *game); /** - * @brief find an executable by its name + * @brief get an executable by name * * @param title the title of the executable to look up * @return the executable - * @exception runtime_error will throw an exception if the name is not correct + * @exception runtime_error will throw an exception if the executable is not found **/ - const Executable &find(const QString &title) const; + const Executable &get(const QString &title) const; /** * @brief find an executable by its name @@ -118,7 +123,7 @@ public: * @return the executable * @exception runtime_error will throw an exception if the name is not correct **/ - Executable &find(const QString &title); + Executable &get(const QString &title); /** * @brief find an executable by a fileinfo structure @@ -126,7 +131,13 @@ public: * @return the executable * @exception runtime_error will throw an exception if the name is not correct */ - Executable &findByBinary(const QFileInfo &info); + Executable &getByBinary(const QFileInfo &info); + + /** + * @brief returns an iterator for the given executable by title, or end() + */ + iterator find(const QString &title); + const_iterator find(const QString &title) const; /** * @brief determine if an executable exists @@ -183,33 +194,7 @@ public: **/ void remove(const QString &title); - /** - * @brief retrieve begin and end iterators of the configured executables - * - * @param begin iterator to the first executable - * @param end iterator one past the last executable - **/ - void getExecutables(std::vector::const_iterator &begin, std::vector::const_iterator &end) const; - - /** - * @brief retrieve begin and end iterators of the configured executables - * - * @param begin iterator to the first executable - * @param end iterator one past the last executable - **/ - void getExecutables(std::vector::iterator &begin, std::vector::iterator &end); - - /** - * @brief get the number of executables (custom or otherwise) - **/ - size_t size() const { - return m_Executables.size(); - } - private: - - std::vector::iterator findExe(const QString &title); - void addExecutableInternal(const QString &title, const QString &executableName, const QString &arguments, const QString &workingDirectory, const QString &steamAppID); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 38b2ed3f..2fbdbec7 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -733,15 +733,12 @@ void MainWindow::updatePinnedExecutables() bool hasLinks = false; - std::vector::iterator begin, end; - m_OrganizerCore.executablesList()->getExecutables(begin, end); - - for (auto iter = begin; iter != end; ++iter) { - if (iter->isShownOnToolbar()) { + for (const auto& exe : *m_OrganizerCore.executablesList()) { + if (exe.isShownOnToolbar()) { hasLinks = true; QAction *exeAction = new QAction( - iconForExecutable(iter->binaryInfo().filePath()), iter->title()); + iconForExecutable(exe.binaryInfo().filePath()), exe.title()); exeAction->setObjectName(QString("custom__") + iter->m_Title); exeAction->setStatusTip(iter->m_BinaryInfo.filePath()); @@ -1504,24 +1501,42 @@ void MainWindow::registerModPage(IPluginModPage *modPage) void MainWindow::startExeAction() { QAction *action = qobject_cast(sender()); - if (action != nullptr) { - const Executable &selectedExecutable(m_OrganizerCore.executablesList()->find(action->text())); - QString customOverwrite = m_OrganizerCore.currentProfile()->setting("custom_overwrites", selectedExecutable.title()).toString(); - auto forcedLibraries = m_OrganizerCore.currentProfile()->determineForcedLibraries(selectedExecutable.title()); - if (!m_OrganizerCore.currentProfile()->forcedLibrariesEnabled(selectedExecutable.title())) { - forcedLibraries.clear(); - } - m_OrganizerCore.spawnBinary( - selectedExecutable.binaryInfo(), selectedExecutable.arguments(), - selectedExecutable.workingDirectory().length() != 0 - ? selectedExecutable.workingDirectory() - : selectedExecutable.binaryInfo().absolutePath(), - selectedExecutable.steamAppID(), - customOverwrite, - forcedLibraries); - } else { + + if (action == nullptr) { qCritical("not an action?"); + return; } + + const auto& list = *m_OrganizerCore.executablesList(); + + const auto title = action->text(); + auto itor = list.find(title); + + if (itor == list.end()) { + qWarning().nospace() + << "startExeAction(): executable '" << title << "' not found"; + + return; + } + + const Executable& exe = *itor; + auto& profile = *m_OrganizerCore.currentProfile(); + + QString customOverwrite = profile.setting("custom_overwrites", exe.title()).toString(); + auto forcedLibraries = profile.determineForcedLibraries(exe.title()); + + if (!profile.forcedLibrariesEnabled(exe.title())) { + forcedLibraries.clear(); + } + + m_OrganizerCore.spawnBinary( + exe.binaryInfo(), exe.arguments(), + exe.workingDirectory().length() != 0 + ? exe.workingDirectory() + : exe.binaryInfo().absolutePath(), + exe.steamAppID(), + customOverwrite, + forcedLibraries); } @@ -1789,12 +1804,12 @@ void MainWindow::refreshExecutablesList() QAbstractItemModel *model = executablesList->model(); - std::vector::const_iterator current, end; - m_OrganizerCore.executablesList()->getExecutables(current, end); - for(int i = 0; current != end; ++current, ++i) { - QIcon icon = iconForExecutable(current->binaryInfo().filePath()); - executablesList->addItem(icon, current->title()); + int i = 0; + for (const auto& exe : *m_OrganizerCore.executablesList()) { + QIcon icon = iconForExecutable(exe.binaryInfo().filePath()); + executablesList->addItem(icon, exe.title()); model->setData(model->index(i, 0), QSize(0, executablesList->iconSize().height() + 4), Qt::SizeHintRole); + ++i; } setExecutableIndex(1); @@ -6389,13 +6404,18 @@ void MainWindow::unlockESPIndex() void MainWindow::removeFromToolbar() { - try { - Executable &exe = m_OrganizerCore.executablesList()->find(m_ContextAction->text()); - exe.setShownOnToolbar(false); - } catch (const std::runtime_error&) { - qDebug("executable doesn't exist any more"); + const auto& title = m_ContextAction->text(); + auto& list = *m_OrganizerCore.executablesList(); + + auto itor = list.find(title); + if (itor == list.end()) { + qWarning().nospace() + << "removeFromToolbar(): executable '" << title << "' not found"; + + return; } + itor->setShownOnToolbar(false); updatePinnedExecutables(); } @@ -6520,14 +6540,14 @@ void MainWindow::on_groupCombo_currentIndexChanged(int index) const Executable &MainWindow::getSelectedExecutable() const { - QString name = ui->executablesListBox->itemText(ui->executablesListBox->currentIndex()); - return m_OrganizerCore.executablesList()->find(name); + const QString name = ui->executablesListBox->itemText(ui->executablesListBox->currentIndex()); + return m_OrganizerCore.executablesList()->get(name); } Executable &MainWindow::getSelectedExecutable() { - QString name = ui->executablesListBox->itemText(ui->executablesListBox->currentIndex()); - return m_OrganizerCore.executablesList()->find(name); + const QString name = ui->executablesListBox->itemText(ui->executablesListBox->currentIndex()); + return m_OrganizerCore.executablesList()->get(name); } void MainWindow::on_linkButton_pressed() diff --git a/src/organizercore.cpp b/src/organizercore.cpp index cfbcad39..4d11a35f 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -375,11 +375,10 @@ QSettings::Status OrganizerCore::storeSettings(const QString &fileName) settings.remove("customExecutables"); settings.beginWriteArray("customExecutables"); - std::vector::const_iterator current, end; - m_ExecutablesList.getExecutables(current, end); + int count = 0; - for (; current != end; ++current) { - const Executable &item = *current; + + for (const auto& item : m_ExecutablesList) { settings.setArrayIndex(count++); settings.setValue("title", item.title()); settings.setValue("custom", item.isCustom()); @@ -508,7 +507,7 @@ void OrganizerCore::updateExecutablesList(QSettings &settings) return; } - m_ExecutablesList.init(managedGame()); + m_ExecutablesList.addFromPlugin(managedGame()); qDebug("setting up configured executables"); @@ -1735,7 +1734,8 @@ HANDLE OrganizerCore::runShortcut(const MOShortcut& shortcut) .arg(shortcut.instance(),shortcut.executable()) .toLocal8Bit().constData()); - Executable& exe = m_ExecutablesList.find(shortcut.executable()); + const Executable& exe = m_ExecutablesList.get(shortcut.executable()); + auto forcedLibaries = m_CurrentProfile->determineForcedLibraries(shortcut.executable()); if (!m_CurrentProfile->forcedLibrariesEnabled(shortcut.executable())) { forcedLibaries.clear(); @@ -1786,7 +1786,7 @@ HANDLE OrganizerCore::startApplication(const QString &executable, currentDirectory = binary.absolutePath(); } try { - const Executable &exe = m_ExecutablesList.findByBinary(binary); + const Executable &exe = m_ExecutablesList.getByBinary(binary); steamAppID = exe.steamAppID(); customOverwrite = m_CurrentProfile->setting("custom_overwrites", exe.title()) @@ -1800,7 +1800,7 @@ HANDLE OrganizerCore::startApplication(const QString &executable, } else { // only a file name, search executables list try { - const Executable &exe = m_ExecutablesList.find(executable); + const Executable &exe = m_ExecutablesList.get(executable); steamAppID = exe.steamAppID(); customOverwrite = m_CurrentProfile->setting("custom_overwrites", exe.title()) -- cgit v1.3.1 From 617a6005451aba1d45f13228f13f1cc150a78bb4 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 18:24:41 -0400 Subject: ExecutablesList: - merged addExecutable(), updateExecutable() and addExecutableInternal() into a new setExecutable() - setExecutable() adds the executable to the list if not found, or forwards to Executable::mergeFrom() - mergeFrom() handles merging from/to plugin executables --- src/editexecutablesdialog.cpp | 24 ++++---- src/executableslist.cpp | 125 ++++++++++++++++++------------------------ src/executableslist.h | 48 +++------------- src/mainwindow.cpp | 10 ++-- 4 files changed, 77 insertions(+), 130 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 9dbc6bae..83756ac8 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -69,7 +69,7 @@ ExecutablesList EditExecutablesDialog::getExecutablesList() const continue; } - newList.addExecutable(*itor); + newList.setExecutable(*itor); } return newList; @@ -138,17 +138,17 @@ void EditExecutablesDialog::resetInput() void EditExecutablesDialog::saveExecutable() { - m_ExecutablesList.updateExecutable( - ui->titleEdit->text(), - QDir::fromNativeSeparators(ui->binaryEdit->text()), - ui->argumentsEdit->text(), - QDir::fromNativeSeparators(ui->workingDirEdit->text()), - ui->overwriteAppIDBox->isChecked() ? - ui->appIDOverwriteEdit->text() : "", - Executable::UseApplicationIcon | Executable::CustomExecutable, - (ui->useAppIconCheckBox->isChecked() ? - Executable::UseApplicationIcon : Executable::Flags()) - | Executable::CustomExecutable); + Executable::Flags flags = Executable::CustomExecutable; + if (ui->useAppIconCheckBox->isChecked()) + flags |= Executable::UseApplicationIcon; + + m_ExecutablesList.setExecutable({ + ui->titleEdit->text(), + QDir::fromNativeSeparators(ui->binaryEdit->text()), + ui->argumentsEdit->text(), + QDir::fromNativeSeparators(ui->workingDirEdit->text()), + ui->overwriteAppIDBox->isChecked() ? ui->appIDOverwriteEdit->text() : "", + flags}); if (ui->newFilesModCheckBox->isChecked()) { m_Profile->storeSetting("custom_overwrites", ui->titleEdit->text(), diff --git a/src/executableslist.cpp b/src/executableslist.cpp index 43a30f02..062ee28e 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -81,11 +81,13 @@ void ExecutablesList::load(const MOBase::IPluginGame* game, QSettings& settings) if (settings.value("ownicon", false).toBool()) flags |= Executable::UseApplicationIcon; - addExecutable( - settings.value("title").toString(), settings.value("binary").toString(), + setExecutable({ + settings.value("title").toString(), + settings.value("binary").toString(), settings.value("arguments").toString(), settings.value("workingDirectory", "").toString(), - settings.value("steamAppID", "").toString(), flags); + settings.value("steamAppID", "").toString(), + flags}); } settings.endArray(); @@ -123,11 +125,13 @@ void ExecutablesList::addFromPlugin(IPluginGame const *game) for (const ExecutableInfo &info : game->executables()) { if (info.isValid()) { - addExecutableInternal(info.title(), - info.binary().absoluteFilePath(), - info.arguments().join(" "), - info.workingDirectory().absolutePath(), - info.steamAppID()); + setExecutable({ + info.title(), + info.binary().absoluteFilePath(), + info.arguments().join(" "), + info.workingDirectory().absolutePath(), + info.steamAppID(), + Executable::UseApplicationIcon}); } } @@ -135,11 +139,13 @@ void ExecutablesList::addFromPlugin(IPluginGame const *game) .withArgument(QString("\"%1\"").arg(QDir::toNativeSeparators(game->dataDirectory().absolutePath()))); if (explorerpp.isValid()) { - addExecutableInternal(explorerpp.title(), + setExecutable({ + explorerpp.title(), explorerpp.binary().absoluteFilePath(), explorerpp.arguments().join(" "), explorerpp.workingDirectory().absolutePath(), - explorerpp.steamAppID()); + explorerpp.steamAppID(), + Executable::UseApplicationIcon}); } } @@ -185,60 +191,17 @@ bool ExecutablesList::titleExists(const QString &title) const return std::find_if(m_Executables.begin(), m_Executables.end(), test) != m_Executables.end(); } -void ExecutablesList::addExecutable(const Executable &executable) +void ExecutablesList::setExecutable(const Executable &executable) { - auto existingExe = find(executable.title()); - if (existingExe != m_Executables.end()) { - *existingExe = executable; - } else { - m_Executables.push_back(executable); - } -} + auto itor = find(executable.title()); -void ExecutablesList::updateExecutable(const QString &title, - const QString &executableName, - const QString &arguments, - const QString &workingDirectory, - const QString &steamAppID, - Executable::Flags mask, - Executable::Flags flags) -{ - QFileInfo file(executableName); - QDir dir(workingDirectory); - auto existingExe = find(title); - flags &= mask; - - if (existingExe != m_Executables.end()) { - existingExe->setTitle(title); - - auto newFlags = existingExe->flags(); - newFlags &= ~mask; - newFlags |= flags; - - existingExe->setFlags(newFlags); - - // for pre-configured executables don't overwrite settings we didn't store - if (flags & Executable::CustomExecutable) { - if (file.exists()) { - // don't overwrite a valid binary with an invalid one - existingExe->setBinaryInfo(file); - } - - if (dir.exists()) { - // don't overwrite a valid working directory with an invalid one - existingExe->setWorkingDirectory(workingDirectory); - } - existingExe->setArguments(arguments); - existingExe->setSteamAppID(steamAppID); - } + if (itor == m_Executables.end()) { + m_Executables.push_back(executable); } else { - m_Executables.push_back({ - title, file, arguments, workingDirectory, steamAppID, - Executable::CustomExecutable | flags}); + itor->mergeFrom(executable); } } - void ExecutablesList::remove(const QString &title) { for (std::vector::iterator iter = m_Executables.begin(); iter != m_Executables.end(); ++iter) { @@ -250,19 +213,6 @@ void ExecutablesList::remove(const QString &title) } -void ExecutablesList::addExecutableInternal(const QString &title, const QString &executableName, - const QString &arguments, const QString &workingDirectory, - const QString &steamAppID) -{ - QFileInfo file(executableName); - if (file.exists()) { - m_Executables.push_back({ - title, file, arguments, steamAppID, - workingDirectory, Executable::UseApplicationIcon}); - } -} - - Executable::Executable( QString title, QFileInfo binaryInfo, QString arguments, QString steamAppID, QString workingDirectory, Flags flags) : @@ -358,3 +308,36 @@ bool Executable::usesOwnIcon() const { return m_flags.testFlag(UseApplicationIcon); } + +void Executable::mergeFrom(const Executable& other) +{ + if (!isCustom()) { + // this happens when the user is trying to modify a plugin executable + + // only change some of the flags + const auto allow = ShowInToolbar; + + m_flags |= (other.flags() & allow); + } else { + // this happens after executables are loaded from settings and plugin + // executables are being added, or when users are modifying executables + + m_title = other.title(); + m_arguments = other.arguments(); + m_steamAppID = other.steamAppID(); + m_workingDirectory = other.workingDirectory(); + + // don't overwrite a valid binary with an invalid one + if (other.binaryInfo().exists()) { + m_binaryInfo = other.binaryInfo(); + } + + if (!other.isCustom()) { + // overwriting a custom executable with a plugin, merge all the flags + m_flags |= other.flags(); + } else { + // overwriting a custom with another custom, just replace the flags + m_flags = other.flags(); + } + } +} diff --git a/src/executableslist.h b/src/executableslist.h index 136f70bf..4965dbf9 100644 --- a/src/executableslist.h +++ b/src/executableslist.h @@ -73,6 +73,8 @@ public: void setShownOnToolbar(bool state); bool usesOwnIcon() const; + void mergeFrom(const Executable& other); + private: QString m_title; QFileInfo m_binaryInfo; @@ -155,57 +157,21 @@ public: * @brief add a new executable to the list * @param executable */ - void addExecutable(const Executable &executable); - - /** - * @brief add a new executable to the list - * - * @param title name displayed in the UI - * @param executableName the actual filename to execute - * @param arguments arguments to pass to the executable - **/ - void addExecutable(const QString &title, - const QString &executableName, - const QString &arguments, - const QString &workingDirectory, - const QString &steamAppID, - Executable::Flags flags) - { - updateExecutable(title, executableName, arguments, workingDirectory, - steamAppID, Executable::AllFlags, flags); - } - - /** - * @brief Update an executable to the list - * - * @param title name displayed in the UI - * @param executableName the actual filename to execute - * @param arguments arguments to pass to the executable - * @param closeMO if true, MO will be closed when the binary is started - **/ - void updateExecutable(const QString &title, - const QString &executableName, - const QString &arguments, - const QString &workingDirectory, - const QString &steamAppID, - Executable::Flags mask, - Executable::Flags flags); + void setExecutable(const Executable &executable); /** - * @brief remove the executable with the specified file name. This needs to be an absolute file path + * @brief remove the executable with the specified file name. This needs to + * be an absolute file path * * @param title title of the executable to remove - * @note if the executable name is invalid, nothing happens. There is no way to determine if this was successful + * @note if the executable name is invalid, nothing happens. There is no way + * to determine if this was successful **/ void remove(const QString &title); private: std::vector m_Executables; - void addExecutableInternal(const QString &title, const QString &executableName, const QString &arguments, - const QString &workingDirectory, - const QString &steamAppID); - /** * @brief add the executables preconfigured for this game **/ diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2fbdbec7..926ba43c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -5507,12 +5507,10 @@ void MainWindow::addAsExecutable() if (!name.isEmpty()) { //Note: If this already exists, you'll lose custom settings - m_OrganizerCore.executablesList()->addExecutable(name, - binaryInfo.absoluteFilePath(), - arguments, - targetInfo.absolutePath(), - QString(), - Executable::CustomExecutable); + m_OrganizerCore.executablesList()->setExecutable({ + name, binaryInfo, arguments, targetInfo.absolutePath(), QString(), + Executable::CustomExecutable}); + refreshExecutablesList(); } -- cgit v1.3.1 From fafdb146004401355db5245cc1f7c241c00cf991 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 19:26:54 -0400 Subject: fixed EditExecutablesDialog being opened without a parent removed Executable's constructor with values, replaced with default ctor + setters, all these strings were much too error-prone added Executable ctor overload to convert from ExecutableInfo plugin executables now override most of the custom changes renamed browseButton to browseBinaryButton to avoid confusion with the other browseDirButton fixed both browse dialogs not handling cancel EditExecutablesDialog's list used to change the text color for custom executables, replaced with italics --- src/editexecutablesdialog.cpp | 35 +++++++++---- src/editexecutablesdialog.h | 2 +- src/editexecutablesdialog.ui | 4 +- src/executableslist.cpp | 118 ++++++++++++++++++++++++++++-------------- src/executableslist.h | 18 +++++-- src/mainwindow.cpp | 13 +++-- 6 files changed, 132 insertions(+), 58 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 83756ac8..a3b2808a 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -81,7 +81,14 @@ void EditExecutablesDialog::refreshExecutablesWidget() for(const auto& exe : m_ExecutablesList) { QListWidgetItem *newItem = new QListWidgetItem(exe.title()); - newItem->setTextColor(exe.isCustom() ? QColor(Qt::black) : QColor(Qt::darkGray)); + + if (!exe.isCustom()) { + auto f = newItem->font(); + f.setItalic(true); + + newItem->setFont(f); + } + ui->executablesListBox->addItem(newItem); } @@ -142,13 +149,13 @@ void EditExecutablesDialog::saveExecutable() if (ui->useAppIconCheckBox->isChecked()) flags |= Executable::UseApplicationIcon; - m_ExecutablesList.setExecutable({ - ui->titleEdit->text(), - QDir::fromNativeSeparators(ui->binaryEdit->text()), - ui->argumentsEdit->text(), - QDir::fromNativeSeparators(ui->workingDirEdit->text()), - ui->overwriteAppIDBox->isChecked() ? ui->appIDOverwriteEdit->text() : "", - flags}); + m_ExecutablesList.setExecutable(Executable() + .title(ui->titleEdit->text()) + .binaryInfo(QDir::fromNativeSeparators(ui->binaryEdit->text())) + .arguments(ui->argumentsEdit->text()) + .steamAppID(ui->overwriteAppIDBox->isChecked() ? ui->appIDOverwriteEdit->text() : "") + .workingDirectory(QDir::fromNativeSeparators(ui->workingDirEdit->text())) + .flags(flags)); if (ui->newFilesModCheckBox->isChecked()) { m_Profile->storeSetting("custom_overwrites", ui->titleEdit->text(), @@ -198,12 +205,17 @@ void EditExecutablesDialog::on_addButton_clicked() refreshExecutablesWidget(); } -void EditExecutablesDialog::on_browseButton_clicked() +void EditExecutablesDialog::on_browseBinaryButton_clicked() { QString binaryName = FileDialogMemory::getOpenFileName( "editExecutableBinary", this, tr("Select a binary"), QString(), tr("Executable (%1)").arg("*.exe *.bat *.jar")); + if (binaryName.isNull()) { + // canceled + return; + } + if (binaryName.endsWith(".jar", Qt::CaseInsensitive)) { QString binaryPath; { // try to find java automatically @@ -250,6 +262,11 @@ void EditExecutablesDialog::on_browseDirButton_clicked() QString dirName = FileDialogMemory::getExistingDirectory("editExecutableDirectory", this, tr("Select a directory")); + if (dirName.isNull()) { + // canceled + return; + } + ui->workingDirEdit->setText(dirName); } diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index bee3cba6..3a856afa 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -78,7 +78,7 @@ private slots: void on_addButton_clicked(); - void on_browseButton_clicked(); + void on_browseBinaryButton_clicked(); void on_removeButton_clicked(); diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index 4f9223d5..adda050c 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -80,7 +80,7 @@ - + Browse filesystem @@ -310,7 +310,7 @@ Right now the only case I know of where this needs to be overwritten is for the executablesListBox titleEdit binaryEdit - browseButton + browseBinaryButton workingDirEdit browseDirButton argumentsEdit diff --git a/src/executableslist.cpp b/src/executableslist.cpp index 9c291708..d884bdf2 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -81,13 +81,13 @@ void ExecutablesList::load(const MOBase::IPluginGame* game, QSettings& settings) if (settings.value("ownicon", false).toBool()) flags |= Executable::UseApplicationIcon; - setExecutable({ - settings.value("title").toString(), - settings.value("binary").toString(), - settings.value("arguments").toString(), - settings.value("workingDirectory", "").toString(), - settings.value("steamAppID", "").toString(), - flags}); + setExecutable(Executable() + .title(settings.value("title").toString()) + .binaryInfo(settings.value("binary").toString()) + .arguments(settings.value("arguments").toString()) + .steamAppID(settings.value("steamAppID", "").toString()) + .workingDirectory(settings.value("workingDirectory", "").toString()) + .flags(flags)); } settings.endArray(); @@ -125,27 +125,22 @@ void ExecutablesList::addFromPlugin(IPluginGame const *game) for (const ExecutableInfo &info : game->executables()) { if (info.isValid()) { - setExecutable({ - info.title(), - info.binary().absoluteFilePath(), - info.arguments().join(" "), - info.workingDirectory().absolutePath(), - info.steamAppID(), - Executable::UseApplicationIcon}); + setExecutable({info, Executable::UseApplicationIcon}); } } - ExecutableInfo explorerpp = ExecutableInfo("Explore Virtual Folder", QFileInfo(QCoreApplication::applicationDirPath() + "/explorer++/Explorer++.exe" )) - .withArgument(QString("\"%1\"").arg(QDir::toNativeSeparators(game->dataDirectory().absolutePath()))); - - if (explorerpp.isValid()) { - setExecutable({ - explorerpp.title(), - explorerpp.binary().absoluteFilePath(), - explorerpp.arguments().join(" "), - explorerpp.workingDirectory().absolutePath(), - explorerpp.steamAppID(), - Executable::UseApplicationIcon}); + const QFileInfo eppBin(QCoreApplication::applicationDirPath() + "/explorer++/Explorer++.exe"); + + if (eppBin.exists()) { + const auto args = QString("\"%1\"") + .arg(QDir::toNativeSeparators(game->dataDirectory().absolutePath())); + + setExecutable(Executable() + .title("Explore Virtual Folder") + .binaryInfo(eppBin) + .arguments(args) + .workingDirectory(eppBin.absolutePath()) + .flags(Executable::UseApplicationIcon)); } } @@ -213,15 +208,13 @@ void ExecutablesList::remove(const QString &title) } -Executable::Executable( - QString title, QFileInfo binaryInfo, QString arguments, - QString steamAppID, QString workingDirectory, Flags flags) : - m_title(std::move(title)), - m_binaryInfo(std::move(binaryInfo)), - m_arguments(std::move(arguments)), - m_steamAppID(std::move(steamAppID)), - m_workingDirectory(std::move(workingDirectory)), - m_flags(flags) +Executable::Executable(const MOBase::ExecutableInfo& info, Flags flags) : + m_title(info.title()), + m_binaryInfo(info.binary()), + m_arguments(info.arguments().join(" ")), + m_steamAppID(info.steamAppID()), + m_workingDirectory(info.workingDirectory().absolutePath()), + m_flags(flags) { } @@ -255,6 +248,42 @@ Executable::Flags Executable::flags() const return m_flags; } +Executable& Executable::title(const QString& s) +{ + m_title = s; + return *this; +} + +Executable& Executable::binaryInfo(const QFileInfo& fi) +{ + m_binaryInfo = fi; + return *this; +} + +Executable& Executable::arguments(const QString& s) +{ + m_arguments = s; + return *this; +} + +Executable& Executable::steamAppID(const QString& s) +{ + m_steamAppID = s; + return *this; +} + +Executable& Executable::workingDirectory(const QString& s) +{ + m_workingDirectory = s; + return *this; +} + +Executable& Executable::flags(Flags f) +{ + m_flags = f; + return *this; +} + bool Executable::isCustom() const { return m_flags.testFlag(CustomExecutable); @@ -281,12 +310,25 @@ bool Executable::usesOwnIcon() const void Executable::mergeFrom(const Executable& other) { - if (!isCustom()) { - // this happens when the user is trying to modify a plugin executable + // flags on plugin executables that the user is allowed to chnage + const auto allow = ShowInToolbar; + + + if (!isCustom() && !other.isCustom()) { + // this happens when loading plugin executables in addFromPlugin(), replace + // everything in case the plugin has changed - // only change some of the flags - const auto allow = ShowInToolbar; + // remember the flags though + const auto flags = m_flags; + // overwrite everything + *this = other; + + // set the user flags + m_flags |= (flags & allow); + } + else if (!isCustom()) { + // this happens when the user is trying to modify a plugin executable m_flags |= (other.flags() & allow); } else { // this happens after executables are loaded from settings and plugin diff --git a/src/executableslist.h b/src/executableslist.h index e35cb550..54a105d0 100644 --- a/src/executableslist.h +++ b/src/executableslist.h @@ -27,7 +27,7 @@ along with Mod Organizer. If not, see . #include #include -namespace MOBase { class IPluginGame; } +namespace MOBase { class IPluginGame; class ExecutableInfo; } /*! * @brief Information about an executable @@ -44,9 +44,12 @@ public: Q_DECLARE_FLAGS(Flags, Flag); - Executable( - QString title, QFileInfo binaryInfo, QString arguments, - QString steamAppID, QString workingDirectory, Flags flags); + Executable() = default; + + /** + * @brief Executable from plugin + */ + Executable(const MOBase::ExecutableInfo& info, Flags flags); const QString& title() const; const QFileInfo& binaryInfo() const; @@ -55,6 +58,13 @@ public: const QString& workingDirectory() const; Flags flags() const; + Executable& title(const QString& s); + Executable& binaryInfo(const QFileInfo& fi); + Executable& arguments(const QString& s); + Executable& steamAppID(const QString& s); + Executable& workingDirectory(const QString& s); + Executable& flags(Flags f); + bool isCustom() const; bool isShownOnToolbar() const; void setShownOnToolbar(bool state); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 926ba43c..267a2971 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2483,7 +2483,9 @@ bool MainWindow::modifyExecutablesDialog() EditExecutablesDialog dialog(*m_OrganizerCore.executablesList(), *m_OrganizerCore.modList(), m_OrganizerCore.currentProfile(), - m_OrganizerCore.managedGame()); + m_OrganizerCore.managedGame(), + this); + QSettings &settings = m_OrganizerCore.settings().directInterface(); QString key = QString("geometry/%1").arg(dialog.objectName()); if (settings.contains(key)) { @@ -5507,9 +5509,12 @@ void MainWindow::addAsExecutable() if (!name.isEmpty()) { //Note: If this already exists, you'll lose custom settings - m_OrganizerCore.executablesList()->setExecutable({ - name, binaryInfo, arguments, targetInfo.absolutePath(), QString(), - Executable::CustomExecutable}); + m_OrganizerCore.executablesList()->setExecutable(Executable() + .title(name) + .binaryInfo(binaryInfo) + .arguments(arguments) + .workingDirectory(targetInfo.absolutePath()) + .flags(Executable::CustomExecutable)); refreshExecutablesList(); } -- cgit v1.3.1 From 840dba26bacd044164d3236218e42f441433252c Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 19:55:41 -0400 Subject: rework of the executables dialog to have a horizontal splitter and use a standard QDialogButtonBox --- src/editexecutablesdialog.cpp | 10 +- src/editexecutablesdialog.h | 5 +- src/editexecutablesdialog.ui | 613 +++++++++++++++++++++++------------------- 3 files changed, 347 insertions(+), 281 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index a3b2808a..559bc8f0 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -42,6 +42,9 @@ EditExecutablesDialog::EditExecutablesDialog( , m_GamePlugin(game) { ui->setupUi(this); + ui->splitter->setSizes({200, 1}); + ui->splitter->setStretchFactor(0, 0); + ui->splitter->setStretchFactor(1, 1); refreshExecutablesWidget(); @@ -367,8 +370,10 @@ void EditExecutablesDialog::on_overwriteAppIDBox_toggled(bool checked) ui->appIDOverwriteEdit->setEnabled(checked); } -void EditExecutablesDialog::on_closeButton_clicked() +void EditExecutablesDialog::on_buttonBox_clicked(QAbstractButton*) { + // there's only a close button for now, so the actual button doesn't matter + if (executableChanged()) { QMessageBox::StandardButton res = QMessageBox::question(this, tr("Save Changes?"), tr("You made changes to the current executable, do you want to save them?"), @@ -382,7 +387,8 @@ void EditExecutablesDialog::on_closeButton_clicked() refreshExecutablesWidget(); } } - this->accept(); + + accept(); } void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex ¤t) diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 3a856afa..07d6459c 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -22,10 +22,11 @@ along with Mod Organizer. If not, see . #include "tutorabledialog.h" #include -#include #include "executableslist.h" #include "profile.h" #include "iplugingame.h" +#include +#include namespace Ui { class EditExecutablesDialog; @@ -88,7 +89,7 @@ private slots: void on_browseDirButton_clicked(); - void on_closeButton_clicked(); + void on_buttonBox_clicked(QAbstractButton *button); void delayedRefresh(); diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index adda050c..1cf1116a 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -6,8 +6,8 @@ 0 0 - 426 - 460 + 524 + 366 @@ -21,293 +21,354 @@ - - - List of configured executables + + + + 0 + 100 + - - This is a list of your configured executables. Executables in grey are automatically recognised and can not be modified. - - - QAbstractItemView::InternalMove - - - Qt::TargetMoveAction - - - QAbstractItemView::ExtendedSelection - - - - - - - - - Title - - - - - - - Name of the executable. This is only for display purposes. - - - Name of the executable. This is only for display purposes. - - - - - - - - - - - Binary - - - - - - - Binary to run - - - Binary to run - - - - - - - Browse filesystem - - - Browse filesystem for the executable to run. - - - ... - - - - - - - - - - - Start in - - - - - - - - - - ... - - - - - - - - - - - Arguments - - - - - - - Arguments to pass to the application - - - Arguments to pass to the application - - - - - - - - - - - Allow the Steam AppID to be used for this executable to be changed. - - - Allow the Steam AppID to be used for this executable to be changed. + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + false + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + List of configured executables + + + This is a list of your configured executables. Executables in grey are automatically recognised and can not be modified. + + + QAbstractItemView::InternalMove + + + Qt::TargetMoveAction + + + QAbstractItemView::ExtendedSelection + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + Title + + + + + + + Name of the executable. This is only for display purposes. + + + Name of the executable. This is only for display purposes. + + + + + + + + + + + Binary + + + + + + + Binary to run + + + Binary to run + + + + + + + Browse filesystem + + + Browse filesystem for the executable to run. + + + ... + + + + + + + + + + + Start in + + + + + + + + + + ... + + + + + + + + + + + Arguments + + + + + + + Arguments to pass to the application + + + Arguments to pass to the application + + + + + + + + + + + Allow the Steam AppID to be used for this executable to be changed. + + + Allow the Steam AppID to be used for this executable to be changed. Every game/tool distributed through Steam has a unique ID. MO needs to know this ID to start those programs directly, otherwise the program is started by steam and then MO will not work. By default, MO will use the AppID for the game. Right now the only case I know of where this needs to be overwritten is for the Skyrim Creation Kit which has its own AppID. This overwrite is already preconfigured. - - - Overwrite Steam AppID - - - - - - - false - - - Steam AppID to use for this executable that differs from the games AppID. - - - Steam AppID to use for this executable that differs from the games AppID. + + + Overwrite Steam AppID + + + + + + + false + + + Steam AppID to use for this executable that differs from the games AppID. + + + Steam AppID to use for this executable that differs from the games AppID. Every game/tool distributed through Steam has a unique ID. MO needs to know this ID to start those programs directly, otherwise the program is started by steam and then MO will not work. By default, MO will use the AppID for the game (usually 72850). Right now the only case I know of where this needs to be overwritten is for the Skyrim Creation Kit which has its own AppID (usually 202480). This overwrite is already preconfigured. - - - - - - - - - - - If this is enabled, new files are created in the specified mod instead of the "Overwrite" mod. - - - Create Files in Mod instead of Overwrite (*) - - - - - - - false - - - - - - - - - - - If this is enabled, the configured libraries will be automatically loaded when this executable is launched. - - - Force Load Libraries (*) - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - false - - - Configure Libraries - - - - - - - - - Use Application's Icon for shortcuts - + + + + + + + + + + + If this is enabled, new files are created in the specified mod instead of the "Overwrite" mod. + + + Create Files in Mod instead of Overwrite (*) + + + + + + + false + + + + + + + + + + + If this is enabled, the configured libraries will be automatically loaded when this executable is launched. + + + Force Load Libraries (*) + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Configure Libraries + + + + + + + + + Use Application's Icon for shortcuts + + + + + + + (*) This setting is profile-specific + + + + + + + + + Add an executable + + + Add an executable + + + Add + + + + :/new/guiresources/resources/list-add.png:/new/guiresources/resources/list-add.png + + + + + + + Remove the selected executable + + + Remove the selected executable + + + Remove + + + + :/new/guiresources/resources/list-remove.png:/new/guiresources/resources/list-remove.png + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + - - - (*) This setting is profile-specific + + + QDialogButtonBox::Close - - - - - - Add an executable - - - Add an executable - - - Add - - - - :/new/guiresources/resources/list-add.png:/new/guiresources/resources/list-add.png - - - - - - - Remove the selected executable - - - Remove the selected executable - - - Remove - - - - :/new/guiresources/resources/list-remove.png:/new/guiresources/resources/list-remove.png - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Close - - - - - - executablesListBox titleEdit binaryEdit browseBinaryButton @@ -318,10 +379,8 @@ Right now the only case I know of where this needs to be overwritten is for the appIDOverwriteEdit newFilesModCheckBox newFilesModBox - useAppIconCheckBox addButton removeButton - closeButton -- cgit v1.3.1 From 5556e2b152decad3392c30c9760a5584454b52e6 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 20:08:53 -0400 Subject: replaced close with ok/cancel moved add/remove below the list --- src/editexecutablesdialog.cpp | 9 +- src/editexecutablesdialog.h | 3 +- src/editexecutablesdialog.ui | 218 +++++++++++++++++++++++------------------- 3 files changed, 125 insertions(+), 105 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 559bc8f0..f7348889 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -370,10 +370,8 @@ void EditExecutablesDialog::on_overwriteAppIDBox_toggled(bool checked) ui->appIDOverwriteEdit->setEnabled(checked); } -void EditExecutablesDialog::on_buttonBox_clicked(QAbstractButton*) +void EditExecutablesDialog::on_buttonBox_accepted() { - // there's only a close button for now, so the actual button doesn't matter - if (executableChanged()) { QMessageBox::StandardButton res = QMessageBox::question(this, tr("Save Changes?"), tr("You made changes to the current executable, do you want to save them?"), @@ -391,6 +389,11 @@ void EditExecutablesDialog::on_buttonBox_clicked(QAbstractButton*) accept(); } +void EditExecutablesDialog::on_buttonBox_rejected() +{ + reject(); +} + void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex ¤t) { if (current.isValid()) { diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 07d6459c..7f389b24 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -89,7 +89,8 @@ private slots: void on_browseDirButton_clicked(); - void on_buttonBox_clicked(QAbstractButton *button); + void on_buttonBox_accepted(); + void on_buttonBox_rejected(); void delayedRefresh(); diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index 1cf1116a..52bbf187 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -6,8 +6,8 @@ 0 0 - 524 - 366 + 710 + 293 @@ -82,6 +82,70 @@ + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Add an executable + + + Add an executable + + + Add + + + + :/new/guiresources/resources/list-add.png:/new/guiresources/resources/list-add.png + + + + + + + Remove the selected executable + + + Remove the selected executable + + + Remove + + + + :/new/guiresources/resources/list-remove.png:/new/guiresources/resources/list-remove.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -99,15 +163,18 @@ 0 - - + + + 20 + + Title - + Name of the executable. This is only for display purposes. @@ -117,73 +184,69 @@ - - - - - + Binary - - - - Binary to run - - - Binary to run - - - - - - - Browse filesystem - - - Browse filesystem for the executable to run. - - - ... - - + + + + + + Binary to run + + + Binary to run + + + + + + + Browse filesystem + + + Browse filesystem for the executable to run. + + + ... + + + + - - - - - + Start in - - - - - - - ... - - + + + + + + + + + ... + + + + - - - - - + Arguments - + Arguments to pass to the application @@ -258,7 +321,7 @@ Right now the only case I know of where this needs to be overwritten is for the If this is enabled, the configured libraries will be automatically loaded when this executable is launched. - Force Load Libraries (*) + Force Load Libraries (Profile Specific) @@ -294,51 +357,6 @@ Right now the only case I know of where this needs to be overwritten is for the - - - - (*) This setting is profile-specific - - - - - - - - - Add an executable - - - Add an executable - - - Add - - - - :/new/guiresources/resources/list-add.png:/new/guiresources/resources/list-add.png - - - - - - - Remove the selected executable - - - Remove the selected executable - - - Remove - - - - :/new/guiresources/resources/list-remove.png:/new/guiresources/resources/list-remove.png - - - - - @@ -362,19 +380,17 @@ Right now the only case I know of where this needs to be overwritten is for the - QDialogButtonBox::Close + QDialogButtonBox::Cancel|QDialogButtonBox::Ok - titleEdit binaryEdit browseBinaryButton workingDirEdit browseDirButton - argumentsEdit overwriteAppIDBox appIDOverwriteEdit newFilesModCheckBox -- cgit v1.3.1 From 39d953c838d459085b4044c9ca5bda0248e47f6b Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 21:03:25 -0400 Subject: load plugin executables after settings, allows for changing the order added warning that an executable is provided by a plugin, disable widgets that can't be changed refactoring EditExecutablesDialog --- src/editexecutablesdialog.cpp | 134 +++++++++++--- src/editexecutablesdialog.h | 9 +- src/editexecutablesdialog.ui | 405 ++++++++++++++++++++++-------------------- src/executableslist.cpp | 4 +- 4 files changed, 328 insertions(+), 224 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index f7348889..8494c892 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -47,15 +47,96 @@ EditExecutablesDialog::EditExecutablesDialog( ui->splitter->setStretchFactor(1, 1); refreshExecutablesWidget(); - ui->newFilesModBox->addItems(modList.allMods()); m_ForcedLibraries = m_Profile->determineForcedLibraries(ui->titleEdit->text()); + + updateUI(nullptr); +} + +EditExecutablesDialog::~EditExecutablesDialog() = default; + +void EditExecutablesDialog::updateUI(const Executable* e) +{ + if (e) { + setEdits(*e); + } else { + clearEdits(); + ui->removeButton->setEnabled(false); + } +} + +void EditExecutablesDialog::clearEdits() +{ + ui->titleEdit->clear(); + ui->binaryEdit->clear(); + ui->workingDirEdit->clear(); + ui->argumentsEdit->clear(); + ui->overwriteAppIDBox->setChecked(false); + ui->appIDOverwriteEdit->clear(); + ui->newFilesModCheckBox->setChecked(false); + ui->newFilesModBox->setCurrentIndex(-1); + ui->forceLoadCheckBox->setChecked(false); + ui->useAppIconCheckBox->setChecked(false); + + ui->pluginProvidedLabel->setVisible(false); } -EditExecutablesDialog::~EditExecutablesDialog() +void EditExecutablesDialog::setEdits(const Executable& e) { - delete ui; + ui->titleEdit->setText(e.title()); + ui->binaryEdit->setText(QDir::toNativeSeparators(e.binaryInfo().absoluteFilePath())); + ui->workingDirEdit->setText(QDir::toNativeSeparators(e.workingDirectory())); + ui->argumentsEdit->setText(e.arguments()); + ui->overwriteAppIDBox->setChecked(!e.steamAppID().isEmpty()); + ui->appIDOverwriteEdit->setText(e.steamAppID()); + ui->useAppIconCheckBox->setChecked(e.usesOwnIcon()); + + int modIndex = -1; + + QString customOverwrite = m_Profile->setting("custom_overwrites", e.title()).toString(); + if (!customOverwrite.isEmpty()) { + modIndex = ui->newFilesModBox->findText(customOverwrite); + } + + ui->newFilesModCheckBox->setChecked(modIndex != -1); + ui->newFilesModBox->setCurrentIndex(modIndex); + + const bool forcedLibraries = m_Profile->forcedLibrariesEnabled(e.title()); + ui->forceLoadCheckBox->setChecked(forcedLibraries); + ui->forceLoadButton->setEnabled(forcedLibraries); + + ui->pluginProvidedLabel->setVisible(!e.isCustom()); + + // only enabled for custom executables + ui->titleEdit->setEnabled(e.isCustom()); + ui->binaryEdit->setEnabled(e.isCustom()); + ui->browseBinaryButton->setEnabled(e.isCustom()); + ui->workingDirEdit->setEnabled(e.isCustom()); + ui->browseWorkingDirButton->setEnabled(e.isCustom()); + ui->argumentsEdit->setEnabled(e.isCustom()); + ui->overwriteAppIDBox->setEnabled(e.isCustom()); + ui->appIDOverwriteEdit->setEnabled(e.isCustom()); + ui->useAppIconCheckBox->setEnabled(e.isCustom()); + + // always enabled + ui->newFilesModCheckBox->setEnabled(true); + ui->newFilesModBox->setEnabled(true); + ui->forceLoadCheckBox->setEnabled(true); +} + +void EditExecutablesDialog::resetInput() +{ + ui->binaryEdit->setText(""); + ui->titleEdit->setText(""); + ui->workingDirEdit->clear(); + ui->argumentsEdit->setText(""); + ui->appIDOverwriteEdit->clear(); + ui->overwriteAppIDBox->setChecked(false); + ui->useAppIconCheckBox->setChecked(false); + ui->newFilesModCheckBox->setChecked(false); + ui->forceLoadCheckBox->setChecked(false); + m_CurrentItem = nullptr; } ExecutablesList EditExecutablesDialog::getExecutablesList() const @@ -95,8 +176,8 @@ void EditExecutablesDialog::refreshExecutablesWidget() ui->executablesListBox->addItem(newItem); } - ui->addButton->setEnabled(false); - ui->removeButton->setEnabled(false); + //ui->addButton->setEnabled(false); + //ui->removeButton->setEnabled(false); } @@ -131,20 +212,6 @@ void EditExecutablesDialog::updateButtonStates() ui->addButton->setEnabled(enabled); } -void EditExecutablesDialog::resetInput() -{ - ui->binaryEdit->setText(""); - ui->titleEdit->setText(""); - ui->workingDirEdit->clear(); - ui->argumentsEdit->setText(""); - ui->appIDOverwriteEdit->clear(); - ui->overwriteAppIDBox->setChecked(false); - ui->useAppIconCheckBox->setChecked(false); - ui->newFilesModCheckBox->setChecked(false); - ui->forceLoadCheckBox->setChecked(false); - m_CurrentItem = nullptr; -} - void EditExecutablesDialog::saveExecutable() { @@ -260,7 +327,7 @@ void EditExecutablesDialog::on_browseBinaryButton_clicked() } } -void EditExecutablesDialog::on_browseDirButton_clicked() +void EditExecutablesDialog::on_browseWorkingDirButton_clicked() { QString dirName = FileDialogMemory::getExistingDirectory("editExecutableDirectory", this, tr("Select a directory")); @@ -359,10 +426,27 @@ bool EditExecutablesDialog::executableChanged() } void EditExecutablesDialog::on_executablesListBox_itemSelectionChanged() { - if (ui->executablesListBox->selectedItems().size() == 0) { - // deselected - resetInput(); + const auto selection = ui->executablesListBox->selectedItems(); + + if (selection.empty()) { + updateUI(nullptr); + return; + } + + auto* item = selection[0]; + if (!item) { + return; } + + const auto& title = item->text(); + auto itor = m_ExecutablesList.find(title); + + if (itor == m_ExecutablesList.end()) { + qWarning().nospace() << "selection: executable '" << title << "' not found"; + return; + } + + updateUI(&*itor); } void EditExecutablesDialog::on_overwriteAppIDBox_toggled(bool checked) @@ -395,7 +479,7 @@ void EditExecutablesDialog::on_buttonBox_rejected() } void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex ¤t) -{ +{/* if (current.isValid()) { if (executableChanged()) { @@ -459,7 +543,7 @@ void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex &cur bool forcedLibraries = m_Profile->forcedLibrariesEnabled(ui->titleEdit->text()); ui->forceLoadButton->setEnabled(forcedLibraries); ui->forceLoadCheckBox->setChecked(forcedLibraries); - } + }*/ } void EditExecutablesDialog::on_newFilesModCheckBox_toggled(bool checked) diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 7f389b24..bb1538ef 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -87,7 +87,7 @@ private slots: void on_overwriteAppIDBox_toggled(bool checked); - void on_browseDirButton_clicked(); + void on_browseWorkingDirButton_clicked(); void on_buttonBox_accepted(); void on_buttonBox_rejected(); @@ -113,7 +113,7 @@ private: void updateButtonStates(); private: - Ui::EditExecutablesDialog *ui; + std::unique_ptr ui; QListWidgetItem *m_CurrentItem; @@ -124,6 +124,11 @@ private: QList m_ForcedLibraries; const MOBase::IPluginGame *m_GamePlugin; + + + void updateUI(const Executable* e); + void clearEdits(); + void setEdits(const Executable& e); }; #endif // EDITEXECUTABLESDIALOG_H diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index 52bbf187..2c9a74f3 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -7,15 +7,9 @@ 0 0 710 - 293 + 348 - - - 200 - 200 - - Modify Executables @@ -77,9 +71,6 @@ Qt::TargetMoveAction - - QAbstractItemView::ExtendedSelection - @@ -163,197 +154,221 @@ 0 - - - 20 - - - - - Title - - - - - - - Name of the executable. This is only for display purposes. - - - Name of the executable. This is only for display purposes. - - - - - - - Binary - - - - - - - - - Binary to run - - - Binary to run - - - - - - - Browse filesystem - - - Browse filesystem for the executable to run. - - - ... - - - - - - - - - Start in - - - - - - - - - - - - ... - - - - - - - - - Arguments - - - - - - - Arguments to pass to the application - - - Arguments to pass to the application - - - - - - - - - - - Allow the Steam AppID to be used for this executable to be changed. - - - Allow the Steam AppID to be used for this executable to be changed. + + + + 10 + + + + + 20 + + + + + Title + + + + + + + Name of the executable. This is only for display purposes. + + + Name of the executable. This is only for display purposes. + + + + + + + Binary + + + + + + + + + Binary to run + + + Binary to run + + + + + + + Browse filesystem + + + Browse filesystem for the executable to run. + + + ... + + + + + + + + + Start in + + + + + + + + + + + + ... + + + + + + + + + Arguments + + + + + + + Arguments to pass to the application + + + Arguments to pass to the application + + + + + + + + + + + Allow the Steam AppID to be used for this executable to be changed. + + + Allow the Steam AppID to be used for this executable to be changed. Every game/tool distributed through Steam has a unique ID. MO needs to know this ID to start those programs directly, otherwise the program is started by steam and then MO will not work. By default, MO will use the AppID for the game. Right now the only case I know of where this needs to be overwritten is for the Skyrim Creation Kit which has its own AppID. This overwrite is already preconfigured. - - - Overwrite Steam AppID - - - - - - - false - - - Steam AppID to use for this executable that differs from the games AppID. - - - Steam AppID to use for this executable that differs from the games AppID. + + + Overwrite Steam AppID + + + + + + + false + + + Steam AppID to use for this executable that differs from the games AppID. + + + Steam AppID to use for this executable that differs from the games AppID. Every game/tool distributed through Steam has a unique ID. MO needs to know this ID to start those programs directly, otherwise the program is started by steam and then MO will not work. By default, MO will use the AppID for the game (usually 72850). Right now the only case I know of where this needs to be overwritten is for the Skyrim Creation Kit which has its own AppID (usually 202480). This overwrite is already preconfigured. - - - - - - - - - - - If this is enabled, new files are created in the specified mod instead of the "Overwrite" mod. - - - Create Files in Mod instead of Overwrite (*) - - - - - - - false - - - - - - - - - - - If this is enabled, the configured libraries will be automatically loaded when this executable is launched. - - - Force Load Libraries (Profile Specific) - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - false - - - Configure Libraries - - - - + + + + + + + + + + + If this is enabled, new files are created in the specified mod instead of the "Overwrite" mod. + + + Create Files in Mod instead of Overwrite (*) + + + + + + + false + + + + + + + + + + + If this is enabled, the configured libraries will be automatically loaded when this executable is launched. + + + Force Load Libraries (Profile Specific) + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Configure Libraries + + + + + + + + + Use Application's Icon for shortcuts + + + + + - + + + + true + + - Use Application's Icon for shortcuts + This executable is provided by the game plugin + + + Qt::AlignCenter @@ -390,7 +405,7 @@ Right now the only case I know of where this needs to be overwritten is for the binaryEdit browseBinaryButton workingDirEdit - browseDirButton + browseWorkingDirButton overwriteAppIDBox appIDOverwriteEdit newFilesModCheckBox diff --git a/src/executableslist.cpp b/src/executableslist.cpp index d884bdf2..8174eb1b 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -65,8 +65,6 @@ bool ExecutablesList::empty() const void ExecutablesList::load(const MOBase::IPluginGame* game, QSettings& settings) { - addFromPlugin(game); - qDebug("setting up configured executables"); int numCustomExecutables = settings.beginReadArray("customExecutables"); @@ -91,6 +89,8 @@ void ExecutablesList::load(const MOBase::IPluginGame* game, QSettings& settings) } settings.endArray(); + + addFromPlugin(game); } void ExecutablesList::store(QSettings& settings) -- cgit v1.3.1 From d125036903bbf5d956233ab79e1fdda3724a1e9e Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 21:15:29 -0400 Subject: stop changing add button to modify, disable remove for plugin executables general clean up of member variable names, whitespace --- src/editexecutablesdialog.cpp | 78 +++++++++++++++++++++++-------------------- src/editexecutablesdialog.h | 63 +++++++++------------------------- 2 files changed, 57 insertions(+), 84 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 8494c892..941ab4e0 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -36,10 +36,11 @@ EditExecutablesDialog::EditExecutablesDialog( Profile *profile, const IPluginGame *game, QWidget *parent) : TutorableDialog("EditExecutables", parent) , ui(new Ui::EditExecutablesDialog) - , m_CurrentItem(nullptr) - , m_ExecutablesList(executablesList) - , m_Profile(profile) - , m_GamePlugin(game) + , m_currentItem(nullptr) + , m_executablesList(executablesList) + , m_profile(profile) + , m_gamePlugin(game) + , m_dirty(false) { ui->setupUi(this); ui->splitter->setSizes({200, 1}); @@ -49,7 +50,7 @@ EditExecutablesDialog::EditExecutablesDialog( refreshExecutablesWidget(); ui->newFilesModBox->addItems(modList.allMods()); - m_ForcedLibraries = m_Profile->determineForcedLibraries(ui->titleEdit->text()); + m_forcedLibraries = m_profile->determineForcedLibraries(ui->titleEdit->text()); updateUI(nullptr); } @@ -60,6 +61,7 @@ void EditExecutablesDialog::updateUI(const Executable* e) { if (e) { setEdits(*e); + ui->removeButton->setEnabled(e->isCustom()); } else { clearEdits(); ui->removeButton->setEnabled(false); @@ -94,7 +96,7 @@ void EditExecutablesDialog::setEdits(const Executable& e) int modIndex = -1; - QString customOverwrite = m_Profile->setting("custom_overwrites", e.title()).toString(); + QString customOverwrite = m_profile->setting("custom_overwrites", e.title()).toString(); if (!customOverwrite.isEmpty()) { modIndex = ui->newFilesModBox->findText(customOverwrite); } @@ -102,7 +104,7 @@ void EditExecutablesDialog::setEdits(const Executable& e) ui->newFilesModCheckBox->setChecked(modIndex != -1); ui->newFilesModBox->setCurrentIndex(modIndex); - const bool forcedLibraries = m_Profile->forcedLibrariesEnabled(e.title()); + const bool forcedLibraries = m_profile->forcedLibrariesEnabled(e.title()); ui->forceLoadCheckBox->setChecked(forcedLibraries); ui->forceLoadButton->setEnabled(forcedLibraries); @@ -125,6 +127,10 @@ void EditExecutablesDialog::setEdits(const Executable& e) ui->forceLoadCheckBox->setEnabled(true); } + + + + void EditExecutablesDialog::resetInput() { ui->binaryEdit->setText(""); @@ -136,7 +142,7 @@ void EditExecutablesDialog::resetInput() ui->useAppIconCheckBox->setChecked(false); ui->newFilesModCheckBox->setChecked(false); ui->forceLoadCheckBox->setChecked(false); - m_CurrentItem = nullptr; + m_currentItem = nullptr; } ExecutablesList EditExecutablesDialog::getExecutablesList() const @@ -144,9 +150,9 @@ ExecutablesList EditExecutablesDialog::getExecutablesList() const ExecutablesList newList; for (int i = 0; i < ui->executablesListBox->count(); ++i) { const auto& title = ui->executablesListBox->item(i)->text(); - auto itor = m_ExecutablesList.find(title); + auto itor = m_executablesList.find(title); - if (itor == m_ExecutablesList.end()) { + if (itor == m_executablesList.end()) { qWarning().nospace() << "getExecutablesList(): executable '" << title << "' not found"; @@ -163,7 +169,7 @@ void EditExecutablesDialog::refreshExecutablesWidget() { ui->executablesListBox->clear(); - for(const auto& exe : m_ExecutablesList) { + for(const auto& exe : m_executablesList) { QListWidgetItem *newItem = new QListWidgetItem(exe.title()); if (!exe.isCustom()) { @@ -209,7 +215,7 @@ void EditExecutablesDialog::updateButtonStates() enabled = false; } - ui->addButton->setEnabled(enabled); + //ui->addButton->setEnabled(enabled); } @@ -219,7 +225,7 @@ void EditExecutablesDialog::saveExecutable() if (ui->useAppIconCheckBox->isChecked()) flags |= Executable::UseApplicationIcon; - m_ExecutablesList.setExecutable(Executable() + m_executablesList.setExecutable(Executable() .title(ui->titleEdit->text()) .binaryInfo(QDir::fromNativeSeparators(ui->binaryEdit->text())) .arguments(ui->argumentsEdit->text()) @@ -228,16 +234,16 @@ void EditExecutablesDialog::saveExecutable() .flags(flags)); if (ui->newFilesModCheckBox->isChecked()) { - m_Profile->storeSetting("custom_overwrites", ui->titleEdit->text(), + m_profile->storeSetting("custom_overwrites", ui->titleEdit->text(), ui->newFilesModBox->currentText()); } else { - m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text()); + m_profile->removeSetting("custom_overwrites", ui->titleEdit->text()); } - m_Profile->removeForcedLibraries(ui->titleEdit->text()); - m_Profile->storeForcedLibraries(ui->titleEdit->text(), m_ForcedLibraries); - m_Profile->setForcedLibrariesEnabled(ui->titleEdit->text(), ui->forceLoadCheckBox->isChecked()); + m_profile->removeForcedLibraries(ui->titleEdit->text()); + m_profile->storeForcedLibraries(ui->titleEdit->text(), m_forcedLibraries); + m_profile->setForcedLibrariesEnabled(ui->titleEdit->text(), ui->forceLoadCheckBox->isChecked()); } @@ -252,10 +258,10 @@ void EditExecutablesDialog::delayedRefresh() void EditExecutablesDialog::on_forceLoadButton_clicked() { - ForcedLoadDialog dialog(m_GamePlugin, this); - dialog.setValues(m_ForcedLibraries); + ForcedLoadDialog dialog(m_gamePlugin, this); + dialog.setValues(m_forcedLibraries); if (dialog.exec() == QDialog::Accepted) { - m_ForcedLibraries = dialog.values(); + m_forcedLibraries = dialog.values(); } } @@ -344,9 +350,9 @@ void EditExecutablesDialog::on_removeButton_clicked() { if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->titleEdit->text()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text()); - m_Profile->removeForcedLibraries(ui->titleEdit->text()); - m_ExecutablesList.remove(ui->titleEdit->text()); + m_profile->removeSetting("custom_overwrites", ui->titleEdit->text()); + m_profile->removeForcedLibraries(ui->titleEdit->text()); + m_executablesList.remove(ui->titleEdit->text()); } resetInput(); @@ -355,7 +361,7 @@ void EditExecutablesDialog::on_removeButton_clicked() void EditExecutablesDialog::on_titleEdit_textChanged(const QString &arg1) { - QPushButton *addButton = findChild("addButton"); + /*QPushButton *addButton = findChild("addButton"); QPushButton *removeButton = findChild("removeButton"); QListWidget *executablesWidget = findChild("executablesListBox"); @@ -371,17 +377,17 @@ void EditExecutablesDialog::on_titleEdit_textChanged(const QString &arg1) // existing item. is it a custom one? addButton->setText(tr("Modify")); removeButton->setEnabled(true); - } + }*/ } bool EditExecutablesDialog::executableChanged() { - if (m_CurrentItem != nullptr) { - const auto& title = m_CurrentItem->text(); - auto itor = m_ExecutablesList.find(title); + if (m_currentItem != nullptr) { + const auto& title = m_currentItem->text(); + auto itor = m_executablesList.find(title); - if (itor == m_ExecutablesList.end()) { + if (itor == m_executablesList.end()) { qWarning().nospace() << "executableChanged(): title '" << title << "' not found"; @@ -390,12 +396,12 @@ bool EditExecutablesDialog::executableChanged() const Executable& selectedExecutable = *itor; - QString storedCustomOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.title()).toString(); + QString storedCustomOverwrite = m_profile->setting("custom_overwrites", selectedExecutable.title()).toString(); bool forcedLibrariesDirty = false; - auto forcedLibaries = m_Profile->determineForcedLibraries(selectedExecutable.title()); + auto forcedLibaries = m_profile->determineForcedLibraries(selectedExecutable.title()); forcedLibrariesDirty |= !std::equal(forcedLibaries.begin(), forcedLibaries.end(), - m_ForcedLibraries.begin(), m_ForcedLibraries.end(), + m_forcedLibraries.begin(), m_forcedLibraries.end(), [](const ExecutableForcedLoadSetting &lhs, const ExecutableForcedLoadSetting &rhs) { return lhs.enabled() == rhs.enabled() && @@ -403,7 +409,7 @@ bool EditExecutablesDialog::executableChanged() lhs.library() == rhs.library() && lhs.process() == rhs.process(); }); - forcedLibrariesDirty |= m_Profile->setting("forced_libraries", ui->titleEdit->text() + "/enabled", false).toBool() != + forcedLibrariesDirty |= m_profile->setting("forced_libraries", ui->titleEdit->text() + "/enabled", false).toBool() != ui->forceLoadCheckBox->isChecked(); return selectedExecutable.title() != ui->titleEdit->text() @@ -439,9 +445,9 @@ void EditExecutablesDialog::on_executablesListBox_itemSelectionChanged() } const auto& title = item->text(); - auto itor = m_ExecutablesList.find(title); + auto itor = m_executablesList.find(title); - if (itor == m_ExecutablesList.end()) { + if (itor == m_executablesList.end()) { qWarning().nospace() << "selection: executable '" << title << "' not found"; return; } diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index bb1538ef..9214941d 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -32,10 +32,8 @@ namespace Ui { class EditExecutablesDialog; } - class ModList; - /** * @brief Dialog to manage the list of executables **/ @@ -44,91 +42,60 @@ class EditExecutablesDialog : public MOBase::TutorableDialog Q_OBJECT public: - /** - * @brief constructor - * * @param executablesList current list of executables * @param parent parent widget **/ - explicit EditExecutablesDialog(const ExecutablesList &executablesList, - const ModList &modList, - Profile *profile, - const MOBase::IPluginGame *game, - QWidget *parent = 0); + explicit EditExecutablesDialog( + const ExecutablesList &executablesList, const ModList &modList, + Profile *profile, const MOBase::IPluginGame *game, QWidget *parent = 0); ~EditExecutablesDialog(); /** * @brief retrieve the updated list of executables - * * @return updated list of executables **/ ExecutablesList getExecutablesList() const; - void saveExecutable(); - private slots: void on_newFilesModCheckBox_toggled(bool checked); - -private slots: - void on_binaryEdit_textChanged(const QString &arg1); - void on_workingDirEdit_textChanged(const QString &arg1); - void on_addButton_clicked(); - void on_browseBinaryButton_clicked(); - void on_removeButton_clicked(); - void on_titleEdit_textChanged(const QString &arg1); - void on_overwriteAppIDBox_toggled(bool checked); - void on_browseWorkingDirButton_clicked(); - void on_buttonBox_accepted(); void on_buttonBox_rejected(); - void delayedRefresh(); - void on_executablesListBox_itemSelectionChanged(); - void on_executablesListBox_clicked(const QModelIndex &index); - void on_forceLoadButton_clicked(); - void on_forceLoadCheckBox_toggled(); -private: - - void resetInput(); - - void refreshExecutablesWidget(); - - bool executableChanged(); - - void updateButtonStates(); - private: std::unique_ptr ui; + ExecutablesList m_executablesList; + Profile *m_profile; + const MOBase::IPluginGame *m_gamePlugin; + bool m_dirty; - QListWidgetItem *m_CurrentItem; - - ExecutablesList m_ExecutablesList; - - Profile *m_Profile; - - QList m_ForcedLibraries; - - const MOBase::IPluginGame *m_GamePlugin; + QListWidgetItem *m_currentItem; + QList m_forcedLibraries; void updateUI(const Executable* e); void clearEdits(); void setEdits(const Executable& e); + + void resetInput(); + void refreshExecutablesWidget(); + bool executableChanged(); + void updateButtonStates(); + void saveExecutable(); }; #endif // EDITEXECUTABLESDIALOG_H -- cgit v1.3.1 From b8199f0c471f2b5ee2b070a96b42ad0040cddf2f Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 21:57:29 -0400 Subject: renamed most of the widgets to shorter or more descriptive names (newFilesModCheckBox?) modifying widgets calls save() --- src/editexecutablesdialog.cpp | 361 +++++++++++++++++++++++------------------- src/editexecutablesdialog.h | 40 +++-- src/editexecutablesdialog.ui | 63 ++++---- 3 files changed, 257 insertions(+), 207 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 941ab4e0..621c670f 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -40,7 +40,7 @@ EditExecutablesDialog::EditExecutablesDialog( , m_executablesList(executablesList) , m_profile(profile) , m_gamePlugin(game) - , m_dirty(false) + , m_settingUI(false) { ui->setupUi(this); ui->splitter->setSizes({200, 1}); @@ -48,108 +48,189 @@ EditExecutablesDialog::EditExecutablesDialog( ui->splitter->setStretchFactor(1, 1); refreshExecutablesWidget(); - ui->newFilesModBox->addItems(modList.allMods()); + ui->mods->addItems(modList.allMods()); - m_forcedLibraries = m_profile->determineForcedLibraries(ui->titleEdit->text()); + m_forcedLibraries = m_profile->determineForcedLibraries(ui->title->text()); + + // title textbox also has to change the list item, will call save manually + connect(ui->title, &QLineEdit::textChanged, [&](auto&& s){ onTitleChanged(s); }); + connect(ui->binary, &QLineEdit::textChanged, [&]{ save(); }); + connect(ui->workingDirectory, &QLineEdit::textChanged, [&]{ save(); }); + connect(ui->arguments, &QLineEdit::textChanged, [&]{ save(); }); updateUI(nullptr); } EditExecutablesDialog::~EditExecutablesDialog() = default; +QListWidgetItem* EditExecutablesDialog::selectedItem() +{ + const auto selection = ui->list->selectedItems(); + + if (selection.empty()) { + return nullptr; + } + + return selection[0]; +} + +Executable* EditExecutablesDialog::selectedExe() +{ + auto* item = selectedItem(); + if (!item) { + return nullptr; + } + + const auto& title = item->text(); + auto itor = m_executablesList.find(title); + + if (itor == m_executablesList.end()) { + return nullptr; + } + + return &*itor; +} + void EditExecutablesDialog::updateUI(const Executable* e) { + m_settingUI = true; + if (e) { setEdits(*e); - ui->removeButton->setEnabled(e->isCustom()); + ui->remove->setEnabled(e->isCustom()); } else { clearEdits(); - ui->removeButton->setEnabled(false); + ui->remove->setEnabled(false); } + + m_settingUI = false; } void EditExecutablesDialog::clearEdits() { - ui->titleEdit->clear(); - ui->binaryEdit->clear(); - ui->workingDirEdit->clear(); - ui->argumentsEdit->clear(); - ui->overwriteAppIDBox->setChecked(false); - ui->appIDOverwriteEdit->clear(); - ui->newFilesModCheckBox->setChecked(false); - ui->newFilesModBox->setCurrentIndex(-1); - ui->forceLoadCheckBox->setChecked(false); - ui->useAppIconCheckBox->setChecked(false); + ui->title->clear(); + ui->binary->clear(); + ui->workingDirectory->clear(); + ui->arguments->clear(); + ui->overwriteSteamAppID->setChecked(false); + ui->steamAppID->clear(); + ui->createFilesInMod->setChecked(false); + ui->mods->setCurrentIndex(-1); + ui->forceLoadLibraries->setChecked(false); + ui->useApplicationIcon->setChecked(false); ui->pluginProvidedLabel->setVisible(false); } void EditExecutablesDialog::setEdits(const Executable& e) { - ui->titleEdit->setText(e.title()); - ui->binaryEdit->setText(QDir::toNativeSeparators(e.binaryInfo().absoluteFilePath())); - ui->workingDirEdit->setText(QDir::toNativeSeparators(e.workingDirectory())); - ui->argumentsEdit->setText(e.arguments()); - ui->overwriteAppIDBox->setChecked(!e.steamAppID().isEmpty()); - ui->appIDOverwriteEdit->setText(e.steamAppID()); - ui->useAppIconCheckBox->setChecked(e.usesOwnIcon()); + ui->title->setText(e.title()); + ui->binary->setText(QDir::toNativeSeparators(e.binaryInfo().absoluteFilePath())); + ui->workingDirectory->setText(QDir::toNativeSeparators(e.workingDirectory())); + ui->arguments->setText(e.arguments()); + ui->overwriteSteamAppID->setChecked(!e.steamAppID().isEmpty()); + ui->steamAppID->setText(e.steamAppID()); + ui->useApplicationIcon->setChecked(e.usesOwnIcon()); int modIndex = -1; QString customOverwrite = m_profile->setting("custom_overwrites", e.title()).toString(); if (!customOverwrite.isEmpty()) { - modIndex = ui->newFilesModBox->findText(customOverwrite); + modIndex = ui->mods->findText(customOverwrite); } - ui->newFilesModCheckBox->setChecked(modIndex != -1); - ui->newFilesModBox->setCurrentIndex(modIndex); + ui->createFilesInMod->setChecked(modIndex != -1); + ui->mods->setCurrentIndex(modIndex); const bool forcedLibraries = m_profile->forcedLibrariesEnabled(e.title()); - ui->forceLoadCheckBox->setChecked(forcedLibraries); - ui->forceLoadButton->setEnabled(forcedLibraries); + ui->forceLoadLibraries->setChecked(forcedLibraries); + ui->configureLibraries->setEnabled(forcedLibraries); ui->pluginProvidedLabel->setVisible(!e.isCustom()); // only enabled for custom executables - ui->titleEdit->setEnabled(e.isCustom()); - ui->binaryEdit->setEnabled(e.isCustom()); - ui->browseBinaryButton->setEnabled(e.isCustom()); - ui->workingDirEdit->setEnabled(e.isCustom()); - ui->browseWorkingDirButton->setEnabled(e.isCustom()); - ui->argumentsEdit->setEnabled(e.isCustom()); - ui->overwriteAppIDBox->setEnabled(e.isCustom()); - ui->appIDOverwriteEdit->setEnabled(e.isCustom()); - ui->useAppIconCheckBox->setEnabled(e.isCustom()); + ui->title->setEnabled(e.isCustom()); + ui->binary->setEnabled(e.isCustom()); + ui->browseBinary->setEnabled(e.isCustom()); + ui->workingDirectory->setEnabled(e.isCustom()); + ui->browseWorkingDirectory->setEnabled(e.isCustom()); + ui->arguments->setEnabled(e.isCustom()); + ui->overwriteSteamAppID->setEnabled(e.isCustom()); + ui->steamAppID->setEnabled(e.isCustom()); + ui->useApplicationIcon->setEnabled(e.isCustom()); // always enabled - ui->newFilesModCheckBox->setEnabled(true); - ui->newFilesModBox->setEnabled(true); - ui->forceLoadCheckBox->setEnabled(true); + ui->createFilesInMod->setEnabled(true); + ui->mods->setEnabled(true); + ui->forceLoadLibraries->setEnabled(true); } +void EditExecutablesDialog::save() +{ + if (m_settingUI) { + // the ui is currently being set, ignore changes + return; + } + + auto* e = selectedExe(); + if (!e) { + qWarning("trying to save but nothing is selected"); + return; + } + + qDebug().nospace() << "saving '" << e->title() << "'"; + + e->title(ui->title->text()); + e->binaryInfo(ui->binary->text()); + e->workingDirectory(ui->workingDirectory->text()); + e->arguments(ui->arguments->text()); + + if (ui->overwriteSteamAppID->isChecked()) { + e->steamAppID(ui->steamAppID->text()); + } else { + e->steamAppID(""); + } +} + +void EditExecutablesDialog::onTitleChanged(const QString& s) +{ + if (m_settingUI) { + // the ui is currently being set, ignore changes + return; + } + // must save first because it relies on the text in the list to find the + // executable to modify + save(); + // once the executable is saved, the list item must be changed to match the + // new name + if (auto* i=selectedItem()) { + i->setText(s); + } +} void EditExecutablesDialog::resetInput() { - ui->binaryEdit->setText(""); - ui->titleEdit->setText(""); - ui->workingDirEdit->clear(); - ui->argumentsEdit->setText(""); - ui->appIDOverwriteEdit->clear(); - ui->overwriteAppIDBox->setChecked(false); - ui->useAppIconCheckBox->setChecked(false); - ui->newFilesModCheckBox->setChecked(false); - ui->forceLoadCheckBox->setChecked(false); + ui->binary->setText(""); + ui->title->setText(""); + ui->workingDirectory->clear(); + ui->arguments->setText(""); + ui->overwriteSteamAppID->setChecked(false); + ui->createFilesInMod->setChecked(false); + ui->forceLoadLibraries->setChecked(false); + ui->steamAppID->clear(); + ui->useApplicationIcon->setChecked(false); + m_currentItem = nullptr; } ExecutablesList EditExecutablesDialog::getExecutablesList() const { ExecutablesList newList; - for (int i = 0; i < ui->executablesListBox->count(); ++i) { - const auto& title = ui->executablesListBox->item(i)->text(); + for (int i = 0; i < ui->list->count(); ++i) { + const auto& title = ui->list->item(i)->text(); auto itor = m_executablesList.find(title); if (itor == m_executablesList.end()) { @@ -167,7 +248,7 @@ ExecutablesList EditExecutablesDialog::getExecutablesList() const void EditExecutablesDialog::refreshExecutablesWidget() { - ui->executablesListBox->clear(); + ui->list->clear(); for(const auto& exe : m_executablesList) { QListWidgetItem *newItem = new QListWidgetItem(exe.title()); @@ -179,7 +260,7 @@ void EditExecutablesDialog::refreshExecutablesWidget() newItem->setFont(f); } - ui->executablesListBox->addItem(newItem); + ui->list->addItem(newItem); } //ui->addButton->setEnabled(false); @@ -187,28 +268,18 @@ void EditExecutablesDialog::refreshExecutablesWidget() } -void EditExecutablesDialog::on_binaryEdit_textChanged(const QString &name) -{ - updateButtonStates(); -} - -void EditExecutablesDialog::on_workingDirEdit_textChanged(const QString &dir) -{ - updateButtonStates(); -} - void EditExecutablesDialog::updateButtonStates() { bool enabled = true; - QString filePath(ui->binaryEdit->text()); + QString filePath(ui->binary->text()); QFileInfo fileInfo(filePath); if (!fileInfo.exists()) enabled = false; if (!fileInfo.isFile()) enabled = false; - QString dirPath(ui->workingDirEdit->text()); + QString dirPath(ui->workingDirectory->text()); if (!dirPath.isEmpty()) { QDir dirInfo(dirPath); if (!dirInfo.exists()) @@ -222,41 +293,41 @@ void EditExecutablesDialog::updateButtonStates() void EditExecutablesDialog::saveExecutable() { Executable::Flags flags = Executable::CustomExecutable; - if (ui->useAppIconCheckBox->isChecked()) + if (ui->useApplicationIcon->isChecked()) flags |= Executable::UseApplicationIcon; m_executablesList.setExecutable(Executable() - .title(ui->titleEdit->text()) - .binaryInfo(QDir::fromNativeSeparators(ui->binaryEdit->text())) - .arguments(ui->argumentsEdit->text()) - .steamAppID(ui->overwriteAppIDBox->isChecked() ? ui->appIDOverwriteEdit->text() : "") - .workingDirectory(QDir::fromNativeSeparators(ui->workingDirEdit->text())) + .title(ui->title->text()) + .binaryInfo(QDir::fromNativeSeparators(ui->binary->text())) + .arguments(ui->arguments->text()) + .steamAppID(ui->overwriteSteamAppID->isChecked() ? ui->steamAppID->text() : "") + .workingDirectory(QDir::fromNativeSeparators(ui->workingDirectory->text())) .flags(flags)); - if (ui->newFilesModCheckBox->isChecked()) { - m_profile->storeSetting("custom_overwrites", ui->titleEdit->text(), - ui->newFilesModBox->currentText()); + if (ui->createFilesInMod->isChecked()) { + m_profile->storeSetting("custom_overwrites", ui->title->text(), + ui->mods->currentText()); } else { - m_profile->removeSetting("custom_overwrites", ui->titleEdit->text()); + m_profile->removeSetting("custom_overwrites", ui->title->text()); } - m_profile->removeForcedLibraries(ui->titleEdit->text()); - m_profile->storeForcedLibraries(ui->titleEdit->text(), m_forcedLibraries); - m_profile->setForcedLibrariesEnabled(ui->titleEdit->text(), ui->forceLoadCheckBox->isChecked()); + m_profile->removeForcedLibraries(ui->title->text()); + m_profile->storeForcedLibraries(ui->title->text(), m_forcedLibraries); + m_profile->setForcedLibrariesEnabled(ui->title->text(), ui->forceLoadLibraries->isChecked()); } void EditExecutablesDialog::delayedRefresh() { - QModelIndex index = ui->executablesListBox->currentIndex(); + /*QModelIndex index = ui->executablesListBox->currentIndex(); resetInput(); refreshExecutablesWidget(); - on_executablesListBox_clicked(index); + on_executablesListBox_clicked(index);*/ } -void EditExecutablesDialog::on_forceLoadButton_clicked() +void EditExecutablesDialog::on_configureLibraries_clicked() { ForcedLoadDialog dialog(m_gamePlugin, this); dialog.setValues(m_forcedLibraries); @@ -265,13 +336,13 @@ void EditExecutablesDialog::on_forceLoadButton_clicked() } } -void EditExecutablesDialog::on_forceLoadCheckBox_toggled() +void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked) { - ui->forceLoadButton->setEnabled(ui->forceLoadCheckBox->isChecked()); + ui->configureLibraries->setEnabled(ui->forceLoadLibraries->isChecked()); } -void EditExecutablesDialog::on_addButton_clicked() +void EditExecutablesDialog::on_add_clicked() { if (executableChanged()) { saveExecutable(); @@ -281,7 +352,7 @@ void EditExecutablesDialog::on_addButton_clicked() refreshExecutablesWidget(); } -void EditExecutablesDialog::on_browseBinaryButton_clicked() +void EditExecutablesDialog::on_browseBinary_clicked() { QString binaryName = FileDialogMemory::getOpenFileName( "editExecutableBinary", this, tr("Select a binary"), QString(), @@ -319,21 +390,21 @@ void EditExecutablesDialog::on_browseBinaryButton_clicked() tr("MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe " "from that installation as the binary.")); } else { - ui->binaryEdit->setText(binaryPath); + ui->binary->setText(binaryPath); } - ui->workingDirEdit->setText(QDir::toNativeSeparators(QFileInfo(binaryName).absolutePath())); - ui->argumentsEdit->setText("-jar \"" + QDir::toNativeSeparators(binaryName) + "\""); + ui->workingDirectory->setText(QDir::toNativeSeparators(QFileInfo(binaryName).absolutePath())); + ui->arguments->setText("-jar \"" + QDir::toNativeSeparators(binaryName) + "\""); } else { - ui->binaryEdit->setText(QDir::toNativeSeparators(binaryName)); + ui->binary->setText(QDir::toNativeSeparators(binaryName)); } - if (ui->titleEdit->text().isEmpty()) { - ui->titleEdit->setText(QFileInfo(binaryName).baseName()); + if (ui->title->text().isEmpty()) { + ui->title->setText(QFileInfo(binaryName).baseName()); } } -void EditExecutablesDialog::on_browseWorkingDirButton_clicked() +void EditExecutablesDialog::on_browseWorkingDirectory_clicked() { QString dirName = FileDialogMemory::getExistingDirectory("editExecutableDirectory", this, tr("Select a directory")); @@ -343,43 +414,22 @@ void EditExecutablesDialog::on_browseWorkingDirButton_clicked() return; } - ui->workingDirEdit->setText(dirName); + ui->workingDirectory->setText(dirName); } -void EditExecutablesDialog::on_removeButton_clicked() +void EditExecutablesDialog::on_remove_clicked() { - if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->titleEdit->text()), + if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->title->text()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - m_profile->removeSetting("custom_overwrites", ui->titleEdit->text()); - m_profile->removeForcedLibraries(ui->titleEdit->text()); - m_executablesList.remove(ui->titleEdit->text()); + m_profile->removeSetting("custom_overwrites", ui->title->text()); + m_profile->removeForcedLibraries(ui->title->text()); + m_executablesList.remove(ui->title->text()); } resetInput(); refreshExecutablesWidget(); } -void EditExecutablesDialog::on_titleEdit_textChanged(const QString &arg1) -{ - /*QPushButton *addButton = findChild("addButton"); - QPushButton *removeButton = findChild("removeButton"); - - QListWidget *executablesWidget = findChild("executablesListBox"); - - QList existingItems = executablesWidget->findItems(arg1, Qt::MatchFixedString); - - addButton->setEnabled(arg1.length() != 0); - - if (existingItems.count() == 0) { - addButton->setText(tr("Add")); - removeButton->setEnabled(false); - } else { - // existing item. is it a custom one? - addButton->setText(tr("Modify")); - removeButton->setEnabled(true); - }*/ -} - bool EditExecutablesDialog::executableChanged() { @@ -409,58 +459,39 @@ bool EditExecutablesDialog::executableChanged() lhs.library() == rhs.library() && lhs.process() == rhs.process(); }); - forcedLibrariesDirty |= m_profile->setting("forced_libraries", ui->titleEdit->text() + "/enabled", false).toBool() != - ui->forceLoadCheckBox->isChecked(); - - return selectedExecutable.title() != ui->titleEdit->text() - || selectedExecutable.arguments() != ui->argumentsEdit->text() - || selectedExecutable.steamAppID() != ui->appIDOverwriteEdit->text() - || !storedCustomOverwrite.isEmpty() != ui->newFilesModCheckBox->isChecked() - || !storedCustomOverwrite.isEmpty() && (storedCustomOverwrite != ui->newFilesModBox->currentText()) - || selectedExecutable.workingDirectory() != QDir::fromNativeSeparators(ui->workingDirEdit->text()) - || selectedExecutable.binaryInfo().absoluteFilePath() != QDir::fromNativeSeparators(ui->binaryEdit->text()) - || selectedExecutable.usesOwnIcon() != ui->useAppIconCheckBox->isChecked() + forcedLibrariesDirty |= m_profile->setting("forced_libraries", ui->title->text() + "/enabled", false).toBool() != + ui->forceLoadLibraries->isChecked(); + + return selectedExecutable.title() != ui->title->text() + || selectedExecutable.arguments() != ui->arguments->text() + || selectedExecutable.steamAppID() != ui->steamAppID->text() + || !storedCustomOverwrite.isEmpty() != ui->createFilesInMod->isChecked() + || !storedCustomOverwrite.isEmpty() && (storedCustomOverwrite != ui->mods->currentText()) + || selectedExecutable.workingDirectory() != QDir::fromNativeSeparators(ui->workingDirectory->text()) + || selectedExecutable.binaryInfo().absoluteFilePath() != QDir::fromNativeSeparators(ui->binary->text()) + || selectedExecutable.usesOwnIcon() != ui->useApplicationIcon->isChecked() || forcedLibrariesDirty ; } else { - QFileInfo fileInfo(ui->binaryEdit->text()); - return !ui->binaryEdit->text().isEmpty() - && !ui->titleEdit->text().isEmpty() + QFileInfo fileInfo(ui->binary->text()); + return !ui->binary->text().isEmpty() + && !ui->title->text().isEmpty() && fileInfo.exists() && fileInfo.isFile(); } } -void EditExecutablesDialog::on_executablesListBox_itemSelectionChanged() -{ - const auto selection = ui->executablesListBox->selectedItems(); - - if (selection.empty()) { - updateUI(nullptr); - return; - } - - auto* item = selection[0]; - if (!item) { - return; - } - - const auto& title = item->text(); - auto itor = m_executablesList.find(title); - if (itor == m_executablesList.end()) { - qWarning().nospace() << "selection: executable '" << title << "' not found"; - return; - } - - updateUI(&*itor); +void EditExecutablesDialog::on_list_itemSelectionChanged() +{ + updateUI(selectedExe()); } -void EditExecutablesDialog::on_overwriteAppIDBox_toggled(bool checked) +void EditExecutablesDialog::on_overwriteSteamAppID_toggled(bool checked) { - ui->appIDOverwriteEdit->setEnabled(checked); + ui->steamAppID->setEnabled(checked); } -void EditExecutablesDialog::on_buttonBox_accepted() +void EditExecutablesDialog::on_buttons_accepted() { if (executableChanged()) { QMessageBox::StandardButton res = QMessageBox::question(this, tr("Save Changes?"), @@ -479,13 +510,13 @@ void EditExecutablesDialog::on_buttonBox_accepted() accept(); } -void EditExecutablesDialog::on_buttonBox_rejected() +void EditExecutablesDialog::on_buttons_rejected() { reject(); } -void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex ¤t) -{/* +/*void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex ¤t) +{ if (current.isValid()) { if (executableChanged()) { @@ -549,10 +580,14 @@ void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex &cur bool forcedLibraries = m_Profile->forcedLibrariesEnabled(ui->titleEdit->text()); ui->forceLoadButton->setEnabled(forcedLibraries); ui->forceLoadCheckBox->setChecked(forcedLibraries); - }*/ + } +}*/ + +void EditExecutablesDialog::on_createFilesInMod_toggled(bool checked) +{ + ui->mods->setEnabled(checked); } -void EditExecutablesDialog::on_newFilesModCheckBox_toggled(bool checked) +void EditExecutablesDialog::on_useApplicationIcon_toggled(bool checked) { - ui->newFilesModBox->setEnabled(checked); } diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 9214941d..f28658e3 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -59,43 +59,51 @@ public: ExecutablesList getExecutablesList() const; private slots: - void on_newFilesModCheckBox_toggled(bool checked); - void on_binaryEdit_textChanged(const QString &arg1); - void on_workingDirEdit_textChanged(const QString &arg1); - void on_addButton_clicked(); - void on_browseBinaryButton_clicked(); - void on_removeButton_clicked(); - void on_titleEdit_textChanged(const QString &arg1); - void on_overwriteAppIDBox_toggled(bool checked); - void on_browseWorkingDirButton_clicked(); - void on_buttonBox_accepted(); - void on_buttonBox_rejected(); + void on_list_itemSelectionChanged(); + + void on_add_clicked(); + void on_remove_clicked(); + + void on_overwriteSteamAppID_toggled(bool checked); + void on_createFilesInMod_toggled(bool checked); + void on_forceLoadLibraries_toggled(bool checked); + void on_useApplicationIcon_toggled(bool checked); + + void on_browseBinary_clicked(); + void on_browseWorkingDirectory_clicked(); + void on_configureLibraries_clicked(); + + void on_buttons_accepted(); + void on_buttons_rejected(); + void delayedRefresh(); - void on_executablesListBox_itemSelectionChanged(); - void on_executablesListBox_clicked(const QModelIndex &index); - void on_forceLoadButton_clicked(); - void on_forceLoadCheckBox_toggled(); private: std::unique_ptr ui; ExecutablesList m_executablesList; Profile *m_profile; const MOBase::IPluginGame *m_gamePlugin; - bool m_dirty; + bool m_settingUI; QListWidgetItem *m_currentItem; QList m_forcedLibraries; + QListWidgetItem* selectedItem(); + Executable* selectedExe(); + void updateUI(const Executable* e); void clearEdits(); void setEdits(const Executable& e); + void save(); void resetInput(); void refreshExecutablesWidget(); bool executableChanged(); void updateButtonStates(); void saveExecutable(); + + void onTitleChanged(const QString& s); }; #endif // EDITEXECUTABLESDIALOG_H diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index 2c9a74f3..6cb8e0b8 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -58,7 +58,7 @@ 0 - + List of configured executables @@ -89,7 +89,7 @@ - + Add an executable @@ -106,7 +106,7 @@ - + Remove the selected executable @@ -172,7 +172,7 @@ - + Name of the executable. This is only for display purposes. @@ -191,7 +191,7 @@ - + Binary to run @@ -201,7 +201,7 @@ - + Browse filesystem @@ -225,10 +225,10 @@ - + - + ... @@ -244,7 +244,7 @@ - + Arguments to pass to the application @@ -258,7 +258,7 @@ - + Allow the Steam AppID to be used for this executable to be changed. @@ -273,7 +273,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + false @@ -292,7 +292,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + If this is enabled, new files are created in the specified mod instead of the "Overwrite" mod. @@ -302,7 +302,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + false @@ -313,12 +313,12 @@ Right now the only case I know of where this needs to be overwritten is for the - + If this is enabled, the configured libraries will be automatically loaded when this executable is launched. - Force Load Libraries (Profile Specific) + Force Load Libraries (*) @@ -336,7 +336,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + false @@ -348,12 +348,19 @@ Right now the only case I know of where this needs to be overwritten is for the - + Use Application's Icon for shortcuts + + + + (*) Profile Specific + + + @@ -393,7 +400,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + QDialogButtonBox::Cancel|QDialogButtonBox::Ok @@ -402,16 +409,16 @@ Right now the only case I know of where this needs to be overwritten is for the - binaryEdit - browseBinaryButton - workingDirEdit - browseWorkingDirButton - overwriteAppIDBox - appIDOverwriteEdit - newFilesModCheckBox - newFilesModBox - addButton - removeButton + binary + browseBinary + workingDirectory + browseWorkingDirectory + overwriteSteamAppID + steamAppID + createFilesInMod + mods + add + remove -- cgit v1.3.1 From cd2fefca1928f374c302c275efcc0bbaf36357bb Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 22:24:43 -0400 Subject: save steam app id, custom overwrite and application icon custom overwrite directories now set locally, will be written to profile when closing the dialog --- src/editexecutablesdialog.cpp | 149 +++++++++++++++++++++++++++--------------- src/editexecutablesdialog.h | 6 +- src/executableslist.cpp | 2 + 3 files changed, 100 insertions(+), 57 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 621c670f..2c376cd1 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -47,16 +47,28 @@ EditExecutablesDialog::EditExecutablesDialog( ui->splitter->setStretchFactor(0, 0); ui->splitter->setStretchFactor(1, 1); - refreshExecutablesWidget(); + for (const auto& e : m_executablesList) { + QString customOverwrite = m_profile->setting("custom_overwrites", e.title()).toString(); + + if (!customOverwrite.isEmpty()) { + m_customOverwrites[e.title()] = customOverwrite; + } + } + + + fillExecutableList(); ui->mods->addItems(modList.allMods()); m_forcedLibraries = m_profile->determineForcedLibraries(ui->title->text()); - // title textbox also has to change the list item, will call save manually - connect(ui->title, &QLineEdit::textChanged, [&](auto&& s){ onTitleChanged(s); }); + // some widgets need to do more than just save() and have their own handler + connect(ui->binary, &QLineEdit::textChanged, [&]{ save(); }); connect(ui->workingDirectory, &QLineEdit::textChanged, [&]{ save(); }); connect(ui->arguments, &QLineEdit::textChanged, [&]{ save(); }); + connect(ui->steamAppID, &QLineEdit::textChanged, [&]{ save(); }); + connect(ui->mods, &QComboBox::currentTextChanged, [&]{ save(); }); + connect(ui->useApplicationIcon, &QCheckBox::toggled, [&]{ save(); }); updateUI(nullptr); } @@ -91,8 +103,27 @@ Executable* EditExecutablesDialog::selectedExe() return &*itor; } +void EditExecutablesDialog::fillExecutableList() +{ + ui->list->clear(); + + for(const auto& exe : m_executablesList) { + QListWidgetItem *newItem = new QListWidgetItem(exe.title()); + + if (!exe.isCustom()) { + auto f = newItem->font(); + f.setItalic(true); + + newItem->setFont(f); + } + + ui->list->addItem(newItem); + } +} + void EditExecutablesDialog::updateUI(const Executable* e) { + // the ui is currently being set, ignore changes m_settingUI = true; if (e) { @@ -103,6 +134,7 @@ void EditExecutablesDialog::updateUI(const Executable* e) ui->remove->setEnabled(false); } + // any changes from now on are from the user m_settingUI = false; } @@ -113,10 +145,13 @@ void EditExecutablesDialog::clearEdits() ui->workingDirectory->clear(); ui->arguments->clear(); ui->overwriteSteamAppID->setChecked(false); + ui->steamAppID->setEnabled(false); ui->steamAppID->clear(); ui->createFilesInMod->setChecked(false); + ui->mods->setEnabled(false); ui->mods->setCurrentIndex(-1); ui->forceLoadLibraries->setChecked(false); + ui->configureLibraries->setEnabled(false); ui->useApplicationIcon->setChecked(false); ui->pluginProvidedLabel->setVisible(false); @@ -129,17 +164,25 @@ void EditExecutablesDialog::setEdits(const Executable& e) ui->workingDirectory->setText(QDir::toNativeSeparators(e.workingDirectory())); ui->arguments->setText(e.arguments()); ui->overwriteSteamAppID->setChecked(!e.steamAppID().isEmpty()); + ui->steamAppID->setEnabled(!e.steamAppID().isEmpty()); ui->steamAppID->setText(e.steamAppID()); ui->useApplicationIcon->setChecked(e.usesOwnIcon()); int modIndex = -1; - QString customOverwrite = m_profile->setting("custom_overwrites", e.title()).toString(); - if (!customOverwrite.isEmpty()) { - modIndex = ui->mods->findText(customOverwrite); + auto itor = m_customOverwrites.find(e.title()); + if (itor != m_customOverwrites.end()) { + modIndex = ui->mods->findText(itor->second); + + if (modIndex == -1) { + qWarning().nospace() + << "executable '" << e.title() << "' uses mod '" << itor->second << "' " + << "as a custom overwrite, but that mod doesn't exist"; + } } ui->createFilesInMod->setChecked(modIndex != -1); + ui->mods->setEnabled(modIndex != -1); ui->mods->setCurrentIndex(modIndex); const bool forcedLibraries = m_profile->forcedLibrariesEnabled(e.title()); @@ -156,19 +199,16 @@ void EditExecutablesDialog::setEdits(const Executable& e) ui->browseWorkingDirectory->setEnabled(e.isCustom()); ui->arguments->setEnabled(e.isCustom()); ui->overwriteSteamAppID->setEnabled(e.isCustom()); - ui->steamAppID->setEnabled(e.isCustom()); ui->useApplicationIcon->setEnabled(e.isCustom()); // always enabled ui->createFilesInMod->setEnabled(true); - ui->mods->setEnabled(true); ui->forceLoadLibraries->setEnabled(true); } void EditExecutablesDialog::save() { if (m_settingUI) { - // the ui is currently being set, ignore changes return; } @@ -180,6 +220,16 @@ void EditExecutablesDialog::save() qDebug().nospace() << "saving '" << e->title() << "'"; + // title may have changed, start with the stuff using it + if (ui->createFilesInMod->isChecked()) { + m_customOverwrites[e->title()] = ui->mods->currentText(); + } else { + auto itor = m_customOverwrites.find(e->title()); + if (itor != m_customOverwrites.end()) { + m_customOverwrites.erase(itor); + } + } + e->title(ui->title->text()); e->binaryInfo(ui->binary->text()); e->workingDirectory(ui->workingDirectory->text()); @@ -192,10 +242,9 @@ void EditExecutablesDialog::save() } } -void EditExecutablesDialog::onTitleChanged(const QString& s) +void EditExecutablesDialog::on_title_textChanged(const QString& s) { if (m_settingUI) { - // the ui is currently being set, ignore changes return; } @@ -210,6 +259,38 @@ void EditExecutablesDialog::onTitleChanged(const QString& s) } } +void EditExecutablesDialog::on_overwriteSteamAppID_toggled(bool checked) +{ + if (m_settingUI) { + return; + } + + ui->steamAppID->setEnabled(checked); + save(); +} + +void EditExecutablesDialog::on_createFilesInMod_toggled(bool checked) +{ + if (m_settingUI) { + return; + } + + ui->mods->setEnabled(checked); + save(); +} + +void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked) +{ + if (m_settingUI) { + return; + } + + ui->configureLibraries->setEnabled(ui->forceLoadLibraries->isChecked()); + save(); +} + + + void EditExecutablesDialog::resetInput() { @@ -246,27 +327,6 @@ ExecutablesList EditExecutablesDialog::getExecutablesList() const return newList; } -void EditExecutablesDialog::refreshExecutablesWidget() -{ - ui->list->clear(); - - for(const auto& exe : m_executablesList) { - QListWidgetItem *newItem = new QListWidgetItem(exe.title()); - - if (!exe.isCustom()) { - auto f = newItem->font(); - f.setItalic(true); - - newItem->setFont(f); - } - - ui->list->addItem(newItem); - } - - //ui->addButton->setEnabled(false); - //ui->removeButton->setEnabled(false); -} - void EditExecutablesDialog::updateButtonStates() { @@ -336,11 +396,6 @@ void EditExecutablesDialog::on_configureLibraries_clicked() } } -void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked) -{ - ui->configureLibraries->setEnabled(ui->forceLoadLibraries->isChecked()); -} - void EditExecutablesDialog::on_add_clicked() { @@ -349,7 +404,7 @@ void EditExecutablesDialog::on_add_clicked() } resetInput(); - refreshExecutablesWidget(); + //refreshExecutablesWidget(); } void EditExecutablesDialog::on_browseBinary_clicked() @@ -427,7 +482,7 @@ void EditExecutablesDialog::on_remove_clicked() } resetInput(); - refreshExecutablesWidget(); + //refreshExecutablesWidget(); } @@ -486,11 +541,6 @@ void EditExecutablesDialog::on_list_itemSelectionChanged() updateUI(selectedExe()); } -void EditExecutablesDialog::on_overwriteSteamAppID_toggled(bool checked) -{ - ui->steamAppID->setEnabled(checked); -} - void EditExecutablesDialog::on_buttons_accepted() { if (executableChanged()) { @@ -503,7 +553,7 @@ void EditExecutablesDialog::on_buttons_accepted() saveExecutable(); // the executable list returned to callers is generated from the user data in the widgets, // NOT the list we just saved - refreshExecutablesWidget(); + //refreshExecutablesWidget(); } } @@ -582,12 +632,3 @@ void EditExecutablesDialog::on_buttons_rejected() ui->forceLoadCheckBox->setChecked(forcedLibraries); } }*/ - -void EditExecutablesDialog::on_createFilesInMod_toggled(bool checked) -{ - ui->mods->setEnabled(checked); -} - -void EditExecutablesDialog::on_useApplicationIcon_toggled(bool checked) -{ -} diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index f28658e3..8ee56e3e 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -64,10 +64,10 @@ private slots: void on_add_clicked(); void on_remove_clicked(); + void on_title_textChanged(const QString& s); void on_overwriteSteamAppID_toggled(bool checked); void on_createFilesInMod_toggled(bool checked); void on_forceLoadLibraries_toggled(bool checked); - void on_useApplicationIcon_toggled(bool checked); void on_browseBinary_clicked(); void on_browseWorkingDirectory_clicked(); @@ -81,6 +81,7 @@ private slots: private: std::unique_ptr ui; ExecutablesList m_executablesList; + std::map m_customOverwrites; Profile *m_profile; const MOBase::IPluginGame *m_gamePlugin; bool m_settingUI; @@ -92,18 +93,17 @@ private: QListWidgetItem* selectedItem(); Executable* selectedExe(); + void fillExecutableList(); void updateUI(const Executable* e); void clearEdits(); void setEdits(const Executable& e); void save(); void resetInput(); - void refreshExecutablesWidget(); bool executableChanged(); void updateButtonStates(); void saveExecutable(); - void onTitleChanged(const QString& s); }; #endif // EDITEXECUTABLESDIALOG_H diff --git a/src/executableslist.cpp b/src/executableslist.cpp index 8174eb1b..f592a2b7 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -67,6 +67,8 @@ void ExecutablesList::load(const MOBase::IPluginGame* game, QSettings& settings) { qDebug("setting up configured executables"); + m_Executables.clear(); + int numCustomExecutables = settings.beginReadArray("customExecutables"); for (int i = 0; i < numCustomExecutables; ++i) { settings.setArrayIndex(i); -- cgit v1.3.1 From f22b64bff76e713d761832584307cffece18114d Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 22:39:57 -0400 Subject: save forced libraries internally --- src/editexecutablesdialog.cpp | 84 ++++++++++++++++++++++++++++--------------- src/editexecutablesdialog.h | 2 +- 2 files changed, 56 insertions(+), 30 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 2c376cd1..5fbb30dd 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -48,18 +48,22 @@ EditExecutablesDialog::EditExecutablesDialog( ui->splitter->setStretchFactor(1, 1); for (const auto& e : m_executablesList) { + // custom overwrites QString customOverwrite = m_profile->setting("custom_overwrites", e.title()).toString(); - if (!customOverwrite.isEmpty()) { m_customOverwrites[e.title()] = customOverwrite; } + + // forced libraries + if (m_profile->forcedLibrariesEnabled(e.title())) { + m_forcedLibraries[e.title()] = m_profile->determineForcedLibraries(e.title()); + } } fillExecutableList(); ui->mods->addItems(modList.allMods()); - m_forcedLibraries = m_profile->determineForcedLibraries(ui->title->text()); // some widgets need to do more than just save() and have their own handler @@ -168,26 +172,32 @@ void EditExecutablesDialog::setEdits(const Executable& e) ui->steamAppID->setText(e.steamAppID()); ui->useApplicationIcon->setChecked(e.usesOwnIcon()); - int modIndex = -1; + { + int modIndex = -1; - auto itor = m_customOverwrites.find(e.title()); - if (itor != m_customOverwrites.end()) { - modIndex = ui->mods->findText(itor->second); + auto itor = m_customOverwrites.find(e.title()); + if (itor != m_customOverwrites.end()) { + modIndex = ui->mods->findText(itor->second); - if (modIndex == -1) { - qWarning().nospace() - << "executable '" << e.title() << "' uses mod '" << itor->second << "' " - << "as a custom overwrite, but that mod doesn't exist"; + if (modIndex == -1) { + qWarning().nospace() + << "executable '" << e.title() << "' uses mod '" << itor->second << "' " + << "as a custom overwrite, but that mod doesn't exist"; + } } + + ui->createFilesInMod->setChecked(modIndex != -1); + ui->mods->setEnabled(modIndex != -1); + ui->mods->setCurrentIndex(modIndex); } - ui->createFilesInMod->setChecked(modIndex != -1); - ui->mods->setEnabled(modIndex != -1); - ui->mods->setCurrentIndex(modIndex); + { + auto itor = m_forcedLibraries.find(e.title()); + const auto hasForcedLibraries = (itor != m_forcedLibraries.end()); - const bool forcedLibraries = m_profile->forcedLibrariesEnabled(e.title()); - ui->forceLoadLibraries->setChecked(forcedLibraries); - ui->configureLibraries->setEnabled(forcedLibraries); + ui->forceLoadLibraries->setChecked(hasForcedLibraries); + ui->configureLibraries->setEnabled(hasForcedLibraries); + } ui->pluginProvidedLabel->setVisible(!e.isCustom()); @@ -230,6 +240,8 @@ void EditExecutablesDialog::save() } } + // forced libraries are saved in on_configureLibraries_clicked() + e->title(ui->title->text()); e->binaryInfo(ui->binary->text()); e->workingDirectory(ui->workingDirectory->text()); @@ -289,6 +301,26 @@ void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked) save(); } +void EditExecutablesDialog::on_configureLibraries_clicked() +{ + auto* e = selectedExe(); + if (!e) { + qWarning("trying to configure libraries but nothing is selected"); + return; + } + + ForcedLoadDialog dialog(m_gamePlugin, this); + + auto itor = m_forcedLibraries.find(e->title()); + if (itor != m_forcedLibraries.end()) { + dialog.setValues(itor->second); + } + + if (dialog.exec() == QDialog::Accepted) { + m_forcedLibraries[e->title()] = dialog.values(); + save(); + } +} @@ -372,9 +404,9 @@ void EditExecutablesDialog::saveExecutable() m_profile->removeSetting("custom_overwrites", ui->title->text()); } - m_profile->removeForcedLibraries(ui->title->text()); - m_profile->storeForcedLibraries(ui->title->text(), m_forcedLibraries); - m_profile->setForcedLibrariesEnabled(ui->title->text(), ui->forceLoadLibraries->isChecked()); + //m_profile->removeForcedLibraries(ui->title->text()); + //m_profile->storeForcedLibraries(ui->title->text(), m_forcedLibraries); + //m_profile->setForcedLibrariesEnabled(ui->title->text(), ui->forceLoadLibraries->isChecked()); } @@ -387,14 +419,6 @@ void EditExecutablesDialog::delayedRefresh() } -void EditExecutablesDialog::on_configureLibraries_clicked() -{ - ForcedLoadDialog dialog(m_gamePlugin, this); - dialog.setValues(m_forcedLibraries); - if (dialog.exec() == QDialog::Accepted) { - m_forcedLibraries = dialog.values(); - } -} void EditExecutablesDialog::on_add_clicked() @@ -488,7 +512,7 @@ void EditExecutablesDialog::on_remove_clicked() bool EditExecutablesDialog::executableChanged() { - if (m_currentItem != nullptr) { + /*if (m_currentItem != nullptr) { const auto& title = m_currentItem->text(); auto itor = m_executablesList.find(title); @@ -533,7 +557,9 @@ bool EditExecutablesDialog::executableChanged() && !ui->title->text().isEmpty() && fileInfo.exists() && fileInfo.isFile(); - } + }*/ + + return false; } void EditExecutablesDialog::on_list_itemSelectionChanged() diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 8ee56e3e..37b50127 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -82,12 +82,12 @@ private: std::unique_ptr ui; ExecutablesList m_executablesList; std::map m_customOverwrites; + std::map> m_forcedLibraries; Profile *m_profile; const MOBase::IPluginGame *m_gamePlugin; bool m_settingUI; QListWidgetItem *m_currentItem; - QList m_forcedLibraries; QListWidgetItem* selectedItem(); -- cgit v1.3.1 From 7026aeaec859fd3632b1062e0cf14d2479c23076 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 23:00:08 -0400 Subject: fixed FileDialogMemory::getOpenFileName() not using given directory disable all widgets when there's no selection now saves application icon browse working directory uses current value in file dialog --- src/editexecutablesdialog.cpp | 54 ++++++++++++++++++++++++++++--------------- src/filedialogmemory.cpp | 28 ++++++++++++++-------- src/filedialogmemory.h | 23 ++++++++---------- 3 files changed, 63 insertions(+), 42 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 5fbb30dd..efcec8e0 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -145,19 +145,28 @@ void EditExecutablesDialog::updateUI(const Executable* e) void EditExecutablesDialog::clearEdits() { ui->title->clear(); + ui->title->setEnabled(false); ui->binary->clear(); + ui->binary->setEnabled(false); + ui->browseBinary->setEnabled(false); ui->workingDirectory->clear(); + ui->workingDirectory->setEnabled(false); + ui->browseWorkingDirectory->setEnabled(false); ui->arguments->clear(); + ui->arguments->setEnabled(false); + ui->overwriteSteamAppID->setEnabled(false); ui->overwriteSteamAppID->setChecked(false); ui->steamAppID->setEnabled(false); ui->steamAppID->clear(); + ui->createFilesInMod->setEnabled(false); ui->createFilesInMod->setChecked(false); ui->mods->setEnabled(false); ui->mods->setCurrentIndex(-1); + ui->forceLoadLibraries->setEnabled(false); ui->forceLoadLibraries->setChecked(false); ui->configureLibraries->setEnabled(false); + ui->useApplicationIcon->setEnabled(false); ui->useApplicationIcon->setChecked(false); - ui->pluginProvidedLabel->setVisible(false); } @@ -252,6 +261,17 @@ void EditExecutablesDialog::save() } else { e->steamAppID(""); } + + if (ui->useApplicationIcon->isChecked()) { + e->flags(e->flags() | Executable::UseApplicationIcon); + } else { + e->flags(e->flags() & (~Executable::UseApplicationIcon)); + } +} + +void EditExecutablesDialog::on_list_itemSelectionChanged() +{ + updateUI(selectedExe()); } void EditExecutablesDialog::on_title_textChanged(const QString& s) @@ -301,6 +321,20 @@ void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked) save(); } +void EditExecutablesDialog::on_browseWorkingDirectory_clicked() +{ + QString dirName = FileDialogMemory::getExistingDirectory( + "editExecutableDirectory", this, tr("Select a directory"), + ui->workingDirectory->text()); + + if (dirName.isNull()) { + // canceled + return; + } + + ui->workingDirectory->setText(dirName); +} + void EditExecutablesDialog::on_configureLibraries_clicked() { auto* e = selectedExe(); @@ -483,19 +517,6 @@ void EditExecutablesDialog::on_browseBinary_clicked() } } -void EditExecutablesDialog::on_browseWorkingDirectory_clicked() -{ - QString dirName = FileDialogMemory::getExistingDirectory("editExecutableDirectory", this, - tr("Select a directory")); - - if (dirName.isNull()) { - // canceled - return; - } - - ui->workingDirectory->setText(dirName); -} - void EditExecutablesDialog::on_remove_clicked() { if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->title->text()), @@ -562,11 +583,6 @@ bool EditExecutablesDialog::executableChanged() return false; } -void EditExecutablesDialog::on_list_itemSelectionChanged() -{ - updateUI(selectedExe()); -} - void EditExecutablesDialog::on_buttons_accepted() { if (executableChanged()) { diff --git a/src/filedialogmemory.cpp b/src/filedialogmemory.cpp index 6b440d0f..9607beb9 100644 --- a/src/filedialogmemory.cpp +++ b/src/filedialogmemory.cpp @@ -56,10 +56,10 @@ void FileDialogMemory::restore(QSettings &settings) } -QString FileDialogMemory::getOpenFileName(const QString &dirID, QWidget *parent, - const QString &caption, const QString &dir, - const QString &filter, QString *selectedFilter, - QFileDialog::Options options) +QString FileDialogMemory::getOpenFileName( + const QString &dirID, QWidget *parent, const QString &caption, + const QString &dir, const QString &filter, QString *selectedFilter, + QFileDialog::Options options) { std::pair::iterator, bool> currentDir = instance().m_Cache.insert(std::make_pair(dirID, dir)); @@ -73,16 +73,26 @@ QString FileDialogMemory::getOpenFileName(const QString &dirID, QWidget *parent, } -QString FileDialogMemory::getExistingDirectory(const QString &dirID, QWidget *parent, - const QString &caption, const QString &dir, QFileDialog::Options options) +QString FileDialogMemory::getExistingDirectory( + const QString &dirID, QWidget *parent, const QString &caption, + const QString &dir, QFileDialog::Options options) { - std::pair::iterator, bool> currentDir = - instance().m_Cache.insert(std::make_pair(dirID, dir)); + QString currentDir = dir; + + if (currentDir.isEmpty()) { + auto itor = instance().m_Cache.find(dirID); + if (itor != instance().m_Cache.end()) { + currentDir = itor->first; + } + } + + QString result = QFileDialog::getExistingDirectory( + parent, caption, currentDir, options); - QString result = QFileDialog::getExistingDirectory(parent, caption, currentDir.first->second, options); if (!result.isNull()) { instance().m_Cache[dirID] = QFileInfo(result).path(); } + return result; } diff --git a/src/filedialogmemory.h b/src/filedialogmemory.h index b2bfdb53..81d7ba40 100644 --- a/src/filedialogmemory.h +++ b/src/filedialogmemory.h @@ -29,30 +29,25 @@ along with Mod Organizer. If not, see . class FileDialogMemory { - public: - static void save(QSettings &settings); static void restore(QSettings &settings); - static QString getOpenFileName(const QString &dirID, QWidget *parent = 0, const QString &caption = QString(), - const QString &dir = QString(), const QString &filter = QString(), - QString *selectedFilter = 0, QFileDialog::Options options = 0); + static QString getOpenFileName( + const QString &dirID, QWidget *parent = 0, const QString &caption = QString(), + const QString &dir = QString(), const QString &filter = QString(), + QString *selectedFilter = 0, QFileDialog::Options options = 0); - static QString getExistingDirectory(const QString &dirID, QWidget *parent = 0, const QString &caption = QString(), - const QString &dir = QString(), - QFileDialog::Options options = QFileDialog::ShowDirsOnly); + static QString getExistingDirectory( + const QString &dirID, QWidget *parent = 0, const QString &caption = QString(), + const QString &dir = QString(), + QFileDialog::Options options = QFileDialog::ShowDirsOnly); private: + std::map m_Cache; FileDialogMemory(); - static FileDialogMemory &instance(); - -private: - - std::map m_Cache; - }; #endif // FILEDIALOGMEMORY_H -- cgit v1.3.1 From 1897d60134e1cff31375f1c602196a99ece7fc86 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 23:31:58 -0400 Subject: pulled java installation detection out of getFileExecutionContext() and into findJavaInstallation() because it was copy/pasted into EditExecutablesDialog fixed FileDialogMemory::getOpenFileName() to also use the given directory correctly handle browse binary button --- src/editexecutablesdialog.cpp | 104 +++++++++++++++++++++--------------------- src/editexecutablesdialog.h | 1 + src/filedialogmemory.cpp | 16 +++++-- src/organizercore.cpp | 72 +++++++++++++++-------------- src/organizercore.h | 2 + 5 files changed, 105 insertions(+), 90 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index efcec8e0..08e2c3d1 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -22,10 +22,12 @@ along with Mod Organizer. If not, see . #include "filedialogmemory.h" #include "stackdata.h" #include "modlist.h" +#include "forcedloaddialog.h" +#include "organizercore.h" + #include #include #include -#include "forcedloaddialog.h" #include using namespace MOBase; @@ -321,6 +323,30 @@ void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked) save(); } +void EditExecutablesDialog::on_browseBinary_clicked() +{ + const QString binaryName = FileDialogMemory::getOpenFileName( + "editExecutableBinary", this, tr("Select a binary"), ui->binary->text(), + tr("Executable (%1)").arg("*.exe *.bat *.jar")); + + if (binaryName.isNull()) { + // canceled + return; + } + + if (binaryName.endsWith(".jar", Qt::CaseInsensitive)) { + setJarBinary(binaryName); + } else { + ui->binary->setText(QDir::toNativeSeparators(binaryName)); + } + + if (ui->title->text().isEmpty()) { + ui->title->setText(QFileInfo(binaryName).baseName()); + } + + save(); +} + void EditExecutablesDialog::on_browseWorkingDirectory_clicked() { QString dirName = FileDialogMemory::getExistingDirectory( @@ -356,6 +382,30 @@ void EditExecutablesDialog::on_configureLibraries_clicked() } } +void EditExecutablesDialog::setJarBinary(const QString& binaryName) +{ + auto java = OrganizerCore::findJavaInstallation(binaryName); + + if (java.isEmpty()) { + QMessageBox::information( + this, tr("Java (32-bit) required"), + tr("MO requires 32-bit java to run this application. If you already " + "have it installed, select javaw.exe from that installation as " + "the binary.")); + } + + // only save once + + m_settingUI = true; + ui->binary->setText(java); + ui->workingDirectory->setText(QDir::toNativeSeparators(QFileInfo(binaryName).absolutePath())); + ui->arguments->setText("-jar \"" + QDir::toNativeSeparators(binaryName) + "\""); + m_settingUI = false; + + save(); +} + + void EditExecutablesDialog::resetInput() @@ -465,58 +515,6 @@ void EditExecutablesDialog::on_add_clicked() //refreshExecutablesWidget(); } -void EditExecutablesDialog::on_browseBinary_clicked() -{ - QString binaryName = FileDialogMemory::getOpenFileName( - "editExecutableBinary", this, tr("Select a binary"), QString(), - tr("Executable (%1)").arg("*.exe *.bat *.jar")); - - if (binaryName.isNull()) { - // canceled - return; - } - - if (binaryName.endsWith(".jar", Qt::CaseInsensitive)) { - QString binaryPath; - { // try to find java automatically - std::wstring binaryNameW = ToWString(binaryName); - WCHAR buffer[MAX_PATH]; - if (::FindExecutableW(binaryNameW.c_str(), nullptr, buffer) - > reinterpret_cast(32)) { - DWORD binaryType = 0UL; - if (!::GetBinaryTypeW(binaryNameW.c_str(), &binaryType)) { - qDebug("failed to determine binary type of \"%ls\": %lu", binaryNameW.c_str(), ::GetLastError()); - } else if (binaryType == SCS_32BIT_BINARY) { - binaryPath = ToQString(buffer); - } - } - } - if (binaryPath.isEmpty()) { - QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); - if (javaReg.contains("CurrentVersion")) { - QString currentVersion = javaReg.value("CurrentVersion").toString(); - binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); - } - } - if (binaryPath.isEmpty()) { - QMessageBox::information(this, tr("Java (32-bit) required"), - tr("MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe " - "from that installation as the binary.")); - } else { - ui->binary->setText(binaryPath); - } - - ui->workingDirectory->setText(QDir::toNativeSeparators(QFileInfo(binaryName).absolutePath())); - ui->arguments->setText("-jar \"" + QDir::toNativeSeparators(binaryName) + "\""); - } else { - ui->binary->setText(QDir::toNativeSeparators(binaryName)); - } - - if (ui->title->text().isEmpty()) { - ui->title->setText(QFileInfo(binaryName).baseName()); - } -} - void EditExecutablesDialog::on_remove_clicked() { if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->title->text()), diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 37b50127..1f3f0082 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -98,6 +98,7 @@ private: void clearEdits(); void setEdits(const Executable& e); void save(); + void setJarBinary(const QString& binaryName); void resetInput(); bool executableChanged(); diff --git a/src/filedialogmemory.cpp b/src/filedialogmemory.cpp index 9607beb9..554a6235 100644 --- a/src/filedialogmemory.cpp +++ b/src/filedialogmemory.cpp @@ -61,14 +61,22 @@ QString FileDialogMemory::getOpenFileName( const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options) { - std::pair::iterator, bool> currentDir = - instance().m_Cache.insert(std::make_pair(dirID, dir)); + QString currentDir = dir; + + if (currentDir.isEmpty()) { + auto itor = instance().m_Cache.find(dirID); + if (itor != instance().m_Cache.end()) { + currentDir = itor->first; + } + } + + QString result = QFileDialog::getOpenFileName( + parent, caption, currentDir, filter, selectedFilter, options); - QString result = QFileDialog::getOpenFileName(parent, caption, currentDir.first->second, - filter, selectedFilter, options); if (!result.isNull()) { instance().m_Cache[dirID] = QFileInfo(result).path(); } + return result; } diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 2172538e..c724e57f 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1182,6 +1182,34 @@ QStringList OrganizerCore::modsSortedByProfilePriority() const return res; } +QString OrganizerCore::findJavaInstallation(const QString& jarFile) +{ + if (!jarFile.isEmpty()) { + // try to find java automatically based on the given jar file + std::wstring jarFileW = jarFile.toStdWString(); + + WCHAR buffer[MAX_PATH]; + if (::FindExecutableW(jarFileW.c_str(), nullptr, buffer) > (HINSTANCE)32) { + DWORD binaryType = 0UL; + if (!::GetBinaryTypeW(buffer, &binaryType)) { + qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError()); + } else if (binaryType == SCS_32BIT_BINARY || binaryType == SCS_64BIT_BINARY) { + return QString::fromWCharArray(buffer); + } + } + } + + // second attempt: look to the registry + QSettings reg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); + if (reg.contains("CurrentVersion")) { + QString currentVersion = reg.value("CurrentVersion").toString(); + return reg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); + } + + // not found + return {}; +} + bool OrganizerCore::getFileExecutionContext( QWidget* parent, const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments, FileExecutionTypes& type) @@ -1199,44 +1227,22 @@ bool OrganizerCore::getFileExecutionContext( type = FileExecutionTypes::Executable; return true; } else if (extension.compare("jar", Qt::CaseInsensitive) == 0) { - // types that need to be injected into - std::wstring targetPathW = targetInfo.absoluteFilePath().toStdWString(); - QString binaryPath; - - { // try to find java automatically - WCHAR buffer[MAX_PATH]; - if (::FindExecutableW(targetPathW.c_str(), nullptr, buffer) > (HINSTANCE)32) { - DWORD binaryType = 0UL; - if (!::GetBinaryTypeW(buffer, &binaryType)) { - qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError()); - } else if (binaryType == SCS_32BIT_BINARY) { - binaryPath = QString::fromWCharArray(buffer); - } - } - } - if (binaryPath.isEmpty() && (extension == "jar")) { - // second attempt: look to the registry - QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); - if (javaReg.contains("CurrentVersion")) { - QString currentVersion = javaReg.value("CurrentVersion").toString(); - binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); - } - } - if (binaryPath.isEmpty()) { - binaryPath = QFileDialog::getOpenFileName( - parent, QObject::tr("Select binary"), QString(), QObject::tr("Binary") + " (*.exe)"); + auto java = findJavaInstallation(targetInfo.absoluteFilePath()); + + if (java.isEmpty()) { + java = QFileDialog::getOpenFileName( + parent, QObject::tr("Select binary"), + QString(), QObject::tr("Binary") + " (*.exe)"); } - if (binaryPath.isEmpty()) { + + if (java.isEmpty()) { return false; } - binaryInfo = QFileInfo(binaryPath); - if (extension == "jar") { - arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - } else { - arguments = QString("\"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - } + binaryInfo = QFileInfo(java); + arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); type = FileExecutionTypes::Executable; + return true; } else { type = FileExecutionTypes::Other; diff --git a/src/organizercore.h b/src/organizercore.h index 8ed34e24..a4a57496 100644 --- a/src/organizercore.h +++ b/src/organizercore.h @@ -147,6 +147,8 @@ public: void doAfterLogin(const std::function &function) { m_PostLoginTasks.append(function); } + static QString findJavaInstallation(const QString& jarFile={}); + static bool getFileExecutionContext( QWidget* parent, const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments, FileExecutionTypes& type); -- cgit v1.3.1 From 6e937f7d09da6ad773874fc6095e2fb5b51d9afc Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 23:44:58 -0400 Subject: add executable --- src/editexecutablesdialog.cpp | 74 +++++++++++++++++++++++++------------------ src/editexecutablesdialog.h | 3 +- 2 files changed, 46 insertions(+), 31 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 08e2c3d1..570d1396 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -114,17 +114,21 @@ void EditExecutablesDialog::fillExecutableList() ui->list->clear(); for(const auto& exe : m_executablesList) { - QListWidgetItem *newItem = new QListWidgetItem(exe.title()); - - if (!exe.isCustom()) { - auto f = newItem->font(); - f.setItalic(true); + ui->list->addItem(createListItem(exe)); + } +} - newItem->setFont(f); - } +QListWidgetItem* EditExecutablesDialog::createListItem(const Executable& exe) +{ + QListWidgetItem *newItem = new QListWidgetItem(exe.title()); - ui->list->addItem(newItem); + if (!exe.isCustom()) { + auto f = newItem->font(); + f.setItalic(true); + newItem->setFont(f); } + + return newItem; } void EditExecutablesDialog::updateUI(const Executable* e) @@ -276,6 +280,24 @@ void EditExecutablesDialog::on_list_itemSelectionChanged() updateUI(selectedExe()); } +void EditExecutablesDialog::on_add_clicked() +{ + auto title = newExecutableTitle(); + if (title.isNull()) { + return; + } + + auto e = Executable() + .title(title) + .flags(Executable::CustomExecutable); + + m_executablesList.setExecutable(e); + + auto* item = createListItem(e); + ui->list->addItem(item); + item->setSelected(true); +} + void EditExecutablesDialog::on_title_textChanged(const QString& s) { if (m_settingUI) { @@ -405,24 +427,26 @@ void EditExecutablesDialog::setJarBinary(const QString& binaryName) save(); } +QString EditExecutablesDialog::newExecutableTitle() +{ + const auto prefix = tr("New Executable"); + QString title = prefix; + for (int i=1; i<100; ++i) { + if (!m_executablesList.titleExists(title)) { + return title; + } -void EditExecutablesDialog::resetInput() -{ - ui->binary->setText(""); - ui->title->setText(""); - ui->workingDirectory->clear(); - ui->arguments->setText(""); - ui->overwriteSteamAppID->setChecked(false); - ui->createFilesInMod->setChecked(false); - ui->forceLoadLibraries->setChecked(false); - ui->steamAppID->clear(); - ui->useApplicationIcon->setChecked(false); + title = prefix + QString(" (%1)").arg(i); + } - m_currentItem = nullptr; + qCritical().nospace() << "ran out of new executable titles"; + return QString::null; } + + ExecutablesList EditExecutablesDialog::getExecutablesList() const { ExecutablesList newList; @@ -505,15 +529,6 @@ void EditExecutablesDialog::delayedRefresh() -void EditExecutablesDialog::on_add_clicked() -{ - if (executableChanged()) { - saveExecutable(); - } - - resetInput(); - //refreshExecutablesWidget(); -} void EditExecutablesDialog::on_remove_clicked() { @@ -524,7 +539,6 @@ void EditExecutablesDialog::on_remove_clicked() m_executablesList.remove(ui->title->text()); } - resetInput(); //refreshExecutablesWidget(); } diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 1f3f0082..3145c94f 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -94,13 +94,14 @@ private: Executable* selectedExe(); void fillExecutableList(); + QListWidgetItem* createListItem(const Executable& exe); void updateUI(const Executable* e); void clearEdits(); void setEdits(const Executable& e); void save(); void setJarBinary(const QString& binaryName); + QString newExecutableTitle(); - void resetInput(); bool executableChanged(); void updateButtonStates(); void saveExecutable(); -- cgit v1.3.1 From f60431f92f9475d59a3e2af41c95cc6723892f9a Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 7 Jun 2019 23:57:52 -0400 Subject: remove executable --- src/editexecutablesdialog.cpp | 61 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 570d1396..15b496ef 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -298,6 +298,56 @@ void EditExecutablesDialog::on_add_clicked() item->setSelected(true); } +void EditExecutablesDialog::on_remove_clicked() +{ + auto* item = selectedItem(); + if (!item) { + qWarning("trying to remove entry but nothing is selected"); + return; + } + + auto* exe = selectedExe(); + if (!exe) { + qWarning("trying to remove entry but nothing is selected"); + return; + } + + const int currentRow = ui->list->row(item); + delete item; + + + // removing custom overwrite + { + auto itor = m_customOverwrites.find(exe->title()); + if (itor != m_customOverwrites.end()) { + m_customOverwrites.erase(itor); + } + } + + // removing forced libraries + { + auto itor = m_forcedLibraries.find(exe->title()); + if (itor != m_forcedLibraries.end()) { + m_forcedLibraries.erase(itor); + } + } + + // removing from main list, must be done last because it invalidates the + // exe pointer + m_executablesList.remove(exe->title()); + + + // reselecting the same row as before, or the last one + if (currentRow >= ui->list->count()) { + // that was the last item, select the new list item, if any + if (ui->list->count() > 0) { + ui->list->item(ui->list->count() - 1)->setSelected(true); + } + } else { + ui->list->item(currentRow)->setSelected(true); + } +} + void EditExecutablesDialog::on_title_textChanged(const QString& s) { if (m_settingUI) { @@ -530,17 +580,6 @@ void EditExecutablesDialog::delayedRefresh() -void EditExecutablesDialog::on_remove_clicked() -{ - if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->title->text()), - QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - m_profile->removeSetting("custom_overwrites", ui->title->text()); - m_profile->removeForcedLibraries(ui->title->text()); - m_executablesList.remove(ui->title->text()); - } - - //refreshExecutablesWidget(); -} bool EditExecutablesDialog::executableChanged() -- cgit v1.3.1 From 57c7b1568518acefcbcc1801954a62fdc94e3b1c Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 8 Jun 2019 00:30:51 -0400 Subject: moved functionality to CustomOverwrites and ForcedLibraries helper classes --- src/editexecutablesdialog.cpp | 163 ++++++++++++++++++++++++++++++------------ src/editexecutablesdialog.h | 43 ++++++++++- 2 files changed, 157 insertions(+), 49 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 15b496ef..6f63416d 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -49,26 +49,13 @@ EditExecutablesDialog::EditExecutablesDialog( ui->splitter->setStretchFactor(0, 0); ui->splitter->setStretchFactor(1, 1); - for (const auto& e : m_executablesList) { - // custom overwrites - QString customOverwrite = m_profile->setting("custom_overwrites", e.title()).toString(); - if (!customOverwrite.isEmpty()) { - m_customOverwrites[e.title()] = customOverwrite; - } - - // forced libraries - if (m_profile->forcedLibrariesEnabled(e.title())) { - m_forcedLibraries[e.title()] = m_profile->determineForcedLibraries(e.title()); - } - } - + m_customOverwrites.load(profile, m_executablesList); + m_forcedLibraries.load(profile, m_executablesList); fillExecutableList(); ui->mods->addItems(modList.allMods()); - // some widgets need to do more than just save() and have their own handler - connect(ui->binary, &QLineEdit::textChanged, [&]{ save(); }); connect(ui->workingDirectory, &QLineEdit::textChanged, [&]{ save(); }); connect(ui->arguments, &QLineEdit::textChanged, [&]{ save(); }); @@ -190,13 +177,12 @@ void EditExecutablesDialog::setEdits(const Executable& e) { int modIndex = -1; - auto itor = m_customOverwrites.find(e.title()); - if (itor != m_customOverwrites.end()) { - modIndex = ui->mods->findText(itor->second); + if (const auto mod=m_customOverwrites.find(e.title())) { + modIndex = ui->mods->findText(*mod); if (modIndex == -1) { qWarning().nospace() - << "executable '" << e.title() << "' uses mod '" << itor->second << "' " + << "executable '" << e.title() << "' uses mod '" << *mod << "' " << "as a custom overwrite, but that mod doesn't exist"; } } @@ -207,8 +193,7 @@ void EditExecutablesDialog::setEdits(const Executable& e) } { - auto itor = m_forcedLibraries.find(e.title()); - const auto hasForcedLibraries = (itor != m_forcedLibraries.end()); + const auto hasForcedLibraries = m_forcedLibraries.find(e.title()).has_value(); ui->forceLoadLibraries->setChecked(hasForcedLibraries); ui->configureLibraries->setEnabled(hasForcedLibraries); @@ -247,16 +232,20 @@ void EditExecutablesDialog::save() // title may have changed, start with the stuff using it if (ui->createFilesInMod->isChecked()) { - m_customOverwrites[e->title()] = ui->mods->currentText(); + m_customOverwrites.set(e->title(), ui->mods->currentText()); } else { - auto itor = m_customOverwrites.find(e->title()); - if (itor != m_customOverwrites.end()) { - m_customOverwrites.erase(itor); - } + m_customOverwrites.remove(e->title()); } // forced libraries are saved in on_configureLibraries_clicked() + // now rename both the custom overwrites and forced libraries if the title + // is being changed + if (e->title() != ui->title->text()) { + m_customOverwrites.rename(e->title(), ui->title->text()); + m_forcedLibraries.rename(e->title(), ui->title->text()); + } + e->title(ui->title->text()); e->binaryInfo(ui->binary->text()); e->workingDirectory(ui->workingDirectory->text()); @@ -316,21 +305,8 @@ void EditExecutablesDialog::on_remove_clicked() delete item; - // removing custom overwrite - { - auto itor = m_customOverwrites.find(exe->title()); - if (itor != m_customOverwrites.end()) { - m_customOverwrites.erase(itor); - } - } - - // removing forced libraries - { - auto itor = m_forcedLibraries.find(exe->title()); - if (itor != m_forcedLibraries.end()) { - m_forcedLibraries.erase(itor); - } - } + m_customOverwrites.remove(exe->title()); + m_forcedLibraries.remove(exe->title()); // removing from main list, must be done last because it invalidates the // exe pointer @@ -354,8 +330,8 @@ void EditExecutablesDialog::on_title_textChanged(const QString& s) return; } - // must save first because it relies on the text in the list to find the - // executable to modify + // must save before modifying the item in the list widget because saving + // relies on the item's text being the same as an item in m_executablesList save(); // once the executable is saved, the list item must be changed to match the @@ -443,13 +419,12 @@ void EditExecutablesDialog::on_configureLibraries_clicked() ForcedLoadDialog dialog(m_gamePlugin, this); - auto itor = m_forcedLibraries.find(e->title()); - if (itor != m_forcedLibraries.end()) { - dialog.setValues(itor->second); + if (auto list=m_forcedLibraries.find(e->title())) { + dialog.setValues(*list); } if (dialog.exec() == QDialog::Accepted) { - m_forcedLibraries[e->title()] = dialog.values(); + m_forcedLibraries.set(e->title(), dialog.values()); save(); } } @@ -725,3 +700,97 @@ void EditExecutablesDialog::on_buttons_rejected() ui->forceLoadCheckBox->setChecked(forcedLibraries); } }*/ + + +void CustomOverwrites::load(Profile* p, const ExecutablesList& exes) +{ + for (const auto& e : exes) { + const auto s = p->setting("custom_overwrites", e.title()).toString(); + + if (!s.isEmpty()) { + m_map[e.title()] = s; + } + } +} + +std::optional CustomOverwrites::find(const QString& title) const +{ + auto itor = m_map.find(title); + if (itor == m_map.end()) { + return {}; + } + + return itor->second; +} + +void CustomOverwrites::set(const QString& title, const QString& mod) +{ + m_map[title] = mod; +} + +void CustomOverwrites::rename(const QString& oldTitle, const QString& newTitle) +{ + auto itor = m_map.find(oldTitle); + if (itor == m_map.end()) { + return; + } + + // copy to new title, erase old + m_map[newTitle] = itor->second; + m_map.erase(itor); +} + +void CustomOverwrites::remove(const QString& title) +{ + auto itor = m_map.find(title); + + if (itor != m_map.end()) { + m_map.erase(itor); + } +} + + +void ForcedLibraries::load(Profile* p, const ExecutablesList& exes) +{ + for (const auto& e : exes) { + if (p->forcedLibrariesEnabled(e.title())) { + m_map[e.title()] = p->determineForcedLibraries(e.title()); + } + } +} + +std::optional ForcedLibraries::find(const QString& title) const +{ + auto itor = m_map.find(title); + if (itor == m_map.end()) { + return {}; + } + + return itor->second; +} + +void ForcedLibraries::set(const QString& title, const list_type& mod) +{ + m_map[title] = mod; +} + +void ForcedLibraries::rename(const QString& oldTitle, const QString& newTitle) +{ + auto itor = m_map.find(oldTitle); + if (itor == m_map.end()) { + return; + } + + // copy to new title, erase old + m_map[newTitle] = itor->second; + m_map.erase(itor); +} + +void ForcedLibraries::remove(const QString& title) +{ + auto itor = m_map.find(title); + + if (itor != m_map.end()) { + m_map.erase(itor); + } +} diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 3145c94f..f8382915 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -27,6 +27,7 @@ along with Mod Organizer. If not, see . #include "iplugingame.h" #include #include +#include namespace Ui { class EditExecutablesDialog; @@ -34,6 +35,44 @@ namespace Ui { class ModList; + +/** helper class to manage custom overwrites within the edit executables + * dialog + **/ +class CustomOverwrites +{ +public: + void load(Profile* p, const ExecutablesList& exes); + std::optional find(const QString& title) const; + + void set(const QString& title, const QString& mod); + void rename(const QString& oldTitle, const QString& newTitle); + void remove(const QString& title); + +private: + std::map m_map; +}; + + +/** helper class to manage forced libraries within the edit executables dialog + **/ +class ForcedLibraries +{ +public: + using list_type = QList; + + void load(Profile* p, const ExecutablesList& exes); + std::optional find(const QString& title) const; + + void set(const QString& title, const list_type& list); + void rename(const QString& oldTitle, const QString& newTitle); + void remove(const QString& title); + +private: + std::map m_map; +}; + + /** * @brief Dialog to manage the list of executables **/ @@ -81,8 +120,8 @@ private slots: private: std::unique_ptr ui; ExecutablesList m_executablesList; - std::map m_customOverwrites; - std::map> m_forcedLibraries; + CustomOverwrites m_customOverwrites; + ForcedLibraries m_forcedLibraries; Profile *m_profile; const MOBase::IPluginGame *m_gamePlugin; bool m_settingUI; -- cgit v1.3.1 From 626045511160b9d44a4ffd29f6dce11f5db6096b Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 9 Jun 2019 10:37:08 -0400 Subject: removed old, unused stuff have mainwindow save all the new settings once the dialog closes --- src/editexecutablesdialog.cpp | 281 ++++++++---------------------------------- src/editexecutablesdialog.h | 13 +- src/mainwindow.cpp | 38 +++++- 3 files changed, 86 insertions(+), 246 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 6f63416d..28a6b148 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -63,11 +63,49 @@ EditExecutablesDialog::EditExecutablesDialog( connect(ui->mods, &QComboBox::currentTextChanged, [&]{ save(); }); connect(ui->useApplicationIcon, &QCheckBox::toggled, [&]{ save(); }); - updateUI(nullptr); + // select the first one in the list, if any + if (ui->list->count() > 0) { + ui->list->item(0)->setSelected(true); + } else { + updateUI(nullptr); + } } EditExecutablesDialog::~EditExecutablesDialog() = default; +ExecutablesList EditExecutablesDialog::getExecutablesList() const +{ + ExecutablesList newList; + + // make sure the executables are in the same order as in the list + for (int i = 0; i < ui->list->count(); ++i) { + const auto& title = ui->list->item(i)->text(); + + auto itor = m_executablesList.find(title); + + if (itor == m_executablesList.end()) { + qWarning().nospace() + << "getExecutablesList(): executable '" << title << "' not found"; + + continue; + } + + newList.setExecutable(*itor); + } + + return newList; +} + +const CustomOverwrites& EditExecutablesDialog::getCustomOverwrites() const +{ + return m_customOverwrites; +} + +const ForcedLibraries& EditExecutablesDialog::getForcedLibraries() const +{ + return m_forcedLibraries; +} + QListWidgetItem* EditExecutablesDialog::selectedItem() { const auto selection = ui->list->selectedItems(); @@ -429,6 +467,16 @@ void EditExecutablesDialog::on_configureLibraries_clicked() } } +void EditExecutablesDialog::on_buttons_accepted() +{ + accept(); +} + +void EditExecutablesDialog::on_buttons_rejected() +{ + reject(); +} + void EditExecutablesDialog::setJarBinary(const QString& binaryName) { auto java = OrganizerCore::findJavaInstallation(binaryName); @@ -471,237 +519,6 @@ QString EditExecutablesDialog::newExecutableTitle() } - -ExecutablesList EditExecutablesDialog::getExecutablesList() const -{ - ExecutablesList newList; - for (int i = 0; i < ui->list->count(); ++i) { - const auto& title = ui->list->item(i)->text(); - auto itor = m_executablesList.find(title); - - if (itor == m_executablesList.end()) { - qWarning().nospace() - << "getExecutablesList(): executable '" << title << "' not found"; - - continue; - } - - newList.setExecutable(*itor); - } - - return newList; -} - - -void EditExecutablesDialog::updateButtonStates() -{ - bool enabled = true; - - QString filePath(ui->binary->text()); - QFileInfo fileInfo(filePath); - if (!fileInfo.exists()) - enabled = false; - if (!fileInfo.isFile()) - enabled = false; - - QString dirPath(ui->workingDirectory->text()); - if (!dirPath.isEmpty()) { - QDir dirInfo(dirPath); - if (!dirInfo.exists()) - enabled = false; - } - - //ui->addButton->setEnabled(enabled); -} - - -void EditExecutablesDialog::saveExecutable() -{ - Executable::Flags flags = Executable::CustomExecutable; - if (ui->useApplicationIcon->isChecked()) - flags |= Executable::UseApplicationIcon; - - m_executablesList.setExecutable(Executable() - .title(ui->title->text()) - .binaryInfo(QDir::fromNativeSeparators(ui->binary->text())) - .arguments(ui->arguments->text()) - .steamAppID(ui->overwriteSteamAppID->isChecked() ? ui->steamAppID->text() : "") - .workingDirectory(QDir::fromNativeSeparators(ui->workingDirectory->text())) - .flags(flags)); - - if (ui->createFilesInMod->isChecked()) { - m_profile->storeSetting("custom_overwrites", ui->title->text(), - ui->mods->currentText()); - } - else { - m_profile->removeSetting("custom_overwrites", ui->title->text()); - } - - //m_profile->removeForcedLibraries(ui->title->text()); - //m_profile->storeForcedLibraries(ui->title->text(), m_forcedLibraries); - //m_profile->setForcedLibrariesEnabled(ui->title->text(), ui->forceLoadLibraries->isChecked()); -} - - -void EditExecutablesDialog::delayedRefresh() -{ - /*QModelIndex index = ui->executablesListBox->currentIndex(); - resetInput(); - refreshExecutablesWidget(); - on_executablesListBox_clicked(index);*/ -} - - - - - - - -bool EditExecutablesDialog::executableChanged() -{ - /*if (m_currentItem != nullptr) { - const auto& title = m_currentItem->text(); - auto itor = m_executablesList.find(title); - - if (itor == m_executablesList.end()) { - qWarning().nospace() - << "executableChanged(): title '" << title << "' not found"; - - return false; - } - - const Executable& selectedExecutable = *itor; - - QString storedCustomOverwrite = m_profile->setting("custom_overwrites", selectedExecutable.title()).toString(); - - bool forcedLibrariesDirty = false; - auto forcedLibaries = m_profile->determineForcedLibraries(selectedExecutable.title()); - forcedLibrariesDirty |= !std::equal(forcedLibaries.begin(), forcedLibaries.end(), - m_forcedLibraries.begin(), m_forcedLibraries.end(), - [](const ExecutableForcedLoadSetting &lhs, const ExecutableForcedLoadSetting &rhs) - { - return lhs.enabled() == rhs.enabled() && - lhs.forced() == rhs.forced() && - lhs.library() == rhs.library() && - lhs.process() == rhs.process(); - }); - forcedLibrariesDirty |= m_profile->setting("forced_libraries", ui->title->text() + "/enabled", false).toBool() != - ui->forceLoadLibraries->isChecked(); - - return selectedExecutable.title() != ui->title->text() - || selectedExecutable.arguments() != ui->arguments->text() - || selectedExecutable.steamAppID() != ui->steamAppID->text() - || !storedCustomOverwrite.isEmpty() != ui->createFilesInMod->isChecked() - || !storedCustomOverwrite.isEmpty() && (storedCustomOverwrite != ui->mods->currentText()) - || selectedExecutable.workingDirectory() != QDir::fromNativeSeparators(ui->workingDirectory->text()) - || selectedExecutable.binaryInfo().absoluteFilePath() != QDir::fromNativeSeparators(ui->binary->text()) - || selectedExecutable.usesOwnIcon() != ui->useApplicationIcon->isChecked() - || forcedLibrariesDirty - ; - } else { - QFileInfo fileInfo(ui->binary->text()); - return !ui->binary->text().isEmpty() - && !ui->title->text().isEmpty() - && fileInfo.exists() - && fileInfo.isFile(); - }*/ - - return false; -} - -void EditExecutablesDialog::on_buttons_accepted() -{ - if (executableChanged()) { - QMessageBox::StandardButton res = QMessageBox::question(this, tr("Save Changes?"), - tr("You made changes to the current executable, do you want to save them?"), - QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); - if (res == QMessageBox::Cancel) { - return; - } else if (res == QMessageBox::Yes) { - saveExecutable(); - // the executable list returned to callers is generated from the user data in the widgets, - // NOT the list we just saved - //refreshExecutablesWidget(); - } - } - - accept(); -} - -void EditExecutablesDialog::on_buttons_rejected() -{ - reject(); -} - -/*void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex ¤t) -{ - if (current.isValid()) { - - if (executableChanged()) { - QMessageBox::StandardButton res = QMessageBox::question(this, tr("Save Changes?"), - tr("You made changes to the current executable, do you want to save them?"), - QMessageBox::Yes | QMessageBox::No); - if (res == QMessageBox::Yes) { - saveExecutable(); - - //This is necessary if we're adding a new item, but it doesn't look very nice. - //Ideally we'd end up with the correct row displayed - ui->executablesListBox->selectionModel()->clearSelection(); - ui->executablesListBox->selectionModel()->select(current, QItemSelectionModel::SelectCurrent); - QTimer::singleShot(50, this, SLOT(delayedRefresh())); - return; - } - } - - ui->executablesListBox->selectionModel()->clearSelection(); - ui->executablesListBox->selectionModel()->select(current, QItemSelectionModel::SelectCurrent); - - m_CurrentItem = ui->executablesListBox->item(current.row()); - - const auto& title = m_CurrentItem->text(); - auto itor = m_ExecutablesList.find(title); - - if (itor == m_ExecutablesList.end()) { - qWarning().nospace() << "selection: executable '" << title << "' not found"; - return; - } - - const Executable& selectedExecutable = *itor; - - ui->titleEdit->setText(selectedExecutable.title()); - ui->binaryEdit->setText(QDir::toNativeSeparators(selectedExecutable.binaryInfo().absoluteFilePath())); - ui->argumentsEdit->setText(selectedExecutable.arguments()); - ui->workingDirEdit->setText(QDir::toNativeSeparators(selectedExecutable.workingDirectory())); - ui->removeButton->setEnabled(selectedExecutable.isCustom()); - ui->overwriteAppIDBox->setChecked(!selectedExecutable.steamAppID().isEmpty()); - if (!selectedExecutable.steamAppID().isEmpty()) { - ui->appIDOverwriteEdit->setText(selectedExecutable.steamAppID()); - } else { - ui->appIDOverwriteEdit->clear(); - } - ui->useAppIconCheckBox->setChecked(selectedExecutable.usesOwnIcon()); - - int index = -1; - - QString customOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.title()).toString(); - if (!customOverwrite.isEmpty()) { - index = ui->newFilesModBox->findText(customOverwrite); - qDebug("find %s -> %d", qUtf8Printable(customOverwrite), index); - } - - ui->newFilesModCheckBox->setChecked(index != -1); - if (index != -1) { - ui->newFilesModBox->setCurrentIndex(index); - } - - m_ForcedLibraries = m_Profile->determineForcedLibraries(ui->titleEdit->text()); - bool forcedLibraries = m_Profile->forcedLibrariesEnabled(ui->titleEdit->text()); - ui->forceLoadButton->setEnabled(forcedLibraries); - ui->forceLoadCheckBox->setChecked(forcedLibraries); - } -}*/ - - void CustomOverwrites::load(Profile* p, const ExecutablesList& exes) { for (const auto& e : exes) { diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index f8382915..5199537c 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -91,11 +91,9 @@ public: ~EditExecutablesDialog(); - /** - * @brief retrieve the updated list of executables - * @return updated list of executables - **/ ExecutablesList getExecutablesList() const; + const CustomOverwrites& getCustomOverwrites() const; + const ForcedLibraries& getForcedLibraries() const; private slots: void on_list_itemSelectionChanged(); @@ -115,8 +113,6 @@ private slots: void on_buttons_accepted(); void on_buttons_rejected(); - void delayedRefresh(); - private: std::unique_ptr ui; ExecutablesList m_executablesList; @@ -140,11 +136,6 @@ private: void save(); void setJarBinary(const QString& binaryName); QString newExecutableTitle(); - - bool executableChanged(); - void updateButtonStates(); - void saveExecutable(); - }; #endif // EDITEXECUTABLESDIALOG_H diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 267a2971..05417f51 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2479,24 +2479,56 @@ static HRESULT CreateShortcut(LPCWSTR targetFileName, LPCWSTR arguments, bool MainWindow::modifyExecutablesDialog() { bool result = false; + try { - EditExecutablesDialog dialog(*m_OrganizerCore.executablesList(), + const auto oldExecutables = *m_OrganizerCore.executablesList(); + auto* profile = m_OrganizerCore.currentProfile(); + + EditExecutablesDialog dialog(oldExecutables, *m_OrganizerCore.modList(), - m_OrganizerCore.currentProfile(), + profile, m_OrganizerCore.managedGame(), this); QSettings &settings = m_OrganizerCore.settings().directInterface(); QString key = QString("geometry/%1").arg(dialog.objectName()); + if (settings.contains(key)) { dialog.restoreGeometry(settings.value(key).toByteArray()); } + if (dialog.exec() == QDialog::Accepted) { - m_OrganizerCore.setExecutablesList(dialog.getExecutablesList()); + const auto newExecutables = dialog.getExecutablesList(); + + // remove all the custom overwrites and forced libraries + for (const auto& e : oldExecutables) { + profile->removeSetting("custom_overwrites", e.title()); + profile->removeForcedLibraries(e.title()); + } + + // set the new custom overwrites and forced libraries + for (const auto& e : newExecutables) { + if (auto modName=dialog.getCustomOverwrites().find(e.title())) { + profile->storeSetting("custom_overwrites", e.title(), *modName); + } + + if (auto list=dialog.getForcedLibraries().find(e.title())) { + if (!list->empty()) { + profile->setForcedLibrariesEnabled(e.title(), true); + profile->storeForcedLibraries(e.title(), *list); + } + } + } + + // set the new executables list + m_OrganizerCore.setExecutablesList(newExecutables); + result = true; } + settings.setValue(key, dialog.saveGeometry()); refreshExecutablesList(); + updatePinnedExecutables(); } catch (const std::exception &e) { reportError(e.what()); } -- cgit v1.3.1 From d6d05dcae8d2b26aff5917449e38f9886bca65ba Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 9 Jun 2019 11:02:43 -0400 Subject: handles changing the title to one that already exists by just ignoring it --- src/editexecutablesdialog.cpp | 57 +++++++++++++++++++++++++++++++++---------- src/editexecutablesdialog.h | 3 ++- 2 files changed, 46 insertions(+), 14 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 28a6b148..102ac4d5 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -275,16 +275,22 @@ void EditExecutablesDialog::save() m_customOverwrites.remove(e->title()); } + QString newTitle = ui->title->text(); + if (isTitleConflicting(newTitle)) { + // don't save conflicting titles + newTitle = e->title(); + } + // forced libraries are saved in on_configureLibraries_clicked() // now rename both the custom overwrites and forced libraries if the title // is being changed - if (e->title() != ui->title->text()) { - m_customOverwrites.rename(e->title(), ui->title->text()); - m_forcedLibraries.rename(e->title(), ui->title->text()); + if (e->title() != newTitle) { + m_customOverwrites.rename(e->title(), newTitle); + m_forcedLibraries.rename(e->title(), newTitle); + e->title(newTitle); } - e->title(ui->title->text()); e->binaryInfo(ui->binary->text()); e->workingDirectory(ui->workingDirectory->text()); e->arguments(ui->arguments->text()); @@ -309,13 +315,13 @@ void EditExecutablesDialog::on_list_itemSelectionChanged() void EditExecutablesDialog::on_add_clicked() { - auto title = newExecutableTitle(); - if (title.isNull()) { + auto title = makeNonConflictingTitle(tr("New Executable")); + if (!title) { return; } auto e = Executable() - .title(title) + .title(*title) .flags(Executable::CustomExecutable); m_executablesList.setExecutable(e); @@ -362,12 +368,31 @@ void EditExecutablesDialog::on_remove_clicked() } } +bool EditExecutablesDialog::isTitleConflicting(const QString& s) +{ + for (const auto& exe : m_executablesList) { + if (exe.title() == s) { + if (&exe != selectedExe()) { + // found an executable that's not the current one with the same title + return true; + } + } + } + + return false; +} + void EditExecutablesDialog::on_title_textChanged(const QString& s) { if (m_settingUI) { return; } + // don't allow changing the title to something that already exists + if (isTitleConflicting(s)) { + return; + } + // must save before modifying the item in the list widget because saving // relies on the item's text being the same as an item in m_executablesList save(); @@ -427,7 +452,12 @@ void EditExecutablesDialog::on_browseBinary_clicked() } if (ui->title->text().isEmpty()) { - ui->title->setText(QFileInfo(binaryName).baseName()); + const auto prefix = QFileInfo(binaryName).baseName(); + const auto newTitle = makeNonConflictingTitle(prefix); + + if (newTitle) { + ui->title->setText(*newTitle); + } } save(); @@ -500,10 +530,9 @@ void EditExecutablesDialog::setJarBinary(const QString& binaryName) save(); } -QString EditExecutablesDialog::newExecutableTitle() +std::optional EditExecutablesDialog::makeNonConflictingTitle( + const QString& prefix) { - const auto prefix = tr("New Executable"); - QString title = prefix; for (int i=1; i<100; ++i) { @@ -514,8 +543,10 @@ QString EditExecutablesDialog::newExecutableTitle() title = prefix + QString(" (%1)").arg(i); } - qCritical().nospace() << "ran out of new executable titles"; - return QString::null; + qCritical().nospace() + << "ran out of executable titles for prefix '" << prefix << "'"; + + return {}; } diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 5199537c..6e006ae2 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -135,7 +135,8 @@ private: void setEdits(const Executable& e); void save(); void setJarBinary(const QString& binaryName); - QString newExecutableTitle(); + std::optional makeNonConflictingTitle(const QString& prefix); + bool isTitleConflicting(const QString& s); }; #endif // EDITEXECUTABLESDIALOG_H -- cgit v1.3.1 From e86224ee7ffdb18b7c7d17bc2c5cef2457665103 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 9 Jun 2019 11:38:44 -0400 Subject: moved commiting changes to EditExecutablesDialog itself instead of doing it from the main window use a separate enabled state for custom overwrites and forced libraries, this remembers the values even when unchecking the checkbox, as long as the dialog stays opened pass the whole OrganizerCore to EditExecutablesDialog, simplifies a bunch of things --- src/editexecutablesdialog.cpp | 147 ++++++++++++++++++++++++++++++++---------- src/editexecutablesdialog.h | 39 +++++++---- src/mainwindow.cpp | 36 +---------- 3 files changed, 139 insertions(+), 83 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 102ac4d5..cb6ec6e8 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -33,15 +33,12 @@ along with Mod Organizer. If not, see . using namespace MOBase; using namespace MOShared; -EditExecutablesDialog::EditExecutablesDialog( - const ExecutablesList &executablesList, const ModList &modList, - Profile *profile, const IPluginGame *game, QWidget *parent) +EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent) : TutorableDialog("EditExecutables", parent) , ui(new Ui::EditExecutablesDialog) - , m_currentItem(nullptr) - , m_executablesList(executablesList) - , m_profile(profile) - , m_gamePlugin(game) + , m_organizerCore(oc) + , m_originalExecutables(*oc.executablesList()) + , m_executablesList(*oc.executablesList()) , m_settingUI(false) { ui->setupUi(this); @@ -49,11 +46,11 @@ EditExecutablesDialog::EditExecutablesDialog( ui->splitter->setStretchFactor(0, 0); ui->splitter->setStretchFactor(1, 1); - m_customOverwrites.load(profile, m_executablesList); - m_forcedLibraries.load(profile, m_executablesList); + m_customOverwrites.load(m_organizerCore.currentProfile(), m_executablesList); + m_forcedLibraries.load(m_organizerCore.currentProfile(), m_executablesList); fillExecutableList(); - ui->mods->addItems(modList.allMods()); + ui->mods->addItems(m_organizerCore.modList()->allMods()); // some widgets need to do more than just save() and have their own handler connect(ui->binary, &QLineEdit::textChanged, [&]{ save(); }); @@ -106,6 +103,37 @@ const ForcedLibraries& EditExecutablesDialog::getForcedLibraries() const return m_forcedLibraries; } +void EditExecutablesDialog::commitChanges() +{ + const auto newExecutables = getExecutablesList(); + auto* profile = m_organizerCore.currentProfile(); + + // remove all the custom overwrites and forced libraries + for (const auto& e : m_originalExecutables) { + profile->removeSetting("custom_overwrites", e.title()); + profile->removeForcedLibraries(e.title()); + } + + // set the new custom overwrites and forced libraries + for (const auto& e : newExecutables) { + if (auto info=m_customOverwrites.find(e.title())) { + if (info && info->enabled) { + profile->storeSetting("custom_overwrites", e.title(), info->modName); + } + } + + if (auto info=m_forcedLibraries.find(e.title())) { + if (info && info->enabled && !info->list.empty()) { + profile->setForcedLibrariesEnabled(e.title(), true); + profile->storeForcedLibraries(e.title(), info->list); + } + } + } + + // set the new executables list + m_organizerCore.setExecutablesList(newExecutables); +} + QListWidgetItem* EditExecutablesDialog::selectedItem() { const auto selection = ui->list->selectedItems(); @@ -215,23 +243,28 @@ void EditExecutablesDialog::setEdits(const Executable& e) { int modIndex = -1; - if (const auto mod=m_customOverwrites.find(e.title())) { - modIndex = ui->mods->findText(*mod); + const auto info = m_customOverwrites.find(e.title()); + + if (info && !info->modName.isEmpty()) { + modIndex = ui->mods->findText(info->modName); if (modIndex == -1) { qWarning().nospace() - << "executable '" << e.title() << "' uses mod '" << *mod << "' " + << "executable '" << e.title() << "' uses mod '" << info->modName << "' " << "as a custom overwrite, but that mod doesn't exist"; } } - ui->createFilesInMod->setChecked(modIndex != -1); - ui->mods->setEnabled(modIndex != -1); + const bool hasCustomOverwrites = (info && info->enabled); + + ui->createFilesInMod->setChecked(hasCustomOverwrites); + ui->mods->setEnabled(hasCustomOverwrites); ui->mods->setCurrentIndex(modIndex); } { - const auto hasForcedLibraries = m_forcedLibraries.find(e.title()).has_value(); + const auto info = m_forcedLibraries.find(e.title()); + const bool hasForcedLibraries = (info && info->enabled); ui->forceLoadLibraries->setChecked(hasForcedLibraries); ui->configureLibraries->setEnabled(hasForcedLibraries); @@ -269,25 +302,32 @@ void EditExecutablesDialog::save() qDebug().nospace() << "saving '" << e->title() << "'"; // title may have changed, start with the stuff using it + + // custom overwrites if (ui->createFilesInMod->isChecked()) { - m_customOverwrites.set(e->title(), ui->mods->currentText()); + m_customOverwrites.setEnabled(e->title(), true); + m_customOverwrites.setMod(e->title(), ui->mods->currentText()); } else { - m_customOverwrites.remove(e->title()); + m_customOverwrites.setEnabled(e->title(), false); } + // forced libraries + m_forcedLibraries.setEnabled(e->title(), ui->forceLoadLibraries->isChecked()); + + // get the new title, but ignore it if it's conflicting with an already + // existing executable QString newTitle = ui->title->text(); if (isTitleConflicting(newTitle)) { - // don't save conflicting titles newTitle = e->title(); } - // forced libraries are saved in on_configureLibraries_clicked() - - // now rename both the custom overwrites and forced libraries if the title - // is being changed if (e->title() != newTitle) { + // now rename both the custom overwrites and forced libraries if the title + // is being changed m_customOverwrites.rename(e->title(), newTitle); m_forcedLibraries.rename(e->title(), newTitle); + + // save the new title e->title(newTitle); } @@ -485,20 +525,21 @@ void EditExecutablesDialog::on_configureLibraries_clicked() return; } - ForcedLoadDialog dialog(m_gamePlugin, this); + ForcedLoadDialog dialog(m_organizerCore.managedGame(), this); - if (auto list=m_forcedLibraries.find(e->title())) { - dialog.setValues(*list); + if (auto info=m_forcedLibraries.find(e->title())) { + dialog.setValues(info->list); } if (dialog.exec() == QDialog::Accepted) { - m_forcedLibraries.set(e->title(), dialog.values()); + m_forcedLibraries.setList(e->title(), dialog.values()); save(); } } void EditExecutablesDialog::on_buttons_accepted() { + commitChanges(); accept(); } @@ -556,12 +597,13 @@ void CustomOverwrites::load(Profile* p, const ExecutablesList& exes) const auto s = p->setting("custom_overwrites", e.title()).toString(); if (!s.isEmpty()) { - m_map[e.title()] = s; + m_map[e.title()] = {true, s}; } } } -std::optional CustomOverwrites::find(const QString& title) const +std::optional CustomOverwrites::find( + const QString& title) const { auto itor = m_map.find(title); if (itor == m_map.end()) { @@ -571,9 +613,26 @@ std::optional CustomOverwrites::find(const QString& title) const return itor->second; } -void CustomOverwrites::set(const QString& title, const QString& mod) +void CustomOverwrites::setEnabled(const QString& title, bool b) { - m_map[title] = mod; + auto itor = m_map.find(title); + + if (itor == m_map.end()) { + m_map[title] = {b, {}}; + } else { + itor->second.enabled = b; + } +} + +void CustomOverwrites::setMod(const QString& title, const QString& mod) +{ + auto itor = m_map.find(title); + + if (itor == m_map.end()) { + m_map[title] = {true, mod}; + } else { + itor->second.modName = mod; + } } void CustomOverwrites::rename(const QString& oldTitle, const QString& newTitle) @@ -602,12 +661,13 @@ void ForcedLibraries::load(Profile* p, const ExecutablesList& exes) { for (const auto& e : exes) { if (p->forcedLibrariesEnabled(e.title())) { - m_map[e.title()] = p->determineForcedLibraries(e.title()); + m_map[e.title()] = {true, p->determineForcedLibraries(e.title())}; } } } -std::optional ForcedLibraries::find(const QString& title) const +std::optional ForcedLibraries::find( + const QString& title) const { auto itor = m_map.find(title); if (itor == m_map.end()) { @@ -617,9 +677,26 @@ std::optional ForcedLibraries::find(const QString& t return itor->second; } -void ForcedLibraries::set(const QString& title, const list_type& mod) +void ForcedLibraries::setEnabled(const QString& title, bool b) +{ + auto itor = m_map.find(title); + + if (itor == m_map.end()) { + m_map[title] = {b, {}}; + } else { + itor->second.enabled = b; + } +} + +void ForcedLibraries::setList(const QString& title, const list_type& list) { - m_map[title] = mod; + auto itor = m_map.find(title); + + if (itor == m_map.end()) { + m_map[title] = {true, list}; + } else { + itor->second.list = list; + } } void ForcedLibraries::rename(const QString& oldTitle, const QString& newTitle) diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 6e006ae2..4957ebff 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -34,7 +34,7 @@ namespace Ui { } class ModList; - +class OrganizerCore; /** helper class to manage custom overwrites within the edit executables * dialog @@ -42,15 +42,22 @@ class ModList; class CustomOverwrites { public: + struct Info + { + bool enabled; + QString modName; + }; + void load(Profile* p, const ExecutablesList& exes); - std::optional find(const QString& title) const; + std::optional find(const QString& title) const; - void set(const QString& title, const QString& mod); + void setEnabled(const QString& title, bool b); + void setMod(const QString& title, const QString& mod); void rename(const QString& oldTitle, const QString& newTitle); void remove(const QString& title); private: - std::map m_map; + std::map m_map; }; @@ -61,15 +68,22 @@ class ForcedLibraries public: using list_type = QList; + struct Info + { + bool enabled; + list_type list; + }; + void load(Profile* p, const ExecutablesList& exes); - std::optional find(const QString& title) const; + std::optional find(const QString& title) const; - void set(const QString& title, const list_type& list); + void setEnabled(const QString& title, bool b); + void setList(const QString& title, const list_type& list); void rename(const QString& oldTitle, const QString& newTitle); void remove(const QString& title); private: - std::map m_map; + std::map m_map; }; @@ -85,9 +99,7 @@ public: * @param executablesList current list of executables * @param parent parent widget **/ - explicit EditExecutablesDialog( - const ExecutablesList &executablesList, const ModList &modList, - Profile *profile, const MOBase::IPluginGame *game, QWidget *parent = 0); + explicit EditExecutablesDialog(OrganizerCore& oc, QWidget* parent=nullptr); ~EditExecutablesDialog(); @@ -115,15 +127,13 @@ private slots: private: std::unique_ptr ui; + OrganizerCore& m_organizerCore; + const ExecutablesList m_originalExecutables; ExecutablesList m_executablesList; CustomOverwrites m_customOverwrites; ForcedLibraries m_forcedLibraries; - Profile *m_profile; - const MOBase::IPluginGame *m_gamePlugin; bool m_settingUI; - QListWidgetItem *m_currentItem; - QListWidgetItem* selectedItem(); Executable* selectedExe(); @@ -137,6 +147,7 @@ private: void setJarBinary(const QString& binaryName); std::optional makeNonConflictingTitle(const QString& prefix); bool isTitleConflicting(const QString& s); + void commitChanges(); }; #endif // EDITEXECUTABLESDIALOG_H diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 05417f51..15a6eb62 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2482,13 +2482,8 @@ bool MainWindow::modifyExecutablesDialog() try { const auto oldExecutables = *m_OrganizerCore.executablesList(); - auto* profile = m_OrganizerCore.currentProfile(); - EditExecutablesDialog dialog(oldExecutables, - *m_OrganizerCore.modList(), - profile, - m_OrganizerCore.managedGame(), - this); + EditExecutablesDialog dialog(m_OrganizerCore, this); QSettings &settings = m_OrganizerCore.settings().directInterface(); QString key = QString("geometry/%1").arg(dialog.objectName()); @@ -2497,34 +2492,7 @@ bool MainWindow::modifyExecutablesDialog() dialog.restoreGeometry(settings.value(key).toByteArray()); } - if (dialog.exec() == QDialog::Accepted) { - const auto newExecutables = dialog.getExecutablesList(); - - // remove all the custom overwrites and forced libraries - for (const auto& e : oldExecutables) { - profile->removeSetting("custom_overwrites", e.title()); - profile->removeForcedLibraries(e.title()); - } - - // set the new custom overwrites and forced libraries - for (const auto& e : newExecutables) { - if (auto modName=dialog.getCustomOverwrites().find(e.title())) { - profile->storeSetting("custom_overwrites", e.title(), *modName); - } - - if (auto list=dialog.getForcedLibraries().find(e.title())) { - if (!list->empty()) { - profile->setForcedLibrariesEnabled(e.title(), true); - profile->storeForcedLibraries(e.title(), *list); - } - } - } - - // set the new executables list - m_OrganizerCore.setExecutablesList(newExecutables); - - result = true; - } + result = (dialog.exec() == QDialog::Accepted); settings.setValue(key, dialog.saveGeometry()); refreshExecutablesList(); -- cgit v1.3.1 From 98d5602c9951b49f8033161d8497553293070f8f Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 9 Jun 2019 11:53:20 -0400 Subject: adjusted the position of the "(*) Profile Specific" label comments --- src/editexecutablesdialog.cpp | 3 +++ src/editexecutablesdialog.ui | 3 +++ 2 files changed, 6 insertions(+) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index cb6ec6e8..96f4660a 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -485,12 +485,15 @@ void EditExecutablesDialog::on_browseBinary_clicked() return; } + // setting binary if (binaryName.endsWith(".jar", Qt::CaseInsensitive)) { + // special case for jar files, uses the system java installation setJarBinary(binaryName); } else { ui->binary->setText(QDir::toNativeSeparators(binaryName)); } + // setting title if currently empty if (ui->title->text().isEmpty()) { const auto prefix = QFileInfo(binaryName).baseName(); const auto newTitle = makeNonConflictingTitle(prefix); diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index 6cb8e0b8..7a5fa27f 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -359,6 +359,9 @@ Right now the only case I know of where this needs to be overwritten is for the (*) Profile Specific + + 5 + -- cgit v1.3.1 From 5fa7fd7fb9f3a8f67e8842420d7a2ad600722119 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 9 Jun 2019 17:05:51 -0400 Subject: moved add/remove to the top, changed them to tool buttons with icons, added up/down buttons --- src/editexecutablesdialog.cpp | 48 +++++++++++++++++++++++++ src/editexecutablesdialog.h | 3 ++ src/editexecutablesdialog.ui | 84 +++++++++++++++++++++++++------------------ 3 files changed, 101 insertions(+), 34 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 96f4660a..9747a86f 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -348,6 +348,44 @@ void EditExecutablesDialog::save() } } +void EditExecutablesDialog::moveSelection(int by) +{ + auto* item = selectedItem(); + if (!item) { + return; + } + + // moving down the list + while (by > 0) { + const auto row = ui->list->row(item); + + if (row >= (ui->list->count() - 1)) { + break; + } + + ui->list->takeItem(row); + ui->list->insertItem(row + 1, item); + item->setSelected(true); + + --by; + } + + // moving up the list + while (by < 0) { + const auto row = ui->list->row(item); + + if (row <= 0) { + break; + } + + ui->list->takeItem(row); + ui->list->insertItem(row - 1, item); + item->setSelected(true); + + ++by; + } +} + void EditExecutablesDialog::on_list_itemSelectionChanged() { updateUI(selectedExe()); @@ -408,6 +446,16 @@ void EditExecutablesDialog::on_remove_clicked() } } +void EditExecutablesDialog::on_up_clicked() +{ + moveSelection(-1); +} + +void EditExecutablesDialog::on_down_clicked() +{ + moveSelection(+1); +} + bool EditExecutablesDialog::isTitleConflicting(const QString& s) { for (const auto& exe : m_executablesList) { diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 4957ebff..80ec56df 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -112,6 +112,8 @@ private slots: void on_add_clicked(); void on_remove_clicked(); + void on_up_clicked(); + void on_down_clicked(); void on_title_textChanged(const QString& s); void on_overwriteSteamAppID_toggled(bool checked); @@ -144,6 +146,7 @@ private: void clearEdits(); void setEdits(const Executable& e); void save(); + void moveSelection(int by); void setJarBinary(const QString& binaryName); std::optional makeNonConflictingTitle(const QString& prefix); bool isTitleConflicting(const QString& s); diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index e85256c8..9801a75c 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -57,24 +57,15 @@ 0 - - - - List of configured executables - - - This is a list of your configured executables. Executables in grey are automatically recognised and can not be modified. - - - QAbstractItemView::InternalMove - - - Qt::TargetMoveAction - - - + + + + Executables + + + @@ -89,7 +80,7 @@ - + Add an executable @@ -100,13 +91,13 @@ Add - - :/new/guiresources/resources/list-add.png:/new/guiresources/resources/list-add.png + + :/MO/gui/add:/MO/gui/add - + Remove the selected executable @@ -117,26 +108,51 @@ Remove - - :/new/guiresources/resources/list-remove.png:/new/guiresources/resources/list-remove.png + + :/MO/gui/resources/list-remove.png:/MO/gui/resources/list-remove.png - - - Qt::Horizontal + + + Move the executable up in the list - - - 40 - 20 - + + + :/MO/gui/resources/go-up.png:/MO/gui/resources/go-up.png - + + + + + + Move the executable down in the list + + + + :/MO/gui/resources/go-down.png:/MO/gui/resources/go-down.png + + + + + + List of configured executables + + + This is a list of your configured executables. Executables in grey are automatically recognised and can not be modified. + + + QAbstractItemView::InternalMove + + + Qt::TargetMoveAction + + + @@ -420,9 +436,9 @@ Right now the only case I know of where this needs to be overwritten is for the steamAppID createFilesInMod mods - add - remove - + + + -- cgit v1.3.1 From c8e1b4ab3a51cfe0f39a6f0d78cf0988c380549c Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 9 Jun 2019 17:43:10 -0400 Subject: changed the down/up pngs to be slightly offset vertically from what they were, they did not look aligned when next to each other added status/tooltip/whatsthis strings to new buttons change enabled status of up/down dynamically simplified move() to just move by one --- src/editexecutablesdialog.cpp | 87 ++++++++++++++++++++++++++---------------- src/editexecutablesdialog.h | 6 ++- src/editexecutablesdialog.ui | 24 ++++++++++++ src/resources/go-down.png | Bin 874 -> 937 bytes src/resources/go-up.png | Bin 877 -> 974 bytes 5 files changed, 82 insertions(+), 35 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 9747a86f..e2772757 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -64,7 +64,7 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent) if (ui->list->count() > 0) { ui->list->item(0)->setSelected(true); } else { - updateUI(nullptr); + updateUI(nullptr, nullptr); } } @@ -184,23 +184,40 @@ QListWidgetItem* EditExecutablesDialog::createListItem(const Executable& exe) return newItem; } -void EditExecutablesDialog::updateUI(const Executable* e) +void EditExecutablesDialog::updateUI( + const QListWidgetItem* item, const Executable* e) { // the ui is currently being set, ignore changes m_settingUI = true; if (e) { setEdits(*e); - ui->remove->setEnabled(e->isCustom()); } else { clearEdits(); - ui->remove->setEnabled(false); } + setButtons(item, e); + // any changes from now on are from the user m_settingUI = false; } +void EditExecutablesDialog::setButtons( + const QListWidgetItem* item, const Executable* e) +{ + // add is always enabled + + if (item) { + ui->remove->setEnabled(e->isCustom()); + ui->up->setEnabled(canMove(item, -1)); + ui->down->setEnabled(canMove(item, +1)); + } else { + ui->remove->setEnabled(false); + ui->up->setEnabled(false); + ui->down->setEnabled(false); + } +} + void EditExecutablesDialog::clearEdits() { ui->title->clear(); @@ -348,47 +365,41 @@ void EditExecutablesDialog::save() } } -void EditExecutablesDialog::moveSelection(int by) +bool EditExecutablesDialog::canMove(const QListWidgetItem* item, int direction) { - auto* item = selectedItem(); if (!item) { - return; + return false; } - // moving down the list - while (by > 0) { - const auto row = ui->list->row(item); + if (direction < 0) { + // moving up + return (ui->list->row(item) > 0); - if (row >= (ui->list->count() - 1)) { - break; - } - - ui->list->takeItem(row); - ui->list->insertItem(row + 1, item); - item->setSelected(true); - - --by; + } else if (direction > 0) { + // moving down + return (ui->list->row(item) < (ui->list->count() - 1)); } - // moving up the list - while (by < 0) { - const auto row = ui->list->row(item); + return false; +} - if (row <= 0) { - break; - } +void EditExecutablesDialog::move(QListWidgetItem* item, int direction) +{ + if (!canMove(item, direction)) { + return; + } - ui->list->takeItem(row); - ui->list->insertItem(row - 1, item); - item->setSelected(true); + const auto row = ui->list->row(item); - ++by; - } + // removing item + ui->list->takeItem(row); + ui->list->insertItem(row + (direction > 0 ? 1 : -1), item); + item->setSelected(true); } void EditExecutablesDialog::on_list_itemSelectionChanged() { - updateUI(selectedExe()); + updateUI(selectedItem(), selectedExe()); } void EditExecutablesDialog::on_add_clicked() @@ -448,12 +459,22 @@ void EditExecutablesDialog::on_remove_clicked() void EditExecutablesDialog::on_up_clicked() { - moveSelection(-1); + auto* item = selectedItem(); + if (!item) { + return; + } + + move(item, -1); } void EditExecutablesDialog::on_down_clicked() { - moveSelection(+1); + auto* item = selectedItem(); + if (!item) { + return; + } + + move(item, +1); } bool EditExecutablesDialog::isTitleConflicting(const QString& s) diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 80ec56df..10a6166f 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -142,11 +142,13 @@ private: void fillExecutableList(); QListWidgetItem* createListItem(const Executable& exe); - void updateUI(const Executable* e); + void updateUI(const QListWidgetItem* item, const Executable* e); void clearEdits(); void setEdits(const Executable& e); + void setButtons(const QListWidgetItem* item, const Executable* e); void save(); - void moveSelection(int by); + bool canMove(const QListWidgetItem* item, int direction); + void move(QListWidgetItem* item, int direction); void setJarBinary(const QString& binaryName); std::optional makeNonConflictingTitle(const QString& prefix); bool isTitleConflicting(const QString& s); diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index 9801a75c..fb65dbbe 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -84,6 +84,9 @@ Add an executable + + Add an executable + Add an executable @@ -101,6 +104,9 @@ Remove the selected executable + + Remove the selected executable + Remove the selected executable @@ -115,6 +121,15 @@ + + Move the executable up in the list + + + Move the executable up in the list + + + Move the executable up in the list + Move the executable up in the list @@ -126,6 +141,15 @@ + + Move the executable down in the list + + + Move the executable down in the list + + + Move the executable down in the list + Move the executable down in the list diff --git a/src/resources/go-down.png b/src/resources/go-down.png index af237881..bf0ce4fd 100644 Binary files a/src/resources/go-down.png and b/src/resources/go-down.png differ diff --git a/src/resources/go-up.png b/src/resources/go-up.png index b0a0cd72..a4b4e022 100644 Binary files a/src/resources/go-up.png and b/src/resources/go-up.png differ -- cgit v1.3.1 From 82975a6a38d0807e962b0e4b6cbd76337dc8189c Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Wed, 12 Jun 2019 15:32:07 -0400 Subject: reduced spacing between buttons, removed chatty logging --- src/editexecutablesdialog.cpp | 2 -- src/editexecutablesdialog.ui | 6 ++++++ 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index e2772757..6c0522e4 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -316,8 +316,6 @@ void EditExecutablesDialog::save() return; } - qDebug().nospace() << "saving '" << e->title() << "'"; - // title may have changed, start with the stuff using it // custom overwrites diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index 83d81225..9b6c8153 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -48,6 +48,9 @@ + + 3 + 0 @@ -62,6 +65,9 @@ + + 0 + -- cgit v1.3.1 From 7671725436551b7254ea89ff6985c5491fcc743d Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 14 Jun 2019 04:30:33 -0400 Subject: removed concept of custom executables, everything is modifiable added apply button to dialog added reset button that re-adds plugin executables and renames existing ones if needed moved executables files to their filter in visual studio --- src/CMakeLists.txt | 11 +-- src/editexecutablesdialog.cpp | 143 ++++++++++++++++++++------------------ src/editexecutablesdialog.h | 9 +-- src/editexecutablesdialog.ui | 37 +++++----- src/executableslist.cpp | 156 ++++++++++++++++++++++++------------------ src/executableslist.h | 24 +++++-- src/mainwindow.cpp | 3 +- src/pch.h | 1 + 8 files changed, 221 insertions(+), 163 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5623a851..645a5a73 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -293,7 +293,6 @@ set(core categories shared/directoryentry directoryrefresher - executableslist installationmanager instancemanager loadmechanism @@ -309,7 +308,6 @@ set(dialogs activatemodsdialog categoriesdialog credentialsdialog - editexecutablesdialog filedialogmemory forcedloaddialog forcedloaddialogwidget @@ -333,6 +331,11 @@ set(downloads downloadmanager ) +set(executables + executableslist + editexecutablesdialog +) + set(locking ilockedwaitingforprocess lockeddialog @@ -412,8 +415,8 @@ set(widgets ) set(src_filters - application core browser dialogs downloads locking modinfo modlist plugins - previews profiles settings utilities widgets + application core browser dialogs downloads executables locking modinfo + modlist plugins previews profiles settings utilities widgets ) foreach(filter in list ${src_filters}) diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 6c0522e4..882bb8b5 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -49,8 +49,9 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent) m_customOverwrites.load(m_organizerCore.currentProfile(), m_executablesList); m_forcedLibraries.load(m_organizerCore.currentProfile(), m_executablesList); - fillExecutableList(); + fillList(); ui->mods->addItems(m_organizerCore.modList()->allMods()); + setDirty(false); // some widgets need to do more than just save() and have their own handler connect(ui->binary, &QLineEdit::textChanged, [&]{ save(); }); @@ -59,13 +60,7 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent) connect(ui->steamAppID, &QLineEdit::textChanged, [&]{ save(); }); connect(ui->mods, &QComboBox::currentTextChanged, [&]{ save(); }); connect(ui->useApplicationIcon, &QCheckBox::toggled, [&]{ save(); }); - - // select the first one in the list, if any - if (ui->list->count() > 0) { - ui->list->item(0)->setSelected(true); - } else { - updateUI(nullptr, nullptr); - } + connect(ui->list->model(), &QAbstractItemModel::rowsMoved, [&]{ saveOrder(); }); } EditExecutablesDialog::~EditExecutablesDialog() = default; @@ -132,6 +127,15 @@ void EditExecutablesDialog::commitChanges() // set the new executables list m_organizerCore.setExecutablesList(newExecutables); + + setDirty(false); +} + +void EditExecutablesDialog::setDirty(bool b) +{ + if (auto* button=ui->buttons->button(QDialogButtonBox::Apply)) { + button->setEnabled(b); + } } QListWidgetItem* EditExecutablesDialog::selectedItem() @@ -162,26 +166,25 @@ Executable* EditExecutablesDialog::selectedExe() return &*itor; } -void EditExecutablesDialog::fillExecutableList() +void EditExecutablesDialog::fillList() { ui->list->clear(); for(const auto& exe : m_executablesList) { ui->list->addItem(createListItem(exe)); } + + // select the first one in the list, if any + if (ui->list->count() > 0) { + ui->list->item(0)->setSelected(true); + } else { + updateUI(nullptr, nullptr); + } } QListWidgetItem* EditExecutablesDialog::createListItem(const Executable& exe) { - QListWidgetItem *newItem = new QListWidgetItem(exe.title()); - - if (!exe.isCustom()) { - auto f = newItem->font(); - f.setItalic(true); - newItem->setFont(f); - } - - return newItem; + return new QListWidgetItem(exe.title()); } void EditExecutablesDialog::updateUI( @@ -205,14 +208,12 @@ void EditExecutablesDialog::updateUI( void EditExecutablesDialog::setButtons( const QListWidgetItem* item, const Executable* e) { - // add is always enabled + // add and remove are always enabled if (item) { - ui->remove->setEnabled(e->isCustom()); ui->up->setEnabled(canMove(item, -1)); ui->down->setEnabled(canMove(item, +1)); } else { - ui->remove->setEnabled(false); ui->up->setEnabled(false); ui->down->setEnabled(false); } @@ -243,7 +244,6 @@ void EditExecutablesDialog::clearEdits() ui->configureLibraries->setEnabled(false); ui->useApplicationIcon->setEnabled(false); ui->useApplicationIcon->setChecked(false); - ui->pluginProvidedLabel->setVisible(false); } void EditExecutablesDialog::setEdits(const Executable& e) @@ -287,19 +287,15 @@ void EditExecutablesDialog::setEdits(const Executable& e) ui->configureLibraries->setEnabled(hasForcedLibraries); } - ui->pluginProvidedLabel->setVisible(!e.isCustom()); - - // only enabled for custom executables - ui->title->setEnabled(e.isCustom()); - ui->binary->setEnabled(e.isCustom()); - ui->browseBinary->setEnabled(e.isCustom()); - ui->workingDirectory->setEnabled(e.isCustom()); - ui->browseWorkingDirectory->setEnabled(e.isCustom()); - ui->arguments->setEnabled(e.isCustom()); - ui->overwriteSteamAppID->setEnabled(e.isCustom()); - ui->useApplicationIcon->setEnabled(e.isCustom()); - // always enabled + ui->title->setEnabled(true); + ui->binary->setEnabled(true); + ui->browseBinary->setEnabled(true); + ui->workingDirectory->setEnabled(true); + ui->browseWorkingDirectory->setEnabled(true); + ui->arguments->setEnabled(true); + ui->overwriteSteamAppID->setEnabled(true); + ui->useApplicationIcon->setEnabled(true); ui->createFilesInMod->setEnabled(true); ui->forceLoadLibraries->setEnabled(true); } @@ -361,6 +357,14 @@ void EditExecutablesDialog::save() } else { e->flags(e->flags() & (~Executable::UseApplicationIcon)); } + + setDirty(true); +} + +void EditExecutablesDialog::saveOrder() +{ + m_executablesList = getExecutablesList(); + setDirty(true); } bool EditExecutablesDialog::canMove(const QListWidgetItem* item, int direction) @@ -393,6 +397,8 @@ void EditExecutablesDialog::move(QListWidgetItem* item, int direction) ui->list->takeItem(row); ui->list->insertItem(row + (direction > 0 ? 1 : -1), item); item->setSelected(true); + + setDirty(true); } void EditExecutablesDialog::on_list_itemSelectionChanged() @@ -400,22 +406,43 @@ void EditExecutablesDialog::on_list_itemSelectionChanged() updateUI(selectedItem(), selectedExe()); } +void EditExecutablesDialog::on_reset_clicked() +{ + const auto title = tr("Reset plugin executables"); + + const auto text = tr( + "This will restore all the executables provided by the game plugin. If " + "there are existing executables with the same names, they will be " + "automatically renamed and left unchanged."); + + const auto buttons = QMessageBox::Ok | QMessageBox::Cancel; + + if (QMessageBox::question(this, title, text, buttons) != QMessageBox::Ok) { + return; + } + + m_executablesList.resetFromPlugin(m_organizerCore.managedGame()); + fillList(); + + setDirty(true); +} + void EditExecutablesDialog::on_add_clicked() { - auto title = makeNonConflictingTitle(tr("New Executable")); + auto title = m_executablesList.makeNonConflictingTitle(tr("New Executable")); if (!title) { return; } - auto e = Executable() - .title(*title) - .flags(Executable::CustomExecutable); + const Executable e(*title); m_executablesList.setExecutable(e); auto* item = createListItem(e); ui->list->addItem(item); item->setSelected(true); + + setDirty(true); } void EditExecutablesDialog::on_remove_clicked() @@ -453,6 +480,8 @@ void EditExecutablesDialog::on_remove_clicked() } else { ui->list->item(currentRow)->setSelected(true); } + + setDirty(true); } void EditExecutablesDialog::on_up_clicked() @@ -563,7 +592,7 @@ void EditExecutablesDialog::on_browseBinary_clicked() // setting title if currently empty if (ui->title->text().isEmpty()) { const auto prefix = QFileInfo(binaryName).baseName(); - const auto newTitle = makeNonConflictingTitle(prefix); + const auto newTitle = m_executablesList.makeNonConflictingTitle(prefix); if (newTitle) { ui->title->setText(*newTitle); @@ -607,15 +636,16 @@ void EditExecutablesDialog::on_configureLibraries_clicked() } } -void EditExecutablesDialog::on_buttons_accepted() +void EditExecutablesDialog::on_buttons_clicked(QAbstractButton* b) { - commitChanges(); - accept(); -} - -void EditExecutablesDialog::on_buttons_rejected() -{ - reject(); + if (b == ui->buttons->button(QDialogButtonBox::Ok)) { + commitChanges(); + accept(); + } else if (b == ui->buttons->button(QDialogButtonBox::Apply)) { + commitChanges(); + } else { + reject(); + } } void EditExecutablesDialog::setJarBinary(const QString& binaryName) @@ -641,25 +671,6 @@ void EditExecutablesDialog::setJarBinary(const QString& binaryName) save(); } -std::optional EditExecutablesDialog::makeNonConflictingTitle( - const QString& prefix) -{ - QString title = prefix; - - for (int i=1; i<100; ++i) { - if (!m_executablesList.titleExists(title)) { - return title; - } - - title = prefix + QString(" (%1)").arg(i); - } - - qCritical().nospace() - << "ran out of executable titles for prefix '" << prefix << "'"; - - return {}; -} - void CustomOverwrites::load(Profile* p, const ExecutablesList& exes) { diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 10a6166f..4a04ef42 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -110,6 +110,7 @@ public: private slots: void on_list_itemSelectionChanged(); + void on_reset_clicked(); void on_add_clicked(); void on_remove_clicked(); void on_up_clicked(); @@ -124,8 +125,7 @@ private slots: void on_browseWorkingDirectory_clicked(); void on_configureLibraries_clicked(); - void on_buttons_accepted(); - void on_buttons_rejected(); + void on_buttons_clicked(QAbstractButton* b); private: std::unique_ptr ui; @@ -140,19 +140,20 @@ private: QListWidgetItem* selectedItem(); Executable* selectedExe(); - void fillExecutableList(); + void fillList(); QListWidgetItem* createListItem(const Executable& exe); void updateUI(const QListWidgetItem* item, const Executable* e); void clearEdits(); void setEdits(const Executable& e); void setButtons(const QListWidgetItem* item, const Executable* e); void save(); + void saveOrder(); bool canMove(const QListWidgetItem* item, int direction); void move(QListWidgetItem* item, int direction); void setJarBinary(const QString& binaryName); - std::optional makeNonConflictingTitle(const QString& prefix); bool isTitleConflicting(const QString& s); void commitChanges(); + void setDirty(bool b); }; #endif // EDITEXECUTABLESDIALOG_H diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui index 9b6c8153..a42dbeed 100644 --- a/src/editexecutablesdialog.ui +++ b/src/editexecutablesdialog.ui @@ -168,6 +168,26 @@ + + + + Adds the executables provided by the game plugin and moves any existing executables out of the way + + + Adds the executables provided by the game plugin and moves any existing executables out of the way + + + Adds the executables provided by the game plugin and moves any existing executables out of the way + + + Reset + + + + :/MO/gui/edit_clear:/MO/gui/edit_clear + + + @@ -425,21 +445,6 @@ Right now the only case I know of where this needs to be overwritten is for the - - - - - true - - - - This executable is provided by the game plugin - - - Qt::AlignCenter - - - @@ -463,7 +468,7 @@ Right now the only case I know of where this needs to be overwritten is for the - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/src/executableslist.cpp b/src/executableslist.cpp index 0283a845..daf200a6 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -74,8 +74,6 @@ void ExecutablesList::load(const MOBase::IPluginGame* game, QSettings& settings) settings.setArrayIndex(i); Executable::Flags flags; - if (settings.value("custom", true).toBool()) - flags |= Executable::CustomExecutable; if (settings.value("toolbar", false).toBool()) flags |= Executable::ShowInToolbar; if (settings.value("ownicon", false).toBool()) @@ -92,7 +90,7 @@ void ExecutablesList::load(const MOBase::IPluginGame* game, QSettings& settings) settings.endArray(); - addFromPlugin(game); + addFromPlugin(game, IgnoreExisting); } void ExecutablesList::store(QSettings& settings) @@ -106,29 +104,33 @@ void ExecutablesList::store(QSettings& settings) settings.setArrayIndex(count++); settings.setValue("title", item.title()); - settings.setValue("custom", item.isCustom()); settings.setValue("toolbar", item.isShownOnToolbar()); settings.setValue("ownicon", item.usesOwnIcon()); - - if (item.isCustom()) { - settings.setValue("binary", item.binaryInfo().absoluteFilePath()); - settings.setValue("arguments", item.arguments()); - settings.setValue("workingDirectory", item.workingDirectory()); - settings.setValue("steamAppID", item.steamAppID()); - } + settings.setValue("binary", item.binaryInfo().absoluteFilePath()); + settings.setValue("arguments", item.arguments()); + settings.setValue("workingDirectory", item.workingDirectory()); + settings.setValue("steamAppID", item.steamAppID()); } settings.endArray(); } -void ExecutablesList::addFromPlugin(IPluginGame const *game) +void ExecutablesList::resetFromPlugin(MOBase::IPluginGame const *game) +{ + qDebug("resetting plugin executables"); + addFromPlugin(game, MoveExisting); +} + +void ExecutablesList::addFromPlugin(IPluginGame const *game, SetFlags flags) { Q_ASSERT(game != nullptr); for (const ExecutableInfo &info : game->executables()) { - if (info.isValid()) { - setExecutable({info, Executable::UseApplicationIcon}); + if (!info.isValid()) { + continue; } + + setExecutable({info, Executable::UseApplicationIcon}, flags); } const QFileInfo eppBin(QCoreApplication::applicationDirPath() + "/explorer++/Explorer++.exe"); @@ -137,12 +139,14 @@ void ExecutablesList::addFromPlugin(IPluginGame const *game) const auto args = QString("\"%1\"") .arg(QDir::toNativeSeparators(game->dataDirectory().absolutePath())); - setExecutable(Executable() + const auto exe = Executable() .title("Explore Virtual Folder") .binaryInfo(eppBin) .arguments(args) .workingDirectory(eppBin.absolutePath()) - .flags(Executable::UseApplicationIcon)); + .flags(Executable::UseApplicationIcon); + + setExecutable(exe, flags); } } @@ -188,28 +192,81 @@ bool ExecutablesList::titleExists(const QString &title) const return std::find_if(m_Executables.begin(), m_Executables.end(), test) != m_Executables.end(); } -void ExecutablesList::setExecutable(const Executable &executable) +void ExecutablesList::setExecutable(const Executable &exe) +{ + setExecutable(exe, MergeExisting); +} + +void ExecutablesList::setExecutable(const Executable &exe, SetFlags flags) { - auto itor = find(executable.title()); + auto itor = find(exe.title()); + + if (itor != end()) { + if (flags == IgnoreExisting) { + return; + } + + if (flags == MoveExisting) { + const auto newTitle = makeNonConflictingTitle(exe.title()); + if (!newTitle) { + qCritical().nospace() + << "executable '" << exe.title() << "' was in the way but could " + << "not be renamed"; + + return; + } + + qWarning().nospace() + << "executable '" << itor->title() << "' was in the way and was " + << "renamed to '" << *newTitle << "'"; + + itor->title(*newTitle); + itor = end(); + } + } if (itor == m_Executables.end()) { - m_Executables.push_back(executable); + m_Executables.push_back(exe); } else { - itor->mergeFrom(executable); + itor->mergeFrom(exe); } } void ExecutablesList::remove(const QString &title) { - for (std::vector::iterator iter = m_Executables.begin(); iter != m_Executables.end(); ++iter) { - if (iter->isCustom() && (iter->title() == title)) { - m_Executables.erase(iter); - break; + auto itor = find(title); + if (itor != m_Executables.end()) { + m_Executables.erase(itor); + } +} + +std::optional ExecutablesList::makeNonConflictingTitle( + const QString& prefix) +{ + const int max = 100; + + QString title = prefix; + + for (int i=1; i. #include "executableinfo.h" #include +#include #include #include @@ -37,14 +38,13 @@ class Executable public: enum Flag { - CustomExecutable = 0x01, ShowInToolbar = 0x02, UseApplicationIcon = 0x04 }; Q_DECLARE_FLAGS(Flags, Flag); - Executable() = default; + Executable(QString title={}); /** * @brief Executable from plugin @@ -65,7 +65,6 @@ public: Executable& workingDirectory(const QString& s); Executable& flags(Flags f); - bool isCustom() const; bool isShownOnToolbar() const; void setShownOnToolbar(bool state); bool usesOwnIcon() const; @@ -106,6 +105,8 @@ public: */ void load(const MOBase::IPluginGame* game, QSettings& settings); + void resetFromPlugin(MOBase::IPluginGame const *game); + /** * @brief writes the current list to the settings */ @@ -166,13 +167,28 @@ public: **/ void remove(const QString &title); + std::optional makeNonConflictingTitle(const QString& prefix); + private: + enum SetFlags + { + IgnoreExisting = 1, + MergeExisting, + MoveExisting + }; + std::vector m_Executables; /** * @brief add the executables preconfigured for this game **/ - void addFromPlugin(MOBase::IPluginGame const *game); + void addFromPlugin(MOBase::IPluginGame const *game, SetFlags flags); + + /** + * @brief add a new executable to the list + * @param executable + */ + void setExecutable(const Executable &exe, SetFlags flags); }; Q_DECLARE_OPERATORS_FOR_FLAGS(Executable::Flags) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 15a6eb62..b5e9c320 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -5513,8 +5513,7 @@ void MainWindow::addAsExecutable() .title(name) .binaryInfo(binaryInfo) .arguments(arguments) - .workingDirectory(targetInfo.absolutePath()) - .flags(Executable::CustomExecutable)); + .workingDirectory(targetInfo.absolutePath())); refreshExecutablesList(); } diff --git a/src/pch.h b/src/pch.h index e86c0da6..1d8df43a 100644 --- a/src/pch.h +++ b/src/pch.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include -- cgit v1.3.1 From 5ca4ea500439bdeee85ca2103374618f2608808d Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 14 Jun 2019 19:13:28 -0400 Subject: merged CustomOverwrites and ForcedLibraries, they were mostly identical some comments --- src/editexecutablesdialog.cpp | 202 ++++++++++-------------------------------- src/editexecutablesdialog.h | 131 ++++++++++++++++++++------- src/executableslist.h | 16 +++- src/profile.cpp | 4 +- src/profile.h | 4 +- 5 files changed, 165 insertions(+), 192 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 882bb8b5..8929d207 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -46,11 +46,11 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent) ui->splitter->setStretchFactor(0, 0); ui->splitter->setStretchFactor(1, 1); - m_customOverwrites.load(m_organizerCore.currentProfile(), m_executablesList); - m_forcedLibraries.load(m_organizerCore.currentProfile(), m_executablesList); + loadCustomOverwrites(); + loadForcedLibraries(); - fillList(); ui->mods->addItems(m_organizerCore.modList()->allMods()); + fillList(); setDirty(false); // some widgets need to do more than just save() and have their own handler @@ -65,6 +65,31 @@ EditExecutablesDialog::EditExecutablesDialog(OrganizerCore& oc, QWidget* parent) EditExecutablesDialog::~EditExecutablesDialog() = default; + +void EditExecutablesDialog::loadCustomOverwrites() +{ + const auto* p = m_organizerCore.currentProfile(); + + for (const auto& e : m_executablesList) { + const auto s = p->setting("custom_overwrites", e.title()).toString(); + + if (!s.isEmpty()) { + m_customOverwrites.set(e.title(), true, s); + } + } +} + +void EditExecutablesDialog::loadForcedLibraries() +{ + const auto* p = m_organizerCore.currentProfile(); + + for (const auto& e : m_executablesList) { + if (p->forcedLibrariesEnabled(e.title())) { + m_forcedLibraries.set(e.title(), true, p->determineForcedLibraries(e.title())); + } + } +} + ExecutablesList EditExecutablesDialog::getExecutablesList() const { ExecutablesList newList; @@ -88,12 +113,14 @@ ExecutablesList EditExecutablesDialog::getExecutablesList() const return newList; } -const CustomOverwrites& EditExecutablesDialog::getCustomOverwrites() const +const EditExecutablesDialog::CustomOverwrites& +EditExecutablesDialog::getCustomOverwrites() const { return m_customOverwrites; } -const ForcedLibraries& EditExecutablesDialog::getForcedLibraries() const +const EditExecutablesDialog::ForcedLibraries& +EditExecutablesDialog::getForcedLibraries() const { return m_forcedLibraries; } @@ -111,16 +138,16 @@ void EditExecutablesDialog::commitChanges() // set the new custom overwrites and forced libraries for (const auto& e : newExecutables) { - if (auto info=m_customOverwrites.find(e.title())) { - if (info && info->enabled) { - profile->storeSetting("custom_overwrites", e.title(), info->modName); + if (auto modName=m_customOverwrites.find(e.title())) { + if (modName && modName->enabled) { + profile->storeSetting("custom_overwrites", e.title(), modName->value); } } - if (auto info=m_forcedLibraries.find(e.title())) { - if (info && info->enabled && !info->list.empty()) { + if (auto libraryList=m_forcedLibraries.find(e.title())) { + if (libraryList && libraryList->enabled && !libraryList->value.empty()) { profile->setForcedLibrariesEnabled(e.title(), true); - profile->storeForcedLibraries(e.title(), info->list); + profile->storeForcedLibraries(e.title(), libraryList->value); } } } @@ -260,19 +287,19 @@ void EditExecutablesDialog::setEdits(const Executable& e) { int modIndex = -1; - const auto info = m_customOverwrites.find(e.title()); + const auto modName = m_customOverwrites.find(e.title()); - if (info && !info->modName.isEmpty()) { - modIndex = ui->mods->findText(info->modName); + if (modName && !modName->value.isEmpty()) { + modIndex = ui->mods->findText(modName->value); if (modIndex == -1) { qWarning().nospace() - << "executable '" << e.title() << "' uses mod '" << info->modName << "' " + << "executable '" << e.title() << "' uses mod '" << modName->value << "' " << "as a custom overwrite, but that mod doesn't exist"; } } - const bool hasCustomOverwrites = (info && info->enabled); + const bool hasCustomOverwrites = (modName && modName->enabled); ui->createFilesInMod->setChecked(hasCustomOverwrites); ui->mods->setEnabled(hasCustomOverwrites); @@ -280,8 +307,8 @@ void EditExecutablesDialog::setEdits(const Executable& e) } { - const auto info = m_forcedLibraries.find(e.title()); - const bool hasForcedLibraries = (info && info->enabled); + const auto libraryList = m_forcedLibraries.find(e.title()); + const bool hasForcedLibraries = (libraryList && libraryList->enabled); ui->forceLoadLibraries->setChecked(hasForcedLibraries); ui->configureLibraries->setEnabled(hasForcedLibraries); @@ -316,8 +343,7 @@ void EditExecutablesDialog::save() // custom overwrites if (ui->createFilesInMod->isChecked()) { - m_customOverwrites.setEnabled(e->title(), true); - m_customOverwrites.setMod(e->title(), ui->mods->currentText()); + m_customOverwrites.set(e->title(), true, ui->mods->currentText()); } else { m_customOverwrites.setEnabled(e->title(), false); } @@ -626,12 +652,12 @@ void EditExecutablesDialog::on_configureLibraries_clicked() ForcedLoadDialog dialog(m_organizerCore.managedGame(), this); - if (auto info=m_forcedLibraries.find(e->title())) { - dialog.setValues(info->list); + if (auto libraryList=m_forcedLibraries.find(e->title())) { + dialog.setValues(libraryList->value); } if (dialog.exec() == QDialog::Accepted) { - m_forcedLibraries.setList(e->title(), dialog.values()); + m_forcedLibraries.setValue(e->title(), dialog.values()); save(); } } @@ -670,133 +696,3 @@ void EditExecutablesDialog::setJarBinary(const QString& binaryName) save(); } - - -void CustomOverwrites::load(Profile* p, const ExecutablesList& exes) -{ - for (const auto& e : exes) { - const auto s = p->setting("custom_overwrites", e.title()).toString(); - - if (!s.isEmpty()) { - m_map[e.title()] = {true, s}; - } - } -} - -std::optional CustomOverwrites::find( - const QString& title) const -{ - auto itor = m_map.find(title); - if (itor == m_map.end()) { - return {}; - } - - return itor->second; -} - -void CustomOverwrites::setEnabled(const QString& title, bool b) -{ - auto itor = m_map.find(title); - - if (itor == m_map.end()) { - m_map[title] = {b, {}}; - } else { - itor->second.enabled = b; - } -} - -void CustomOverwrites::setMod(const QString& title, const QString& mod) -{ - auto itor = m_map.find(title); - - if (itor == m_map.end()) { - m_map[title] = {true, mod}; - } else { - itor->second.modName = mod; - } -} - -void CustomOverwrites::rename(const QString& oldTitle, const QString& newTitle) -{ - auto itor = m_map.find(oldTitle); - if (itor == m_map.end()) { - return; - } - - // copy to new title, erase old - m_map[newTitle] = itor->second; - m_map.erase(itor); -} - -void CustomOverwrites::remove(const QString& title) -{ - auto itor = m_map.find(title); - - if (itor != m_map.end()) { - m_map.erase(itor); - } -} - - -void ForcedLibraries::load(Profile* p, const ExecutablesList& exes) -{ - for (const auto& e : exes) { - if (p->forcedLibrariesEnabled(e.title())) { - m_map[e.title()] = {true, p->determineForcedLibraries(e.title())}; - } - } -} - -std::optional ForcedLibraries::find( - const QString& title) const -{ - auto itor = m_map.find(title); - if (itor == m_map.end()) { - return {}; - } - - return itor->second; -} - -void ForcedLibraries::setEnabled(const QString& title, bool b) -{ - auto itor = m_map.find(title); - - if (itor == m_map.end()) { - m_map[title] = {b, {}}; - } else { - itor->second.enabled = b; - } -} - -void ForcedLibraries::setList(const QString& title, const list_type& list) -{ - auto itor = m_map.find(title); - - if (itor == m_map.end()) { - m_map[title] = {true, list}; - } else { - itor->second.list = list; - } -} - -void ForcedLibraries::rename(const QString& oldTitle, const QString& newTitle) -{ - auto itor = m_map.find(oldTitle); - if (itor == m_map.end()) { - return; - } - - // copy to new title, erase old - m_map[newTitle] = itor->second; - m_map.erase(itor); -} - -void ForcedLibraries::remove(const QString& title) -{ - auto itor = m_map.find(title); - - if (itor != m_map.end()) { - m_map.erase(itor); - } -} diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 4a04ef42..9715489e 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -37,53 +37,102 @@ class ModList; class OrganizerCore; /** helper class to manage custom overwrites within the edit executables - * dialog + * dialog, stores a T and a bool in map indexed by a QString **/ -class CustomOverwrites +template +class ToggableMap { public: - struct Info + struct Value { bool enabled; - QString modName; + T value; + + Value(bool b, T&& v) + : enabled(b), value(std::forward(v)) + { + } }; - void load(Profile* p, const ExecutablesList& exes); - std::optional find(const QString& title) const; + /** + * returns the Value associated with the given title, or empty + **/ + std::optional find(const QString& title) const + { + auto itor = m_map.find(title); + if (itor == m_map.end()) { + return {}; + } - void setEnabled(const QString& title, bool b); - void setMod(const QString& title, const QString& mod); - void rename(const QString& oldTitle, const QString& newTitle); - void remove(const QString& title); + return itor->second; + } -private: - std::map m_map; -}; + /** + * sets the given value, adds it if not found + **/ + void set(QString title, bool b, T value) + { + m_map.insert_or_assign(std::move(title), Value(b, std::move(value))); + } + /** + * sets whether the given value is enabled, inserts it if not found + **/ + void setEnabled(const QString& title, bool b) + { + auto itor = m_map.find(title); -/** helper class to manage forced libraries within the edit executables dialog - **/ -class ForcedLibraries -{ -public: - using list_type = QList; + if (itor == m_map.end()) { + m_map.emplace(title, Value(b, {})); + } else { + itor->second.enabled = b; + } + } - struct Info + /** + * sets the given value, inserts it enabled if not found + **/ + void setValue(const QString& title, T value) { - bool enabled; - list_type list; - }; + auto itor = m_map.find(title); - void load(Profile* p, const ExecutablesList& exes); - std::optional find(const QString& title) const; + if (itor == m_map.end()) { + m_map.emplace(title, Value(true, std::move(value))); + } else { + itor->second.value = std::move(value); + } + } - void setEnabled(const QString& title, bool b); - void setList(const QString& title, const list_type& list); - void rename(const QString& oldTitle, const QString& newTitle); - void remove(const QString& title); + /** + * renames the given value, ignored if not found + **/ + void rename(const QString& oldTitle, QString newTitle) + { + auto itor = m_map.find(oldTitle); + if (itor == m_map.end()) { + return; + } + + // move to new title, erase old + m_map.emplace(std::move(newTitle), std::move(itor->second)); + m_map.erase(itor); + } + + /** + * removes the given value, ignored if not found + **/ + void remove(const QString& title) + { + auto itor = m_map.find(title); + if (itor == m_map.end()) { + return; + } + + m_map.erase(itor); + } private: - std::map m_map; + std::map m_map; }; @@ -95,10 +144,9 @@ class EditExecutablesDialog : public MOBase::TutorableDialog Q_OBJECT public: - /** - * @param executablesList current list of executables - * @param parent parent widget - **/ + using CustomOverwrites = ToggableMap; + using ForcedLibraries = ToggableMap>; + explicit EditExecutablesDialog(OrganizerCore& oc, QWidget* parent=nullptr); ~EditExecutablesDialog(); @@ -130,13 +178,28 @@ private slots: private: std::unique_ptr ui; OrganizerCore& m_organizerCore; + + // copy of the original executables, used to clear the current settings when + // committing changes const ExecutablesList m_originalExecutables; + + // current executable list ExecutablesList m_executablesList; + + // custom overwrites set in the dialog CustomOverwrites m_customOverwrites; + + // forced libraries set in the dialog ForcedLibraries m_forcedLibraries; + + // true when the change events being triggered are in response to loading + // the executable's data into the UI, not from a user change bool m_settingUI; + void loadCustomOverwrites(); + void loadForcedLibraries(); + QListWidgetItem* selectedItem(); Executable* selectedExe(); diff --git a/src/executableslist.h b/src/executableslist.h index 61582e71..61bf6734 100644 --- a/src/executableslist.h +++ b/src/executableslist.h @@ -102,9 +102,13 @@ public: /** * @brief initializes the list from the settings and the given plugin - */ + **/ void load(const MOBase::IPluginGame* game, QSettings& settings); + /** + * @brief re-adds all the executables from the plugin and renames existing + * executables that are in the way + **/ void resetFromPlugin(MOBase::IPluginGame const *game); /** @@ -167,18 +171,28 @@ public: **/ void remove(const QString &title); + /** + * returns a title that starts with the given prefix and does not clash with + * an existing executable, may fail + */ std::optional makeNonConflictingTitle(const QString& prefix); private: enum SetFlags { + // executables having the same name as existing ones are ignored IgnoreExisting = 1, + + // executables having the same name are merged MergeExisting, + + // an existing executable with the same name is renamed MoveExisting }; std::vector m_Executables; + /** * @brief add the executables preconfigured for this game **/ diff --git a/src/profile.cpp b/src/profile.cpp index 4ccaa641..ef387027 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -982,7 +982,7 @@ int Profile::getPriorityMinimum() const return m_ModIndexByPriority.begin()->first; } -bool Profile::forcedLibrariesEnabled(const QString &executable) +bool Profile::forcedLibrariesEnabled(const QString &executable) const { return setting("forced_libraries", executable + "/enabled", false).toBool(); } @@ -992,7 +992,7 @@ void Profile::setForcedLibrariesEnabled(const QString &executable, bool enabled) storeSetting("forced_libraries", executable + "/enabled", enabled); } -QList Profile::determineForcedLibraries(const QString &executable) +QList Profile::determineForcedLibraries(const QString &executable) const { QList results; diff --git a/src/profile.h b/src/profile.h index a7ba7e91..bc7964f8 100644 --- a/src/profile.h +++ b/src/profile.h @@ -330,9 +330,9 @@ public: int getPriorityMinimum() const; - bool forcedLibrariesEnabled(const QString &executable); + bool forcedLibrariesEnabled(const QString &executable) const; void setForcedLibrariesEnabled(const QString &executable, bool enabled); - QList determineForcedLibraries(const QString &executable); + QList determineForcedLibraries(const QString &executable) const; void storeForcedLibraries(const QString &executable, const QList &values); void removeForcedLibraries(const QString &executable); -- cgit v1.3.1