diff options
author | Thales1330 <thaleslima.ufu@gmail.com> | 2016-08-05 17:30:57 -0300 |
---|---|---|
committer | Thales1330 <thaleslima.ufu@gmail.com> | 2016-08-05 17:30:57 -0300 |
commit | 0899cd2aea1fe2e71184bd9c6a86f3bd988304e5 (patch) | |
tree | 3b1900b8dbd9cec7c2920c147103a35a3b59f2a9 /Project | |
parent | 46c9d3fe586fb5c8ac75384b62a79971f96a5b88 (diff) | |
download | PSP.git-0899cd2aea1fe2e71184bd9c6a86f3bd988304e5.tar.gz PSP.git-0899cd2aea1fe2e71184bd9c6a86f3bd988304e5.tar.xz PSP.git-0899cd2aea1fe2e71184bd9c6a86f3bd988304e5.zip |
Selection retangle implemented
Some selections problems
Diffstat (limited to 'Project')
-rw-r--r-- | Project/Project.mk | 2 | ||||
-rw-r--r-- | Project/Release/MainFrame.cpp.o | bin | 117620 -> 117620 bytes | |||
-rw-r--r-- | Project/Release/PSP-UFU.exe | bin | 3241173 -> 3242405 bytes | |||
-rw-r--r-- | Project/Release/Workspace.cpp.o | bin | 87410 -> 88864 bytes | |||
-rw-r--r-- | Project/Workspace.cpp | 100 | ||||
-rw-r--r-- | Project/Workspace.h | 7 |
6 files changed, 86 insertions, 23 deletions
diff --git a/Project/Project.mk b/Project/Project.mk index 4ab79c8..1ef9bb1 100644 --- a/Project/Project.mk +++ b/Project/Project.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=Thales -Date :=03/08/2016 +Date :=05/08/2016 CodeLitePath :="C:/Program Files/CodeLite" LinkerName :=C:/TDM-GCC-64/bin/g++.exe SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC diff --git a/Project/Release/MainFrame.cpp.o b/Project/Release/MainFrame.cpp.o Binary files differindex 569d5cb..8d43ca7 100644 --- a/Project/Release/MainFrame.cpp.o +++ b/Project/Release/MainFrame.cpp.o diff --git a/Project/Release/PSP-UFU.exe b/Project/Release/PSP-UFU.exe Binary files differindex e248987..7b86997 100644 --- a/Project/Release/PSP-UFU.exe +++ b/Project/Release/PSP-UFU.exe diff --git a/Project/Release/Workspace.cpp.o b/Project/Release/Workspace.cpp.o Binary files differindex c952bbc..e9d4782 100644 --- a/Project/Release/Workspace.cpp.o +++ b/Project/Release/Workspace.cpp.o diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index 08f66c7..db56eb7 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -48,6 +48,7 @@ Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar) : m_statusBar = statusBar; m_glContext = new wxGLContext(m_glCanvas); m_camera = new Camera(); + m_selectionRect = wxRect2DDouble(0, 0, 0, 0); const int widths[4] = {-3, -1, 100, 100}; m_statusBar->SetStatusWidths(4, widths); @@ -74,6 +75,8 @@ void Workspace::OnPaint(wxPaintEvent& event) glTranslated(m_camera->GetTranslation().m_x, m_camera->GetTranslation().m_y, 0.0); // Translation // Draw + + // Elements std::vector<Element*>::iterator it = m_elementList.begin(); while(it != m_elementList.end()) { Element* element = *it; @@ -81,6 +84,22 @@ void Workspace::OnPaint(wxPaintEvent& event) it++; } + // Selection rectangle + 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(); + glFlush(); // Sends all pending information directly to the GPU. m_glCanvas->SwapBuffers(); event.Skip(); @@ -113,6 +132,7 @@ void Workspace::SetViewport() void Workspace::OnLeftClickDown(wxMouseEvent& event) { + bool foundElement = false; if(m_mode == MODE_INSERT) { m_mode = MODE_EDIT; } @@ -128,6 +148,7 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) { element->SetSelected(); element->ShowPickbox(); + foundElement = true; if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) { m_mode = MODE_MOVE_PICKBOX; @@ -137,25 +158,14 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) m_mode = MODE_MOVE_ELEMENT; } } - /*else if(!event.ControlDown() && m_mode != MODE_MOVE_ELEMENT) - { - element->SetSelected(false); - }*/ it++; } - - // Deselect elements. - if(!event.ControlDown() && m_mode != MODE_MOVE_ELEMENT) { - it = m_elementList.begin(); - while(it != m_elementList.end()) { - Element* element = *it; - if(!element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) { - element->SetSelected(false); - } - it++; - } - } } + if(!foundElement) { + m_mode = MODE_SELECTION_RECT; + m_startSelRect = m_camera->ScreenToWorld(event.GetPosition()); + } + Redraw(); UpdateStatusBar(); event.Skip(); @@ -163,24 +173,43 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) void Workspace::OnLeftClickUp(wxMouseEvent& event) { - m_mode = MODE_EDIT; - bool foundPickbox = false; std::vector<Element*>::iterator it = m_elementList.begin(); while(it != m_elementList.end()) { Element* element = *it; - if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) { - foundPickbox = true; + if(m_mode == MODE_SELECTION_RECT) { + if(m_selectionRect.Intersects(element->GetRect())) { + element->SetSelected(); + } + else + { + element->SetSelected(false); + } + } + else + { + // Deselect + if(!event.ControlDown()) { + if(!element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) { + element->SetSelected(false); + } + } + + if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) { + foundPickbox = true; + } } it++; } - if(!foundPickbox) { SetCursor(wxCURSOR_ARROW); } + m_mode = MODE_EDIT; + m_selectionRect = wxRect2DDouble(0, 0, 0, 0); + Redraw(); UpdateStatusBar(); } @@ -266,6 +295,34 @@ void Workspace::OnMouseMotion(wxMouseEvent& event) } } break; + + case MODE_SELECTION_RECT: + { + wxPoint2DDouble currentPos = m_camera->ScreenToWorld(event.GetPosition()); + 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(); + } + break; } m_camera->UpdateMousePosition(event.GetPosition()); UpdateStatusBar(); @@ -362,6 +419,7 @@ void Workspace::UpdateStatusBar() case MODE_MOVE_ELEMENT: case MODE_MOVE_PICKBOX: + case MODE_SELECTION_RECT: case MODE_EDIT: { m_statusBar->SetStatusText(wxT("")); diff --git a/Project/Workspace.h b/Project/Workspace.h index a7eca1b..2e47f3b 100644 --- a/Project/Workspace.h +++ b/Project/Workspace.h @@ -18,7 +18,8 @@ enum WorkspaceMode MODE_MOVE_ELEMENT, MODE_MOVE_PICKBOX, MODE_DRAG, - MODE_INSERT + MODE_INSERT, + MODE_SELECTION_RECT }; class Workspace : public WorkspaceBase @@ -54,6 +55,10 @@ class Workspace : public WorkspaceBase std::vector<Element*> m_elementList; void UpdateStatusBar(); + + private: + wxRect2DDouble m_selectionRect; + wxPoint2DDouble m_startSelRect; }; class Camera |