summaryrefslogtreecommitdiffstats
path: root/Project
diff options
context:
space:
mode:
Diffstat (limited to 'Project')
-rw-r--r--Project/Bus.cpp9
-rw-r--r--Project/Bus.h3
-rw-r--r--Project/Element.cpp18
-rw-r--r--Project/Element.h29
-rw-r--r--Project/Line.cpp151
-rw-r--r--Project/Line.h10
-rw-r--r--Project/MainFrame.cpp2
-rw-r--r--Project/Project.mk2
-rw-r--r--Project/Release/Bus.cpp.obin19467 -> 25034 bytes
-rw-r--r--Project/Release/Bus.cpp.o.d155
-rw-r--r--Project/Release/Element.cpp.obin10291 -> 11710 bytes
-rw-r--r--Project/Release/Line.cpp.obin21187 -> 29756 bytes
-rw-r--r--Project/Release/Line.cpp.o.d62
-rw-r--r--Project/Release/PSP-UFU.exebin3257480 -> 3277391 bytes
-rw-r--r--Project/Release/Workspace.cpp.obin94521 -> 110214 bytes
-rw-r--r--Project/Release/Workspace.cpp.o.d20
-rw-r--r--Project/Release/WorkspaceBase.cpp.obin96434 -> 97418 bytes
-rw-r--r--Project/Workspace.cpp74
-rw-r--r--Project/Workspace.h5
-rw-r--r--Project/Workspace.wxcp7
-rw-r--r--Project/WorkspaceBase.cpp2
-rw-r--r--Project/WorkspaceBase.h1
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
index 21460aa..a5f2ad8 100644
--- a/Project/Release/Bus.cpp.o
+++ b/Project/Release/Bus.cpp.o
Binary files differ
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
index eb21254..507b116 100644
--- a/Project/Release/Element.cpp.o
+++ b/Project/Release/Element.cpp.o
Binary files differ
diff --git a/Project/Release/Line.cpp.o b/Project/Release/Line.cpp.o
index 8194ffd..587e66d 100644
--- a/Project/Release/Line.cpp.o
+++ b/Project/Release/Line.cpp.o
Binary files differ
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
index 2a86ce5..04fb13d 100644
--- a/Project/Release/PSP-UFU.exe
+++ b/Project/Release/PSP-UFU.exe
Binary files differ
diff --git a/Project/Release/Workspace.cpp.o b/Project/Release/Workspace.cpp.o
index 67d882f..9d4cb18 100644
--- a/Project/Release/Workspace.cpp.o
+++ b/Project/Release/Workspace.cpp.o
Binary files differ
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
index 4462b10..8ec190c 100644
--- a/Project/Release/WorkspaceBase.cpp.o
+++ b/Project/Release/WorkspaceBase.cpp.o
Binary files differ
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; }