From 132350f8c5161a5daf4f202ac02cb5f4c0463915 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 12 Oct 2018 17:02:00 +0200 Subject: variant/trackmouse: copy-paste from default on short notice --- variant/trackmouse/_variant.cmake | 6 +- variant/trackmouse/lang/nl_NL.ts | 67 ++++++ variant/trackmouse/lang/ru_RU.ts | 67 ++++++ variant/trackmouse/lang/stub.ts | 67 ++++++ variant/trackmouse/lang/zh_CN.ts | 71 ++++++ variant/trackmouse/trackmouse-settings.cpp | 27 ++- variant/trackmouse/window.cpp | 332 ++++++++++++++++++++++++++++- variant/trackmouse/window.hpp | 81 ++++++- variant/trackmouse/window.ui | 79 +++++-- 9 files changed, 754 insertions(+), 43 deletions(-) create mode 100644 variant/trackmouse/lang/zh_CN.ts (limited to 'variant') diff --git a/variant/trackmouse/_variant.cmake b/variant/trackmouse/_variant.cmake index b54ecf52..404c28ec 100644 --- a/variant/trackmouse/_variant.cmake +++ b/variant/trackmouse/_variant.cmake @@ -11,9 +11,11 @@ function(otr_init_variant) "logic" "dinput" "gui" - "pose-widget" "spline" "cv" - "migration") + "migration" + "executable" + "pose-widget" + ) set_property(GLOBAL PROPERTY opentrack-subprojects "${subprojects}") endfunction() diff --git a/variant/trackmouse/lang/nl_NL.ts b/variant/trackmouse/lang/nl_NL.ts index 9e739505..572fd4e7 100644 --- a/variant/trackmouse/lang/nl_NL.ts +++ b/variant/trackmouse/lang/nl_NL.ts @@ -1,4 +1,71 @@ + + main_window + + The Octopus is sad + + + + :: + + + + trackmouse prototype + + + + Keyboard shortcuts + + + + start/stop tracking + + + + Alt+F10 + + + + center + + + + Alt+F11 + + + + freeze + + + + Alt+F12 + + + + Sensitivity + + + + 100% + + + + Start + + + + Stop + + + + Check permissions for your .ini directory: + +%1"%2 + +Exiting now. + + + diff --git a/variant/trackmouse/lang/ru_RU.ts b/variant/trackmouse/lang/ru_RU.ts index f62cf2e1..7b3b9d0b 100644 --- a/variant/trackmouse/lang/ru_RU.ts +++ b/variant/trackmouse/lang/ru_RU.ts @@ -1,4 +1,71 @@ + + main_window + + The Octopus is sad + + + + :: + + + + trackmouse prototype + + + + Keyboard shortcuts + + + + start/stop tracking + + + + Alt+F10 + + + + center + + + + Alt+F11 + + + + freeze + + + + Alt+F12 + + + + Sensitivity + + + + 100% + + + + Start + + + + Stop + + + + Check permissions for your .ini directory: + +%1"%2 + +Exiting now. + + + diff --git a/variant/trackmouse/lang/stub.ts b/variant/trackmouse/lang/stub.ts index 6401616d..ce91cd32 100644 --- a/variant/trackmouse/lang/stub.ts +++ b/variant/trackmouse/lang/stub.ts @@ -1,4 +1,71 @@ + + main_window + + The Octopus is sad + + + + :: + + + + trackmouse prototype + + + + Keyboard shortcuts + + + + start/stop tracking + + + + Alt+F10 + + + + center + + + + Alt+F11 + + + + freeze + + + + Alt+F12 + + + + Sensitivity + + + + 100% + + + + Start + + + + Stop + + + + Check permissions for your .ini directory: + +%1"%2 + +Exiting now. + + + diff --git a/variant/trackmouse/lang/zh_CN.ts b/variant/trackmouse/lang/zh_CN.ts new file mode 100644 index 00000000..ce91cd32 --- /dev/null +++ b/variant/trackmouse/lang/zh_CN.ts @@ -0,0 +1,71 @@ + + + + + main_window + + The Octopus is sad + + + + :: + + + + trackmouse prototype + + + + Keyboard shortcuts + + + + start/stop tracking + + + + Alt+F10 + + + + center + + + + Alt+F11 + + + + freeze + + + + Alt+F12 + + + + Sensitivity + + + + 100% + + + + Start + + + + Stop + + + + Check permissions for your .ini directory: + +%1"%2 + +Exiting now. + + + + diff --git a/variant/trackmouse/trackmouse-settings.cpp b/variant/trackmouse/trackmouse-settings.cpp index 1df88a2d..6d23438c 100644 --- a/variant/trackmouse/trackmouse-settings.cpp +++ b/variant/trackmouse/trackmouse-settings.cpp @@ -47,9 +47,9 @@ static void force_main_settings() module_settings m; - m.tracker_dll = "PointTracker 1.1"; - m.protocol_dll = "Mouse"; - m.filter_dll = "Accela"; + m.tracker_dll = "pt"; + m.protocol_dll = "win32-mouse"; + m.filter_dll = "accela"; s.b->save(); s.b_map->save(); @@ -85,6 +85,7 @@ static void force_pt_settings() static void force_mouse_settings() { + mouse_settings s; s.Mouse_X = Yaw + 1; @@ -98,13 +99,29 @@ static void force_accela_settings() // TODO } +static void force_shortcut_settings() +{ + main_settings s; + s.key_toggle_tracking1.keycode = "Alt+F10"; + s.key_center1.keycode = "Alt+F11"; + s.key_toggle_press1.keycode = "Alt+F12"; + + for (key_opts* k : { &s.key_toggle_tracking1, &s.key_center1, &s.key_toggle_press1 }) + { + k->button = -1; + k->guid = {}; + } + s.b->save(); +} + void force_trackmouse_settings() { - group::with_settings_object([](QSettings&) { // batch config save + options::globals::with_settings_object([](QSettings&) { force_main_settings(); force_spline_settings(); force_pt_settings(); force_mouse_settings(); force_accela_settings(); - }); + force_shortcut_settings(); + }); } diff --git a/variant/trackmouse/window.cpp b/variant/trackmouse/window.cpp index 73f91c74..bb94f1da 100644 --- a/variant/trackmouse/window.cpp +++ b/variant/trackmouse/window.cpp @@ -1,22 +1,338 @@ +/* Copyright (c) 2013-2018, Stanislaw Halik + + * 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 "window.hpp" +#include "options/options.hpp" +#include "migration/migration.hpp" +#include "compat/check-visible.hpp" +#include "compat/sleep.hpp" +#include "compat/macros.hpp" +#include "compat/library-path.hpp" +#include "compat/math.hpp" +#include +#include +#include + +#include +#include +#include +#include +#include +#include #include -void force_trackmouse_settings(); +extern "C" const char* const opentrack_version; -void window::closeEvent(QCloseEvent* e) -{ - e->accept(); - QApplication::exit(0); -} +using namespace options::globals; +using namespace options; + +#if !defined EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif -window::window() : QMainWindow() +#if !defined EXIT_FAILURE +# define EXIT_FAILURE 1 +#endif + +/* FreeBSD sysexits(3) + * + * The input data was incorrect in some way. This + * should only be used for user's data and not system + * files. + */ + +#if !defined EX_OSFILE +# define EX_OSFILE 72 +#endif + +void force_trackmouse_settings(); + +main_window::main_window() : State(OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH) { ui.setupUi(this); - setAttribute(Qt::WA_QuitOnClose); + + update_button_state(false, false); + + // ctrl+q exits + connect(&kbd_quit, SIGNAL(activated()), this, SLOT(exit())); + + if (!set_profile()) + { + die_on_config_not_writable(); + exit(EX_OSFILE); + return; + } + + // only tie and connect main screen options after migrations are done + // below is fine, set_profile() is called already + + 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(ui.btnStartTracker, SIGNAL(clicked()), this, SLOT(start_tracker_())); + connect(ui.btnStopTracker, SIGNAL(clicked()), this, SLOT(stop_tracker_())); force_trackmouse_settings(); + register_shortcuts(); + kbd_quit.setEnabled(true); + + setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | windowFlags()); + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + adjustSize(); + + setVisible(true); show(); } +void main_window::register_shortcuts() +{ + global_shortcuts.reload({ + { s.key_toggle_tracking1, [this](bool) { main_window::toggle_tracker_(); }, true }, + }); + + if (work) + work->reload_shortcuts(); +} + +void main_window::die_on_config_not_writable() +{ + stop_tracker_(); + + static const QString pad(16, QChar(' ')); + + QMessageBox::critical(this, + tr("The Octopus is sad"), + tr("Check permissions for your .ini directory:\n\n%1\"%2\n\n" + "Exiting now." + ).arg(ini_directory(), pad), + QMessageBox::Close, QMessageBox::NoButton); + + exit(EX_OSFILE); +} + +bool main_window::maybe_die_on_config_not_writable(const QString& current) +{ + const bool writable = + with_settings_object([&](QSettings& s) { + return s.isWritable(); + }); + + if (writable) + return false; + + if (!QFile(ini_combine(current)).open(QFile::ReadWrite)) + { + die_on_config_not_writable(); + return true; + } + + return false; +} + +main_window::~main_window() +{ + // stupid ps3 eye has LED issues + if (work) + { + stop_tracker_(); + QEventLoop ev; + ev.processEvents(); + portable::sleep(2000); + } + + exit(); +} + +void main_window::set_working_directory() +{ + QDir::setCurrent(OPENTRACK_BASE_PATH); +} + +void main_window::save_modules() +{ + m.b->save(); +} + +std::tuple +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, 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) +{ + bool not_running = !running; +#if 0 + ui.iconcomboProfile->setEnabled(not_running); + ui.btnStartTracker->setEnabled(not_running); + ui.btnStopTracker->setEnabled(running); + ui.iconcomboProtocol->setEnabled(not_running); + ui.iconcomboFilter->setEnabled(not_running); + ui.iconcomboTrackerSource->setEnabled(not_running); + ui.profile_button->setEnabled(not_running); +#endif + ui.video_frame_label->setVisible(not_running || inertialp); + if(not_running) + { + ui.video_frame_label->setPixmap(QPixmap(":/images/tracking-not-started.png")); + } + else { + ui.video_frame_label->setPixmap(QPixmap(":/images/no-feed.png")); + } +} + +void main_window::start_tracker_() +{ + if (work) + return; + + work = std::make_shared(pose, ev, ui.video_frame, current_tracker(), current_protocol(), current_filter()); + + if (!work->is_ok()) + { + work = nullptr; + return; + } + + if (pTrackerDialog) + pTrackerDialog->register_tracker(work->libs.pTracker.get()); + + if (pFilterDialog) + pFilterDialog->register_filter(work->libs.pFilter.get()); + + if (pProtocolDialog) + pProtocolDialog->register_protocol(work->libs.pProtocol.get()); + + // NB check valid since SelectedLibraries ctor called + // trackers take care of layout state updates + const bool is_inertial = ui.video_frame->layout() == nullptr; + update_button_state(true, is_inertial); + + ui.btnStopTracker->setFocus(); +} + +void main_window::stop_tracker_() +{ + if (!work) + return; + + with_tracker_teardown sentinel; + + if (pTrackerDialog) + pTrackerDialog->unregister_tracker(); + + if (pProtocolDialog) + pProtocolDialog->unregister_protocol(); + + if (pFilterDialog) + pFilterDialog->unregister_filter(); + + work = nullptr; + + 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) +{ + static const QString version{opentrack_version}; + static const QString sep { tr(" :: ") }; + static const QString pat1{ version + sep + "%1" + sep + "%2" }; + static const QString pat2{ version + sep + "%1" }; + + const QString current = ini_filename(); + + if (game_title.isEmpty()) + setWindowTitle(pat2.arg(current)); + else + setWindowTitle(pat1.arg(current, game_title)); +} + +void main_window::exit(int status) +{ + QApplication::setQuitOnLastWindowClosed(true); + close(); + QApplication::exit(status); +} + +bool main_window::set_profile() +{ + if (maybe_die_on_config_not_writable(OPENTRACK_DEFAULT_CONFIG)) + return false; + + set_profile_in_registry(); + + options::detail::bundler::refresh_all_bundles(); + + // migrations are for config layout changes and other user-visible + // incompatibilities in future versions + run_migrations(); + + set_title(); + + return true; +} + +void main_window::closeEvent(QCloseEvent*) +{ + exit(); +} + +void main_window::set_profile_in_registry() +{ + with_global_settings_object([&](QSettings& s) { + s.setValue(OPENTRACK_CONFIG_FILENAME_KEY, OPENTRACK_DEFAULT_CONFIG); + }); +} + +void main_window::toggle_tracker_() +{ + if (work) + stop_tracker(); + else + start_tracker(); +} diff --git a/variant/trackmouse/window.hpp b/variant/trackmouse/window.hpp index e5c34410..af3a3043 100644 --- a/variant/trackmouse/window.hpp +++ b/variant/trackmouse/window.hpp @@ -1,17 +1,86 @@ #pragma once -#include "ui_window.h" +/* Copyright (c) 2013-2016, Stanislaw Halik + + * 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. + */ + +#pragma once + +#include "api/plugin-support.hpp" +#include "logic/main-settings.hpp" +#include "logic/pipeline.hpp" +#include "logic/shortcuts.h" +#include "logic/work.hpp" +#include "logic/state.hpp" +#include "options/options.hpp" + #include -#include +#include +#include +#include +#include +#include -class window : public QMainWindow +#include +#include + +#include "ui_window.h" + +class main_window final : public QMainWindow, private State { Q_OBJECT Ui::window ui; - void closeEvent(QCloseEvent* e) override; -public: - window(); + Shortcuts global_shortcuts; + module_settings m; + + QShortcut kbd_quit { QKeySequence("Ctrl+Q"), this }; + std::unique_ptr pFilterDialog; + std::unique_ptr pProtocolDialog; + std::unique_ptr pTrackerDialog; + + using dylib_ptr = Modules::dylib_ptr; + using dylib_list = Modules::dylib_list; + static std::tuple module_by_name(const QString& name, Modules::dylib_list& list); + + dylib_ptr current_tracker(); + dylib_ptr current_protocol(); + dylib_ptr current_filter(); + + void update_button_state(bool running, bool inertialp); + + void set_title(const QString& game_title = QString()); + + void set_profile_in_registry(); + void register_shortcuts(); + + void closeEvent(QCloseEvent *event) override; + + bool maybe_die_on_config_not_writable(const QString& current); + void die_on_config_not_writable(); + +private slots: + void save_modules(); + void exit(int status = EXIT_SUCCESS); + bool set_profile(); + + void start_tracker_(); + void stop_tracker_(); + void toggle_tracker_(); + + static void set_working_directory(); + +signals: + void start_tracker(); + void stop_tracker(); + +public: + main_window(); + ~main_window() override; }; diff --git a/variant/trackmouse/window.ui b/variant/trackmouse/window.ui index 9501c5c2..f9a45daf 100644 --- a/variant/trackmouse/window.ui +++ b/variant/trackmouse/window.ui @@ -186,24 +186,6 @@ Keyboard shortcuts - - 12 - - - 6 - - - 40 - - - 6 - - - 30 - - - 6 - @@ -226,7 +208,7 @@ - + @@ -246,6 +228,9 @@ Alt+F10 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -270,8 +255,55 @@ - + + + + 0 + 0 + + + + + 12 + 75 + true + PreferAntialias + false + + + + Alt+F11 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + PreferAntialias + false + + + + freeze + + + + + 0 @@ -290,6 +322,9 @@ Alt+F12 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -364,7 +399,7 @@ 3 - + 0 @@ -387,7 +422,7 @@ - + 0 -- cgit v1.2.3