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
|
#include "ControlEditorDC.h"
#include "Camera.h"
#include "ConnectionLine.h"
ControlEditorDC::ControlEditorDC(wxWindow* parent, int ioflags) : ControlEditor(parent)
{
BuildControlElementPanel();
m_camera = new Camera();
m_selectionRect = wxRect2DDouble(0, 0, 0, 0);
m_ioFlags = ioflags;
// Disconnect events from GLCanvas
m_glCanvas->Disconnect(wxEVT_PAINT, wxPaintEventHandler(ControlEditor::OnPaint), nullptr, this);
m_glCanvas->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(ControlEditor::OnLeftClickDown), nullptr, this);
m_glCanvas->Disconnect(wxEVT_LEFT_UP, wxMouseEventHandler(ControlEditor::OnLeftClickUp), nullptr, this);
m_glCanvas->Disconnect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(ControlEditor::OnDoubleClick), nullptr, this);
m_glCanvas->Disconnect(wxEVT_MIDDLE_DOWN, wxMouseEventHandler(ControlEditor::OnMiddleDown), nullptr, this);
m_glCanvas->Disconnect(wxEVT_MIDDLE_UP, wxMouseEventHandler(ControlEditor::OnMiddleUp), nullptr, this);
m_glCanvas->Disconnect(wxEVT_MOTION, wxMouseEventHandler(ControlEditor::OnMouseMotion), nullptr, this);
m_glCanvas->Disconnect(wxEVT_MOUSEWHEEL, wxMouseEventHandler(ControlEditor::OnScroll), nullptr, this);
m_glCanvas->Disconnect(wxEVT_IDLE, wxIdleEventHandler(ControlEditor::OnIdle), nullptr, this);
m_glCanvas->Disconnect(wxEVT_KEY_DOWN, wxKeyEventHandler(ControlEditor::OnKeyDown), nullptr, this);
// Reconnect events to this
m_panelWorkspace->Connect(wxEVT_PAINT, wxPaintEventHandler(ControlEditorDC::OnPaint), nullptr, this); // Connect to overloaded method
m_panelWorkspace->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(ControlEditor::OnLeftClickDown), nullptr, this);
m_panelWorkspace->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(ControlEditor::OnLeftClickUp), nullptr, this);
m_panelWorkspace->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(ControlEditor::OnDoubleClick), nullptr, this);
m_panelWorkspace->Connect(wxEVT_MIDDLE_DOWN, wxMouseEventHandler(ControlEditor::OnMiddleDown), nullptr, this);
m_panelWorkspace->Connect(wxEVT_MIDDLE_UP, wxMouseEventHandler(ControlEditor::OnMiddleUp), nullptr, this);
m_panelWorkspace->Connect(wxEVT_MOTION, wxMouseEventHandler(ControlEditor::OnMouseMotion), nullptr, this);
m_panelWorkspace->Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler(ControlEditor::OnScroll), nullptr, this);
m_panelWorkspace->Connect(wxEVT_IDLE, wxIdleEventHandler(ControlEditorDC::OnIdle), nullptr, this); // Connect to overloaded method
m_panelWorkspace->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(ControlEditor::OnKeyDown), nullptr, this);
m_panelWorkspace->GetSizer()->Remove(m_panelWorkspace->GetSizer()->GetChildren()[0]->GetId()); // remove m_glCanvas object from sizer
delete m_glCanvas; // Delete GLcanvas to allow drawing with wxDC
m_glCanvas = nullptr;
if (m_glContext) delete m_glContext;
m_glContext = nullptr;
m_panelWorkspace->SetBackgroundColour(wxColour(255, 255, 255));
m_panelWorkspace->SetBackgroundStyle(wxBG_STYLE_PAINT); // To allow wxBufferedPaintDC works properly.
Redraw();
}
ControlEditorDC::~ControlEditorDC()
{
// Recreate the GLCanvas. This is necessary to prevent WorkspaceBase destructor access nullptr.
// Also avoid the code editing of WorkspaceBase, since is automatically generated by wxCrafter.
// TODO(?): Find a better way to solve this problem.
m_glCanvas = new wxGLCanvas(this);
}
void ControlEditorDC::OnPaint(wxPaintEvent& event)
{
wxBufferedPaintDC dc(m_panelWorkspace);
dc.Clear();
wxGraphicsContext* gc = wxGraphicsContext::Create(dc);
// Draw
if (gc) {
gc->Scale(m_camera->GetScale(), m_camera->GetScale());
gc->Translate(m_camera->GetTranslation().m_x, m_camera->GetTranslation().m_y);
for (auto line : m_connectionList) {
//ConnectionLine* line = *it;
line->DrawDC(m_camera->GetTranslation(), m_camera->GetScale(), gc);
}
for (auto element : m_elementList) {
element->DrawDC(m_camera->GetTranslation(), m_camera->GetScale(), gc);
}
// Selection rectangle
gc->SetPen(wxPen(wxColour(0, 125, 255, 255)));
gc->SetBrush(wxBrush(wxColour(0, 125, 255, 125)));
gc->DrawRectangle(m_selectionRect.m_x, m_selectionRect.m_y, m_selectionRect.m_width, m_selectionRect.m_height);
delete gc;
}
event.Skip();
}
|