diff options
author | Thales1330 <thaleslima.ufu@gmail.com> | 2017-01-24 18:25:17 -0200 |
---|---|---|
committer | Thales1330 <thaleslima.ufu@gmail.com> | 2017-01-24 18:25:17 -0200 |
commit | bdb0625280d827ba7333b6fc9d6c6534e0720100 (patch) | |
tree | 6511dd5568556115db2affce10696efb7ff62c8f /Project/ControlEditor.cpp | |
parent | 56b93d40596cc6e39930faad0f6fdf347275ee49 (diff) | |
download | PSP.git-bdb0625280d827ba7333b6fc9d6c6534e0720100.tar.gz PSP.git-bdb0625280d827ba7333b6fc9d6c6534e0720100.tar.xz PSP.git-bdb0625280d827ba7333b6fc9d6c6534e0720100.zip |
Control editor implementation start
Diffstat (limited to 'Project/ControlEditor.cpp')
-rw-r--r-- | Project/ControlEditor.cpp | 281 |
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(); } |