summaryrefslogtreecommitdiffstats
path: root/Project/ControlEditor.h
blob: 4a7397c179aa25c6141eec1e0ac1adc2b01711a7 (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
#ifndef CONTROLEDITOR_H
#define CONTROLEDITOR_H

#include "ControlEditorBase.h"
#include <wx/wrapsizer.h>
#include <wx/dcclient.h>
#include <wx/dcscreen.h>
#include <wx/graphics.h>
#include <GL/gl.h>
#include <GL/glu.h>

class Camera;
class Element;
class ControlElement;
class TransferFunction;
class ConnectionLine;
class Sum;
class Multiplier;
class Limiter;
class RateLimiter;
class Exponential;
class Constant;

enum ControlElementButtonID { ID_IO = 0, ID_TF, ID_SUM, ID_CONST, ID_LIMITER, ID_GAIN, ID_MULT, ID_EXP, ID_RATELIM };

class ControlElementButton : public wxWindow
{
public:
    ControlElementButton(wxWindow* parent, wxString label, wxImage image, wxWindowID id = wxID_ANY);
    ~ControlElementButton();

protected:
    virtual void OnPaint(wxPaintEvent& event);
    virtual void OnMouseEnter(wxMouseEvent& event);
    virtual void OnMouseLeave(wxMouseEvent& event);
    virtual void OnLeftClickDown(wxMouseEvent& event);
    virtual void OnLeftClickUp(wxMouseEvent& event);

    wxString m_label;
    wxFont m_font;
    wxPoint m_labelPosition;

    wxImage m_image;
    wxSize m_imageSize;
    wxPoint m_imagePosition;

    int m_borderSize = 2;
    bool m_mouseAbove = false;
    bool m_selected = false;

    wxSize m_buttonSize;
};

class ControlEditor : public ControlEditorBase
{
public:
    enum ControlEditorMode {
        MODE_EDIT = 0,
        MODE_MOVE_ELEMENT,
        MODE_MOVE_LINE,
        MODE_DRAG,
        MODE_DRAG_INSERT,
        MODE_INSERT,
        MODE_INSERT_LINE,
        MODE_SELECTION_RECT,
        MODE_PASTE,
        MODE_DRAG_PASTE
    };
    ControlEditor(wxWindow* parent);
    virtual ~ControlEditor();

    virtual void AddElement(ControlElementButtonID id);
    virtual void Redraw() { m_glCanvas->Refresh(); }
    virtual void RotateSelectedElements(bool clockwise);
    virtual void DeleteSelectedElements();
    virtual void CheckConnections();

protected:
    virtual void OnKeyDown(wxKeyEvent& event);
    virtual void OnIdle(wxIdleEvent& event);
    virtual void OnScroll(wxMouseEvent& event);
    virtual void OnDoubleClick(wxMouseEvent& event);
    virtual void OnLeftClickDown(wxMouseEvent& event);
    virtual void OnLeftClickUp(wxMouseEvent& event);
    virtual void OnMiddleDown(wxMouseEvent& event);
    virtual void OnMiddleUp(wxMouseEvent& event);
    virtual void OnMouseMotion(wxMouseEvent& event);
    virtual void OnPaint(wxPaintEvent& event);
    virtual void LeftClickDown(wxMouseEvent& event);

    void BuildControlElementPanel();
    void SetViewport();

    std::vector<ConnectionLine*>::iterator DeleteLineFromList(std::vector<ConnectionLine*>::iterator& it);

    wxGLContext* m_glContext = NULL;
    Camera* m_camera = NULL;

    ControlEditorMode m_mode = MODE_EDIT;

    wxRect2DDouble m_selectionRect;
    wxPoint2DDouble m_startSelRect;

    std::vector<ControlElement*> m_elementList;
    std::vector<ConnectionLine*> m_connectionList;

    bool m_firstDraw = true;
};
#endif // CONTROLEDITOR_H