diff options
Diffstat (limited to 'variant/default/main-window.hpp')
-rw-r--r-- | variant/default/main-window.hpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/variant/default/main-window.hpp b/variant/default/main-window.hpp new file mode 100644 index 00000000..844542f1 --- /dev/null +++ b/variant/default/main-window.hpp @@ -0,0 +1,158 @@ +/* Copyright (c) 2013-2016, Stanislaw Halik <sthalik@misaki.pl> + + * Permission to use, copy, modify, and/or distribute this + * software for any purpose with or without fee is hereby granted, + * provided that the above copyright notice and this permission + * notice appear in all copies. + */ + +#pragma once + +#include "api/plugin-support.hpp" +#include "gui/mapping-dialog.hpp" +#include "gui/settings.hpp" +#include "gui/process_detector.h" +#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 <QApplication> +#include <QMainWindow> +#include <QKeySequence> +#include <QShortcut> +#include <QPixmap> +#include <QTimer> +#include <QSystemTrayIcon> +#include <QString> +#include <QMenu> +#include <QAction> +#include <QEvent> +#include <QCloseEvent> + +#include <vector> +#include <tuple> +#include <memory> + +#include "gui/ui_main-window.h" + +using namespace options; + +class main_window : public QMainWindow, private State +{ + Q_OBJECT + + Ui::main_window ui; + + Shortcuts global_shortcuts; + module_settings m; + std::unique_ptr<QSystemTrayIcon> tray; + QMenu tray_menu; + QTimer pose_update_timer { this }; + QTimer det_timer; + QTimer config_list_timer; + 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; + + process_detector_worker det; + QMenu profile_menu; + + QAction menu_action_header { &tray_menu }, + menu_action_show { &tray_menu }, + menu_action_exit { &tray_menu }, + menu_action_tracker { &tray_menu }, + menu_action_filter { &tray_menu }, + menu_action_proto { &tray_menu }, + menu_action_options { &tray_menu }, + menu_action_mappings { &tray_menu }; + + std::shared_ptr<dylib> current_tracker() + { + return modules.trackers().value(ui.iconcomboTrackerSource->currentIndex(), nullptr); + } + std::shared_ptr<dylib> current_protocol() + { + return modules.protocols().value(ui.iconcomboProtocol->currentIndex(), nullptr); + } + std::shared_ptr<dylib> current_filter() + { + return modules.filters().value(ui.iconcomboFilter->currentIndex(), nullptr); + } + + void update_button_state(bool running, bool inertialp); + void display_pose(const double* mapped, const double* raw); + void set_title(const QString& game_title = QStringLiteral("")); + static bool get_new_config_name_from_dialog(QString &ret); + void set_profile_in_registry(const QString& profile); + void register_shortcuts(); + void set_keys_enabled(bool flag); + bool is_config_listed(const QString& name); + + void init_tray(); + + void changeEvent(QEvent* e) override; + void closeEvent(QCloseEvent* ev) override; + bool event(QEvent *event) override; + bool maybe_hide_to_tray(QEvent* e); +#if !defined _WIN32 && !defined __APPLE__ + void annoy_if_root(); +#endif + + // only use in impl file since no definition in header! + template<typename t> + bool mk_dialog(std::shared_ptr<dylib> lib, std::unique_ptr<t>& d); + + // idem + template<typename t, typename... Args> + inline bool mk_window(std::unique_ptr<t>& place, Args&&... params); + + // idem + template<typename t, typename F> + bool mk_window_common(std::unique_ptr<t>& d, F&& ctor); + +private slots: + void save_modules(); + void exit(int status = EXIT_SUCCESS); + bool set_profile(const QString& new_name); + + 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 start_tracker_(); + void stop_tracker_(); + + void ensure_tray(); + + void toggle_restore_from_tray(QSystemTrayIcon::ActivationReason e); + +signals: + void start_tracker(); + void stop_tracker(); + void toggle_tracker(); + void restart_tracker(); +public: + main_window(); + ~main_window(); + static void set_working_directory(); + 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(); +}; |