diff options
author | Thales1330 <thaleslima.ufu@gmail.com> | 2017-01-06 20:49:28 -0200 |
---|---|---|
committer | Thales1330 <thaleslima.ufu@gmail.com> | 2017-01-06 20:49:28 -0200 |
commit | 2cd589742c6a4fd289d2f0696d844ccf18b917cb (patch) | |
tree | 42a64542d07a4997be5e216ffd54a27e39f76b56 /Project/Workspace.cpp | |
parent | 6a268dba6da88e0a371ce6358e4f43b0c3d08d7d (diff) | |
download | PSP.git-2cd589742c6a4fd289d2f0696d844ccf18b917cb.tar.gz PSP.git-2cd589742c6a4fd289d2f0696d844ccf18b917cb.tar.xz PSP.git-2cd589742c6a4fd289d2f0696d844ccf18b917cb.zip |
Several bugfixes on power elements
Diffstat (limited to 'Project/Workspace.cpp')
-rw-r--r-- | Project/Workspace.cpp | 154 |
1 files changed, 98 insertions, 56 deletions
diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index ef0a911..e668bf3 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -163,16 +163,19 @@ void Workspace::SetViewport() void Workspace::OnLeftClickDown(wxMouseEvent& event) { + wxPoint clickPoint = event.GetPosition(); bool foundElement = false; - if(m_mode == MODE_INSERT_TEXT || m_mode == MODE_PASTE) { + Element* newElement = NULL; + bool showNewElementForm = false; + if(m_mode == MODE_INSERT_TEXT || m_mode == MODE_PASTE || m_mode == MODE_DRAG_PASTE) { m_mode = MODE_EDIT; } else if(m_mode == MODE_INSERT || m_mode == MODE_DRAG_INSERT || m_mode == MODE_DRAG_INSERT_TEXT) { // Get the last element inserted on the list. - Element* newElement = *(m_elementList.end() - 1); - for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) { + newElement = *(m_elementList.end() - 1); + for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) { Element* element = *it; // Clicked in any element. - if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) { + if(element->Contains(m_camera->ScreenToWorld(clickPoint))) { // Click at a bus. if(typeid(*element) == typeid(Bus)) { // Select the bus. @@ -180,8 +183,10 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) foundElement = true; // Element found. // Add the new element's parent. If the element being inserted returns true, back to // edit mode. - if(newElement->AddParent(element, m_camera->ScreenToWorld(event.GetPosition()))) { + if(newElement->AddParent(element, m_camera->ScreenToWorld(clickPoint))) { ValidateElementsVoltages(); + m_timer->Stop(); + showNewElementForm = true; m_mode = MODE_EDIT; } } @@ -190,27 +195,27 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) // The line element can have an indefined number of points. if(!foundElement) { if(typeid(*newElement) == typeid(Line)) { - newElement->AddPoint(m_camera->ScreenToWorld(event.GetPosition())); + newElement->AddPoint(m_camera->ScreenToWorld(clickPoint)); } } foundElement = true; } else { bool clickPickbox = false; - for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) { + for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) { Element* element = *it; element->ResetPickboxes(); // Reset pickbox state. // Set movement initial position (not necessarily will be moved). - element->StartMove(m_camera->ScreenToWorld(event.GetPosition())); + element->StartMove(m_camera->ScreenToWorld(clickPoint)); // Click in selected element node. - if(element->NodeContains(m_camera->ScreenToWorld(event.GetPosition())) != 0 && element->IsSelected()) { + if(element->NodeContains(m_camera->ScreenToWorld(clickPoint)) != 0 && element->IsSelected()) { m_mode = MODE_MOVE_NODE; foundElement = true; } // Click in an element. - else if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) { + else if(element->Contains(m_camera->ScreenToWorld(clickPoint))) { if(!foundElement) { // Select and show pickbox. element->SetSelected(); @@ -218,7 +223,7 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) foundElement = true; } // If pickbox contains the click, move the pickbox - if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) { + if(element->PickboxContains(m_camera->ScreenToWorld(clickPoint))) { m_mode = MODE_MOVE_PICKBOX; clickPickbox = true; } @@ -229,18 +234,18 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) } // Click in a switch. - else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition()))) { + else if(element->SwitchesContains(m_camera->ScreenToWorld(clickPoint))) { element->SetOnline(element->IsOnline() ? false : true); } } // Text element - for(auto it = m_textList.begin(); it != m_textList.end(); it++) { + for(auto it = m_textList.begin(), itEnd = m_textList.end(); it != itEnd; ++it) { Text* text = *it; - text->StartMove(m_camera->ScreenToWorld(event.GetPosition())); + text->StartMove(m_camera->ScreenToWorld(clickPoint)); - if(text->Contains(m_camera->ScreenToWorld(event.GetPosition()))) { + if(text->Contains(m_camera->ScreenToWorld(clickPoint))) { if(!foundElement) { text->SetSelected(); m_mode = MODE_MOVE_ELEMENT; @@ -252,11 +257,16 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) if(!foundElement) { m_mode = MODE_SELECTION_RECT; - m_startSelRect = m_camera->ScreenToWorld(event.GetPosition()); + m_startSelRect = m_camera->ScreenToWorld(clickPoint); } Redraw(); UpdateStatusBar(); + + if(showNewElementForm) { + if(newElement) newElement->ShowForm(this, newElement); + } + event.Skip(); } @@ -272,9 +282,10 @@ void Workspace::OnLeftDoubleClick(wxMouseEvent& event) if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) { bool elementIsBus = false; Bus oldBus; - if(Bus* bus = dynamic_cast<Bus*>(element)) { + Bus* currentBus = NULL; + if((currentBus = dynamic_cast<Bus*>(element))) { elementIsBus = true; - oldBus = *bus; + oldBus = *currentBus; } m_timer->Stop(); element->ShowForm(this, element); @@ -285,27 +296,25 @@ void Workspace::OnLeftDoubleClick(wxMouseEvent& event) // propagated through the lines if(elementIsBus) { // The voltage was changed - if(oldBus.GetEletricalData().nominalVoltage != - static_cast<Bus*>(element)->GetEletricalData().nominalVoltage || - oldBus.GetEletricalData().nominalVoltageUnit != - static_cast<Bus*>(element)->GetEletricalData().nominalVoltageUnit) { - // Check if the lines has this bus as parent - for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) { - Element* child = *it; - - bool elementIsParent = false; + if(oldBus.GetEletricalData().nominalVoltage != currentBus->GetEletricalData().nominalVoltage || + oldBus.GetEletricalData().nominalVoltageUnit != currentBus->GetEletricalData().nominalVoltageUnit) { + // Check if the bus has line as child. + std::vector<Element*> childList = element->GetChildList(); + for(auto itc = childList.begin(), itcEnd = childList.end(); itc != itcEnd; ++itc) { + Element* child = *itc; if(typeid(*child) == typeid(Line)) { - for(int i = 0; i < (int)child->GetParentList().size(); i++) { - Element* parent = child->GetParentList()[i]; - if(parent == element) { - // TODO: Ask the user if he wants to change all - // voltages - ValidateBusesVoltages(element); - elementIsParent = true; - } + wxMessageDialog msgDialog(this, _("Do you want to change the rated voltage of the path?"), + _("Warning"), wxYES_NO | wxCENTRE | wxICON_WARNING); + if(msgDialog.ShowModal() == wxID_YES) + ValidateBusesVoltages(element); + else { + auto data = currentBus->GetEletricalData(); + data.nominalVoltage = oldBus.GetEletricalData().nominalVoltage; + data.nominalVoltageUnit = oldBus.GetEletricalData().nominalVoltageUnit; + currentBus->SetElectricalData(data); } + break; } - if(elementIsParent) break; } } ValidateElementsVoltages(); @@ -353,11 +362,6 @@ void Workspace::OnRightClickDown(wxMouseEvent& event) if(!menu.GetClientData()) break; } element->ResetPickboxes(); - - /*if(redraw) { - Redraw(); - redraw = false; - }*/ } } } @@ -402,7 +406,7 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event) if(m_mode == MODE_SELECTION_RECT) { if(element->Intersects(m_selectionRect)) { element->SetSelected(); - } else { + } else if(!event.ControlDown()) { element->SetSelected(false); } } else if(m_mode == MODE_MOVE_NODE) { @@ -444,7 +448,7 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event) if(m_mode == MODE_SELECTION_RECT) { if(text->Intersects(m_selectionRect)) { text->SetSelected(); - } else { + } else if(!event.ControlDown()) { text->SetSelected(false); } } else if(!event.ControlDown()) { @@ -492,7 +496,8 @@ void Workspace::OnMouseMotion(wxMouseEvent& event) case MODE_DRAG: case MODE_DRAG_INSERT: - case MODE_DRAG_INSERT_TEXT: { + case MODE_DRAG_INSERT_TEXT: + case MODE_DRAG_PASTE: { m_camera->SetTranslation(event.GetPosition()); redraw = true; } break; @@ -603,28 +608,54 @@ void Workspace::OnMouseMotion(wxMouseEvent& event) void Workspace::OnMiddleDown(wxMouseEvent& event) { // Set to drag mode. - if(m_mode != MODE_INSERT && m_mode != MODE_INSERT_TEXT && m_mode != MODE_DRAG_INSERT && - m_mode != MODE_DRAG_INSERT_TEXT) { + switch(m_mode) { + case MODE_INSERT: { + m_mode = MODE_DRAG_INSERT; + } break; + case MODE_INSERT_TEXT: { + m_mode = MODE_DRAG_INSERT_TEXT; + } break; + case MODE_PASTE: { + m_mode = MODE_DRAG_PASTE; + } break; + default: { + m_mode = MODE_DRAG; + } break; + } + /*if(m_mode != MODE_INSERT && m_mode != MODE_INSERT_TEXT && m_mode == MODE_PASTE && m_mode != MODE_DRAG_INSERT && + m_mode != MODE_DRAG_INSERT_TEXT && m_mode != MODE_DRAG_PASTE) { m_mode = MODE_DRAG; } else if(m_mode == MODE_INSERT_TEXT) { m_mode = MODE_DRAG_INSERT_TEXT; + }else if(m_mode == MODE_PASTE) { + m_mode = MODE_DRAG_PASTE; } else { m_mode = MODE_DRAG_INSERT; - } + }*/ m_camera->StartTranslation(m_camera->ScreenToWorld(event.GetPosition())); UpdateStatusBar(); } void Workspace::OnMiddleUp(wxMouseEvent& event) { - if(m_mode != MODE_INSERT && m_mode != MODE_INSERT_TEXT && m_mode != MODE_DRAG_INSERT && - m_mode != MODE_DRAG_INSERT_TEXT) { - // Set to edit mode back. - m_mode = MODE_EDIT; - } else if(m_mode == MODE_DRAG_INSERT_TEXT) { - m_mode = MODE_INSERT_TEXT; - } else if(m_mode == MODE_DRAG_INSERT) { - m_mode = MODE_INSERT; + switch(m_mode) { + case MODE_DRAG_INSERT: { + m_mode = MODE_INSERT; + } break; + case MODE_DRAG_INSERT_TEXT: { + m_mode = MODE_INSERT_TEXT; + } break; + case MODE_DRAG_PASTE: { + m_mode = MODE_PASTE; + } break; + case MODE_INSERT: + case MODE_INSERT_TEXT: + case MODE_PASTE: { + // Does nothing. + } break; + default: { + m_mode = MODE_EDIT; + } break; } UpdateStatusBar(); } @@ -822,7 +853,8 @@ void Workspace::UpdateStatusBar() m_statusBar->SetStatusText(_("MODE: DRAG"), 1); } break; - case MODE_PASTE: { + case MODE_PASTE: + case MODE_DRAG_PASTE: { m_statusBar->SetStatusText(_("MODE: PASTE"), 1); } @@ -1371,3 +1403,13 @@ void Workspace::OnIdle(wxIdleEvent& event) Redraw(); } } + +std::vector<Element*> Workspace::GetAllElements() const +{ + std::vector<Element*> allElements; + + for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) allElements.push_back(*it); + for(auto it = m_textList.begin(), itEnd = m_textList.end(); it != itEnd; ++it) allElements.push_back(*it); + + return allElements; +} |