diff options
-rw-r--r-- | Project/Camera.cpp | 38 | ||||
-rw-r--r-- | Project/Camera.h | 35 | ||||
-rw-r--r-- | Project/ControlEditor.cpp | 281 | ||||
-rw-r--r-- | Project/ControlEditor.h | 59 | ||||
-rw-r--r-- | Project/ControlEditor.wxcp | 51 | ||||
-rw-r--r-- | Project/ControlEditorBase.cpp | 17 | ||||
-rw-r--r-- | Project/ControlEditorBase.h | 7 | ||||
-rw-r--r-- | Project/MainFrame.cpp | 6 | ||||
-rw-r--r-- | Project/Project.mk | 32 | ||||
-rw-r--r-- | Project/Project.project | 4 | ||||
-rw-r--r-- | Project/Project.txt | 2 | ||||
-rw-r--r-- | Project/TransferFunction.cpp | 10 | ||||
-rw-r--r-- | Project/TransferFunction.h | 14 | ||||
-rw-r--r-- | Project/Workspace.cpp | 40 | ||||
-rw-r--r-- | Project/Workspace.h | 75 |
15 files changed, 473 insertions, 198 deletions
diff --git a/Project/Camera.cpp b/Project/Camera.cpp new file mode 100644 index 0000000..248a835 --- /dev/null +++ b/Project/Camera.cpp @@ -0,0 +1,38 @@ +#include "Camera.h" + +Camera::Camera() +{ + m_translation = wxPoint2DDouble(0, 0); + m_scale = 1.0; +} + +Camera::~Camera() {} +wxPoint2DDouble Camera::ScreenToWorld(wxPoint2DDouble screenCoords) const +{ + return wxPoint2DDouble( + screenCoords.m_x / m_scale - m_translation.m_x, screenCoords.m_y / m_scale - m_translation.m_y); +} + +void Camera::SetTranslation(wxPoint2DDouble screenPoint) +{ + m_translation = screenPoint / m_scale - m_translationStartPt; +} + +void Camera::SetScale(wxPoint2DDouble screenPoint, double delta) +{ + m_translation -= screenPoint * (1.0 - m_scale) / m_scale; + + m_scale += delta; + + // Limits: 5% - 300% + if(m_scale < m_zoomMin) m_scale = m_zoomMin; + if(m_scale > m_zoomMax) m_scale = m_zoomMax; + + m_translation += screenPoint * (1.0 - m_scale) / m_scale; +} + +wxPoint2DDouble Camera::GetMousePosition(bool worldCoords) const +{ + if(worldCoords) return ScreenToWorld(m_mousePosition); + return m_mousePosition; +}
\ No newline at end of file diff --git a/Project/Camera.h b/Project/Camera.h new file mode 100644 index 0000000..141047f --- /dev/null +++ b/Project/Camera.h @@ -0,0 +1,35 @@ +#ifndef CAMERA_H +#define CAMERA_H + +#include <wx/geometry.h> + +class Camera +{ +public: + Camera(); + ~Camera(); + + void SetScale(wxPoint2DDouble screenPoint, double delta); + void SetScale(double scale) { m_scale = scale; } + void SetTranslation(wxPoint2DDouble screenPoint); + void StartTranslation(wxPoint2DDouble startPoint) { this->m_translationStartPt = startPoint; } + void UpdateMousePosition(wxPoint2DDouble mousePosition) { this->m_mousePosition = mousePosition; } + double GetScale() const { return m_scale; } + wxPoint2DDouble GetTranslation() const { return m_translation; } + wxPoint2DDouble GetMousePosition(bool worldCoords = true) const; + wxPoint2DDouble ScreenToWorld(wxPoint2DDouble screenCoords) const; + double GetZoomMin() const { return m_zoomMin; } + double GetZoomMax() const { return m_zoomMax; } + +protected: + wxPoint2DDouble m_translation; + wxPoint2DDouble m_translationStartPt; + double m_scale; + + wxPoint2DDouble m_mousePosition; + + double m_zoomMin = 0.01; + double m_zoomMax = 3.0; +}; + +#endif // CAMERA_H 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(); } diff --git a/Project/ControlEditor.h b/Project/ControlEditor.h index 723831a..e121690 100644 --- a/Project/ControlEditor.h +++ b/Project/ControlEditor.h @@ -6,19 +6,14 @@ #include <wx/dcclient.h> #include <wx/dcscreen.h> #include <wx/graphics.h> +#include <GL/gl.h> +#include <GL/glu.h> -enum ControlElementButtonID -{ - ID_IO = 0, - ID_TF, - ID_SUM, - ID_CONST, - ID_LIMITER, - ID_GAIN, - ID_MULT, - ID_SAT, - ID_RATELIM -}; +class Camera; +class ControlElement; +class TransferFunction; + +enum ControlElementButtonID { ID_IO = 0, ID_TF, ID_SUM, ID_CONST, ID_LIMITER, ID_GAIN, ID_MULT, ID_SAT, ID_RATELIM }; class ControlElementButton : public wxWindow { @@ -36,30 +31,58 @@ protected: 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_DRAG, + MODE_DRAG_INSERT, + MODE_INSERT, + MODE_SELECTION_RECT, + MODE_PASTE, + MODE_DRAG_PASTE + }; ControlEditor(wxWindow* parent); virtual ~ControlEditor(); - + virtual void AddElement(ControlElementButtonID id); + virtual void Redraw() { m_glCanvas->Refresh(); } protected: - void BuildControlElementPanel(); + 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); - wxButton* m_tfButton; + void BuildControlElementPanel(); + void SetViewport(); + + wxGLContext* m_glContext = NULL; + Camera* m_camera = NULL; + + ControlEditorMode m_mode = MODE_EDIT; + + wxRect2DDouble m_selectionRect; + wxPoint2DDouble m_startSelRect; + + std::vector<ControlElement*> m_elementList; }; #endif // CONTROLEDITOR_H diff --git a/Project/ControlEditor.wxcp b/Project/ControlEditor.wxcp index 5ea38e9..b587276 100644 --- a/Project/ControlEditor.wxcp +++ b/Project/ControlEditor.wxcp @@ -1084,7 +1084,56 @@ "m_label": "WX_GL_SAMPLES", "m_value": "" }], - "m_events": [], + "m_events": [{ + "m_eventName": "wxEVT_PAINT", + "m_eventClass": "wxPaintEvent", + "m_eventHandler": "wxPaintEventHandler", + "m_functionNameAndSignature": "OnPaint(wxPaintEvent& event)", + "m_description": "Process a wxEVT_PAINT event", + "m_noBody": false + }, { + "m_eventName": "wxEVT_LEFT_DOWN", + "m_eventClass": "wxMouseEvent", + "m_eventHandler": "wxMouseEventHandler", + "m_functionNameAndSignature": "OnLeftClickDown(wxMouseEvent& event)", + "m_description": "Process a wxEVT_LEFT_DOWN event. The handler of this event should normally call event.Skip() to allow the default processing to take place as otherwise the window under mouse wouldn't get the focus.", + "m_noBody": false + }, { + "m_eventName": "wxEVT_LEFT_UP", + "m_eventClass": "wxMouseEvent", + "m_eventHandler": "wxMouseEventHandler", + "m_functionNameAndSignature": "OnLeftClickUp(wxMouseEvent& event)", + "m_description": "Process a wxEVT_LEFT_UP event.", + "m_noBody": false + }, { + "m_eventName": "wxEVT_LEFT_DCLICK", + "m_eventClass": "wxMouseEvent", + "m_eventHandler": "wxMouseEventHandler", + "m_functionNameAndSignature": "OnDoubleClick(wxMouseEvent& event)", + "m_description": "Process a wxEVT_LEFT_DCLICK event.", + "m_noBody": false + }, { + "m_eventName": "wxEVT_MIDDLE_DOWN", + "m_eventClass": "wxMouseEvent", + "m_eventHandler": "wxMouseEventHandler", + "m_functionNameAndSignature": "OnMiddleDown(wxMouseEvent& event)", + "m_description": "Process a wxEVT_MIDDLE_DOWN event", + "m_noBody": false + }, { + "m_eventName": "wxEVT_MIDDLE_UP", + "m_eventClass": "wxMouseEvent", + "m_eventHandler": "wxMouseEventHandler", + "m_functionNameAndSignature": "OnMiddleUp(wxMouseEvent& event)", + "m_description": "Process a wxEVT_MIDDLE_UP event", + "m_noBody": false + }, { + "m_eventName": "wxEVT_MOTION", + "m_eventClass": "wxMouseEvent", + "m_eventHandler": "wxMouseEventHandler", + "m_functionNameAndSignature": "OnMouseMotion(wxMouseEvent& event)", + "m_description": "Process a wxEVT_MOTION event", + "m_noBody": false + }], "m_children": [] }] }] diff --git a/Project/ControlEditorBase.cpp b/Project/ControlEditorBase.cpp index 440069e..bc0a1aa 100644 --- a/Project/ControlEditorBase.cpp +++ b/Project/ControlEditorBase.cpp @@ -96,10 +96,27 @@ ControlEditorBase::ControlEditorBase(wxWindow* parent, wxWindowID id, const wxSt wxPersistenceManager::Get().Restore(this); } #endif + // Connect events + m_glCanvas->Connect(wxEVT_PAINT, wxPaintEventHandler(ControlEditorBase::OnPaint), NULL, this); + m_glCanvas->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(ControlEditorBase::OnLeftClickDown), NULL, this); + m_glCanvas->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(ControlEditorBase::OnLeftClickUp), NULL, this); + m_glCanvas->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(ControlEditorBase::OnDoubleClick), NULL, this); + m_glCanvas->Connect(wxEVT_MIDDLE_DOWN, wxMouseEventHandler(ControlEditorBase::OnMiddleDown), NULL, this); + m_glCanvas->Connect(wxEVT_MIDDLE_UP, wxMouseEventHandler(ControlEditorBase::OnMiddleUp), NULL, this); + m_glCanvas->Connect(wxEVT_MOTION, wxMouseEventHandler(ControlEditorBase::OnMouseMotion), NULL, this); + } ControlEditorBase::~ControlEditorBase() { + m_glCanvas->Disconnect(wxEVT_PAINT, wxPaintEventHandler(ControlEditorBase::OnPaint), NULL, this); + m_glCanvas->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(ControlEditorBase::OnLeftClickDown), NULL, this); + m_glCanvas->Disconnect(wxEVT_LEFT_UP, wxMouseEventHandler(ControlEditorBase::OnLeftClickUp), NULL, this); + m_glCanvas->Disconnect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(ControlEditorBase::OnDoubleClick), NULL, this); + m_glCanvas->Disconnect(wxEVT_MIDDLE_DOWN, wxMouseEventHandler(ControlEditorBase::OnMiddleDown), NULL, this); + m_glCanvas->Disconnect(wxEVT_MIDDLE_UP, wxMouseEventHandler(ControlEditorBase::OnMiddleUp), NULL, this); + m_glCanvas->Disconnect(wxEVT_MOTION, wxMouseEventHandler(ControlEditorBase::OnMouseMotion), NULL, this); + m_auimgr->UnInit(); delete m_auimgr; diff --git a/Project/ControlEditorBase.h b/Project/ControlEditorBase.h index e74bf49..5bee173 100644 --- a/Project/ControlEditorBase.h +++ b/Project/ControlEditorBase.h @@ -48,6 +48,13 @@ protected: wxStatusBar* m_statusBarMain; protected: + virtual void OnPaint(wxPaintEvent& event) { event.Skip(); } + virtual void OnLeftClickDown(wxMouseEvent& event) { event.Skip(); } + virtual void OnLeftClickUp(wxMouseEvent& event) { event.Skip(); } + virtual void OnDoubleClick(wxMouseEvent& event) { event.Skip(); } + virtual void OnMiddleDown(wxMouseEvent& event) { event.Skip(); } + virtual void OnMiddleUp(wxMouseEvent& event) { event.Skip(); } + virtual void OnMouseMotion(wxMouseEvent& event) { event.Skip(); } public: wxToolBar* GetToolbarMain() { return m_toolbarMain; } diff --git a/Project/MainFrame.cpp b/Project/MainFrame.cpp index 6049a8d..87c547e 100644 --- a/Project/MainFrame.cpp +++ b/Project/MainFrame.cpp @@ -197,7 +197,7 @@ void MainFrame::OnMoveClick(wxRibbonButtonBarEvent& event) element->StartMove(averagePos); } } - workspace->SetWorkspaceMode(MODE_MOVE_ELEMENT); + workspace->SetWorkspaceMode(Workspace::MODE_MOVE_ELEMENT); } } @@ -303,7 +303,7 @@ void MainFrame::OnAddElementsClick(wxCommandEvent& event) Workspace* workspace = static_cast<Workspace*>(m_auiNotebook->GetCurrentPage()); if(workspace) { - if(workspace->GetWorkspaceMode() != MODE_INSERT) { + if(workspace->GetWorkspaceMode() != Workspace::MODE_INSERT) { auto elementList = workspace->GetElementList(); wxString statusBarText = ""; bool newElement = false; @@ -382,7 +382,7 @@ void MainFrame::OnAddElementsClick(wxCommandEvent& event) } if(newElement) { workspace->SetElementList(elementList); - workspace->SetWorkspaceMode(MODE_INSERT); + workspace->SetWorkspaceMode(Workspace::MODE_INSERT); workspace->SetStatusBarText(statusBarText); workspace->Redraw(); } diff --git a/Project/Project.mk b/Project/Project.mk index 9f3bcce..6fb7752 100644 --- a/Project/Project.mk +++ b/Project/Project.mk @@ -13,8 +13,8 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=Thales -Date :=20/01/2017 -CodeLitePath :="C:/Program Files (x86)/CodeLite" +Date :=24/01/2017 +CodeLitePath :="C:/Program Files/CodeLite" LinkerName :=C:/TDM-GCC-64/bin/g++.exe SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC ObjectSuffix :=.o @@ -61,15 +61,15 @@ AS := C:/TDM-GCC-64/bin/as.exe ## ## User defined environment variables ## -CodeLiteDir:=C:\Program Files (x86)\CodeLite -UNIT_TEST_PP_SRC_DIR:=C:\UnitTest++-1.3 +CodeLiteDir:=C:\Program Files\CodeLite WXWIN:=C:\wxWidgets-3.1.0 WXCFG:=gcc_dll\mswu Objects0=$(IntermediateDirectory)/main.cpp$(ObjectSuffix) $(IntermediateDirectory)/win_resources.rc$(ObjectSuffix) $(IntermediateDirectory)/ElementDataObject.cpp$(ObjectSuffix) $(IntermediateDirectory)/Element.cpp$(ObjectSuffix) $(IntermediateDirectory)/ArtMetro.cpp$(ObjectSuffix) $(IntermediateDirectory)/wxGLString.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrame.cpp$(ObjectSuffix) $(IntermediateDirectory)/Workspace.cpp$(ObjectSuffix) $(IntermediateDirectory)/FileHanding.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlEditor.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/MainFrameBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/WorkspaceBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/BusFormBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementFormBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlEditorBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrameBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/WorkspaceBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlEditorBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/Bus.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/Line.cpp$(ObjectSuffix) $(IntermediateDirectory)/Transformer.cpp$(ObjectSuffix) $(IntermediateDirectory)/Machines.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncGenerator.cpp$(ObjectSuffix) $(IntermediateDirectory)/IndMotor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Branch.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncMotor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Shunt.cpp$(ObjectSuffix) $(IntermediateDirectory)/Load.cpp$(ObjectSuffix) $(IntermediateDirectory)/Inductor.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/Capacitor.cpp$(ObjectSuffix) $(IntermediateDirectory)/PowerElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElectricCalculation.cpp$(ObjectSuffix) $(IntermediateDirectory)/PowerFlow.cpp$(ObjectSuffix) $(IntermediateDirectory)/Fault.cpp$(ObjectSuffix) $(IntermediateDirectory)/Text.cpp$(ObjectSuffix) $(IntermediateDirectory)/GraphicalElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/BusForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/GeneratorStabForm.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/LineForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SwitchingForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransformerForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/LoadForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ReactiveShuntElementForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/IndMotorForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncMachineForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TextForm.cpp$(ObjectSuffix) + $(IntermediateDirectory)/Camera.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrameBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/WorkspaceBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/BusFormBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementFormBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlEditorBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrameBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/WorkspaceBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlEditorBase.cpp$(ObjectSuffix) \ + $(IntermediateDirectory)/Bus.cpp$(ObjectSuffix) $(IntermediateDirectory)/Line.cpp$(ObjectSuffix) $(IntermediateDirectory)/Transformer.cpp$(ObjectSuffix) $(IntermediateDirectory)/Machines.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncGenerator.cpp$(ObjectSuffix) $(IntermediateDirectory)/IndMotor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Branch.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncMotor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Shunt.cpp$(ObjectSuffix) $(IntermediateDirectory)/Load.cpp$(ObjectSuffix) \ + $(IntermediateDirectory)/Inductor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Capacitor.cpp$(ObjectSuffix) $(IntermediateDirectory)/PowerElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElectricCalculation.cpp$(ObjectSuffix) $(IntermediateDirectory)/PowerFlow.cpp$(ObjectSuffix) $(IntermediateDirectory)/Fault.cpp$(ObjectSuffix) $(IntermediateDirectory)/Text.cpp$(ObjectSuffix) $(IntermediateDirectory)/GraphicalElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/BusForm.cpp$(ObjectSuffix) \ + $(IntermediateDirectory)/GeneratorStabForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/LineForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SwitchingForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransformerForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/LoadForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ReactiveShuntElementForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/IndMotorForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncMachineForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TextForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransferFunction.cpp$(ObjectSuffix) \ + @@ -174,6 +174,14 @@ $(IntermediateDirectory)/ControlEditor.cpp$(DependSuffix): ControlEditor.cpp $(IntermediateDirectory)/ControlEditor.cpp$(PreprocessSuffix): ControlEditor.cpp $(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/ControlEditor.cpp$(PreprocessSuffix) ControlEditor.cpp +$(IntermediateDirectory)/Camera.cpp$(ObjectSuffix): Camera.cpp $(IntermediateDirectory)/Camera.cpp$(DependSuffix) + $(CXX) $(IncludePCH) $(SourceSwitch) "C:/Users/Thales/Documents/GitHub/PSP/Project/Camera.cpp" $(CXXFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/Camera.cpp$(ObjectSuffix) $(IncludePath) +$(IntermediateDirectory)/Camera.cpp$(DependSuffix): Camera.cpp + @$(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/Camera.cpp$(ObjectSuffix) -MF$(IntermediateDirectory)/Camera.cpp$(DependSuffix) -MM Camera.cpp + +$(IntermediateDirectory)/Camera.cpp$(PreprocessSuffix): Camera.cpp + $(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/Camera.cpp$(PreprocessSuffix) Camera.cpp + $(IntermediateDirectory)/MainFrameBitmaps.cpp$(ObjectSuffix): MainFrameBitmaps.cpp $(IntermediateDirectory)/MainFrameBitmaps.cpp$(DependSuffix) $(CXX) $(IncludePCH) $(SourceSwitch) "C:/Users/Thales/Documents/GitHub/PSP/Project/MainFrameBitmaps.cpp" $(CXXFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/MainFrameBitmaps.cpp$(ObjectSuffix) $(IncludePath) $(IntermediateDirectory)/MainFrameBitmaps.cpp$(DependSuffix): MainFrameBitmaps.cpp @@ -478,6 +486,14 @@ $(IntermediateDirectory)/TextForm.cpp$(DependSuffix): TextForm.cpp $(IntermediateDirectory)/TextForm.cpp$(PreprocessSuffix): TextForm.cpp $(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/TextForm.cpp$(PreprocessSuffix) TextForm.cpp +$(IntermediateDirectory)/TransferFunction.cpp$(ObjectSuffix): TransferFunction.cpp $(IntermediateDirectory)/TransferFunction.cpp$(DependSuffix) + $(CXX) $(IncludePCH) $(SourceSwitch) "C:/Users/Thales/Documents/GitHub/PSP/Project/TransferFunction.cpp" $(CXXFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/TransferFunction.cpp$(ObjectSuffix) $(IncludePath) +$(IntermediateDirectory)/TransferFunction.cpp$(DependSuffix): TransferFunction.cpp + @$(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/TransferFunction.cpp$(ObjectSuffix) -MF$(IntermediateDirectory)/TransferFunction.cpp$(DependSuffix) -MM TransferFunction.cpp + +$(IntermediateDirectory)/TransferFunction.cpp$(PreprocessSuffix): TransferFunction.cpp + $(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/TransferFunction.cpp$(PreprocessSuffix) TransferFunction.cpp + -include $(IntermediateDirectory)/*$(DependSuffix) ## diff --git a/Project/Project.project b/Project/Project.project index 3d0ec6f..c03c768 100644 --- a/Project/Project.project +++ b/Project/Project.project @@ -63,6 +63,7 @@ <File Name="TextForm.cpp"/> </VirtualDirectory> <File Name="ControlEditor.cpp"/> + <File Name="Camera.cpp"/> </VirtualDirectory> <File Name="main.cpp"/> </VirtualDirectory> @@ -102,6 +103,8 @@ </VirtualDirectory> <VirtualDirectory Name="control element"> <File Name="ControlElement.h"/> + <File Name="TransferFunction.h"/> + <File Name="TransferFunction.cpp"/> </VirtualDirectory> </VirtualDirectory> <VirtualDirectory Name="view"> @@ -127,6 +130,7 @@ <File Name="TextForm.h"/> </VirtualDirectory> <File Name="ControlEditor.h"/> + <File Name="Camera.h"/> </VirtualDirectory> </VirtualDirectory> <VirtualDirectory Name="resources"> diff --git a/Project/Project.txt b/Project/Project.txt index c70ee11..c70cfdf 100644 --- a/Project/Project.txt +++ b/Project/Project.txt @@ -1 +1 @@ -./Release/main.cpp.o ./Release/win_resources.rc.o ./Release/ElementDataObject.cpp.o ./Release/Element.cpp.o ./Release/ArtMetro.cpp.o ./Release/wxGLString.cpp.o ./Release/MainFrame.cpp.o ./Release/Workspace.cpp.o ./Release/FileHanding.cpp.o ./Release/ControlEditor.cpp.o ./Release/MainFrameBitmaps.cpp.o ./Release/WorkspaceBitmaps.cpp.o ./Release/BusFormBitmaps.cpp.o ./Release/ElementFormBitmaps.cpp.o ./Release/ControlEditorBitmaps.cpp.o ./Release/MainFrameBase.cpp.o ./Release/WorkspaceBase.cpp.o ./Release/ElementForm.cpp.o ./Release/ControlEditorBase.cpp.o ./Release/Bus.cpp.o ./Release/Line.cpp.o ./Release/Transformer.cpp.o ./Release/Machines.cpp.o ./Release/SyncGenerator.cpp.o ./Release/IndMotor.cpp.o ./Release/Branch.cpp.o ./Release/SyncMotor.cpp.o ./Release/Shunt.cpp.o ./Release/Load.cpp.o ./Release/Inductor.cpp.o ./Release/Capacitor.cpp.o ./Release/PowerElement.cpp.o ./Release/ElectricCalculation.cpp.o ./Release/PowerFlow.cpp.o ./Release/Fault.cpp.o ./Release/Text.cpp.o ./Release/GraphicalElement.cpp.o ./Release/ControlElement.cpp.o ./Release/BusForm.cpp.o ./Release/GeneratorStabForm.cpp.o ./Release/LineForm.cpp.o ./Release/SwitchingForm.cpp.o ./Release/TransformerForm.cpp.o ./Release/LoadForm.cpp.o ./Release/ReactiveShuntElementForm.cpp.o ./Release/IndMotorForm.cpp.o ./Release/SyncMachineForm.cpp.o ./Release/TextForm.cpp.o +./Release/main.cpp.o ./Release/win_resources.rc.o ./Release/ElementDataObject.cpp.o ./Release/Element.cpp.o ./Release/ArtMetro.cpp.o ./Release/wxGLString.cpp.o ./Release/MainFrame.cpp.o ./Release/Workspace.cpp.o ./Release/FileHanding.cpp.o ./Release/ControlEditor.cpp.o ./Release/Camera.cpp.o ./Release/MainFrameBitmaps.cpp.o ./Release/WorkspaceBitmaps.cpp.o ./Release/BusFormBitmaps.cpp.o ./Release/ElementFormBitmaps.cpp.o ./Release/ControlEditorBitmaps.cpp.o ./Release/MainFrameBase.cpp.o ./Release/WorkspaceBase.cpp.o ./Release/ElementForm.cpp.o ./Release/ControlEditorBase.cpp.o ./Release/Bus.cpp.o ./Release/Line.cpp.o ./Release/Transformer.cpp.o ./Release/Machines.cpp.o ./Release/SyncGenerator.cpp.o ./Release/IndMotor.cpp.o ./Release/Branch.cpp.o ./Release/SyncMotor.cpp.o ./Release/Shunt.cpp.o ./Release/Load.cpp.o ./Release/Inductor.cpp.o ./Release/Capacitor.cpp.o ./Release/PowerElement.cpp.o ./Release/ElectricCalculation.cpp.o ./Release/PowerFlow.cpp.o ./Release/Fault.cpp.o ./Release/Text.cpp.o ./Release/GraphicalElement.cpp.o ./Release/ControlElement.cpp.o ./Release/BusForm.cpp.o ./Release/GeneratorStabForm.cpp.o ./Release/LineForm.cpp.o ./Release/SwitchingForm.cpp.o ./Release/TransformerForm.cpp.o ./Release/LoadForm.cpp.o ./Release/ReactiveShuntElementForm.cpp.o ./Release/IndMotorForm.cpp.o ./Release/SyncMachineForm.cpp.o ./Release/TextForm.cpp.o ./Release/TransferFunction.cpp.o diff --git a/Project/TransferFunction.cpp b/Project/TransferFunction.cpp new file mode 100644 index 0000000..514ca9c --- /dev/null +++ b/Project/TransferFunction.cpp @@ -0,0 +1,10 @@ +#include "TransferFunction.h" + +TransferFunction::TransferFunction() +{ +} + +TransferFunction::~TransferFunction() +{ +} + diff --git a/Project/TransferFunction.h b/Project/TransferFunction.h new file mode 100644 index 0000000..2a5acbb --- /dev/null +++ b/Project/TransferFunction.h @@ -0,0 +1,14 @@ +#ifndef TRANSFERFUNCTION_H +#define TRANSFERFUNCTION_H + +#include "ControlElement.h" + +class TransferFunction : public ControlElement +{ +public: + TransferFunction(); + ~TransferFunction(); + +}; + +#endif // TRANSFERFUNCTION_H diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index 1ed8d93..c53bd60 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -1,5 +1,5 @@ #include "Workspace.h" - +#include "Camera.h" #include "Element.h" //#include "Bus.h" #include "Line.h" @@ -17,44 +17,6 @@ #include "PowerFlow.h" #include "Fault.h" -// Camera -Camera::Camera() -{ - m_translation = wxPoint2DDouble(0, 0); - m_scale = 1.0; -} - -Camera::~Camera() {} -wxPoint2DDouble Camera::ScreenToWorld(wxPoint2DDouble screenCoords) const -{ - return wxPoint2DDouble( - screenCoords.m_x / m_scale - m_translation.m_x, screenCoords.m_y / m_scale - m_translation.m_y); -} - -void Camera::SetTranslation(wxPoint2DDouble screenPoint) -{ - m_translation = screenPoint / m_scale - m_translationStartPt; -} - -void Camera::SetScale(wxPoint2DDouble screenPoint, double delta) -{ - m_translation -= screenPoint * (1.0 - m_scale) / m_scale; - - m_scale += delta; - - // Limits: 5% - 300% - if(m_scale < m_zoomMin) m_scale = m_zoomMin; - if(m_scale > m_zoomMax) m_scale = m_zoomMax; - - m_translation += screenPoint * (1.0 - m_scale) / m_scale; -} - -wxPoint2DDouble Camera::GetMousePosition(bool worldCoords) const -{ - if(worldCoords) return ScreenToWorld(m_mousePosition); - return m_mousePosition; -} - // Workspace Workspace::Workspace() : WorkspaceBase(NULL) diff --git a/Project/Workspace.h b/Project/Workspace.h index bf98425..bf03a9e 100644 --- a/Project/Workspace.h +++ b/Project/Workspace.h @@ -32,21 +32,6 @@ class Text; class PowerFlow; class Fault; -enum WorkspaceMode { - MODE_EDIT = 0, - MODE_MOVE_ELEMENT, - MODE_MOVE_PICKBOX, - MODE_MOVE_NODE, - MODE_DRAG, - MODE_DRAG_INSERT, - MODE_DRAG_INSERT_TEXT, - MODE_INSERT, - MODE_INSERT_TEXT, - MODE_SELECTION_RECT, - MODE_PASTE, - MODE_DRAG_PASTE -}; - enum ElementID { ID_BUS = 0, ID_LINE, @@ -65,6 +50,21 @@ enum ElementID { class Workspace : public WorkspaceBase { public: + enum WorkspaceMode { + MODE_EDIT = 0, + MODE_MOVE_ELEMENT, + MODE_MOVE_PICKBOX, + MODE_MOVE_NODE, + MODE_DRAG, + MODE_DRAG_INSERT, + MODE_DRAG_INSERT_TEXT, + MODE_INSERT, + MODE_INSERT_TEXT, + MODE_SELECTION_RECT, + MODE_PASTE, + MODE_DRAG_PASTE + }; + Workspace(); Workspace(wxWindow* parent, wxString name = wxEmptyString, wxStatusBar* statusBar = NULL); ~Workspace(); @@ -75,10 +75,10 @@ public: std::vector<Element*> GetAllElements() const; WorkspaceMode GetWorkspaceMode() const { return m_mode; } Camera* GetCamera() const { return m_camera; } - + void CopySelection(); bool Paste(); - + wxFileName GetSavedPath() const { return m_savedPath; } void SetName(wxString name) { m_name = name; } @@ -92,13 +92,15 @@ public: void Redraw() { m_glCanvas->Refresh(); } void RotateSelectedElements(bool clockwise = true); void DeleteSelectedElements(); - bool GetElementsCorners(wxPoint2DDouble& leftUpCorner, wxPoint2DDouble& rightDownCorner, std::vector<Element*> elementList); + bool GetElementsCorners(wxPoint2DDouble& leftUpCorner, + wxPoint2DDouble& rightDownCorner, + std::vector<Element*> elementList); void Fit(); void UnselectAll(); void ValidateBusesVoltages(Element* initialBus); void ValidateElementsVoltages(); - + void UpdateElementsID(); void UpdateTextElements(); @@ -139,42 +141,13 @@ protected: int m_elementNumber[NUM_ELEMENTS]; std::vector<Text*> m_textList; - + wxFileName m_savedPath; - + wxRect2DDouble m_selectionRect; wxPoint2DDouble m_startSelRect; - - bool m_justOpened = false; -}; - -class Camera -{ -public: - Camera(); - ~Camera(); - - void SetScale(wxPoint2DDouble screenPoint, double delta); - void SetScale(double scale) { m_scale = scale; } - void SetTranslation(wxPoint2DDouble screenPoint); - void StartTranslation(wxPoint2DDouble startPoint) { this->m_translationStartPt = startPoint; } - void UpdateMousePosition(wxPoint2DDouble mousePosition) { this->m_mousePosition = mousePosition; } - double GetScale() const { return m_scale; } - wxPoint2DDouble GetTranslation() const { return m_translation; } - wxPoint2DDouble GetMousePosition(bool worldCoords = true) const; - wxPoint2DDouble ScreenToWorld(wxPoint2DDouble screenCoords) const; - double GetZoomMin() const { return m_zoomMin; } - double GetZoomMax() const { return m_zoomMax; } -protected: - wxPoint2DDouble m_translation; - wxPoint2DDouble m_translationStartPt; - double m_scale; - - wxPoint2DDouble m_mousePosition; - - double m_zoomMin = 0.01; - double m_zoomMax = 3.0; + bool m_justOpened = false; }; #endif // WORKSPACE_H |