diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 74bba784..408ccb52 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -18,6 +18,10 @@ it on https://github.com/GNS3/gns3-gui we will take care of the triage.
For bugs specific to the GNS3 VM, please report on https://github.com/GNS3/gns3-vm
+## Security issues
+
+For security issues please keep it private and send an email to developers@gns3.net
+
## Asking for new features
The best is to start a discussion on the community website in order to get feedback
diff --git a/gns3/items/node_item.py b/gns3/items/node_item.py
index c6c7be3a..128f6fc5 100644
--- a/gns3/items/node_item.py
+++ b/gns3/items/node_item.py
@@ -377,6 +377,11 @@ class NodeItem():
:param value: value of the change
"""
+ # was causing infinite recursion loops when placed within the below if statements
+ if change == QtWidgets.QGraphicsItem.ItemPositionHasChanged and self._main_window.uiSnapToGridAction.isChecked():
+ GRID_SIZE = 75
+ self.setPos(float(GRID_SIZE * round(self.x() / GRID_SIZE)), float(GRID_SIZE * round(self.y() / GRID_SIZE)))
+
# dynamically change the renderer when this node item is selected/unselected.
if change == QtWidgets.QGraphicsItem.ItemSelectedChange:
if value:
diff --git a/gns3/ui/main_window.ui b/gns3/ui/main_window.ui
index 475c60de..8ec12d17 100644
--- a/gns3/ui/main_window.ui
+++ b/gns3/ui/main_window.ui
@@ -123,6 +123,7 @@ background-none;
+
@@ -904,6 +905,17 @@ background-none;
Show layers
+
+
+ true
+
+
+ Snap To Grid
+
+
+ Snap To Grid
+
+
diff --git a/gns3/ui/main_window_ui.py b/gns3/ui/main_window_ui.py
index 15dedb24..8af1383d 100644
--- a/gns3/ui/main_window_ui.py
+++ b/gns3/ui/main_window_ui.py
@@ -1,9 +1,8 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file '/home/grossmj/PycharmProjects/gns3-gui/gns3/ui/main_window.ui'
+# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/main_window.ui'
#
-# Created: Tue May 10 10:08:21 2016
-# by: PyQt5 UI code generator 5.2.1
+# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
@@ -87,8 +86,8 @@ class Ui_MainWindow(object):
self.uiNodesDockWidgetContents = QtWidgets.QWidget()
self.uiNodesDockWidgetContents.setObjectName("uiNodesDockWidgetContents")
self.vboxlayout = QtWidgets.QVBoxLayout(self.uiNodesDockWidgetContents)
- self.vboxlayout.setSpacing(0)
self.vboxlayout.setContentsMargins(0, 0, 0, 0)
+ self.vboxlayout.setSpacing(0)
self.vboxlayout.setObjectName("vboxlayout")
self.uiNodesView = NodesView(self.uiNodesDockWidgetContents)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
@@ -129,8 +128,8 @@ class Ui_MainWindow(object):
self.uiConsoleDockWidgetContents = QtWidgets.QWidget()
self.uiConsoleDockWidgetContents.setObjectName("uiConsoleDockWidgetContents")
self.vboxlayout1 = QtWidgets.QVBoxLayout(self.uiConsoleDockWidgetContents)
- self.vboxlayout1.setSpacing(0)
self.vboxlayout1.setContentsMargins(0, 0, 0, 0)
+ self.vboxlayout1.setSpacing(0)
self.vboxlayout1.setObjectName("vboxlayout1")
self.uiConsoleTextEdit = ConsoleView(self.uiConsoleDockWidgetContents)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
@@ -324,6 +323,9 @@ class Ui_MainWindow(object):
self.uiShowLayersAction = QtWidgets.QAction(MainWindow)
self.uiShowLayersAction.setCheckable(True)
self.uiShowLayersAction.setObjectName("uiShowLayersAction")
+ self.uiSnapToGridAction = QtWidgets.QAction(MainWindow)
+ self.uiSnapToGridAction.setCheckable(True)
+ self.uiSnapToGridAction.setObjectName("uiSnapToGridAction")
self.uiSaveProjectAsAction = QtWidgets.QAction(MainWindow)
icon21 = QtGui.QIcon()
icon21.addPixmap(QtGui.QPixmap(":/icons/save-as-project.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
@@ -385,9 +387,9 @@ class Ui_MainWindow(object):
self.uiAddLinkAction.setCheckable(True)
icon29 = QtGui.QIcon()
icon29.addPixmap(QtGui.QPixmap(":/icons/cancel-connection.svg"), QtGui.QIcon.Active, QtGui.QIcon.On)
+ icon29.addPixmap(QtGui.QPixmap(":/icons/cancel-connection.svg"), QtGui.QIcon.Normal, QtGui.QIcon.On)
icon29.addPixmap(QtGui.QPixmap(":/icons/connection-new-hover.svg"), QtGui.QIcon.Active, QtGui.QIcon.Off)
icon29.addPixmap(QtGui.QPixmap(":/icons/connection-new.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
- icon29.addPixmap(QtGui.QPixmap(":/icons/cancel-connection.svg"), QtGui.QIcon.Normal, QtGui.QIcon.On)
self.uiAddLinkAction.setIcon(icon29)
self.uiAddLinkAction.setObjectName("uiAddLinkAction")
self.uiGettingStartedAction = QtWidgets.QAction(MainWindow)
@@ -475,6 +477,7 @@ class Ui_MainWindow(object):
self.uiViewMenu.addAction(self.uiFitInViewAction)
self.uiViewMenu.addSeparator()
self.uiViewMenu.addAction(self.uiShowLayersAction)
+ self.uiViewMenu.addAction(self.uiSnapToGridAction)
self.uiViewMenu.addAction(self.uiResetPortLabelsAction)
self.uiViewMenu.addAction(self.uiShowPortNamesAction)
self.uiViewMenu.addSeparator()
@@ -642,6 +645,8 @@ class Ui_MainWindow(object):
self.uiSnapshotAction.setStatusTip(_translate("MainWindow", "Manage snapshots"))
self.uiShowLayersAction.setText(_translate("MainWindow", "Show layers"))
self.uiShowLayersAction.setStatusTip(_translate("MainWindow", "Show layers"))
+ self.uiSnapToGridAction.setText(_translate("MainWindow", "Snap To Grid"))
+ self.uiSnapToGridAction.setStatusTip(_translate("MainWindow", "Snap To Grid"))
self.uiSaveProjectAsAction.setText(_translate("MainWindow", "&Save project as..."))
self.uiSaveProjectAsAction.setToolTip(_translate("MainWindow", "Save project as..."))
self.uiSaveProjectAsAction.setStatusTip(_translate("MainWindow", "Save project as..."))
@@ -702,9 +707,9 @@ class Ui_MainWindow(object):
self.uiEditReadmeAction.setText(_translate("MainWindow", "Edit readme"))
self.uiAcademyAction.setText(_translate("MainWindow", "GNS3 &Academy"))
-from ..graphics_view import GraphicsView
from ..console_view import ConsoleView
+from ..graphics_view import GraphicsView
from ..nodes_view import NodesView
-from ..topology_summary_view import TopologySummaryView
from ..server_summary_view import ServerSummaryView
+from ..topology_summary_view import TopologySummaryView
from . import resources_rc