From 47d4b25bd0583b1fd65ae885950efd34c9df256b Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 28 Mar 2019 13:40:33 +0100 Subject: cmake: move around variant directories --- trackmouse/CMakeLists.txt | 9 + trackmouse/images/start.png | Bin 0 -> 1400 bytes trackmouse/images/stop.png | Bin 0 -> 5790 bytes trackmouse/lang/nl_NL.ts | 74 ++++++ trackmouse/lang/ru_RU.ts | 74 ++++++ trackmouse/lang/stub.ts | 74 ++++++ trackmouse/lang/zh_CN.ts | 74 ++++++ trackmouse/main.cpp | 18 ++ trackmouse/trackmouse-res.qrc | 6 + trackmouse/trackmouse-settings.cpp | 132 +++++++++++ trackmouse/trackmouse.ico | Bin 0 -> 67134 bytes trackmouse/trackmouse.rc | 2 + trackmouse/window.cpp | 388 +++++++++++++++++++++++++++++++ trackmouse/window.hpp | 94 ++++++++ trackmouse/window.ui | 458 +++++++++++++++++++++++++++++++++++++ 15 files changed, 1403 insertions(+) create mode 100644 trackmouse/CMakeLists.txt create mode 100644 trackmouse/images/start.png create mode 100644 trackmouse/images/stop.png create mode 100644 trackmouse/lang/nl_NL.ts create mode 100644 trackmouse/lang/ru_RU.ts create mode 100644 trackmouse/lang/stub.ts create mode 100644 trackmouse/lang/zh_CN.ts create mode 100644 trackmouse/main.cpp create mode 100644 trackmouse/trackmouse-res.qrc create mode 100644 trackmouse/trackmouse-settings.cpp create mode 100644 trackmouse/trackmouse.ico create mode 100644 trackmouse/trackmouse.rc create mode 100644 trackmouse/window.cpp create mode 100644 trackmouse/window.hpp create mode 100644 trackmouse/window.ui (limited to 'trackmouse') diff --git a/trackmouse/CMakeLists.txt b/trackmouse/CMakeLists.txt new file mode 100644 index 00000000..6240d4b3 --- /dev/null +++ b/trackmouse/CMakeLists.txt @@ -0,0 +1,9 @@ +otr_module(executable EXECUTABLE BIN) + +set_target_properties(opentrack-executable PROPERTIES + SUFFIX "${opentrack-binary-suffix}" + OUTPUT_NAME "trackmouse" + PREFIX "" +) + +target_link_libraries(${self} opentrack-user-interface opentrack-version) diff --git a/trackmouse/images/start.png b/trackmouse/images/start.png new file mode 100644 index 00000000..b8e6f271 Binary files /dev/null and b/trackmouse/images/start.png differ diff --git a/trackmouse/images/stop.png b/trackmouse/images/stop.png new file mode 100644 index 00000000..0ff13bd5 Binary files /dev/null and b/trackmouse/images/stop.png differ diff --git a/trackmouse/lang/nl_NL.ts b/trackmouse/lang/nl_NL.ts new file mode 100644 index 00000000..92f790af --- /dev/null +++ b/trackmouse/lang/nl_NL.ts @@ -0,0 +1,74 @@ + + + + + main_window + + The Octopus is sad + + + + :: + + + + Check permissions for your .ini directory: + +%1"%2 + +Exiting now. + + + + + window + + trackmouse prototype + + + + Keyboard shortcuts + + + + start/stop tracking + + + + Alt+F10 + + + + center + + + + Alt+F11 + + + + Alt+F12 + + + + Sensitivity + + + + 100% + + + + Start + + + + Stop + + + + freeze toggle + + + + diff --git a/trackmouse/lang/ru_RU.ts b/trackmouse/lang/ru_RU.ts new file mode 100644 index 00000000..dd9011c4 --- /dev/null +++ b/trackmouse/lang/ru_RU.ts @@ -0,0 +1,74 @@ + + + + + main_window + + The Octopus is sad + + + + :: + + + + Check permissions for your .ini directory: + +%1"%2 + +Exiting now. + + + + + window + + trackmouse prototype + + + + Keyboard shortcuts + + + + start/stop tracking + + + + Alt+F10 + + + + center + + + + Alt+F11 + + + + Alt+F12 + + + + Sensitivity + + + + 100% + + + + Start + + + + Stop + + + + freeze toggle + + + + diff --git a/trackmouse/lang/stub.ts b/trackmouse/lang/stub.ts new file mode 100644 index 00000000..968e31c5 --- /dev/null +++ b/trackmouse/lang/stub.ts @@ -0,0 +1,74 @@ + + + + + main_window + + The Octopus is sad + + + + :: + + + + Check permissions for your .ini directory: + +%1"%2 + +Exiting now. + + + + + window + + trackmouse prototype + + + + Keyboard shortcuts + + + + start/stop tracking + + + + Alt+F10 + + + + center + + + + Alt+F11 + + + + Alt+F12 + + + + Sensitivity + + + + 100% + + + + Start + + + + Stop + + + + freeze toggle + + + + diff --git a/trackmouse/lang/zh_CN.ts b/trackmouse/lang/zh_CN.ts new file mode 100644 index 00000000..968e31c5 --- /dev/null +++ b/trackmouse/lang/zh_CN.ts @@ -0,0 +1,74 @@ + + + + + main_window + + The Octopus is sad + + + + :: + + + + Check permissions for your .ini directory: + +%1"%2 + +Exiting now. + + + + + window + + trackmouse prototype + + + + Keyboard shortcuts + + + + start/stop tracking + + + + Alt+F10 + + + + center + + + + Alt+F11 + + + + Alt+F12 + + + + Sensitivity + + + + 100% + + + + Start + + + + Stop + + + + freeze toggle + + + + diff --git a/trackmouse/main.cpp b/trackmouse/main.cpp new file mode 100644 index 00000000..2313e1ac --- /dev/null +++ b/trackmouse/main.cpp @@ -0,0 +1,18 @@ +#include "gui/init.hpp" +#include "window.hpp" + +#if defined _WIN32 +# include +#endif + +int main(int argc, char** argv) +{ + return run_application(argc, argv, []() { return new main_window; }); +} + +#if defined _MSC_VER +int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int /* nCmdShow */) +{ + return main(__argc, __argv); +} +#endif diff --git a/trackmouse/trackmouse-res.qrc b/trackmouse/trackmouse-res.qrc new file mode 100644 index 00000000..f351b3f2 --- /dev/null +++ b/trackmouse/trackmouse-res.qrc @@ -0,0 +1,6 @@ + + + images/start.png + images/stop.png + + diff --git a/trackmouse/trackmouse-settings.cpp b/trackmouse/trackmouse-settings.cpp new file mode 100644 index 00000000..45ec36a5 --- /dev/null +++ b/trackmouse/trackmouse-settings.cpp @@ -0,0 +1,132 @@ +#include "logic/main-settings.hpp" +#include "logic/mappings.hpp" + +#include "tracker-pt/pt-settings.hpp" +#include "filter-accela/accela-settings.hpp" +#include "proto-mouse/mouse-settings.hpp" + +#include "options/options.hpp" + +#include + +using namespace options; + +static void force_spline_settings() +{ + main_settings main; + + axis_opts** all_axis_opts = main.all_axis_opts; + Mappings mappings { all_axis_opts }; + + for (unsigned k = 0; k < 6; k++) + { + Map& map = mappings(k); + const QString& prefix = all_axis_opts[k]->prefix(); + + const QString& name1 = map.name; + const QString& name2 = map.alt_name; + + bundle b = make_bundle(prefix); + + spline_detail::settings s1(b, name1, Axis(k)); + spline_detail::settings s2(b, name2, Axis(k)); + + s1.points = QList { { 180, 180 } }; + s2.points = QList { { 180, 180 } }; + + b->save(); + } +} + +static void force_main_settings() +{ + main_settings s; + s.center_at_startup = true; + s.reltrans_mode = reltrans_disabled; + s.neck_enable = false; + + module_settings m; + + m.tracker_dll = "pt"; + m.protocol_dll = "win32-mouse"; + m.filter_dll = "accela"; + + s.b->save(); + s.b_map->save(); +} + +static void force_pt_settings() +{ + pt_settings s("tracker-pt"); + + enum { Clip = 0 }; + + s.active_model_panel = Clip; + // XXX TODO these are Mini Clip Right sizes + s.clip_by = 60; + s.clip_bz = 38.2; + s.clip_ty = 42.2; + s.clip_tz = 12.6; + + s.cam_fps = 60; + s.cam_res_x = 640; + s.cam_res_y = 480; + s.camera_name = "PS3Eye Camera"; + + s.min_point_size = 3.7; + s.max_point_size = 10; + + // XXX TODO auto threshold slider position + s.auto_threshold = true; + s.threshold_slider = slider_value(82., s.threshold_slider->min(), s.threshold_slider->max()); + + s.t_MH_x = 0, s.t_MH_y = 0, s.t_MH_z = 0; + s.blob_color = pt_color_natural; + s.fov = 56; + s.dynamic_pose = false; + + s.b->save(); +} + +static void force_mouse_settings() +{ + + mouse_settings s; + + s.Mouse_X = Yaw + 1; + s.Mouse_Y = Pitch + 1; + + s.b->save(); +} + +static void force_accela_settings() +{ + // XXX TODO +} + +static void force_shortcut_settings() +{ + main_settings s; + s.key_toggle_tracking1.keycode = "Ins"; + s.key_center1.keycode = "PgUp"; + s.key_toggle1.keycode = "PgDown"; + + 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() +{ + 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/trackmouse/trackmouse.ico b/trackmouse/trackmouse.ico new file mode 100644 index 00000000..5cac8da1 Binary files /dev/null and b/trackmouse/trackmouse.ico differ diff --git a/trackmouse/trackmouse.rc b/trackmouse/trackmouse.rc new file mode 100644 index 00000000..8df1e9b1 --- /dev/null +++ b/trackmouse/trackmouse.rc @@ -0,0 +1,2 @@ +#include +IDI_ICON1 ICON "trackmouse.ico" diff --git a/trackmouse/window.cpp b/trackmouse/window.cpp new file mode 100644 index 00000000..d6c8a8dd --- /dev/null +++ b/trackmouse/window.cpp @@ -0,0 +1,388 @@ +/* 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 + +extern "C" const char* const opentrack_version; + +using namespace options::globals; +using namespace options; + +#if !defined EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif + +#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); + + 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(this, &main_window::toggle_tracker, + this, [&] { qDebug() << "toggle tracker"; toggle_tracker_(); }, + Qt::QueuedConnection); + + connect(ui.btnStartTracker, SIGNAL(clicked()), this, SLOT(start_tracker_())); + connect(ui.btnStopTracker, SIGNAL(clicked()), this, SLOT(stop_tracker_())); + + { + tie_setting(mouse.sensitivity_x, ui.sensitivity_slider); + tie_setting(mouse.sensitivity_x, ui.sensitivity_label, + [](double x) { return QString::number(x) + QStringLiteral("%"); }); + // one-way only + tie_setting(mouse.sensitivity_x, this, + [this](double x) { mouse.sensitivity_y = *mouse.sensitivity_x; }); + + // no "ok" button, gotta save on timer + auto save = [this] { + qDebug() << "trackmouse: saving settings"; + mouse.b->save(); + save_settings_timer.stop(); + }; + + auto start_save_timer = [this](double) { + save_settings_timer.start(); + }; + + save_settings_timer.setInterval(save_settings_interval_ms); + save_settings_timer.setSingleShot(true); + + ui.sensitivity_slider->setTracking(false); + connect(&save_settings_timer, &QTimer::timeout, this, save, Qt::DirectConnection); +#if 1 + // this doesn't fire the timer on application load + connect(ui.sensitivity_slider, &QSlider::valueChanged, this, start_save_timer, Qt::DirectConnection); +#else + // but this does so let's not not use it + tie_setting(mouse.sensitivity_x, this, start_save_timer); +#endif + } + + 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_(); + close(); + + constexpr int inc = 100, max = 2000; + + 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(); +} + +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(); +} + +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) +{ + if (exiting_already) + return; + exiting_already = true; + + qDebug() << "trackmouse: saving settings on app exit"; + save_settings_timer.stop(); + mouse.b->save(); + + //close(); + QApplication::setQuitOnLastWindowClosed(true); + 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_() +{ + qDebug() << "toggle tracker"; + if (work) + stop_tracker_(); + else + start_tracker_(); +} diff --git a/trackmouse/window.hpp b/trackmouse/window.hpp new file mode 100644 index 00000000..2c196852 --- /dev/null +++ b/trackmouse/window.hpp @@ -0,0 +1,94 @@ +#pragma once + +/* 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 "ui_window.h" +#include "proto-mouse/mouse-settings.hpp" + +#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 +#include + +class main_window final : public QMainWindow, private State +{ + Q_OBJECT + + Ui::window ui; + + QTimer save_settings_timer { this }; + + Shortcuts global_shortcuts; + module_settings m; + mouse_settings mouse; + + QShortcut kbd_quit { QKeySequence("Ctrl+Q"), this }; + std::unique_ptr pFilterDialog; + std::unique_ptr pProtocolDialog; + std::unique_ptr pTrackerDialog; + bool exiting_already { false }; + + 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(); + + static constexpr int save_settings_interval_ms = 2500; + +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(); + void toggle_tracker(); + +public: + main_window(); + ~main_window() override; +}; diff --git a/trackmouse/window.ui b/trackmouse/window.ui new file mode 100644 index 00000000..c79ae846 --- /dev/null +++ b/trackmouse/window.ui @@ -0,0 +1,458 @@ + + + window + + + + 0 + 0 + 755 + 240 + + + + + 0 + 0 + + + + + 16777215 + 240 + + + + trackmouse prototype + + + + + 0 + 0 + + + + + 16777215 + 240 + + + + + 6 + + + 6 + + + 0 + + + 12 + + + 0 + + + + + + 0 + 0 + + + + + 320 + 240 + + + + + 320 + 240 + + + + + + 0 + 0 + 320 + 240 + + + + + 0 + 0 + + + + + 320 + 240 + + + + + 320 + 240 + + + + + + 0 + 0 + 320 + 240 + + + + + 0 + 0 + + + + + 320 + 240 + + + + + 320 + 240 + + + + + Candara + 37 + 50 + false + true + + + + + + + :/images/tracking-not-started.png + + + false + + + Qt::AlignCenter + + + true + + + + + + + + + + 0 + 0 + + + + + 12 + + + 8 + + + 12 + + + 12 + + + 12 + + + + + Keyboard shortcuts + + + + + + + 0 + 0 + + + + + 12 + 75 + true + PreferAntialias + false + + + + start/stop tracking + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + PreferAntialias + false + + + + Insert + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + PreferAntialias + false + + + + center + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + PreferAntialias + false + + + + Page Up + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + PreferAntialias + false + + + + freeze toggle + + + + + + + + 0 + 0 + + + + + 12 + 75 + true + PreferAntialias + false + + + + Page Down + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + 0 + 0 + + + + Sensitivity + + + + + + + 10 + 0 + + + + 475 + + + 1 + + + Qt::Horizontal + + + QSlider::TicksAbove + + + 50 + + + + + + + + 2 + 0 + + + + 100% + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + 0 + 0 + + + + + 3 + + + 3 + + + + + + 0 + 0 + + + + Start + + + + :/images/images/start.png:/images/images/start.png + + + + 43 + 20 + + + + + + + + + 0 + 0 + + + + Stop + + + + :/images/images/stop.png:/images/images/stop.png + + + + + + + + + + + + + + + + + + -- cgit v1.2.3