diff options
Diffstat (limited to 'variant')
-rw-r--r-- | variant/default/CMakeLists.txt | 2 | ||||
-rw-r--r-- | variant/default/_variant.cmake | 4 | ||||
-rw-r--r-- | variant/default/main-window.cpp | 582 | ||||
-rw-r--r-- | variant/default/main-window.hpp | 95 | ||||
-rw-r--r-- | variant/default/main.cpp | 4 | ||||
-rw-r--r-- | variant/default/new_file_dialog.h | 2 | ||||
-rw-r--r-- | variant/trackmouse/CMakeLists.txt | 2 | ||||
-rw-r--r-- | variant/trackmouse/window.cpp | 16 | ||||
-rw-r--r-- | variant/trackmouse/window.hpp | 2 |
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(); |