summaryrefslogtreecommitdiffstats
path: root/Project/ControlEditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Project/ControlEditor.cpp')
-rw-r--r--Project/ControlEditor.cpp281
1 files changed, 204 insertions, 77 deletions
diff --git a/Project/ControlEditor.cpp b/Project/ControlEditor.cpp
index 1d1587c..f75478c 100644
--- a/Project/ControlEditor.cpp
+++ b/Project/ControlEditor.cpp
@@ -1,6 +1,107 @@
#include "ControlEditor.h"
-ControlEditor::ControlEditor(wxWindow* parent) : ControlEditorBase(parent) { BuildControlElementPanel(); }
+#include "Camera.h"
+#include "ControlElement.h"
+#include "TransferFunction.h"
+
+ControlElementButton::ControlElementButton(wxWindow* parent, wxString label, wxImage image, wxWindowID id)
+ : wxWindow(parent, id)
+{
+ SetBackgroundColour(*wxWHITE);
+ // m_font = wxFont(8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
+ m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+ m_label = label;
+ m_image = image;
+ m_imageSize = wxSize(image.GetWidth(), image.GetHeight());
+
+ // Calculate label size.
+ wxScreenDC dc;
+ dc.SetFont(m_font);
+ wxSize textSize = dc.GetTextExtent(label);
+
+ int buttonWidth = 0;
+ if(textSize.GetWidth() > m_imageSize.GetWidth()) {
+ buttonWidth = textSize.GetWidth();
+ m_imagePosition = wxPoint((buttonWidth - m_imageSize.GetWidth()) / 2 + m_borderSize, m_borderSize);
+ m_labelPosition = wxPoint(m_borderSize, m_imageSize.GetHeight() + m_borderSize);
+ } else {
+ buttonWidth = m_imageSize.GetWidth();
+ m_imagePosition = wxPoint(m_borderSize, m_borderSize);
+ m_labelPosition =
+ wxPoint((buttonWidth - textSize.GetWidth()) / 2 + m_borderSize, m_imageSize.GetHeight() + m_borderSize);
+ }
+ m_buttonSize =
+ wxSize(buttonWidth + 2 * m_borderSize, textSize.GetHeight() + m_imageSize.GetHeight() + 2 * m_borderSize);
+ SetMinSize(m_buttonSize + wxSize(m_borderSize, m_borderSize));
+
+ // Events.
+ Bind(wxEVT_PAINT, &ControlElementButton::OnPaint, this);
+ Bind(wxEVT_ENTER_WINDOW, &ControlElementButton::OnMouseEnter, this);
+ Bind(wxEVT_LEAVE_WINDOW, &ControlElementButton::OnMouseLeave, this);
+ Bind(wxEVT_LEFT_DOWN, &ControlElementButton::OnLeftClickDown, this);
+ Bind(wxEVT_LEFT_UP, &ControlElementButton::OnLeftClickUp, this);
+}
+
+ControlElementButton::~ControlElementButton() {}
+void ControlElementButton::OnPaint(wxPaintEvent& event)
+{
+ wxPaintDC dc(this);
+ wxGraphicsContext* gc = wxGraphicsContext::Create(dc);
+ if(gc) {
+ if(m_mouseAbove) {
+ if(m_selected) {
+ gc->SetPen(wxPen(wxColour(0, 125, 255, 255), m_borderSize - 1));
+ gc->SetBrush(wxBrush(wxColour(0, 125, 255, 100)));
+ } else {
+ gc->SetPen(*wxTRANSPARENT_PEN);
+ gc->SetBrush(wxBrush(wxColour(0, 125, 255, 70)));
+ }
+ gc->DrawRectangle(m_borderSize / 2, m_borderSize / 2, m_buttonSize.GetWidth(), m_buttonSize.GetHeight());
+ }
+ gc->DrawBitmap(gc->CreateBitmapFromImage(m_image), m_imagePosition.x, m_imagePosition.y, m_imageSize.GetWidth(),
+ m_imageSize.GetHeight());
+ gc->SetFont(m_font, *wxBLACK);
+ gc->DrawText(m_label, m_labelPosition.x, m_labelPosition.y);
+ delete gc;
+ }
+}
+
+void ControlElementButton::OnMouseEnter(wxMouseEvent& event)
+{
+ m_mouseAbove = true;
+ Refresh();
+ event.Skip();
+}
+
+void ControlElementButton::OnMouseLeave(wxMouseEvent& event)
+{
+ m_mouseAbove = false;
+ Refresh();
+ event.Skip();
+}
+
+void ControlElementButton::OnLeftClickDown(wxMouseEvent& event)
+{
+ m_selected = true;
+ Refresh();
+ event.Skip();
+}
+
+void ControlElementButton::OnLeftClickUp(wxMouseEvent& event)
+{
+ m_selected = false;
+ Refresh();
+ event.Skip();
+}
+
+ControlEditor::ControlEditor(wxWindow* parent)
+ : ControlEditorBase(parent)
+{
+ BuildControlElementPanel();
+ m_glContext = new wxGLContext(m_glCanvas);
+ m_camera = new Camera();
+ m_selectionRect = wxRect2DDouble(0, 0, 0, 0);
+}
ControlEditor::~ControlEditor()
{
// m_tfButton->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(ControlEditor::LeftClickDown), m_tfButton, this);
@@ -12,8 +113,8 @@ void ControlEditor::BuildControlElementPanel()
wxWrapSizer* wrapSizer = new wxWrapSizer();
m_panelControlElements->SetSizer(wrapSizer);
- ControlElementButton* ioButton = new ControlElementButton(m_panelControlElements, _("In/Out"),
- wxImage("..\\data\\images\\control\\io.png"), ID_IO);
+ ControlElementButton* ioButton = new ControlElementButton(
+ m_panelControlElements, _("In/Out"), wxImage("..\\data\\images\\control\\io.png"), ID_IO);
wrapSizer->Add(ioButton, 0, wxALL, 5);
ioButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
@@ -22,8 +123,8 @@ void ControlEditor::BuildControlElementPanel()
wrapSizer->Add(tfButton, 0, wxALL, 5);
tfButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
- ControlElementButton* sumButton = new ControlElementButton(m_panelControlElements, _("Sum"),
- wxImage("..\\data\\images\\control\\sum.png"), ID_SUM);
+ ControlElementButton* sumButton = new ControlElementButton(
+ m_panelControlElements, _("Sum"), wxImage("..\\data\\images\\control\\sum.png"), ID_SUM);
wrapSizer->Add(sumButton, 0, wxALL, 5);
sumButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
@@ -47,8 +148,8 @@ void ControlEditor::BuildControlElementPanel()
wrapSizer->Add(multButton, 0, wxALL, 5);
multButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
- ControlElementButton* satButton = new ControlElementButton(m_panelControlElements, _("Saturation"),
- wxImage("..\\data\\images\\control\\sat.png"), ID_SAT);
+ ControlElementButton* satButton = new ControlElementButton(
+ m_panelControlElements, _("Saturation"), wxImage("..\\data\\images\\control\\sat.png"), ID_SAT);
wrapSizer->Add(satButton, 0, wxALL, 5);
satButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
@@ -64,6 +165,31 @@ void ControlEditor::LeftClickDown(wxMouseEvent& event)
event.Skip();
}
+void ControlEditor::SetViewport()
+{
+ glClearColor(1.0, 1.0, 1.0, 1.0); // White background.
+ glClear(GL_COLOR_BUFFER_BIT);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_COLOR_MATERIAL);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_LINE_SMOOTH);
+
+ double width = m_glCanvas->GetSize().x - 1;
+ double height = m_glCanvas->GetSize().y - 1;
+
+ // Viewport fit the screen.
+ glViewport(0, 0, width, height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0.0, width, height, 0.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
void ControlEditor::AddElement(ControlElementButtonID id)
{
switch(id) {
@@ -97,92 +223,93 @@ void ControlEditor::AddElement(ControlElementButtonID id)
}
}
-ControlElementButton::ControlElementButton(wxWindow* parent, wxString label, wxImage image, wxWindowID id)
- : wxWindow(parent, id)
+void ControlEditor::OnPaint(wxPaintEvent& event)
{
- SetBackgroundColour(*wxWHITE);
- //m_font = wxFont(8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
- m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
- m_label = label;
- m_image = image;
- m_imageSize = wxSize(image.GetWidth(), image.GetHeight());
+ wxPaintDC dc(m_glCanvas);
+ m_glContext->SetCurrent(*m_glCanvas);
+ SetViewport();
- // Calculate label size.
- wxScreenDC dc;
- dc.SetFont(m_font);
- wxSize textSize = dc.GetTextExtent(label);
+ // Set GLCanvas scale and translation.
+ glScaled(m_camera->GetScale(), m_camera->GetScale(), 0.0); // Scale
+ glTranslated(m_camera->GetTranslation().m_x, m_camera->GetTranslation().m_y, 0.0); // Translation
- int buttonWidth = 0;
- if(textSize.GetWidth() > m_imageSize.GetWidth()) {
- buttonWidth = textSize.GetWidth();
- m_imagePosition = wxPoint((buttonWidth - m_imageSize.GetWidth()) / 2 + m_borderSize, m_borderSize);
- m_labelPosition = wxPoint(m_borderSize, m_imageSize.GetHeight() + m_borderSize);
- } else {
- buttonWidth = m_imageSize.GetWidth();
- m_imagePosition = wxPoint(m_borderSize, m_borderSize);
- m_labelPosition =
- wxPoint((buttonWidth - textSize.GetWidth()) / 2 + m_borderSize, m_imageSize.GetHeight() + m_borderSize);
- }
- m_buttonSize =
- wxSize(buttonWidth + 2 * m_borderSize, textSize.GetHeight() + m_imageSize.GetHeight() + 2 * m_borderSize);
- SetMinSize(m_buttonSize + wxSize(m_borderSize, m_borderSize));
+ // Selection rectangle
+ glLineWidth(1.0);
+ glColor4d(0.0, 0.5, 1.0, 1.0);
+ glBegin(GL_LINE_LOOP);
+ glVertex2d(m_selectionRect.m_x, m_selectionRect.m_y);
+ glVertex2d(m_selectionRect.m_x, m_selectionRect.m_y + m_selectionRect.m_height);
+ glVertex2d(m_selectionRect.m_x + m_selectionRect.m_width, m_selectionRect.m_y + m_selectionRect.m_height);
+ glVertex2d(m_selectionRect.m_x + m_selectionRect.m_width, m_selectionRect.m_y);
+ glEnd();
+ glColor4d(0.0, 0.5, 1.0, 0.3);
+ glBegin(GL_QUADS);
+ glVertex2d(m_selectionRect.m_x, m_selectionRect.m_y);
+ glVertex2d(m_selectionRect.m_x, m_selectionRect.m_y + m_selectionRect.m_height);
+ glVertex2d(m_selectionRect.m_x + m_selectionRect.m_width, m_selectionRect.m_y + m_selectionRect.m_height);
+ glVertex2d(m_selectionRect.m_x + m_selectionRect.m_width, m_selectionRect.m_y);
+ glEnd();
- // Events.
- Bind(wxEVT_PAINT, &ControlElementButton::OnPaint, this);
- Bind(wxEVT_ENTER_WINDOW, &ControlElementButton::OnMouseEnter, this);
- Bind(wxEVT_LEAVE_WINDOW, &ControlElementButton::OnMouseLeave, this);
- Bind(wxEVT_LEFT_DOWN, &ControlElementButton::OnLeftClickDown, this);
- Bind(wxEVT_LEFT_UP, &ControlElementButton::OnLeftClickUp, this);
+ glFlush(); // Sends all pending information directly to the GPU.
+ m_glCanvas->SwapBuffers();
+ event.Skip();
}
+void ControlEditor::OnDoubleClick(wxMouseEvent& event) {}
-ControlElementButton::~ControlElementButton() {}
-void ControlElementButton::OnPaint(wxPaintEvent& event)
+void ControlEditor::OnLeftClickDown(wxMouseEvent& event)
{
- wxPaintDC dc(this);
- wxGraphicsContext* gc = wxGraphicsContext::Create(dc);
- if(gc) {
- if(m_mouseAbove) {
- if(m_selected) {
- gc->SetPen(wxPen(wxColour(0, 125, 255, 255), m_borderSize - 1));
- gc->SetBrush(wxBrush(wxColour(0, 125, 255, 100)));
- } else {
- gc->SetPen(*wxTRANSPARENT_PEN);
- gc->SetBrush(wxBrush(wxColour(0, 125, 255, 70)));
- }
- gc->DrawRectangle(m_borderSize / 2, m_borderSize / 2, m_buttonSize.GetWidth(), m_buttonSize.GetHeight());
- }
- gc->DrawBitmap(gc->CreateBitmapFromImage(m_image), m_imagePosition.x, m_imagePosition.y, m_imageSize.GetWidth(),
- m_imageSize.GetHeight());
- gc->SetFont(m_font, *wxBLACK);
- gc->DrawText(m_label, m_labelPosition.x, m_labelPosition.y);
- delete gc;
- }
-}
+ wxPoint2DDouble clickPoint = event.GetPosition();
-void ControlElementButton::OnMouseEnter(wxMouseEvent& event)
-{
- m_mouseAbove = true;
- Refresh();
- event.Skip();
-}
+ m_mode = MODE_SELECTION_RECT;
+ m_startSelRect = m_camera->ScreenToWorld(clickPoint);
-void ControlElementButton::OnMouseLeave(wxMouseEvent& event)
-{
- m_mouseAbove = false;
- Refresh();
+ Redraw();
event.Skip();
}
-void ControlElementButton::OnLeftClickDown(wxMouseEvent& event)
+void ControlEditor::OnLeftClickUp(wxMouseEvent& event)
{
- m_selected = true;
- Refresh();
+ if(m_mode != MODE_INSERT) {
+ m_mode = MODE_EDIT;
+ }
+ m_selectionRect = wxRect2DDouble(0, 0, 0, 0);
+ Redraw();
event.Skip();
}
-void ControlElementButton::OnLeftClickUp(wxMouseEvent& event)
+void ControlEditor::OnMiddleDown(wxMouseEvent& event) {}
+void ControlEditor::OnMiddleUp(wxMouseEvent& event) {}
+
+void ControlEditor::OnMouseMotion(wxMouseEvent& event)
{
- m_selected = false;
- Refresh();
+ wxPoint2DDouble clickPoint = event.GetPosition();
+ bool redraw = false;
+
+ switch(m_mode) {
+ case MODE_SELECTION_RECT: {
+ wxPoint2DDouble currentPos = m_camera->ScreenToWorld(clickPoint);
+ double x, y, w, h;
+ if(currentPos.m_x < m_startSelRect.m_x) {
+ x = currentPos.m_x;
+ w = m_startSelRect.m_x - currentPos.m_x;
+ } else {
+ x = m_startSelRect.m_x;
+ w = currentPos.m_x - m_startSelRect.m_x;
+ }
+ if(currentPos.m_y < m_startSelRect.m_y) {
+ y = currentPos.m_y;
+ h = m_startSelRect.m_y - currentPos.m_y;
+ } else {
+ y = m_startSelRect.m_y;
+ h = currentPos.m_y - m_startSelRect.m_y;
+ }
+
+ m_selectionRect = wxRect2DDouble(x, y, w, h);
+ redraw = true;
+ } break;
+ default:
+ break;
+ }
+ if(redraw) Redraw();
event.Skip();
}