summaryrefslogtreecommitdiffstats
path: root/Project
diff options
context:
space:
mode:
authorThales1330 <thaleslima.ufu@gmail.com>2016-08-05 17:30:57 -0300
committerThales1330 <thaleslima.ufu@gmail.com>2016-08-05 17:30:57 -0300
commit0899cd2aea1fe2e71184bd9c6a86f3bd988304e5 (patch)
tree3b1900b8dbd9cec7c2920c147103a35a3b59f2a9 /Project
parent46c9d3fe586fb5c8ac75384b62a79971f96a5b88 (diff)
downloadPSP.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.mk2
-rw-r--r--Project/Release/MainFrame.cpp.obin117620 -> 117620 bytes
-rw-r--r--Project/Release/PSP-UFU.exebin3241173 -> 3242405 bytes
-rw-r--r--Project/Release/Workspace.cpp.obin87410 -> 88864 bytes
-rw-r--r--Project/Workspace.cpp100
-rw-r--r--Project/Workspace.h7
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
index 569d5cb..8d43ca7 100644
--- a/Project/Release/MainFrame.cpp.o
+++ b/Project/Release/MainFrame.cpp.o
Binary files differ
diff --git a/Project/Release/PSP-UFU.exe b/Project/Release/PSP-UFU.exe
index e248987..7b86997 100644
--- a/Project/Release/PSP-UFU.exe
+++ b/Project/Release/PSP-UFU.exe
Binary files differ
diff --git a/Project/Release/Workspace.cpp.o b/Project/Release/Workspace.cpp.o
index c952bbc..e9d4782 100644
--- a/Project/Release/Workspace.cpp.o
+++ b/Project/Release/Workspace.cpp.o
Binary files differ
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