summaryrefslogtreecommitdiffhomepage
path: root/gui/process_detector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gui/process_detector.cpp')
-rw-r--r--gui/process_detector.cpp139
1 files changed, 85 insertions, 54 deletions
diff --git a/gui/process_detector.cpp b/gui/process_detector.cpp
index e45c0215..74e8caac 100644
--- a/gui/process_detector.cpp
+++ b/gui/process_detector.cpp
@@ -7,8 +7,10 @@
*/
#include "process_detector.h"
-#include "main-window.hpp"
+#include "options/options.hpp"
#include "compat/process-list.hpp"
+#include "compat/base-path.hpp"
+
#include <QList>
#include <QFileDialog>
#include <QComboBox>
@@ -16,41 +18,71 @@
#include <QHash>
#include <QPushButton>
#include <QSettings>
+#include <QtEvents>
+
+static constexpr auto RECORD_SEPARATOR = QChar(char(0x1e)); // RS ^]
+static constexpr auto UNIT_SEPARATOR = QChar(char(0x1f)); // US ^_
+
+using namespace options;
+using namespace options::globals;
-void settings::set_game_list(const QString &game_list)
+void proc_detector_settings::set_game_list(const QString &game_list)
{
- QSettings settings(OPENTRACK_ORG);
- settings.setValue("executable-list", game_list);
+ with_global_settings_object([&](QSettings& settings) {
+ settings.setValue("executable-list", game_list);
+ mark_global_ini_modified();
+ });
}
-QString settings::get_game_list()
+QString proc_detector_settings::get_game_list()
{
- QSettings settings(OPENTRACK_ORG);
- return settings.value("executable-list").toString();
+ return with_global_settings_object([&](QSettings& settings) {
+ return settings.value("executable-list").toString();
+ });
}
-bool settings::is_enabled()
+bool proc_detector_settings::is_enabled()
{
- QSettings settings(OPENTRACK_ORG);
- return settings.value("executable-detector-enabled", false).toBool();
+ return with_global_settings_object([&](QSettings& settings) {
+ return settings.value("executable-detector-enabled", false).toBool();
+ });
}
-void settings::set_is_enabled(bool enabled)
+void proc_detector_settings::set_is_enabled(bool enabled)
{
- QSettings settings(OPENTRACK_ORG);
- settings.setValue("executable-detector-enabled", enabled);
+ with_global_settings_object([&](QSettings& settings) {
+ settings.setValue("executable-detector-enabled", enabled);
+ mark_global_ini_modified();
+ });
}
-QHash<QString, QString> settings::split_process_names()
+#ifdef __GNUG__
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
+QHash<QString, QString> proc_detector_settings::split_process_names()
{
- QHash<QString, QString> ret;
QString str = get_game_list();
- QStringList pairs = str.split('|');
- for (auto pair : pairs)
+ constexpr auto split_flag =
+#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
+ Qt::SkipEmptyParts;
+#else
+ QString::SkipEmptyParts;
+#endif
+ QStringList pairs = str.split(RECORD_SEPARATOR, split_flag);
+ QHash<QString, QString> ret;
+ ret.reserve(pairs.size() * 2);
+ for (auto const& pair : pairs)
{
- QList<QString> tmp = pair.split(':');
+ QStringList tmp = pair.split(UNIT_SEPARATOR);
if (tmp.count() != 2)
continue;
+ if (tmp[0].contains(UNIT_SEPARATOR) || tmp[0].contains(RECORD_SEPARATOR))
+ continue;
+ if (tmp[1].contains(UNIT_SEPARATOR) || tmp[1].contains(RECORD_SEPARATOR))
+ continue;
+ if (tmp[0].isEmpty() || tmp[1].isEmpty())
+ continue;
ret[tmp[0]] = tmp[1];
}
return ret;
@@ -58,29 +90,27 @@ QHash<QString, QString> settings::split_process_names()
void BrowseButton::browse()
{
- QFileDialog dialog(this);
- dialog.setFileMode(QFileDialog::ExistingFile);
- QString dir_path = QFileInfo(group::ini_pathname()).absolutePath();
- QString filename = dialog.getOpenFileName(
- this,
- tr("Set executable name"),
- dir_path,
- tr("Executable (*.exe);;All Files (*)"));
- MainWindow::set_working_directory();
+ QString dir_path = QFileInfo(ini_pathname()).absolutePath();
+ QString filename = QFileDialog::getOpenFileName(
+ this,
+ tr("Set executable name"),
+ dir_path,
+ tr("Executable (*.exe);;All Files (*)"));
+ QDir::setCurrent(OPENTRACK_BASE_PATH);
filename = QFileInfo(filename).fileName();
if (!filename.isNull())
twi->setText(filename);
}
-int process_detector::add_row(QString exe_name, QString profile)
+int process_detector::add_row(QString const& exe_name, QString const& profile)
{
int i = ui.tableWidget->rowCount();
ui.tableWidget->insertRow(i);
QComboBox* cb = new QComboBox();
cb->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);
- cb->addItem("");
- cb->addItems(group::ini_list());
+ cb->addItems(ini_list());
+ cb->setCurrentText(ini_filename());
ui.tableWidget->setCellWidget(i, 1, cb);
QTableWidgetItem* twi = new QTableWidgetItem(exe_name);
@@ -89,7 +119,7 @@ int process_detector::add_row(QString exe_name, QString profile)
{
BrowseButton* b = new BrowseButton(twi);
b->setText("...");
- QObject::connect(b, SIGNAL(clicked()), b, SLOT(browse()));
+ QObject::connect(b, &BrowseButton::clicked, b, &BrowseButton::browse);
ui.tableWidget->setCellWidget(i, 2, b);
}
@@ -98,13 +128,14 @@ int process_detector::add_row(QString exe_name, QString profile)
return i;
}
-void process_detector::add_items()
+void process_detector::load_rows()
{
+ for (int k = ui.tableWidget->size().height() - 1; k >= 0; k--)
+ ui.tableWidget->removeRow(k);
auto names = s.split_process_names();
- ui.tableWidget->clearContents();
auto keys = names.keys();
std::sort(keys.begin(), keys.end());
- for (auto n : keys)
+ for (auto const& n : keys)
add_row(n, names[n]);
}
@@ -114,13 +145,10 @@ process_detector::process_detector(QWidget* parent) : QWidget(parent)
connect(ui.add, SIGNAL(clicked()), this, SLOT(add()));
connect(ui.remove, SIGNAL(clicked()), this, SLOT(remove()));
- add_items();
+ load_rows();
QResizeEvent e(ui.tableWidget->size(), ui.tableWidget->size());
ui.tableWidget->resizeEvent(&e);
-
- settings s;
-
ui.enabled->setChecked(s.is_enabled());
}
@@ -131,8 +159,11 @@ void process_detector::save()
for (int i = 0; i < ui.tableWidget->rowCount(); i++)
{
auto exe = ui.tableWidget->item(i, 0)->text();
- auto profile = reinterpret_cast<QComboBox*>(ui.tableWidget->cellWidget(i, 1))->currentText();
- str += "|" + exe + ":" + profile;
+ auto widget = qobject_cast<QComboBox*>(ui.tableWidget->cellWidget(i, 1));
+ if (!widget)
+ continue;
+ auto profile = widget->currentText();
+ str += RECORD_SEPARATOR + exe + UNIT_SEPARATOR + profile;
}
s.set_game_list(str);
@@ -141,6 +172,8 @@ void process_detector::save()
void process_detector::revert()
{
+ load_rows();
+ ui.enabled->setChecked(s.is_enabled());
}
void process_detector::add()
@@ -157,14 +190,14 @@ void process_detector::remove()
bool process_detector_worker::should_stop()
{
- if (last_exe_name == "")
+ if (last_exe_name == QString())
return false;
- settings s;
+ proc_detector_settings s;
if (!s.is_enabled())
{
- last_exe_name = "";
+ last_exe_name = QString{};
return false;
}
@@ -173,17 +206,17 @@ bool process_detector_worker::should_stop()
if (exe_list.contains(last_exe_name))
return false;
- last_exe_name = "";
+ last_exe_name = QString{};
return true;
}
-bool process_detector_worker::config_to_start(QString& str)
+bool process_detector_worker::profile_to_start(QString& str)
{
- settings s;
+ proc_detector_settings s;
if (!s.is_enabled())
{
- last_exe_name = "";
+ last_exe_name = QString{};
return false;
}
@@ -192,20 +225,18 @@ bool process_detector_worker::config_to_start(QString& str)
// assuming manual stop by user button click.
// don't automatically start again while the same process is running.
- if (last_exe_name != "" && exe_list.contains(last_exe_name))
+ if (!last_exe_name.isEmpty() && exe_list.contains(last_exe_name))
return false;
// it's gone, we can start automatically again
- last_exe_name = "";
+ last_exe_name = QString();
- for (auto& name : exe_list)
- {
+ for (auto&& name : exe_list)
if (filenames.contains(name))
{
- last_exe_name = name;
str = filenames[name];
- return str != "";
+ last_exe_name = name;
+ return str != QString{};
}
- }
return false;
}