summaryrefslogtreecommitdiffhomepage
path: root/variant
diff options
context:
space:
mode:
Diffstat (limited to 'variant')
-rw-r--r--variant/default/CMakeLists.txt2
-rw-r--r--variant/default/_variant.cmake4
-rw-r--r--variant/default/main-window.cpp582
-rw-r--r--variant/default/main-window.hpp95
-rw-r--r--variant/default/main.cpp4
-rw-r--r--variant/default/new_file_dialog.h2
-rw-r--r--variant/trackmouse/CMakeLists.txt2
-rw-r--r--variant/trackmouse/window.cpp16
-rw-r--r--variant/trackmouse/window.hpp2
9 files changed, 307 insertions, 402 deletions
diff --git a/variant/default/CMakeLists.txt b/variant/default/CMakeLists.txt
index a9e3c754..a8829aa5 100644
--- a/variant/default/CMakeLists.txt
+++ b/variant/default/CMakeLists.txt
@@ -6,4 +6,4 @@ set_target_properties(opentrack-executable PROPERTIES
PREFIX ""
)
-target_link_libraries(opentrack-executable opentrack-user-interface)
+target_link_libraries(${self} opentrack-user-interface opentrack-version)
diff --git a/variant/default/_variant.cmake b/variant/default/_variant.cmake
index b7ba90b3..161fefda 100644
--- a/variant/default/_variant.cmake
+++ b/variant/default/_variant.cmake
@@ -22,7 +22,9 @@ function(otr_init_variant)
"macosx"
"cv"
"migration"
- "main-window")
+ "main-window"
+ "video"
+ )
set_property(GLOBAL PROPERTY opentrack-subprojects "${subprojects}")
endfunction()
diff --git a/variant/default/main-window.cpp b/variant/default/main-window.cpp
index 0112e2cc..a223c32f 100644
--- a/variant/default/main-window.cpp
+++ b/variant/default/main-window.cpp
@@ -19,7 +19,6 @@
#include "compat/sysexits.hpp"
#include <algorithm>
-#include <iterator>
#include <utility>
#include <QMessageBox>
@@ -39,179 +38,138 @@ main_window::main_window() : State(OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH)
annoy_if_root();
#endif
- update_button_state(false, false);
+ init_profiles();
+ init_buttons();
+ init_tray_menu();
+ init_dylibs();
+ init_shortcuts();
- if (ini_directory().isEmpty())
- {
- die_on_config_not_writable();
- return;
- }
+ setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | windowFlags());
+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ adjustSize();
- if (!refresh_config_list())
+ if (!start_in_tray())
{
- exit(EX_OSFILE);
- return;
+ setVisible(true);
+ show();
}
+ else
+ setVisible(false);
- connect(ui.btnEditCurves, SIGNAL(clicked()), this, SLOT(show_mapping_window()));
- connect(ui.btnShortcuts, SIGNAL(clicked()), this, SLOT(show_options_dialog()));
- connect(ui.btnShowEngineControls, SIGNAL(clicked()), this, SLOT(show_tracker_settings()));
- connect(ui.btnShowServerControls, SIGNAL(clicked()), this, SLOT(show_proto_settings()));
- connect(ui.btnShowFilterControls, SIGNAL(clicked()), this, SLOT(show_filter_settings()));
- connect(ui.btnStartTracker, SIGNAL(clicked()), this, SLOT(start_tracker_()));
- connect(ui.btnStopTracker, SIGNAL(clicked()), this, SLOT(stop_tracker_()));
- connect(ui.iconcomboProfile, &QComboBox::currentTextChanged, this, [&](const QString& x) { set_profile(x); });
+ connect(&pose_update_timer, &QTimer::timeout,
+ this, &main_window::show_pose, Qt::DirectConnection);
+ connect(&det_timer, &QTimer::timeout,
+ this, &main_window::maybe_start_profile_from_executable);
+ det_timer.start(1000);
+}
- // fill dylib comboboxen
- {
- modules.filters().push_front(std::make_shared<dylib>(QString(), dylib::Filter));
+void main_window::init_shortcuts()
+{
+ register_shortcuts();
- for (dylib_ptr& x : modules.trackers())
- ui.iconcomboTrackerSource->addItem(x->icon, x->name, x->module_name);
+ // ctrl+q exits
+ connect(&kbd_quit, &QShortcut::activated, this, [this]() { main_window::exit(EXIT_SUCCESS); }, Qt::DirectConnection);
+ kbd_quit.setEnabled(true);
+}
- for (dylib_ptr& x : modules.protocols())
- ui.iconcomboProtocol->addItem(x->icon, x->name, x->module_name);
+void main_window::init_dylibs()
+{
+ using dylib_ptr = Modules::dylib_ptr;
+ using dylib_list = Modules::dylib_list;
- for (dylib_ptr& x : modules.filters())
- ui.iconcomboFilter->addItem(x->icon, x->name, x->module_name);
- }
+ modules.filters().push_front(std::make_shared<dylib>("", dylib::Filter));
- // timers
- connect(&config_list_timer, &QTimer::timeout, this, [this] { refresh_config_list(); });
- connect(&pose_update_timer, &QTimer::timeout, this, &main_window::show_pose, Qt::DirectConnection);
- connect(&det_timer, SIGNAL(timeout()), this, SLOT(maybe_start_profile_from_executable()));
+ for (dylib_ptr& x : modules.trackers())
+ ui.iconcomboTrackerSource->addItem(x->icon, x->name, x->module_name);
- // ctrl+q exits
- connect(&kbd_quit, &QShortcut::activated, this, [this]() { main_window::exit(EXIT_SUCCESS); }, Qt::DirectConnection);
+ for (dylib_ptr& x : modules.protocols())
+ ui.iconcomboProtocol->addItem(x->icon, x->name, x->module_name);
- // profile menu
- {
- profile_menu.addAction(tr("Create new empty config"), this, SLOT(make_empty_config()));
- profile_menu.addAction(tr("Create new copied config"), this, SLOT(make_copied_config()));
- profile_menu.addAction(tr("Open configuration directory"), this, SLOT(open_config_directory()));
- ui.profile_button->setMenu(&profile_menu);
- }
+ for (dylib_ptr& x : modules.filters())
+ ui.iconcomboFilter->addItem(x->icon, x->name, x->module_name);
- {
- const QString cur = ini_filename();
- bool ok = is_config_listed(cur) ? set_profile(cur) : set_profile(OPENTRACK_DEFAULT_CONFIG);
- if (!ok)
- {
- exit(EX_OSFILE);
- return;
- }
- }
+ connect(ui.iconcomboTrackerSource, &QComboBox::currentTextChanged,
+ this, [&](const QString&) { pTrackerDialog = nullptr; });
- // only tie and connect main screen options after migrations are done
- // below is fine, set_profile() is called already
+ connect(ui.iconcomboProtocol, &QComboBox::currentTextChanged,
+ this, [&](const QString&) { pProtocolDialog = nullptr; });
- // dylibs
- {
- connect(ui.iconcomboTrackerSource,
- &QComboBox::currentTextChanged,
- this,
- [&](const QString&) { pTrackerDialog = nullptr; });
+ connect(ui.iconcomboFilter, &QComboBox::currentTextChanged,
+ this, [&](const QString&) { pFilterDialog = nullptr; });
- connect(ui.iconcomboTrackerSource,
- &QComboBox::currentTextChanged,
- this,
- [&](const QString&) { pProtocolDialog = nullptr; });
+ connect(&m.tracker_dll, value_::value_changed<QString>(),
+ this, &main_window::save_modules,
+ Qt::DirectConnection);
- connect(ui.iconcomboTrackerSource,
- &QComboBox::currentTextChanged,
- this,
- [&](const QString&) { pFilterDialog = nullptr; });
+ connect(&m.protocol_dll, value_::value_changed<QString>(),
+ this, &main_window::save_modules,
+ Qt::DirectConnection);
- connect(&m.tracker_dll, value_::value_changed<QString>(),
- this, &main_window::save_modules,
- Qt::DirectConnection);
+ connect(&m.filter_dll, value_::value_changed<QString>(),
+ this, &main_window::save_modules,
+ Qt::DirectConnection);
- connect(&m.protocol_dll, value_::value_changed<QString>(),
- this, &main_window::save_modules,
- Qt::DirectConnection);
+ {
+ struct list {
+ dylib_list& libs;
+ QComboBox* input;
+ value<QString>& place;
+ };
- connect(&m.filter_dll, value_::value_changed<QString>(),
- this, &main_window::save_modules,
- Qt::DirectConnection);
+ list types[] {
+ { modules.trackers(), ui.iconcomboTrackerSource, m.tracker_dll },
+ { modules.protocols(), ui.iconcomboProtocol, m.protocol_dll },
+ { modules.filters(), ui.iconcomboFilter, m.filter_dll },
+ };
+ for (list& type : types)
{
- struct list {
- dylib_list& libs;
- QComboBox* input;
- value<QString>& place;
- };
-
- list types[] {
- { modules.trackers(), ui.iconcomboTrackerSource, m.tracker_dll },
- { modules.protocols(), ui.iconcomboProtocol, m.protocol_dll },
- { modules.filters(), ui.iconcomboFilter, m.filter_dll },
- };
-
- for (list& type : types)
- {
- list& t = type;
- tie_setting(t.place, t.input,
- [t](const QString& name) {
- auto [ptr, idx] = module_by_name(name, t.libs);
- return idx;
- },
- [t](int, const QVariant& userdata) {
- auto [ptr, idx] = module_by_name(userdata.toString(), t.libs);
- if (ptr)
- return ptr->module_name;
- else
- return QString();
- });
- }
+ list t = type;
+ tie_setting(t.place, t.input,
+ [t](const QString& name) {
+ auto [ptr, idx] = module_by_name(name, t.libs);
+ return idx;
+ },
+ [t](int, const QVariant& userdata) {
+ auto [ptr, idx] = module_by_name(userdata.toString(), t.libs);
+ if (ptr)
+ return ptr->module_name;
+ else
+ return QString();
+ });
}
}
+}
- connect(this, &main_window::start_tracker,
- this, [&] { qDebug() << "start tracker"; start_tracker_(); },
- Qt::QueuedConnection);
-
- connect(this, &main_window::stop_tracker,
- this, [&] { qDebug() << "stop tracker"; stop_tracker_(); },
- Qt::QueuedConnection);
-
- connect(this, &main_window::toggle_tracker,
- this, [&] { qDebug() << "toggle tracker"; if (work) stop_tracker_(); else start_tracker_(); },
- Qt::QueuedConnection);
-
- connect(this, &main_window::restart_tracker,
- this, [&] { qDebug() << "restart tracker"; stop_tracker_(); start_tracker_(); },
- Qt::QueuedConnection);
+void main_window::init_profiles()
+{
+ refresh_profile_list();
+ // implicitly created by `ini_directory()'
+ if (ini_directory().isEmpty() || !QDir(ini_directory()).isReadable())
+ die_on_profile_not_writable();
- init_tray();
- ensure_tray();
+ set_profile(ini_filename());
- register_shortcuts();
- det_timer.start(1000);
- config_list_timer.start(1000 * 5);
- kbd_quit.setEnabled(true);
+ // profile menu
+ profile_menu.addAction(tr("Create new empty config"), this, &main_window::create_empty_profile);
+ profile_menu.addAction(tr("Create new copied config"), this, &main_window::create_copied_profile);
+ profile_menu.addAction(tr("Open configuration directory"), this, &main_window::open_profile_directory);
+ ui.profile_button->setMenu(&profile_menu);
- setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | windowFlags());
- setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- adjustSize();
+ connect(&profile_list_timer, &QTimer::timeout, this, &main_window::refresh_profile_list);
+ profile_list_timer.start(1000 * 5);
- if (!start_in_tray())
- {
- setVisible(true);
- show();
- }
- else
- setVisible(false);
+ connect(ui.iconcomboProfile, &QComboBox::currentTextChanged,
+ this, [this](const QString& x) { main_window::set_profile(x); });
}
-void main_window::init_tray()
+void main_window::init_tray_menu()
{
tray_menu.clear();
QString display_name(opentrack_version);
if (display_name.startsWith("opentrack-"))
- {
display_name = tr("opentrack") + " " + display_name.mid(sizeof("opentrack-") - 1);
- }
if (display_name.endsWith("-DEBUG"))
display_name.replace(display_name.size() - int(sizeof("DEBUG")), display_name.size(), tr(" (debug)"));
@@ -261,10 +219,22 @@ void main_window::init_tray()
QObject::connect(&menu_action_exit, &QAction::triggered, this, &main_window::exit);
tray_menu.addAction(&menu_action_exit);
- connect(&s.tray_enabled,
- static_cast<void (value_::*)(bool) const>(&value_::valueChanged),
- this,
- &main_window::ensure_tray);
+ connect(&s.tray_enabled, value_::value_changed<bool>(),
+ this, &main_window::ensure_tray);
+
+ ensure_tray();
+}
+
+void main_window::init_buttons()
+{
+ update_button_state(false, false);
+ connect(ui.btnEditCurves, &QPushButton::clicked, this, &main_window::show_mapping_window);
+ connect(ui.btnShortcuts, &QPushButton::clicked, this, &main_window::show_options_dialog);
+ connect(ui.btnShowEngineControls, &QPushButton::clicked, this, &main_window::show_tracker_settings);
+ connect(ui.btnShowServerControls, &QPushButton::clicked, this, &main_window::show_proto_settings);
+ connect(ui.btnShowFilterControls, &QPushButton::clicked, this, &main_window::show_filter_settings);
+ connect(ui.btnStartTracker, &QPushButton::clicked, this, &main_window::start_tracker_);
+ connect(ui.btnStopTracker, &QPushButton::clicked, this, &main_window::stop_tracker_);
}
void main_window::register_shortcuts()
@@ -287,7 +257,7 @@ void main_window::register_shortcuts()
work->reload_shortcuts();
}
-void main_window::die_on_config_not_writable()
+void main_window::die_on_profile_not_writable()
{
stop_tracker_();
@@ -301,32 +271,7 @@ void main_window::die_on_config_not_writable()
exit(EX_OSFILE);
}
-bool main_window::maybe_die_on_config_not_writable(const QString& current, QStringList* ini_list_)
-{
- const bool writable =
- with_settings_object([&](QSettings& s) {
- return s.isWritable();
- });
-
- if (writable)
- return false;
-
- const bool open = QFile(ini_combine(current)).open(QFile::ReadWrite);
- QStringList list = ini_list();
-
- if (!list.contains(current) || !open)
- {
- die_on_config_not_writable();
- return true;
- }
-
- if (ini_list_ != nullptr)
- *ini_list_ = std::move(list);
-
- return false;
-}
-
-bool main_window::get_new_config_name_from_dialog(QString& ret)
+bool main_window::profile_name_from_dialog(QString& ret)
{
new_file_dialog dlg;
dlg.exec();
@@ -336,113 +281,93 @@ bool main_window::get_new_config_name_from_dialog(QString& ret)
main_window::~main_window()
{
// stupid ps3 eye has LED issues
- if (work)
+ if (work && ui.video_frame->layout())
{
+ hide();
stop_tracker_();
- QEventLoop ev;
- ev.processEvents();
- portable::sleep(2000);
+ close();
+
+ constexpr int inc = 25, max = 1000;
+
+ for (int k = 0; k < max; k += inc)
+ {
+ QEventLoop ev;
+ ev.processEvents();
+ portable::sleep(inc);
+ }
}
exit();
}
-void main_window::set_working_directory()
-{
- QDir::setCurrent(OPENTRACK_BASE_PATH);
-}
-
void main_window::save_modules()
{
m.b->save();
}
-void main_window::make_empty_config()
+void main_window::create_empty_profile()
{
QString name;
- if (get_new_config_name_from_dialog(name))
+ if (profile_name_from_dialog(name))
{
QFile(ini_combine(name)).open(QFile::ReadWrite);
+ refresh_profile_list();
- if (!refresh_config_list())
- return;
-
- if (is_config_listed(name))
+ if (profile_list.contains(name))
{
QSignalBlocker q(ui.iconcomboProfile);
- if (!set_profile(name))
- return;
- mark_config_as_not_needing_migration();
+ set_profile(name, false);
+ mark_profile_as_not_needing_migration();
}
}
}
-void main_window::make_copied_config()
+void main_window::create_copied_profile()
{
const QString cur = ini_pathname();
QString name;
- if (cur != "" && get_new_config_name_from_dialog(name))
+ if (!cur.isEmpty() && profile_name_from_dialog(name))
{
const QString new_name = ini_combine(name);
(void) QFile::remove(new_name);
QFile::copy(cur, new_name);
- if (!refresh_config_list())
- return;
+ refresh_profile_list();
- if (is_config_listed(name))
+ if (profile_list.contains(name))
{
QSignalBlocker q(ui.iconcomboProfile);
- if (!set_profile(name))
- return;
- mark_config_as_not_needing_migration();
+ set_profile(name, false);
+ mark_profile_as_not_needing_migration();
}
}
}
-void main_window::open_config_directory()
+void main_window::open_profile_directory()
{
QDesktopServices::openUrl("file:///" + QDir::toNativeSeparators(ini_directory()));
}
-bool main_window::refresh_config_list()
+void main_window::refresh_profile_list()
{
if (work)
- return true;
+ return;
QStringList list = ini_list();
-
- // check for sameness
- const bool exact_same = !list.empty() && progn(
- if (list.size() == ui.iconcomboProfile->count())
- {
- const int sz = list.size();
- for (int i = 0; i < sz; i++)
- {
- if (list[i] != ui.iconcomboProfile->itemText(i))
- return false;
- }
- return true;
- }
-
- return false;
- );
-
QString current = ini_filename();
- if (!list.contains(current))
- current = OPENTRACK_DEFAULT_CONFIG;
+ if (list == profile_list)
+ return;
- if (maybe_die_on_config_not_writable(current, &list))
- return false;
+ if (!list.contains(current))
+ current = OPENTRACK_DEFAULT_PROFILE;
- if (exact_same)
- return true;
+ profile_list = list;
- const QIcon icon(":/images/settings16.png");
+ static const QIcon icon(":/images/settings16.png");
QSignalBlocker l(ui.iconcomboProfile);
@@ -453,42 +378,9 @@ bool main_window::refresh_config_list()
ui.iconcomboProfile->setItemIcon(i, icon);
ui.iconcomboProfile->setCurrentText(current);
-
- return true;
}
-std::tuple<main_window::dylib_ptr, int> main_window::module_by_name(const QString& name, Modules::dylib_list& list)
-{
- auto it = std::find_if(list.cbegin(), list.cend(), [&name](const dylib_ptr& lib) {
- if (!lib)
- return name.isEmpty();
- else
- return name == lib->module_name;
- });
- if (it == list.cend())
- return { nullptr, -1 };
- else
- return { *it, int(std::distance(list.cbegin(), it)) };
-}
-
-main_window::dylib_ptr main_window::current_tracker()
-{
- auto [ptr, idx] = module_by_name(m.tracker_dll, modules.trackers());
- return ptr;
-}
-
-main_window::dylib_ptr main_window::current_protocol()
-{
- auto [ptr, idx] = module_by_name(m.protocol_dll, modules.protocols());
- return ptr;
-}
-
-main_window::dylib_ptr main_window::current_filter()
-{
- auto [ptr, idx] = module_by_name(m.filter_dll, modules.filters());
- return ptr;
-}
void main_window::update_button_state(bool running, bool inertialp)
{
@@ -515,11 +407,6 @@ void main_window::start_tracker_()
if (work)
return;
- {
- double p[6] = {0,0,0, 0,0,0};
- display_pose(p, p);
- }
-
work = std::make_shared<Work>(pose, ev, ui.video_frame, current_tracker(), current_protocol(), current_filter());
if (!work->is_ok())
@@ -528,6 +415,11 @@ void main_window::start_tracker_()
return;
}
+ {
+ double p[6] = {0,0,0, 0,0,0};
+ show_pose_(p, p);
+ }
+
if (pTrackerDialog)
pTrackerDialog->register_tracker(work->libs.pTracker.get());
@@ -552,6 +444,7 @@ void main_window::stop_tracker_()
if (!work)
return;
+ force_is_visible(true);
with_tracker_teardown sentinel;
pose_update_timer.stop();
@@ -569,8 +462,8 @@ void main_window::stop_tracker_()
work = nullptr;
{
- double p[6] = {0,0,0, 0,0,0};
- display_pose(p, p);
+ double p[6] {};
+ show_pose_(p, p);
}
update_button_state(false, false);
@@ -578,7 +471,7 @@ void main_window::stop_tracker_()
ui.btnStartTracker->setFocus();
}
-void main_window::display_pose(const double *mapped, const double *raw)
+void main_window::show_pose_(const double* mapped, const double* raw)
{
ui.pose_display->rotate_async(mapped[Yaw], mapped[Pitch], -mapped[Roll],
mapped[TX], mapped[TY], mapped[TZ]);
@@ -634,32 +527,29 @@ void main_window::show_pose()
work->pipeline_.raw_and_mapped_pose(mapped, raw);
- display_pose(mapped, raw);
-}
-
-template<typename t, typename... Args>
-bool mk_window(std::unique_ptr<t>& place, Args&&... params)
-{
- return mk_window_common(place, [&] {
- return std::make_unique<t>(params...);
- });
+ show_pose_(mapped, raw);
}
-template<typename t>
-bool mk_dialog(std::unique_ptr<t>& place, const std::shared_ptr<dylib>& lib)
+static void show_window(QWidget& d, bool fresh)
{
- using u = std::unique_ptr<t>;
+ if (fresh)
+ {
+ d.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | d.windowFlags());
+ d.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- return mk_window_common(place, [&] {
- if (lib && lib->Dialog)
- return u{ (t*)lib->Dialog() };
- else
- return u{};
- });
+ d.show();
+ d.adjustSize();
+ d.raise();
+ }
+ else
+ {
+ d.show();
+ d.raise();
+ }
}
template<typename t, typename F>
-bool mk_window_common(std::unique_ptr<t>& d, F&& fun)
+static bool mk_window_common(std::unique_ptr<t>& d, F&& fun)
{
bool fresh = false;
@@ -672,22 +562,25 @@ bool mk_window_common(std::unique_ptr<t>& d, F&& fun)
return fresh;
}
-void show_window(QWidget& d, bool fresh)
+template<typename t, typename... Args>
+static bool mk_window(std::unique_ptr<t>& place, Args&&... params)
{
- if (fresh)
- {
- d.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | d.windowFlags());
- d.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ return mk_window_common(place, [&] {
+ return std::make_unique<t>(params...);
+ });
+}
- d.show();
- d.adjustSize();
- d.raise();
- }
- else
- {
- d.show();
- d.raise();
- }
+template<typename t>
+static bool mk_dialog(std::unique_ptr<t>& place, const std::shared_ptr<dylib>& lib)
+{
+ using u = std::unique_ptr<t>;
+
+ return mk_window_common(place, [&] {
+ if (lib && lib->Dialog)
+ return u{ (t*)lib->Dialog() };
+ else
+ return u{};
+ });
}
void main_window::show_tracker_settings()
@@ -725,7 +618,7 @@ void main_window::show_options_dialog()
// also doesn't work when switching profiles with options dialog open
// move shortcuts to a separate bundle and add a migration -sh 20180218
connect(options_widget.get(), &options_dialog::closing,
- this, &main_window::register_shortcuts);
+ this, &main_window::register_shortcuts);
}
}
@@ -755,36 +648,41 @@ void main_window::exit(int status)
QApplication::exit(status);
}
-bool main_window::set_profile(const QString& new_name_)
+void main_window::set_profile(const QString& new_name_, bool migrate)
{
- if (!refresh_config_list())
- return false;
+ QSignalBlocker b(ui.iconcomboProfile);
QString new_name = new_name_;
- if (!is_config_listed(new_name))
- new_name = OPENTRACK_DEFAULT_CONFIG;
+ if (!profile_list.contains(new_name))
+ {
+ new_name = OPENTRACK_DEFAULT_PROFILE;
+ if (!profile_list.contains(new_name))
+ migrate = false;
+ }
- if (maybe_die_on_config_not_writable(new_name, nullptr))
- return false;
+ const bool status = new_name != ini_filename();
- ui.iconcomboProfile->setCurrentText(new_name);
- set_profile_in_registry(new_name);
+ if (status)
+ set_profile_in_registry(new_name);
- // XXX workaround migration breakage -sh 20180428
- QSignalBlocker b1(ui.iconcomboTrackerSource);
- QSignalBlocker b2(ui.iconcomboProtocol);
- QSignalBlocker b3(ui.iconcomboFilter);
+ using bundler = options::detail::bundler;
- options::detail::bundler::refresh_all_bundles();
+ bundler::reload_no_notify();
- // migrations are for config layout changes and other user-visible
- // incompatibilities in future versions
- run_migrations();
+ if (migrate)
+ // migrations are for config layout changes and other user-visible
+ // incompatibilities in future versions
+ run_migrations();
+ else
+ mark_profile_as_not_needing_migration();
+
+ bundler::notify();
set_title();
- return true;
+ if (status)
+ ui.iconcomboProfile->setCurrentText(new_name);
}
void main_window::ensure_tray()
@@ -814,9 +712,7 @@ void main_window::ensure_tray()
}
else
{
- const bool is_hidden = isHidden() || !isVisible();
-
- if (is_hidden)
+ if (!isVisible())
{
show();
setVisible(true);
@@ -848,19 +744,14 @@ void main_window::toggle_restore_from_tray(QSystemTrayIcon::ActivationReason e)
ensure_tray();
- const bool is_minimized = isHidden() || !is_tray_enabled();
+ const bool is_minimized = isHidden() || !tray_enabled();
menu_action_show.setText(!isHidden() ? tr("Show the Octopus") : tr("Hide the Octopus"));
setVisible(is_minimized);
setHidden(!is_minimized);
- setWindowState(typed_progn(Qt::WindowStates,
- if (is_minimized)
- return windowState() & ~Qt::WindowMinimized;
- else
- return Qt::WindowNoState;
- ));
+ setWindowState(is_minimized ? windowState() & ~Qt::WindowMinimized : Qt::WindowNoState);
if (is_minimized)
{
@@ -878,7 +769,7 @@ bool main_window::maybe_hide_to_tray(QEvent* e)
{
if (e->type() == QEvent::WindowStateChange &&
(windowState() & Qt::WindowMinimized) &&
- is_tray_enabled())
+ tray_enabled())
{
e->accept();
ensure_tray();
@@ -899,10 +790,10 @@ void main_window::maybe_start_profile_from_executable()
{
if (!work)
{
- QString prof;
- if (det.config_to_start(prof))
+ QString profile;
+ if (det.profile_to_start(profile) && profile_list.contains(profile))
{
- set_profile(prof);
+ set_profile(profile);
start_tracker_();
}
}
@@ -922,18 +813,7 @@ void main_window::set_keys_enabled(bool flag)
global_shortcuts.reload({});
}
else
- {
register_shortcuts();
- }
-}
-
-bool main_window::is_config_listed(const QString& name)
-{
- const int sz = ui.iconcomboProfile->count();
- for (int i = 0; i < sz; i++)
- if (ui.iconcomboProfile->itemText(i) == name)
- return true;
- return false;
}
void main_window::changeEvent(QEvent* e)
@@ -964,23 +844,41 @@ bool main_window::event(QEvent* event)
return QMainWindow::event(event);
}
-bool main_window::is_tray_enabled()
+bool main_window::tray_enabled()
{
return s.tray_enabled && QSystemTrayIcon::isSystemTrayAvailable();
}
bool main_window::start_in_tray()
{
- return s.tray_enabled && s.tray_start && QSystemTrayIcon::isSystemTrayAvailable();
+ return tray_enabled() && s.tray_start;
}
void main_window::set_profile_in_registry(const QString &profile)
{
with_global_settings_object([&](QSettings& s) {
- s.setValue(OPENTRACK_CONFIG_FILENAME_KEY, profile);
+ s.setValue(OPENTRACK_PROFILE_FILENAME_KEY, profile);
});
}
+void main_window::restart_tracker_()
+{
+ qDebug() << "restart tracker";
+
+ stop_tracker_();
+ start_tracker_();
+}
+
+void main_window::toggle_tracker_()
+{
+ qDebug() << "toggle tracker";
+
+ if (work)
+ stop_tracker_();
+ else
+ start_tracker_();
+}
+
#if !defined _WIN32
# include <unistd.h>
void main_window::annoy_if_root()
diff --git a/variant/default/main-window.hpp b/variant/default/main-window.hpp
index 55fca177..9ffb7019 100644
--- a/variant/default/main-window.hpp
+++ b/variant/default/main-window.hpp
@@ -18,6 +18,7 @@
#include "logic/work.hpp"
#include "logic/state.hpp"
#include "options/options.hpp"
+#include "compat/qt-signal.hpp"
#include <QApplication>
#include <QMainWindow>
@@ -31,6 +32,7 @@
#include <QAction>
#include <QEvent>
#include <QCloseEvent>
+#include <QList>
#include <tuple>
#include <memory>
@@ -39,20 +41,23 @@
class main_window final : public QMainWindow, private State
{
- Q_OBJECT
+ Q_DECLARE_TR_FUNCTIONS(main_window)
Ui::main_window ui;
- Shortcuts global_shortcuts;
- module_settings m;
std::unique_ptr<QSystemTrayIcon> tray;
- QMenu tray_menu;
+ QMenu tray_menu { this };
+
QTimer pose_update_timer { this };
QTimer det_timer;
- QTimer config_list_timer;
+ QTimer profile_list_timer;
+
+ Shortcuts global_shortcuts;
+ QShortcut kbd_quit { QKeySequence("Ctrl+Q"), this };
+
std::unique_ptr<options_dialog> options_widget;
std::unique_ptr<mapping_dialog> mapping_widget;
- QShortcut kbd_quit { QKeySequence("Ctrl+Q"), this };
+
std::unique_ptr<IFilterDialog> pFilterDialog;
std::unique_ptr<IProtocolDialog> pProtocolDialog;
std::unique_ptr<ITrackerDialog> pTrackerDialog;
@@ -60,6 +65,8 @@ class main_window final : public QMainWindow, private State
process_detector_worker det;
QMenu profile_menu;
+ QList<QString> profile_list;
+
QAction menu_action_header { &tray_menu },
menu_action_show { &tray_menu },
menu_action_exit { &tray_menu },
@@ -71,72 +78,66 @@ class main_window final : public QMainWindow, private State
bool exiting_already { false };
- using dylib_ptr = Modules::dylib_ptr;
- using dylib_list = Modules::dylib_list;
-
- dylib_ptr current_tracker();
- dylib_ptr current_protocol();
- dylib_ptr current_filter();
+ qt_sig::nullary start_tracker { this, &main_window::start_tracker_, Qt::QueuedConnection };
+ qt_sig::nullary stop_tracker { this, &main_window::stop_tracker_, Qt::QueuedConnection };
+ qt_sig::nullary toggle_tracker { this, &main_window::toggle_tracker_, Qt::QueuedConnection };
+ qt_sig::nullary restart_tracker { this, &main_window::restart_tracker_, Qt::QueuedConnection };
- static std::tuple<dylib_ptr, int> module_by_name(const QString& name, Modules::dylib_list& list);
+ void init_dylibs();
+ void init_tray_menu();
+ void init_profiles();
+ void init_buttons();
- void update_button_state(bool running, bool inertialp);
- void display_pose(const double* mapped, const double* raw);
- void set_title(const QString& game_title = QString());
- static bool get_new_config_name_from_dialog(QString &ret);
- void set_profile_in_registry(const QString& profile);
+ void init_shortcuts();
void register_shortcuts();
void set_keys_enabled(bool flag);
- bool is_config_listed(const QString& name);
- void init_tray();
+ void update_button_state(bool running, bool inertialp);
- void changeEvent(QEvent* e) override;
- bool event(QEvent *event) override;
- bool maybe_hide_to_tray(QEvent* e);
#if !defined _WIN32
void annoy_if_root();
#endif
+ void changeEvent(QEvent* e) override;
+ bool maybe_hide_to_tray(QEvent* e);
void closeEvent(QCloseEvent *event) override;
-
- bool maybe_die_on_config_not_writable(const QString& current, QStringList* ini_list);
- void die_on_config_not_writable();
- bool is_tray_enabled();
- bool start_in_tray();
-
-private slots:
- void save_modules();
- void exit(int status = EXIT_SUCCESS);
- bool set_profile(const QString& new_name);
+ bool event(QEvent *event) override;
void show_tracker_settings();
void show_proto_settings();
void show_filter_settings();
+
void show_options_dialog();
void show_mapping_window();
- void show_pose();
- void maybe_start_profile_from_executable();
-
- void make_empty_config();
- void make_copied_config();
- void open_config_directory();
- bool refresh_config_list();
+ void show_pose();
+ void show_pose_(const double* mapped, const double* raw);
+ void set_title(const QString& game_title = QString());
void start_tracker_();
void stop_tracker_();
+ void restart_tracker_();
+ void toggle_tracker_();
- void ensure_tray();
+ void set_profile(const QString& new_name, bool migrate = true);
+ void set_profile_in_registry(const QString& profile);
+ void refresh_profile_list();
+ void die_on_profile_not_writable();
+ void maybe_start_profile_from_executable();
+ [[nodiscard]] static bool profile_name_from_dialog(QString& ret);
+
+ void create_empty_profile();
+ void create_copied_profile();
+ void open_profile_directory();
+ void ensure_tray();
void toggle_restore_from_tray(QSystemTrayIcon::ActivationReason e);
- static void set_working_directory();
+ bool tray_enabled();
+ bool start_in_tray();
-signals:
- void start_tracker();
- void stop_tracker();
- void toggle_tracker();
- void restart_tracker();
+ void save_modules();
+
+ void exit(int status = EXIT_SUCCESS);
public:
main_window();
diff --git a/variant/default/main.cpp b/variant/default/main.cpp
index 09bb5e2a..2c1dc607 100644
--- a/variant/default/main.cpp
+++ b/variant/default/main.cpp
@@ -5,13 +5,13 @@
# include <windows.h>
#endif
-#if defined Q_CREATOR_RUN
+#ifdef __clang__
# pragma GCC diagnostic ignored "-Wmain"
#endif
int main(int argc, char** argv)
{
- return run_application(argc, argv, [] { return new main_window; });
+ return run_application(argc, argv, [] { return std::make_unique<main_window>(); });
}
#if defined _MSC_VER
diff --git a/variant/default/new_file_dialog.h b/variant/default/new_file_dialog.h
index 5669e4a9..7244e524 100644
--- a/variant/default/new_file_dialog.h
+++ b/variant/default/new_file_dialog.h
@@ -11,7 +11,7 @@ class new_file_dialog : public QDialog
{
Q_OBJECT
public:
- new_file_dialog(QWidget* parent = 0);
+ new_file_dialog(QWidget* parent = nullptr);
bool is_ok(QString& name_);
private:
diff --git a/variant/trackmouse/CMakeLists.txt b/variant/trackmouse/CMakeLists.txt
index c57479d4..6240d4b3 100644
--- a/variant/trackmouse/CMakeLists.txt
+++ b/variant/trackmouse/CMakeLists.txt
@@ -6,4 +6,4 @@ set_target_properties(opentrack-executable PROPERTIES
PREFIX ""
)
-target_link_libraries(opentrack-executable opentrack-user-interface)
+target_link_libraries(${self} opentrack-user-interface opentrack-version)
diff --git a/variant/trackmouse/window.cpp b/variant/trackmouse/window.cpp
index a1160c50..d6c8a8dd 100644
--- a/variant/trackmouse/window.cpp
+++ b/variant/trackmouse/window.cpp
@@ -184,9 +184,16 @@ main_window::~main_window()
if (work)
{
stop_tracker_();
- QEventLoop ev;
- ev.processEvents();
- portable::sleep(2000);
+ close();
+
+ constexpr int inc = 100, max = 2000;
+
+ for (int k = 0; k < max; k += inc)
+ {
+ QEventLoop ev;
+ ev.processEvents();
+ portable::sleep(inc);
+ }
}
exit();
@@ -309,9 +316,6 @@ void main_window::stop_tracker_()
update_button_state(false, false);
set_title();
ui.btnStartTracker->setFocus();
-
- // ps3 eye issues
- portable::sleep(1000);
}
void main_window::set_title(const QString& game_title)
diff --git a/variant/trackmouse/window.hpp b/variant/trackmouse/window.hpp
index fd5d5f44..2c196852 100644
--- a/variant/trackmouse/window.hpp
+++ b/variant/trackmouse/window.hpp
@@ -70,7 +70,7 @@ class main_window final : public QMainWindow, private State
bool maybe_die_on_config_not_writable(const QString& current);
void die_on_config_not_writable();
- static constexpr inline int save_settings_interval_ms = 2500;
+ static constexpr int save_settings_interval_ms = 2500;
private slots:
void save_modules();