diff options
Diffstat (limited to 'Project')
-rw-r--r-- | Project/Bus.cpp | 9 | ||||
-rw-r--r-- | Project/Bus.h | 3 | ||||
-rw-r--r-- | Project/Element.cpp | 18 | ||||
-rw-r--r-- | Project/Element.h | 29 | ||||
-rw-r--r-- | Project/Line.cpp | 151 | ||||
-rw-r--r-- | Project/Line.h | 10 | ||||
-rw-r--r-- | Project/MainFrame.cpp | 2 | ||||
-rw-r--r-- | Project/Project.mk | 2 | ||||
-rw-r--r-- | Project/Release/Bus.cpp.o | bin | 19467 -> 25034 bytes | |||
-rw-r--r-- | Project/Release/Bus.cpp.o.d | 155 | ||||
-rw-r--r-- | Project/Release/Element.cpp.o | bin | 10291 -> 11710 bytes | |||
-rw-r--r-- | Project/Release/Line.cpp.o | bin | 21187 -> 29756 bytes | |||
-rw-r--r-- | Project/Release/Line.cpp.o.d | 62 | ||||
-rw-r--r-- | Project/Release/PSP-UFU.exe | bin | 3257480 -> 3277391 bytes | |||
-rw-r--r-- | Project/Release/Workspace.cpp.o | bin | 94521 -> 110214 bytes | |||
-rw-r--r-- | Project/Release/Workspace.cpp.o.d | 20 | ||||
-rw-r--r-- | Project/Release/WorkspaceBase.cpp.o | bin | 96434 -> 97418 bytes | |||
-rw-r--r-- | Project/Workspace.cpp | 74 | ||||
-rw-r--r-- | Project/Workspace.h | 5 | ||||
-rw-r--r-- | Project/Workspace.wxcp | 7 | ||||
-rw-r--r-- | Project/WorkspaceBase.cpp | 2 | ||||
-rw-r--r-- | Project/WorkspaceBase.h | 1 |
22 files changed, 513 insertions, 37 deletions
diff --git a/Project/Bus.cpp b/Project/Bus.cpp index a7ebf59..a578e1b 100644 --- a/Project/Bus.cpp +++ b/Project/Bus.cpp @@ -147,6 +147,13 @@ void Bus::MovePickbox(wxPoint2DDouble position) void Bus::Rotate() { - m_angle += 45.0; + m_angle += m_rotationAngle; if(m_angle >= 360.0) m_angle = 0.0; } + +bool Bus::GetContextMenu(wxMenu& menu) +{ + menu.Append(ID_EDIT_BUS, _("Edit bus")); + menu.Append(ID_ROTATE, _("Rotate")); + return true; +} diff --git a/Project/Bus.h b/Project/Bus.h index 0c9d374..a7fa122 100644 --- a/Project/Bus.h +++ b/Project/Bus.h @@ -9,7 +9,7 @@ class Bus : public Element Bus(); Bus(wxPoint2DDouble position); ~Bus(); - virtual bool AddParent(Element* parent, wxPoint2DDouble position) {return true;} + virtual bool AddParent(Element* parent, wxPoint2DDouble position) { return true; } virtual bool Contains(wxPoint2DDouble position) const; virtual bool Intersects(wxRect2DDouble rect) const; virtual void Draw(wxPoint2DDouble translation, double scale) const; @@ -17,6 +17,7 @@ class Bus : public Element virtual wxCursor GetBestPickboxCursor() const; virtual void MovePickbox(wxPoint2DDouble position); virtual bool PickboxContains(wxPoint2DDouble position); + virtual bool GetContextMenu(wxMenu& menu); }; #endif // BUS_H diff --git a/Project/Element.cpp b/Project/Element.cpp index 55cb87d..7f0e211 100644 --- a/Project/Element.cpp +++ b/Project/Element.cpp @@ -10,12 +10,6 @@ void Element::SetPosition(const wxPoint2DDouble position) m_width + 2.0 * m_borderSize, m_height + 2.0 * m_borderSize); } -wxPoint2DDouble Element::WorldToScreen(wxPoint2DDouble translation, double scale, double offsetX, double offsetY) const -{ - return wxPoint2DDouble(m_position.m_x + offsetX + translation.m_x, m_position.m_y + offsetY + translation.m_y) * - scale; -} - void Element::DrawCircle(wxPoint2DDouble position, double radius, int numSegments, GLenum mode) const { glBegin(mode); @@ -102,3 +96,15 @@ wxPoint2DDouble Element::GetSwitchPoint(Element* parent, wxPoint2DDouble parentP std::sin(wxDegToRad(angle)) * (swPoint.m_x - parentPoint.m_x) + std::cos(wxDegToRad(angle)) * (swPoint.m_y - parentPoint.m_y) + parentPoint.m_y); } + +wxPoint2DDouble Element::WorldToScreen(wxPoint2DDouble translation, double scale, double offsetX, double offsetY) const +{ + return wxPoint2DDouble(m_position.m_x + offsetX + translation.m_x, m_position.m_y + offsetY + translation.m_y) * + scale; +} + +wxPoint2DDouble Element::WorldToScreen(wxPoint2DDouble position, wxPoint2DDouble translation, double scale, double offsetX, double offsetY) const +{ + return wxPoint2DDouble(position.m_x + offsetX + translation.m_x, position.m_y + offsetY + translation.m_y) * + scale; +} diff --git a/Project/Element.h b/Project/Element.h index 1287bc4..eb89640 100644 --- a/Project/Element.h +++ b/Project/Element.h @@ -3,6 +3,7 @@ #include <wx/geometry.h> #include <wx/cursor.h> +#include <wx/menu.h> #include <GL/gl.h> enum PickboxID @@ -16,6 +17,17 @@ enum PickboxID ID_PB_LEFT_TOP }; +enum ContextMenuID +{ + ID_EDIT_BUS = 0, + ID_EDIT_LINE, + + ID_LINE_ADD_NODE, + ID_LINE_REMOVE_NODE, + + ID_ROTATE +}; + class Element { public: @@ -51,10 +63,12 @@ class Element virtual wxCursor GetBestPickboxCursor() const = 0; // General methods - virtual void AddPoint(wxPoint2DDouble point){}; + virtual bool GetContextMenu(wxMenu& menu) { return false; } + virtual void AddPoint(wxPoint2DDouble point) {} virtual void StartMove(wxPoint2DDouble position); virtual void Move(wxPoint2DDouble position); virtual void MoveNode(Element* parent, wxPoint2DDouble position){}; + virtual void RotateNode(Element* parent) {} virtual wxPoint2DDouble GetSwitchPoint(Element* parent, wxPoint2DDouble parentPoint, wxPoint2DDouble secondPoint) const; @@ -63,17 +77,21 @@ class Element double scale, double offsetX = 0.0, double offsetY = 0.0) const; + virtual wxPoint2DDouble WorldToScreen(wxPoint2DDouble position, + wxPoint2DDouble translation, + double scale, + double offsetX = 0.0, + double offsetY = 0.0) const; virtual void DrawCircle(wxPoint2DDouble position, double radius, int numSegments, GLenum mode = GL_LINE_LOOP) const; virtual void DrawRectangle(wxPoint2DDouble position, double width, double height, GLenum mode = GL_QUADS) const; virtual void DrawRectangle(wxPoint2DDouble* points, GLenum mode = GL_QUADS) const; virtual void DrawLine(std::vector<wxPoint2DDouble> points, GLenum mode = GL_LINE_STRIP) const; virtual void DrawPickbox(wxPoint2DDouble position) const; virtual wxPoint2DDouble RotateAtPosition(wxPoint2DDouble pointToRotate, double angle, bool degrees = true) const; - - virtual std::vector<Element*> GetParentList() const { return m_parentList; } - virtual wxPoint2DDouble GetMoveStartPosition() const { return m_moveStartPt; } - virtual wxPoint2DDouble GetMovePosition() const { return m_movePos; } + virtual std::vector<Element*> GetParentList() const { return m_parentList; } + virtual wxPoint2DDouble GetMoveStartPosition() const { return m_moveStartPt; } + virtual wxPoint2DDouble GetMovePosition() const { return m_movePos; } protected: std::vector<Element*> m_parentList; @@ -83,6 +101,7 @@ class Element double m_height = 0.0; double m_angle = 0.0; double m_borderSize = 2.0; + double m_rotationAngle = 45.0; bool m_selected = false; bool m_dragging = false; diff --git a/Project/Line.cpp b/Project/Line.cpp index b8686bb..54418d4 100644 --- a/Project/Line.cpp +++ b/Project/Line.cpp @@ -2,7 +2,14 @@ Line::Line() {} Line::~Line() {} -bool Line::Contains(wxPoint2DDouble position) const { return false; } +bool Line::Contains(wxPoint2DDouble position) const +{ + if(PointToLineDistance(position) < 5.0) { + return true; + } + return false; +} + void Line::Draw(wxPoint2DDouble translation, double scale) const { std::vector<wxPoint2DDouble> pointList = m_pointList; @@ -15,6 +22,22 @@ void Line::Draw(wxPoint2DDouble translation, double scale) const pointList.push_back(m_position); } + // Line selected (Layer 1). + if(m_selected) { + glLineWidth(1.5 + m_borderSize * 2.0); + glColor4d(0.0, 0.5, 1.0, 0.5); + DrawLine(pointList); + + // Draw nodes selection. + if(pointList.size() > 0) { + DrawCircle(pointList[0], 5.0 + m_borderSize, 10, GL_POLYGON); + if(m_inserted) { + DrawCircle(pointList[pointList.size() - 1], 5.0 + +m_borderSize, 10, GL_POLYGON); + } + } + } + + // Draw line (Layer 2) glLineWidth(1.5); glColor4d(0.2, 0.2, 0.2, 1.0); DrawLine(pointList); @@ -27,9 +50,21 @@ void Line::Draw(wxPoint2DDouble translation, double scale) const DrawCircle(pointList[pointList.size() - 1], 5.0, 10, GL_POLYGON); } } + + // Draw pickboxes (Layer 3). + if(m_showPickbox) { + glPushMatrix(); + glLoadIdentity(); + + for(int i = 2; i < (int)m_pointList.size() - 2; i++) { + DrawPickbox(WorldToScreen(m_pointList[i], translation, scale)); + } + + glPopMatrix(); + } } -wxCursor Line::GetBestPickboxCursor() const { return wxCURSOR_ARROW; } +wxCursor Line::GetBestPickboxCursor() const { return wxCURSOR_SIZING; } bool Line::AddParent(Element* parent, wxPoint2DDouble position) { if(parent) { @@ -71,10 +106,48 @@ bool Line::AddParent(Element* parent, wxPoint2DDouble position) } return false; } -bool Line::Intersects(wxRect2DDouble rect) const { return false; } -void Line::MovePickbox(wxPoint2DDouble position) {} -bool Line::PickboxContains(wxPoint2DDouble position) { return false; } -void Line::Rotate() {} +bool Line::Intersects(wxRect2DDouble rect) const +{ + for(auto it = m_pointList.begin(); it != m_pointList.end(); ++it) { + if(rect.Contains(*it)) return true; + } + return false; +} +void Line::MovePickbox(wxPoint2DDouble position) +{ + if(m_activePickboxID == ID_PB_NONE) return; + + for(int i = 2; i < (int)m_pointList.size() - 2; i++) { + if(m_activePickboxID == i) { + m_pointList[i] = m_movePts[i] + position - m_moveStartPt; + UpdateSwitchesPosition(); + } + } +} +bool Line::PickboxContains(wxPoint2DDouble position) +{ + for(int i = 2; i < (int)m_pointList.size() - 2; i++) { + wxRect2DDouble rect(m_pointList[i].m_x - 5.0, m_pointList[i].m_y - 5.0, 10.0, 10.0); + if(rect.Contains(position)) { + m_activePickboxID = i; + return true; + } + } + return false; +} +void Line::RotateNode(Element* parent) +{ + if(parent == m_parentList[0]) { + m_pointList[0] = parent->RotateAtPosition(m_pointList[0], m_rotationAngle); + } + else if(parent == m_parentList[1]) + { + m_pointList[m_pointList.size() - 1] = + parent->RotateAtPosition(m_pointList[m_pointList.size() - 1], m_rotationAngle); + } + UpdateSwitchesPosition(); +} + void Line::AddPoint(wxPoint2DDouble point) { if(m_parentList.size() != 0) { @@ -82,19 +155,81 @@ void Line::AddPoint(wxPoint2DDouble point) } } +void Line::StartMove(wxPoint2DDouble position) +{ + m_moveStartPt = position; + m_movePts = m_pointList; +} + void Line::MoveNode(Element* parent, wxPoint2DDouble position) { // First bus. if(parent == m_parentList[0]) { - m_pointList[0] = parent->GetMovePosition() + position - parent->GetMoveStartPosition(); + m_pointList[0] = m_movePts[0] + position - m_moveStartPt; } // Second bus. else if(parent == m_parentList[1]) { - m_pointList[m_pointList.size() - 1] = parent->GetMovePosition() + position - parent->GetMoveStartPosition(); + m_pointList[m_pointList.size() - 1] = m_movePts[m_pointList.size() - 1] + position - m_moveStartPt; } + + // If the line is selected, move all the points, except the switches and buses points. + if(m_selected) { + for(int i = 2; i < (int)m_pointList.size() - 2; i++) { + m_pointList[i] = m_movePts[i] + position - m_moveStartPt; + } + } + // Recalculate switches positions + UpdateSwitchesPosition(); +} + +void Line::UpdateSwitchesPosition() +{ m_pointList[1] = GetSwitchPoint(m_parentList[0], m_pointList[0], m_pointList[2]); m_pointList[m_pointList.size() - 2] = GetSwitchPoint(m_parentList[1], m_pointList[m_pointList.size() - 1], m_pointList[m_pointList.size() - 3]); } + +double Line::PointToLineDistance(wxPoint2DDouble point) const +{ + //[Ref] http://geomalgorithms.com/a02-_lines.html + double distance = 100.0; // Big initial distance. + wxPoint2DDouble p0 = point; + + for(int i = 0; i < (int)m_pointList.size() - 1; i++) { + double d = 0.0; + + wxPoint2DDouble p1 = m_pointList[i]; + wxPoint2DDouble p2 = m_pointList[i + 1]; + + wxPoint2DDouble v = p2 - p1; + wxPoint2DDouble w = p0 - p1; + + double c1 = w.m_x * v.m_x + w.m_y * v.m_y; + double c2 = v.m_x * v.m_x + v.m_y * v.m_y; + + if(c1 <= 0.0) { + d = std::sqrt(std::pow(p0.m_y - p1.m_y, 2) + std::pow(p0.m_x - p1.m_x, 2)); + } + else if(c2 <= c1) + { + d = std::sqrt(std::pow(p0.m_y - p2.m_y, 2) + std::pow(p0.m_x - p2.m_x, 2)); + } + else + { + d = std::abs((p2.m_y - p1.m_y) * p0.m_x - (p2.m_x - p1.m_x) * p0.m_y + p2.m_x * p1.m_y - + p2.m_y * p1.m_x) / + std::sqrt(std::pow(p2.m_y - p1.m_y, 2) + std::pow(p2.m_x - p1.m_x, 2)); + } + if(d < distance) distance = d; + } + + return distance; +} + +bool Line::GetContextMenu(wxMenu& menu) +{ + menu.Append(ID_EDIT_LINE, _("Edit line")); + return true; +} diff --git a/Project/Line.h b/Project/Line.h index 6717783..08a2b36 100644 --- a/Project/Line.h +++ b/Project/Line.h @@ -13,18 +13,24 @@ class Line : public Element virtual bool Contains(wxPoint2DDouble position) const; virtual void Draw(wxPoint2DDouble translation, double scale) const; virtual void Move(wxPoint2DDouble position) {} + virtual void StartMove(wxPoint2DDouble position); virtual void MoveNode(Element* parent, wxPoint2DDouble position); virtual wxCursor GetBestPickboxCursor() const; virtual bool AddParent(Element* parent, wxPoint2DDouble position); virtual bool Intersects(wxRect2DDouble rect) const; virtual void MovePickbox(wxPoint2DDouble position); virtual bool PickboxContains(wxPoint2DDouble position); - virtual void Rotate(); + virtual void Rotate() {} + virtual void RotateNode(Element* parent); virtual void AddPoint(wxPoint2DDouble point); + virtual bool GetContextMenu(wxMenu& menu); - protected: +protected: + void UpdateSwitchesPosition(); + double PointToLineDistance(wxPoint2DDouble point) const; std::vector<wxPoint2DDouble> m_pointList; bool m_inserted = false; + std::vector<wxPoint2DDouble> m_movePts; }; #endif // LINE_H diff --git a/Project/MainFrame.cpp b/Project/MainFrame.cpp index c9ab732..1ba9887 100644 --- a/Project/MainFrame.cpp +++ b/Project/MainFrame.cpp @@ -175,7 +175,7 @@ void MainFrame::OnAddElementsClick(wxCommandEvent& event) // inserir gerador break; case ID_ADDMENU_LOAD: - // inserir larga + // inserir carga break; case ID_ADDMENU_CAPACITOR: // inserir capacitor diff --git a/Project/Project.mk b/Project/Project.mk index b4c2164..e5e39f0 100644 --- a/Project/Project.mk +++ b/Project/Project.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=Thales -Date :=17/08/2016 +Date :=18/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/Bus.cpp.o b/Project/Release/Bus.cpp.o Binary files differindex 21460aa..a5f2ad8 100644 --- a/Project/Release/Bus.cpp.o +++ b/Project/Release/Bus.cpp.o diff --git a/Project/Release/Bus.cpp.o.d b/Project/Release/Bus.cpp.o.d index 1830618..d55f135 100644 --- a/Project/Release/Bus.cpp.o.d +++ b/Project/Release/Bus.cpp.o.d @@ -57,7 +57,58 @@ Release/Bus.cpp.o: Bus.cpp Bus.h Element.h \ C:/wxWidgets-3.1.0/include/wx/cursor.h \ C:/wxWidgets-3.1.0/include/wx/gdiobj.h \ C:/wxWidgets-3.1.0/include/wx/msw/gdiimage.h \ - C:/wxWidgets-3.1.0/include/wx/msw/cursor.h + C:/wxWidgets-3.1.0/include/wx/msw/cursor.h \ + C:/wxWidgets-3.1.0/include/wx/menu.h \ + C:/wxWidgets-3.1.0/include/wx/window.h \ + C:/wxWidgets-3.1.0/include/wx/event.h \ + C:/wxWidgets-3.1.0/include/wx/clntdata.h \ + C:/wxWidgets-3.1.0/include/wx/dynarray.h \ + C:/wxWidgets-3.1.0/include/wx/thread.h \ + C:/wxWidgets-3.1.0/include/wx/tracker.h \ + C:/wxWidgets-3.1.0/include/wx/typeinfo.h \ + C:/wxWidgets-3.1.0/include/wx/any.h \ + C:/wxWidgets-3.1.0/include/wx/datetime.h \ + C:/wxWidgets-3.1.0/include/wx/anystr.h \ + C:/wxWidgets-3.1.0/include/wx/variant.h \ + C:/wxWidgets-3.1.0/include/wx/meta/convertible.h \ + C:/wxWidgets-3.1.0/include/wx/meta/removeref.h \ + C:/wxWidgets-3.1.0/include/wx/font.h \ + C:/wxWidgets-3.1.0/include/wx/msw/font.h \ + C:/wxWidgets-3.1.0/include/wx/colour.h \ + C:/wxWidgets-3.1.0/include/wx/msw/colour.h \ + C:/wxWidgets-3.1.0/include/wx/region.h \ + C:/wxWidgets-3.1.0/include/wx/msw/region.h \ + C:/wxWidgets-3.1.0/include/wx/intl.h \ + C:/wxWidgets-3.1.0/include/wx/translation.h \ + C:/wxWidgets-3.1.0/include/wx/language.h \ + C:/wxWidgets-3.1.0/include/wx/scopedptr.h \ + C:/wxWidgets-3.1.0/include/wx/checkeddelete.h \ + C:/wxWidgets-3.1.0/include/wx/validate.h \ + C:/wxWidgets-3.1.0/include/wx/palette.h \ + C:/wxWidgets-3.1.0/include/wx/msw/palette.h \ + C:/wxWidgets-3.1.0/include/wx/accel.h \ + C:/wxWidgets-3.1.0/include/wx/msw/accel.h \ + C:/wxWidgets-3.1.0/include/wx/msw/window.h \ + C:/wxWidgets-3.1.0/include/wx/settings.h \ + C:/wxWidgets-3.1.0/include/wx/menuitem.h \ + C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h \ + C:/wxWidgets-3.1.0/include/wx/bitmap.h \ + C:/wxWidgets-3.1.0/include/wx/image.h \ + C:/wxWidgets-3.1.0/include/wx/stream.h \ + C:/wxWidgets-3.1.0/include/wx/imagbmp.h \ + C:/wxWidgets-3.1.0/include/wx/imagpng.h \ + C:/wxWidgets-3.1.0/include/wx/imaggif.h \ + C:/wxWidgets-3.1.0/include/wx/imagpcx.h \ + C:/wxWidgets-3.1.0/include/wx/imagjpeg.h \ + C:/wxWidgets-3.1.0/include/wx/imagtga.h \ + C:/wxWidgets-3.1.0/include/wx/imagtiff.h \ + C:/wxWidgets-3.1.0/include/wx/imagpnm.h \ + C:/wxWidgets-3.1.0/include/wx/imagxpm.h \ + C:/wxWidgets-3.1.0/include/wx/imagiff.h \ + C:/wxWidgets-3.1.0/include/wx/msw/bitmap.h \ + C:/wxWidgets-3.1.0/include/wx/ownerdrw.h \ + C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h \ + C:/wxWidgets-3.1.0/include/wx/msw/menu.h Bus.h: @@ -182,3 +233,105 @@ C:/wxWidgets-3.1.0/include/wx/gdiobj.h: C:/wxWidgets-3.1.0/include/wx/msw/gdiimage.h: C:/wxWidgets-3.1.0/include/wx/msw/cursor.h: + +C:/wxWidgets-3.1.0/include/wx/menu.h: + +C:/wxWidgets-3.1.0/include/wx/window.h: + +C:/wxWidgets-3.1.0/include/wx/event.h: + +C:/wxWidgets-3.1.0/include/wx/clntdata.h: + +C:/wxWidgets-3.1.0/include/wx/dynarray.h: + +C:/wxWidgets-3.1.0/include/wx/thread.h: + +C:/wxWidgets-3.1.0/include/wx/tracker.h: + +C:/wxWidgets-3.1.0/include/wx/typeinfo.h: + +C:/wxWidgets-3.1.0/include/wx/any.h: + +C:/wxWidgets-3.1.0/include/wx/datetime.h: + +C:/wxWidgets-3.1.0/include/wx/anystr.h: + +C:/wxWidgets-3.1.0/include/wx/variant.h: + +C:/wxWidgets-3.1.0/include/wx/meta/convertible.h: + +C:/wxWidgets-3.1.0/include/wx/meta/removeref.h: + +C:/wxWidgets-3.1.0/include/wx/font.h: + +C:/wxWidgets-3.1.0/include/wx/msw/font.h: + +C:/wxWidgets-3.1.0/include/wx/colour.h: + +C:/wxWidgets-3.1.0/include/wx/msw/colour.h: + +C:/wxWidgets-3.1.0/include/wx/region.h: + +C:/wxWidgets-3.1.0/include/wx/msw/region.h: + +C:/wxWidgets-3.1.0/include/wx/intl.h: + +C:/wxWidgets-3.1.0/include/wx/translation.h: + +C:/wxWidgets-3.1.0/include/wx/language.h: + +C:/wxWidgets-3.1.0/include/wx/scopedptr.h: + +C:/wxWidgets-3.1.0/include/wx/checkeddelete.h: + +C:/wxWidgets-3.1.0/include/wx/validate.h: + +C:/wxWidgets-3.1.0/include/wx/palette.h: + +C:/wxWidgets-3.1.0/include/wx/msw/palette.h: + +C:/wxWidgets-3.1.0/include/wx/accel.h: + +C:/wxWidgets-3.1.0/include/wx/msw/accel.h: + +C:/wxWidgets-3.1.0/include/wx/msw/window.h: + +C:/wxWidgets-3.1.0/include/wx/settings.h: + +C:/wxWidgets-3.1.0/include/wx/menuitem.h: + +C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h: + +C:/wxWidgets-3.1.0/include/wx/bitmap.h: + +C:/wxWidgets-3.1.0/include/wx/image.h: + +C:/wxWidgets-3.1.0/include/wx/stream.h: + +C:/wxWidgets-3.1.0/include/wx/imagbmp.h: + +C:/wxWidgets-3.1.0/include/wx/imagpng.h: + +C:/wxWidgets-3.1.0/include/wx/imaggif.h: + +C:/wxWidgets-3.1.0/include/wx/imagpcx.h: + +C:/wxWidgets-3.1.0/include/wx/imagjpeg.h: + +C:/wxWidgets-3.1.0/include/wx/imagtga.h: + +C:/wxWidgets-3.1.0/include/wx/imagtiff.h: + +C:/wxWidgets-3.1.0/include/wx/imagpnm.h: + +C:/wxWidgets-3.1.0/include/wx/imagxpm.h: + +C:/wxWidgets-3.1.0/include/wx/imagiff.h: + +C:/wxWidgets-3.1.0/include/wx/msw/bitmap.h: + +C:/wxWidgets-3.1.0/include/wx/ownerdrw.h: + +C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h: + +C:/wxWidgets-3.1.0/include/wx/msw/menu.h: diff --git a/Project/Release/Element.cpp.o b/Project/Release/Element.cpp.o Binary files differindex eb21254..507b116 100644 --- a/Project/Release/Element.cpp.o +++ b/Project/Release/Element.cpp.o diff --git a/Project/Release/Line.cpp.o b/Project/Release/Line.cpp.o Binary files differindex 8194ffd..587e66d 100644 --- a/Project/Release/Line.cpp.o +++ b/Project/Release/Line.cpp.o diff --git a/Project/Release/Line.cpp.o.d b/Project/Release/Line.cpp.o.d index 684bf28..040ae16 100644 --- a/Project/Release/Line.cpp.o.d +++ b/Project/Release/Line.cpp.o.d @@ -110,7 +110,27 @@ Release/Line.cpp.o: Line.cpp Line.h \ C:/wxWidgets-3.1.0/include/wx/stockitem.h \ C:/wxWidgets-3.1.0/include/wx/generic/msgdlgg.h \ C:/wxWidgets-3.1.0/include/wx/msw/msgdlg.h Element.h \ - C:/wxWidgets-3.1.0/include/wx/geometry.h + C:/wxWidgets-3.1.0/include/wx/geometry.h \ + C:/wxWidgets-3.1.0/include/wx/menu.h \ + C:/wxWidgets-3.1.0/include/wx/menuitem.h \ + C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h \ + C:/wxWidgets-3.1.0/include/wx/bitmap.h \ + C:/wxWidgets-3.1.0/include/wx/image.h \ + C:/wxWidgets-3.1.0/include/wx/stream.h \ + C:/wxWidgets-3.1.0/include/wx/imagbmp.h \ + C:/wxWidgets-3.1.0/include/wx/imagpng.h \ + C:/wxWidgets-3.1.0/include/wx/imaggif.h \ + C:/wxWidgets-3.1.0/include/wx/imagpcx.h \ + C:/wxWidgets-3.1.0/include/wx/imagjpeg.h \ + C:/wxWidgets-3.1.0/include/wx/imagtga.h \ + C:/wxWidgets-3.1.0/include/wx/imagtiff.h \ + C:/wxWidgets-3.1.0/include/wx/imagpnm.h \ + C:/wxWidgets-3.1.0/include/wx/imagxpm.h \ + C:/wxWidgets-3.1.0/include/wx/imagiff.h \ + C:/wxWidgets-3.1.0/include/wx/msw/bitmap.h \ + C:/wxWidgets-3.1.0/include/wx/ownerdrw.h \ + C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h \ + C:/wxWidgets-3.1.0/include/wx/msw/menu.h Line.h: @@ -341,3 +361,43 @@ C:/wxWidgets-3.1.0/include/wx/msw/msgdlg.h: Element.h: C:/wxWidgets-3.1.0/include/wx/geometry.h: + +C:/wxWidgets-3.1.0/include/wx/menu.h: + +C:/wxWidgets-3.1.0/include/wx/menuitem.h: + +C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h: + +C:/wxWidgets-3.1.0/include/wx/bitmap.h: + +C:/wxWidgets-3.1.0/include/wx/image.h: + +C:/wxWidgets-3.1.0/include/wx/stream.h: + +C:/wxWidgets-3.1.0/include/wx/imagbmp.h: + +C:/wxWidgets-3.1.0/include/wx/imagpng.h: + +C:/wxWidgets-3.1.0/include/wx/imaggif.h: + +C:/wxWidgets-3.1.0/include/wx/imagpcx.h: + +C:/wxWidgets-3.1.0/include/wx/imagjpeg.h: + +C:/wxWidgets-3.1.0/include/wx/imagtga.h: + +C:/wxWidgets-3.1.0/include/wx/imagtiff.h: + +C:/wxWidgets-3.1.0/include/wx/imagpnm.h: + +C:/wxWidgets-3.1.0/include/wx/imagxpm.h: + +C:/wxWidgets-3.1.0/include/wx/imagiff.h: + +C:/wxWidgets-3.1.0/include/wx/msw/bitmap.h: + +C:/wxWidgets-3.1.0/include/wx/ownerdrw.h: + +C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h: + +C:/wxWidgets-3.1.0/include/wx/msw/menu.h: diff --git a/Project/Release/PSP-UFU.exe b/Project/Release/PSP-UFU.exe Binary files differindex 2a86ce5..04fb13d 100644 --- a/Project/Release/PSP-UFU.exe +++ b/Project/Release/PSP-UFU.exe diff --git a/Project/Release/Workspace.cpp.o b/Project/Release/Workspace.cpp.o Binary files differindex 67d882f..9d4cb18 100644 --- a/Project/Release/Workspace.cpp.o +++ b/Project/Release/Workspace.cpp.o diff --git a/Project/Release/Workspace.cpp.o.d b/Project/Release/Workspace.cpp.o.d index a3a5abb..465d6d8 100644 --- a/Project/Release/Workspace.cpp.o.d +++ b/Project/Release/Workspace.cpp.o.d @@ -184,7 +184,13 @@ Release/Workspace.cpp.o: Workspace.cpp Workspace.h \ C:/wxWidgets-3.1.0/include/wx/ioswrap.h \ C:/wxWidgets-3.1.0/include/wx/msw/textctrl.h \ C:/wxWidgets-3.1.0/include/wx/systhemectrl.h \ - C:/wxWidgets-3.1.0/include/wx/msw/treectrl.h Element.h Bus.h Line.h + C:/wxWidgets-3.1.0/include/wx/msw/treectrl.h Element.h \ + C:/wxWidgets-3.1.0/include/wx/menu.h \ + C:/wxWidgets-3.1.0/include/wx/menuitem.h \ + C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h \ + C:/wxWidgets-3.1.0/include/wx/ownerdrw.h \ + C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h \ + C:/wxWidgets-3.1.0/include/wx/msw/menu.h Bus.h Line.h Workspace.h: @@ -566,6 +572,18 @@ C:/wxWidgets-3.1.0/include/wx/msw/treectrl.h: Element.h: +C:/wxWidgets-3.1.0/include/wx/menu.h: + +C:/wxWidgets-3.1.0/include/wx/menuitem.h: + +C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h: + +C:/wxWidgets-3.1.0/include/wx/ownerdrw.h: + +C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h: + +C:/wxWidgets-3.1.0/include/wx/msw/menu.h: + Bus.h: Line.h: diff --git a/Project/Release/WorkspaceBase.cpp.o b/Project/Release/WorkspaceBase.cpp.o Binary files differindex 4462b10..8ec190c 100644 --- a/Project/Release/WorkspaceBase.cpp.o +++ b/Project/Release/WorkspaceBase.cpp.o diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index f33948b..26c913b 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -200,6 +200,26 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) event.Skip(); } +void Workspace::OnRightClickDown(wxMouseEvent& event) +{ + if(m_mode == MODE_EDIT) { + for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) { + Element* element = *it; + if(element->IsSelected()) { + if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) { + wxMenu menu; + if(element->GetContextMenu(menu)) { + menu.SetClientData(element); + menu.Connect(wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(Workspace::OnPopupClick), NULL, this); + PopupMenu(&menu); + } + } + } + } + } +} + void Workspace::OnLeftClickUp(wxMouseEvent& event) { bool foundPickbox = false; @@ -313,14 +333,11 @@ void Workspace::OnMouseMotion(wxMouseEvent& event) { for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) { Element* element = *it; - //Parent's element moving... - for(int i=0; i<(int)element->GetParentList().size(); i++) { - //wxMessageBox(wxString::Format("%d", element->GetParentList().size())); - //Element* parent = *itp; - Element* parent = element->GetParentList()[i]; - if(parent->IsSelected()) { - element->MoveNode(parent, m_camera->ScreenToWorld(event.GetPosition())); - //itp = element->GetParentList().end();//Exit the for because the element was already moved. + // Parent's element moving... + for(int i = 0; i < (int)element->GetParentList().size(); i++) { + Element* parent = element->GetParentList()[i]; + if(parent->IsSelected()) { + element->MoveNode(parent, m_camera->ScreenToWorld(event.GetPosition())); } } if(element->IsSelected()) { @@ -409,6 +426,13 @@ void Workspace::OnKeyDown(wxKeyEvent& event) { for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) { Element* element = *it; + // Parent's element rotating... + for(int i = 0; i < (int)element->GetParentList().size(); i++) { + Element* parent = element->GetParentList()[i]; + if(parent->IsSelected()) { + element->RotateNode(parent); + } + } if(element->IsSelected()) { element->Rotate(); } @@ -479,3 +503,37 @@ void Workspace::UpdateStatusBar() wxString::Format(wxT("X: %.1f Y: %.1f"), m_camera->GetMousePosition().m_x, m_camera->GetMousePosition().m_y), 3); } + +void Workspace::OnPopupClick(wxCommandEvent& event) +{ + wxMenu* menu = (wxMenu*)event.GetEventObject(); + Element* element = (Element*)menu->GetClientData(); + switch(event.GetId()) + { + case ID_EDIT_BUS: + { + wxMessageBox("Edit bus!"); + } + break; + case ID_EDIT_LINE: + { + wxMessageBox("Edit line!"); + } + break; + case ID_ROTATE: + { + element->Rotate(); + for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) { + Element* nonEditedElement = *it; + // Parent's element rotating... + for(int i = 0; i < (int)nonEditedElement->GetParentList().size(); i++) { + Element* parent = nonEditedElement->GetParentList()[i]; + if(parent == element) { + nonEditedElement->RotateNode(parent); + } + } + } + Redraw(); + } + } +} diff --git a/Project/Workspace.h b/Project/Workspace.h index 8667fa5..e240206 100644 --- a/Project/Workspace.h +++ b/Project/Workspace.h @@ -21,7 +21,7 @@ enum WorkspaceMode MODE_MOVE_PICKBOX, MODE_DRAG, MODE_INSERT, - MODE_SELECTION_RECT + MODE_SELECTION_RECT }; class Workspace : public WorkspaceBase @@ -35,7 +35,9 @@ class Workspace : public WorkspaceBase void SetName(wxString name) { m_name = name; } std::vector<Element*> GetElementList() { return m_elementList; } void Redraw() { m_glCanvas->Refresh(); } + protected: + virtual void OnRightClickDown(wxMouseEvent& event); virtual void OnLeftClickUp(wxMouseEvent& event); virtual void OnScroll(wxMouseEvent& event); virtual void OnMiddleDown(wxMouseEvent& event); @@ -44,6 +46,7 @@ class Workspace : public WorkspaceBase virtual void OnKeyDown(wxKeyEvent& event); virtual void OnLeftClickDown(wxMouseEvent& event); virtual void OnPaint(wxPaintEvent& event); + virtual void OnPopupClick(wxCommandEvent& event); void SetViewport(); diff --git a/Project/Workspace.wxcp b/Project/Workspace.wxcp index 0ceb65b..0153fd3 100644 --- a/Project/Workspace.wxcp +++ b/Project/Workspace.wxcp @@ -320,6 +320,13 @@ "m_functionNameAndSignature": "OnScroll(wxMouseEvent& event)", "m_description": "Process a wxEVT_MOUSEWHEEL event", "m_noBody": false + }, { + "m_eventName": "wxEVT_RIGHT_DOWN", + "m_eventClass": "wxMouseEvent", + "m_eventHandler": "wxMouseEventHandler", + "m_functionNameAndSignature": "OnRightClickDown(wxMouseEvent& event)", + "m_description": "Process a wxEVT_RIGHT_DOWN event", + "m_noBody": false }], "m_children": [] }] diff --git a/Project/WorkspaceBase.cpp b/Project/WorkspaceBase.cpp index 7a63758..65a1071 100644 --- a/Project/WorkspaceBase.cpp +++ b/Project/WorkspaceBase.cpp @@ -51,6 +51,7 @@ WorkspaceBase::WorkspaceBase(wxWindow* parent, wxWindowID id, const wxPoint& pos m_glCanvas->Connect(wxEVT_MIDDLE_UP, wxMouseEventHandler(WorkspaceBase::OnMiddleUp), NULL, this); m_glCanvas->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(WorkspaceBase::OnLeftClickUp), NULL, this); m_glCanvas->Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler(WorkspaceBase::OnScroll), NULL, this); + m_glCanvas->Connect(wxEVT_RIGHT_DOWN, wxMouseEventHandler(WorkspaceBase::OnRightClickDown), NULL, this); } @@ -64,5 +65,6 @@ WorkspaceBase::~WorkspaceBase() m_glCanvas->Disconnect(wxEVT_MIDDLE_UP, wxMouseEventHandler(WorkspaceBase::OnMiddleUp), NULL, this); m_glCanvas->Disconnect(wxEVT_LEFT_UP, wxMouseEventHandler(WorkspaceBase::OnLeftClickUp), NULL, this); m_glCanvas->Disconnect(wxEVT_MOUSEWHEEL, wxMouseEventHandler(WorkspaceBase::OnScroll), NULL, this); + m_glCanvas->Disconnect(wxEVT_RIGHT_DOWN, wxMouseEventHandler(WorkspaceBase::OnRightClickDown), NULL, this); } diff --git a/Project/WorkspaceBase.h b/Project/WorkspaceBase.h index ccd1fcb..30bfdc3 100644 --- a/Project/WorkspaceBase.h +++ b/Project/WorkspaceBase.h @@ -45,6 +45,7 @@ protected: virtual void OnMiddleUp(wxMouseEvent& event) { event.Skip(); } virtual void OnLeftClickUp(wxMouseEvent& event) { event.Skip(); } virtual void OnScroll(wxMouseEvent& event) { event.Skip(); } + virtual void OnRightClickDown(wxMouseEvent& event) { event.Skip(); } public: wxGLCanvas* GetGlCanvas() { return m_glCanvas; } |