diff options
author | Thales1330 <thaleslima.ufu@gmail.com> | 2016-08-03 17:43:25 -0300 |
---|---|---|
committer | Thales1330 <thaleslima.ufu@gmail.com> | 2016-08-03 17:43:25 -0300 |
commit | 46c9d3fe586fb5c8ac75384b62a79971f96a5b88 (patch) | |
tree | 686264564945c68f788887a2745f08f8bb3f0926 /Project/Workspace.cpp | |
parent | 0b720e578e0e91262e04651ce81cd2e7f6828967 (diff) | |
download | PSP.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.cpp | 195 |
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("")); |