summaryrefslogtreecommitdiffstats
path: root/src/yuzu/configuration/configure_touch_widget.h
blob: 49f533afe2b10f943f8a8b584e96667aa268c417 (plain) (blame)
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
// SPDX-FileCopyrightText: 2020 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <optional>
#include <utility>
#include <vector>
#include <QFrame>
#include <QPointer>

class QLabel;

// Widget for representing touchscreen coordinates
class TouchScreenPreview : public QFrame {
    Q_OBJECT
    Q_PROPERTY(QColor dotHighlightColor MEMBER dot_highlight_color)

public:
    explicit TouchScreenPreview(QWidget* parent);
    ~TouchScreenPreview() override;

    void SetCoordLabel(QLabel*);
    int AddDot(int device_x, int device_y);
    void RemoveDot(int id);
    void HighlightDot(int id, bool active = true) const;
    void MoveDot(int id, int device_x, int device_y) const;

signals:
    void DotAdded(const QPoint& pos);
    void DotSelected(int dot_id);
    void DotMoved(int dot_id, const QPoint& pos);

protected:
    void resizeEvent(QResizeEvent*) override;
    void mouseMoveEvent(QMouseEvent*) override;
    void leaveEvent(QEvent*) override;
    void mousePressEvent(QMouseEvent*) override;
    bool eventFilter(QObject*, QEvent*) override;

private:
    std::optional<QPoint> MapToDeviceCoords(int screen_x, int screen_y) const;
    void PositionDot(QLabel* dot, int device_x = -1, int device_y = -1) const;

    bool ignore_resize = false;
    QPointer<QLabel> coord_label;

    std::vector<std::pair<int, QLabel*>> dots;
    int max_dot_id = 0;
    QColor dot_highlight_color;
    static constexpr char PropId[] = "dot_id";
    static constexpr char PropX[] = "device_x";
    static constexpr char PropY[] = "device_y";

    struct DragState {
        bool active = false;
        QPointer<QLabel> dot;
        QPoint start_pos;
    };
    DragState drag_state;
};