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.cpp211
1 files changed, 211 insertions, 0 deletions
diff --git a/gui/process_detector.cpp b/gui/process_detector.cpp
new file mode 100644
index 00000000..f9fa4b59
--- /dev/null
+++ b/gui/process_detector.cpp
@@ -0,0 +1,211 @@
+/* Copyright (c) 2015, Stanislaw Halik <sthalik@misaki.pl>
+
+ * Permission to use, copy, modify, and/or distribute this
+ * software for any purpose with or without fee is hereby granted,
+ * provided that the above copyright notice and this permission
+ * notice appear in all copies.
+ */
+
+#include "process_detector.h"
+#include "ui.h"
+#include "opentrack-compat/process-list.hpp"
+#include <QList>
+#include <QFileDialog>
+#include <QComboBox>
+#include <QString>
+#include <QHash>
+#include <QPushButton>
+
+void settings::set_game_list(const QString &game_list)
+{
+ QSettings settings(OPENTRACK_ORG);
+ settings.setValue("executable-list", game_list);
+}
+
+QString settings::get_game_list()
+{
+ QSettings settings(OPENTRACK_ORG);
+ return settings.value("executable-list").toString();
+}
+
+bool settings::is_enabled()
+{
+ QSettings settings(OPENTRACK_ORG);
+ return settings.value("executable-detector-enabled", false).toBool();
+}
+
+void settings::set_is_enabled(bool enabled)
+{
+ QSettings settings(OPENTRACK_ORG);
+ settings.setValue("executable-detector-enabled", enabled);
+}
+
+QHash<QString, QString> settings::split_process_names()
+{
+ QHash<QString, QString> ret;
+ QString str = get_game_list();
+ QStringList pairs = str.split('|');
+ for (auto pair : pairs)
+ {
+ QList<QString> tmp = pair.split(':');
+ if (tmp.count() != 2)
+ continue;
+ ret[tmp[0]] = tmp[1];
+ }
+ return ret;
+}
+
+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();
+ filename = QFileInfo(filename).fileName();
+ if (!filename.isNull())
+ twi->setText(filename);
+}
+
+int process_detector::add_row(QString exe_name, QString 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());
+ ui.tableWidget->setCellWidget(i, 1, cb);
+
+ QTableWidgetItem* twi = new QTableWidgetItem(exe_name);
+ ui.tableWidget->setItem(i, 0, twi);
+
+ {
+ BrowseButton* b = new BrowseButton(twi);
+ b->setText("...");
+ QObject::connect(b, SIGNAL(pressed()), b, SLOT(browse()));
+ ui.tableWidget->setCellWidget(i, 2, b);
+ }
+
+ cb->setCurrentText(profile);
+
+ return i;
+}
+
+void process_detector::add_items()
+{
+ auto names = s.split_process_names();
+ ui.tableWidget->clearContents();
+ auto keys = names.keys();
+ qSort(keys);
+ for (auto n : keys)
+ add_row(n, names[n]);
+}
+
+process_detector::process_detector(QWidget* parent) : QWidget(parent)
+{
+ ui.setupUi(this);
+ setFixedSize(size());
+ connect(ui.add, SIGNAL(pressed()), this, SLOT(add()));
+ connect(ui.remove, SIGNAL(pressed()), this, SLOT(remove()));
+
+ add_items();
+
+ QResizeEvent e(ui.tableWidget->size(), ui.tableWidget->size());
+ ui.tableWidget->resizeEvent(&e);
+
+ settings s;
+
+ ui.enabled->setChecked(s.is_enabled());
+}
+
+void process_detector::save()
+{
+ QString str;
+
+ 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;
+ }
+
+ s.set_game_list(str);
+ s.set_is_enabled(ui.enabled->isChecked());
+}
+
+void process_detector::revert()
+{
+}
+
+void process_detector::add()
+{
+ add_row();
+}
+
+void process_detector::remove()
+{
+ int r = ui.tableWidget->currentRow();
+ if (r != -1)
+ ui.tableWidget->removeRow(r);
+}
+
+bool process_detector_worker::should_stop()
+{
+ if (last_exe_name == "")
+ return false;
+
+ settings s;
+
+ if (!s.is_enabled())
+ {
+ last_exe_name = "";
+ return false;
+ }
+
+ QStringList exe_list = get_all_executable_names();
+
+ if (exe_list.contains(last_exe_name))
+ return false;
+
+ last_exe_name = "";
+
+ return true;
+}
+
+bool process_detector_worker::config_to_start(QString& str)
+{
+ settings s;
+ if (!s.is_enabled())
+ {
+ last_exe_name = "";
+ return false;
+ }
+
+ auto filenames = s.split_process_names();
+ QStringList exe_list = get_all_executable_names();
+
+ // 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))
+ return false;
+ // it's gone, we can start automatically again
+ last_exe_name = "";
+
+ for (auto& name : exe_list)
+ {
+ if (filenames.contains(name))
+ {
+ last_exe_name = name;
+ str = filenames[name];
+ return str != "";
+ }
+ }
+
+ return false;
+}