summaryrefslogtreecommitdiffstats
path: root/Project/Workspace.cpp
diff options
context:
space:
mode:
authorThales1330 <thaleslima.ufu@gmail.com>2016-08-03 17:43:25 -0300
committerThales1330 <thaleslima.ufu@gmail.com>2016-08-03 17:43:25 -0300
commit46c9d3fe586fb5c8ac75384b62a79971f96a5b88 (patch)
tree686264564945c68f788887a2745f08f8bb3f0926 /Project/Workspace.cpp
parent0b720e578e0e91262e04651ce81cd2e7f6828967 (diff)
downloadPSP.git-46c9d3fe586fb5c8ac75384b62a79971f96a5b88.tar.gz
PSP.git-46c9d3fe586fb5c8ac75384b62a79971f96a5b88.tar.xz
PSP.git-46c9d3fe586fb5c8ac75384b62a79971f96a5b88.zip
Bus implemented, selection not working
Selection to move fail
Diffstat (limited to 'Project/Workspace.cpp')
-rw-r--r--Project/Workspace.cpp195
1 files changed, 126 insertions, 69 deletions
diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp
index bae40e6..08f66c7 100644
--- a/Project/Workspace.cpp
+++ b/Project/Workspace.cpp
@@ -60,7 +60,6 @@ Workspace::~Workspace()
if(!(*it)) delete *it;
it++;
}
- // if(!m_statusBar) delete m_statusBar;
if(!m_camera) delete m_camera;
}
@@ -119,19 +118,43 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event)
}
else
{
+ bool clickPickbox = false;
std::vector<Element*>::iterator it = m_elementList.begin();
while(it != m_elementList.end()) {
Element* element = *it;
+ element->ResetPickboxes(); // Reset pickbox state.
+ element->StartMove(m_camera->ScreenToWorld(event.GetPosition()));
+
if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
element->SetSelected();
element->ShowPickbox();
+
+ if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ m_mode = MODE_MOVE_PICKBOX;
+ clickPickbox = true;
+ }
+ if(!clickPickbox) {
+ m_mode = MODE_MOVE_ELEMENT;
+ }
}
- else if(!event.ControlDown())
- {
- element->SetSelected(false);
- }
+ /*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++;
+ }
+ }
}
Redraw();
UpdateStatusBar();
@@ -140,57 +163,25 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event)
void Workspace::OnLeftClickUp(wxMouseEvent& event)
{
- if(m_mode == MODE_EDIT_ELEMENT) {
- m_mode = MODE_EDIT;
- }
-}
+ m_mode = MODE_EDIT;
-void Workspace::OnKeyDown(wxKeyEvent& event)
-{
- char key = event.GetUnicodeKey();
- if(key != WXK_NONE) {
- switch(key)
- {
- case WXK_ESCAPE: // Cancel operations.
- {
- if(m_mode == MODE_INSERT) {
- m_elementList.pop_back(); // Removes the last element being inserted.
- m_mode = MODE_EDIT;
- Redraw();
- }
- }
- break;
- case 'R': // Rotate the selected elements.
- {
- std::vector<Element*>::iterator it = m_elementList.begin();
- while(it != m_elementList.end()) {
- Element* element = *it;
- if(element->IsSelected()) {
- element->Rotate();
- }
- it++;
- }
- Redraw();
- }
- break;
- case 'B': // Insert a bus.
- {
- if(m_mode != MODE_INSERT) {
- Bus* newBus = new Bus(m_camera->ScreenToWorld(event.GetPosition()));
- m_elementList.push_back(newBus);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Bus: Click to insert, ESC to cancel."));
- Redraw();
- }
- }
- break;
- default:
- break;
+ 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;
}
+
+ it++;
+ }
+
+ if(!foundPickbox) {
+ SetCursor(wxCURSOR_ARROW);
}
UpdateStatusBar();
- event.Skip();
}
void Workspace::OnMouseMotion(wxMouseEvent& event)
@@ -213,31 +204,21 @@ void Workspace::OnMouseMotion(wxMouseEvent& event)
}
break;
- case MODE_EDIT_ELEMENT:
case MODE_EDIT:
{
bool foundPickbox = false;
+ bool redraw = false;
std::vector<Element*>::iterator it = m_elementList.begin();
while(it != m_elementList.end()) {
Element* element = *it;
if(element->IsSelected()) {
- // MODE_EDIT_ELEMENT is a flag which indicates that a pickbox is being dragged. He
- // will work like a shortcut to method Element::MovePickbox until a mouse button is
- // released.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition())) ||
- m_mode == MODE_EDIT_ELEMENT)
- {
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
element->ShowPickbox();
- if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition())) ||
- m_mode == MODE_EDIT_ELEMENT)
- {
+ redraw = true;
+
+ if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
foundPickbox = true;
SetCursor(element->GetBestPickboxCursor());
- if(event.Dragging()) {
- m_mode = MODE_EDIT_ELEMENT;
- element->MovePickbox(
- m_camera->ScreenToWorld(event.GetPosition()));
- }
}
else if(!foundPickbox)
{
@@ -246,17 +227,44 @@ void Workspace::OnMouseMotion(wxMouseEvent& event)
}
else if(!foundPickbox)
{
+ if(element->IsPickboxShown()) redraw = true;
+
element->ShowPickbox(false);
SetCursor(wxCURSOR_ARROW);
}
}
it++;
}
- Redraw();
+ if(redraw) Redraw();
+ }
+ break;
+
+ case MODE_MOVE_PICKBOX:
+ {
+ std::vector<Element*>::iterator it = m_elementList.begin();
+ while(it != m_elementList.end()) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ element->MovePickbox(m_camera->ScreenToWorld(event.GetPosition()));
+ Redraw();
+ }
+ it++;
+ }
}
break;
- default:
+ case MODE_MOVE_ELEMENT:
+ {
+ std::vector<Element*>::iterator it = m_elementList.begin();
+ while(it != m_elementList.end()) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ element->Move(m_camera->ScreenToWorld(event.GetPosition()));
+ Redraw();
+ }
+ it++;
+ }
+ }
break;
}
m_camera->UpdateMousePosition(event.GetPosition());
@@ -288,6 +296,54 @@ void Workspace::OnScroll(wxMouseEvent& event)
Redraw();
}
+void Workspace::OnKeyDown(wxKeyEvent& event)
+{
+ char key = event.GetUnicodeKey();
+ if(key != WXK_NONE) {
+ switch(key)
+ {
+ case WXK_ESCAPE: // Cancel operations.
+ {
+ if(m_mode == MODE_INSERT) {
+ m_elementList.pop_back(); // Removes the last element being inserted.
+ m_mode = MODE_EDIT;
+ Redraw();
+ }
+ }
+ break;
+ case 'R': // Rotate the selected elements.
+ {
+ std::vector<Element*>::iterator it = m_elementList.begin();
+ while(it != m_elementList.end()) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ element->Rotate();
+ }
+ it++;
+ }
+ Redraw();
+ }
+ break;
+ case 'B': // Insert a bus.
+ {
+ if(m_mode != MODE_INSERT) {
+ Bus* newBus = new Bus(m_camera->ScreenToWorld(event.GetPosition()));
+ m_elementList.push_back(newBus);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Bus: Click to insert, ESC to cancel."));
+ Redraw();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ UpdateStatusBar();
+ event.Skip();
+}
+
void Workspace::UpdateStatusBar()
{
switch(m_mode)
@@ -304,7 +360,8 @@ void Workspace::UpdateStatusBar()
}
break;
- case MODE_EDIT_ELEMENT:
+ case MODE_MOVE_ELEMENT:
+ case MODE_MOVE_PICKBOX:
case MODE_EDIT:
{
m_statusBar->SetStatusText(wxT(""));