summaryrefslogtreecommitdiffhomepage
path: root/gui/ui.h
blob: 7509e3182becf1458671ab33f73889acf67f10dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/* Copyright (c) 2014-2015, 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 <QMainWindow>
#include <QKeySequence>
#include <QShortcut>
#include <QPixmap>
#include <QTimer>
#include <QSystemTrayIcon>
#include <QString>
#include <QMenu>

#include <vector>
#include <tuple>

#include "ui_main.h"

#include "opentrack-compat/options.hpp"
#include "opentrack-logic/main-settings.hpp"
#include "opentrack/plugin-support.hpp"
#include "opentrack-logic/tracker.h"
#include "opentrack-logic/shortcuts.h"
#include "opentrack-logic/work.hpp"
#include "opentrack-logic/state.hpp"
#include "curve-config.h"
#include "options-dialog.hpp"
#include "process_detector.h"

using namespace options;

class MainWindow : public QMainWindow, private State
{
    Q_OBJECT

    Shortcuts global_shortcuts;
    module_settings m;
    Ui::OpentrackUI ui;
    mem<QSystemTrayIcon> tray;
    QTimer pose_update_timer;
    QTimer det_timer;
    QTimer config_list_timer;
    mem<OptionsDialog> options_widget;
    mem<MapWidget> mapping_widget;
    QShortcut kbd_quit;
    mem<IFilterDialog> pFilterDialog;
    mem<IProtocolDialog> pProtocolDialog;
    mem<ITrackerDialog> pTrackerDialog;
    process_detector_worker det;
    QMenu profile_menu;
    bool is_refreshing_profiles;

    mem<dylib> current_tracker()
    {
        return modules.trackers().value(ui.iconcomboTrackerSource->currentIndex(), nullptr);
    }
    mem<dylib> current_protocol()
    {
        return modules.protocols().value(ui.iconcomboProtocol->currentIndex(), nullptr);
    }
    mem<dylib> current_filter()
    {
        return modules.filters().value(ui.iconcomboFilter->currentIndex(), nullptr);
    }

    void load_settings();
    void load_mappings();
    void updateButtonState(bool running, bool inertialp);
    void display_pose(const double* mapped, const double* raw);
    void ensure_tray();
    void set_title(const QString& game_title = QStringLiteral(""));
    static bool get_new_config_name_from_dialog(QString &ret);
    void set_profile(const QString& profile);
    void register_shortcuts();
    void set_keys_enabled(bool flag);
private slots:
    void save_modules();
    void exit();
    void profile_selected(const QString& name);

    void showTrackerSettings();
    void showProtocolSettings();
    void showFilterSettings();
    void show_options_dialog();
    void showCurveConfiguration();
    void showHeadPose();

    void restore_from_tray(QSystemTrayIcon::ActivationReason);
    void maybe_start_profile_from_executable();

    void make_empty_config();
    void make_copied_config();
    void open_config_directory();
    void refresh_config_list();

    void startTracker();
    void stopTracker();
    void reload_options();
signals:
    void emit_start_tracker();
    void emit_stop_tracker();
    void emit_toggle_tracker();
    void emit_restart_tracker();
public:
    MainWindow();
    ~MainWindow();
    static void set_working_directory();
    void warn_on_config_not_writable();
};