summaryrefslogtreecommitdiffstats
path: root/Project/Workspace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Project/Workspace.cpp')
-rw-r--r--Project/Workspace.cpp185
1 files changed, 116 insertions, 69 deletions
diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp
index 103a9b0..ef0a911 100644
--- a/Project/Workspace.cpp
+++ b/Project/Workspace.cpp
@@ -79,11 +79,15 @@ Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar)
Workspace::~Workspace()
{
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) {
+ if(*it) delete *it;
+ }
+ for(auto it = m_textList.begin(), itEnd = m_textList.end(); it != itEnd; ++it) {
if(*it) delete *it;
}
- m_elementList.clear();
if(m_camera) delete m_camera;
+ if(m_glContext) delete m_glContext;
+ if(m_tipWindow) delete m_tipWindow;
}
void Workspace::OnPaint(wxPaintEvent& event)
@@ -268,22 +272,23 @@ void Workspace::OnLeftDoubleClick(wxMouseEvent& event)
if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
bool elementIsBus = false;
Bus oldBus;
- if(typeid(*element) == typeid(Bus)) {
+ if(Bus* bus = dynamic_cast<Bus*>(element)) {
elementIsBus = true;
- oldBus = *(Bus*)element;
+ oldBus = *bus;
}
m_timer->Stop();
element->ShowForm(this, element);
elementEdited = true;
redraw = true;
- // If the edited element is a bus and was changed the nominal voltage, this voltage must be
+ // If the edited element is a bus and was changed the rated voltage, this voltage must be
// propagated through the lines
if(elementIsBus) {
// The voltage was changed
- if(oldBus.GetEletricalData().nominalVoltage != ((Bus*)element)->GetEletricalData().nominalVoltage ||
+ if(oldBus.GetEletricalData().nominalVoltage !=
+ static_cast<Bus*>(element)->GetEletricalData().nominalVoltage ||
oldBus.GetEletricalData().nominalVoltageUnit !=
- ((Bus*)element)->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;
@@ -330,7 +335,7 @@ void Workspace::OnRightClickDown(wxMouseEvent& event)
{
bool redraw = false;
if(m_mode == MODE_EDIT) {
- 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;
if(element->IsSelected()) {
// Show context menu.
@@ -344,20 +349,20 @@ void Workspace::OnRightClickDown(wxMouseEvent& event)
wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(Workspace::OnPopupClick), NULL, this);
PopupMenu(&menu);
redraw = true;
+
+ if(!menu.GetClientData()) break;
}
element->ResetPickboxes();
- if(redraw) {
+ /*if(redraw) {
Redraw();
redraw = false;
- }
- // If the last element was removed using the menu, we must leave the "search for" to
- // prevent error.
- break;
+ }*/
}
}
}
}
+ if(redraw) Redraw();
m_timer->Start();
}
@@ -548,15 +553,15 @@ void Workspace::OnMouseMotion(wxMouseEvent& event)
if(element->IsSelected()) {
element->Move(m_camera->ScreenToWorld(event.GetPosition()));
// Move child nodes
- for(int i = 0; i < (int)element->GetChildList().size(); i++) {
- Element* child = element->GetChildList()[i];
- child->MoveNode(element, m_camera->ScreenToWorld(event.GetPosition()));
+ std::vector<Element*> childList = element->GetChildList();
+ for(auto it = childList.begin(), itEnd = childList.end(); it != itEnd; ++it) {
+ (*it)->MoveNode(element, m_camera->ScreenToWorld(event.GetPosition()));
}
redraw = true;
}
}
// Text element motion
- 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;
if(text->IsSelected()) {
text->Move(m_camera->ScreenToWorld(event.GetPosition()));
@@ -713,7 +718,7 @@ void Workspace::OnKeyDown(wxKeyEvent& event)
for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) {
Element* element = *it;
if(element->Contains(m_camera->GetMousePosition())) {
- for(int i=0; i<(int)element->GetParentList().size(); i++) {
+ for(int i = 0; i < (int)element->GetParentList().size(); i++) {
if(element->GetParentList()[i]) numParent++;
}
numChild = element->GetChildList().size();
@@ -846,25 +851,19 @@ void Workspace::UpdateStatusBar()
void Workspace::OnPopupClick(wxCommandEvent& event)
{
- wxMenu* menu = (wxMenu*)event.GetEventObject();
- Element* element = (Element*)menu->GetClientData();
+ wxMenu* menu = static_cast<wxMenu*>(event.GetEventObject());
+ Element* element = static_cast<Element*>(menu->GetClientData());
switch(event.GetId()) {
- case ID_EDIT_BUS: {
- wxMessageBox("Edit bus!");
- } break;
- case ID_EDIT_LINE: {
- wxMessageBox("Edit line!");
- } break;
- case ID_EDIT_TRANSFORMER: {
- wxMessageBox("Edit transformer!");
+ case ID_EDIT_ELEMENT: {
+ if(element->ShowForm(this, element)) UpdateTextElements();
} break;
case ID_LINE_ADD_NODE: {
- Line* line = (Line*)element;
+ Line* line = static_cast<Line*>(element);
line->AddNode(m_camera->GetMousePosition());
Redraw();
} break;
case ID_LINE_REMOVE_NODE: {
- Line* line = (Line*)element;
+ Line* line = static_cast<Line*>(element);
line->RemoveNode(m_camera->GetMousePosition());
Redraw();
} break;
@@ -897,22 +896,39 @@ void Workspace::OnPopupClick(wxCommandEvent& event)
Redraw();
} break;
case ID_DELETE: {
- 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* iElement = *it;
if(element == iElement) {
- for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
- Element* child = *itp;
- // Parent's element being deleted...
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Element* parent = child->GetParentList()[i];
- if(parent == element) {
- child->RemoveParent(parent);
- parent->RemoveChild(child);
- }
+ // Remove child/parent.
+ std::vector<Element*> childList = element->GetChildList();
+ for(auto itc = childList.begin(), itEnd = childList.end(); itc != itEnd; ++itc) {
+ Element* child = *itc;
+ if(child) {
+ child->RemoveParent(element);
+ element->RemoveChild(child);
+ }
+ }
+ std::vector<Element*> parentList = element->GetParentList();
+ for(auto itp = parentList.begin(), itEnd = parentList.end(); itp != itEnd; ++itp) {
+ Element* parent = *itp;
+ if(parent) {
+ parent->RemoveChild(element);
}
}
- m_elementList.erase(it--);
+
+ for(auto itt = m_textList.begin(); itt != m_textList.end(); ++itt) {
+ Text* text = *itt;
+ if(text->GetElement() == element) {
+ m_textList.erase(itt--);
+ if(text) delete text;
+ }
+ }
+
+ m_elementList.erase(it);
+ if(element) delete element;
+ menu->SetClientData(NULL);
+ break;
}
}
} break;
@@ -960,29 +976,42 @@ void Workspace::DeleteSelectedElements()
if(element->IsSelected()) {
- // Remove itself from parent list
- for(int i = 0; i < (int)element->GetParentList().size(); ++i) {
- Element* parent = element->GetParentList()[i];
- if(parent) parent->RemoveChild(element);
+ // Remove child/parent.
+ std::vector<Element*> childList = element->GetChildList();
+ for(auto itc = childList.begin(), itEnd = childList.end(); itc != itEnd; ++itc) {
+ Element* child = *itc;
+ if(child) {
+ child->RemoveParent(element);
+ element->RemoveChild(child);
+ }
}
- // Remove child parent.
- for(int i = 0; i < (int)element->GetChildList().size(); ++i) {
- Element* child = element->GetChildList()[i];
- if(child) child->RemoveParent(element);
+ std::vector<Element*> parentList = element->GetParentList();
+ for(auto itp = parentList.begin(), itEnd = parentList.end(); itp != itEnd; ++itp) {
+ Element* parent = *itp;
+ if(parent) {
+ parent->RemoveChild(element);
+ }
}
for(auto itt = m_textList.begin(); itt != m_textList.end(); ++itt) {
Text* text = *itt;
- if(text->GetElement() == element) m_textList.erase(itt--);
+ if(text->GetElement() == element) {
+ m_textList.erase(itt--);
+ if(text) delete text;
+ }
}
m_elementList.erase(it--);
+ if(element) delete element;
}
}
for(auto it = m_textList.begin(); it != m_textList.end(); ++it) {
Text* text = *it;
- if(text->IsSelected()) m_textList.erase(it--);
+ if(text->IsSelected()) {
+ m_textList.erase(it--);
+ if(text) delete text;
+ }
}
Redraw();
@@ -1039,16 +1068,16 @@ void Workspace::Fit()
void Workspace::ValidateBusesVoltages(Element* initialBus)
{
- double nominalVoltage = ((Bus*)initialBus)->GetEletricalData().nominalVoltage;
- ElectricalUnit nominalVoltageUnit = ((Bus*)initialBus)->GetEletricalData().nominalVoltageUnit;
+ double nominalVoltage = static_cast<Bus*>(initialBus)->GetEletricalData().nominalVoltage;
+ ElectricalUnit nominalVoltageUnit = static_cast<Bus*>(initialBus)->GetEletricalData().nominalVoltageUnit;
for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
Element* child = *it;
if(typeid(*child) == typeid(Line)) {
if(child->GetParentList()[0] && child->GetParentList()[1]) {
- BusElectricalData data1 = ((Bus*)child->GetParentList()[0])->GetEletricalData();
- BusElectricalData data2 = ((Bus*)child->GetParentList()[1])->GetEletricalData();
+ BusElectricalData data1 = static_cast<Bus*>(child->GetParentList()[0])->GetEletricalData();
+ BusElectricalData data2 = static_cast<Bus*>(child->GetParentList()[1])->GetEletricalData();
if(data1.nominalVoltage != data2.nominalVoltage ||
data1.nominalVoltageUnit != data2.nominalVoltageUnit) {
@@ -1057,8 +1086,8 @@ void Workspace::ValidateBusesVoltages(Element* initialBus)
data1.nominalVoltageUnit = nominalVoltageUnit;
data2.nominalVoltageUnit = nominalVoltageUnit;
- ((Bus*)child->GetParentList()[0])->SetElectricalData(data1);
- ((Bus*)child->GetParentList()[1])->SetElectricalData(data2);
+ static_cast<Bus*>(child->GetParentList()[0])->SetElectricalData(data1);
+ static_cast<Bus*>(child->GetParentList()[1])->SetElectricalData(data2);
it = m_elementList.begin(); // Restart search.
}
@@ -1077,7 +1106,7 @@ void Workspace::ValidateElementsVoltages()
std::vector<double> nominalVoltage;
std::vector<ElectricalUnit> nominalVoltageUnit;
for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Bus* parent = (Bus*)child->GetParentList()[i];
+ Bus* parent = static_cast<Bus*>(child->GetParentList()[i]);
if(parent) {
nominalVoltage.push_back(parent->GetEletricalData().nominalVoltage);
nominalVoltageUnit.push_back(parent->GetEletricalData().nominalVoltageUnit);
@@ -1119,7 +1148,7 @@ void Workspace::CopySelection()
for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) {
Element* element = *it;
if(typeid(*element) == typeid(Bus)) {
- Bus* bus = (Bus*)element;
+ Bus* bus = static_cast<Bus*>(element);
auto data = bus->GetEletricalData();
data.number = busNumber;
bus->SetElectricalData(data);
@@ -1171,7 +1200,7 @@ bool Workspace::Paste()
Element* copy = (*it)->GetCopy();
if(copy) {
pastedElements.push_back(copy);
- pastedBusList.push_back((Bus*)copy);
+ pastedBusList.push_back(static_cast<Bus*>(copy));
m_elementList.push_back(copy);
}
}
@@ -1182,8 +1211,7 @@ bool Workspace::Paste()
Element* copy = (*it)->GetCopy();
if(copy) {
// Check if is text element
- if(typeid(*copy) == typeid(Text)) {
- Text* text = (Text*)copy;
+ if(Text* text = dynamic_cast<Text*>(copy)) {
// Check if element associated with the text exists.
bool elementExist = false;
for(int i = 0; i < (int)m_elementList.size(); i++) {
@@ -1194,12 +1222,12 @@ bool Workspace::Paste()
}
if(elementExist) {
pastedElements.push_back(copy);
- m_textList.push_back((Text*)copy);
+ m_textList.push_back(text);
}
} else {
// Change the parent if copied, otherwise remove it.
for(int j = 0; j < (int)copy->GetParentList().size(); j++) {
- Bus* currentParent = (Bus*)copy->GetParentList()[j];
+ Bus* currentParent = static_cast<Bus*>(copy->GetParentList()[j]);
if(currentParent) {
int parentID = currentParent->GetID();
bool parentCopied = false;
@@ -1224,12 +1252,13 @@ bool Workspace::Paste()
// Update buses childs
for(auto it = pastedBusList.begin(), itEnd = pastedBusList.end(); it != itEnd; ++it) {
Bus* bus = *it;
- for(int i = 0; i < (int)bus->GetChildList().size(); ++i) {
- Element* currentChild = bus->GetChildList()[i];
+ std::vector<Element*> childList = bus->GetChildList();
+ for(auto it = childList.begin(), itEnd = childList.end(); it != itEnd; ++it) {
+ Element* currentChild = *it;
int childID = currentChild->GetID();
bool childCopied = false;
- for(int j = 0; j < (int)pastedElements.size(); j++) {
- Element* newChild = pastedElements[j];
+ for(int i = 0; i < (int)pastedElements.size(); i++) {
+ Element* newChild = pastedElements[i];
if(childID == newChild->GetID()) {
childCopied = true;
bus->ReplaceChild(currentChild, newChild);
@@ -1321,6 +1350,24 @@ void Workspace::OnTimer(wxTimerEvent& event)
void Workspace::SetTextList(std::vector<Text*> textList)
{
- m_textList = textList;
+ m_textList.clear();
+ for(auto it = textList.begin(), itEnd = textList.end(); it != itEnd; ++it) m_textList.push_back(*it);
+
UpdateTextElements();
}
+
+void Workspace::SetElementList(std::vector<Element*> elementList)
+{
+ m_elementList.clear();
+ for(auto it = elementList.begin(), itEnd = elementList.end(); it != itEnd; ++it) m_elementList.push_back(*it);
+}
+
+void Workspace::OnIdle(wxIdleEvent& event)
+{
+ // TODO: Find other solution to text displayed wrong on opened file.
+ if(m_justOpened) {
+ m_justOpened = false;
+ UpdateTextElements();
+ Redraw();
+ }
+}