Merge pull request #3780 from GNS3/release/v2.2.56.1

Release v2.2.56.1
This commit is contained in:
Jeremy Grossmann
2026-02-11 16:53:04 +08:00
committed by GitHub
16 changed files with 47 additions and 32 deletions

View File

@@ -1,5 +1,15 @@
# Change Log
## 2.2.56.1 28/01/2026
* Fix line style support for links
* Fix cannot add IOS in preferences
* Fix cannot add IOU in preferences
* Upgrade dependencies
* Drop Python 3.8 support
* Display a warning if a SVG image format isn't supported
* Fix error in profile selection window after PyQt6 migration
## 2.2.56 21/01/2026
* Fixing tab name in MobaXterm

View File

@@ -1,4 +1,4 @@
-rrequirements.txt
pytest==8.3.2
pytest-timeout==2.3.1
pytest==8.4.2 # version 8.4.2 is the last one supporting Python 3.9
pytest-timeout==2.4.0

View File

@@ -50,7 +50,7 @@ class CrashReport:
Report crash to a third party service
"""
DSN = "https://f09d966530e45cc56fbe33adc6baeeb8@o19455.ingest.us.sentry.io/38506"
DSN = "https://2173ac82d30385607ee40ae11973e298@o19455.ingest.us.sentry.io/38506"
_instance = None
def __init__(self):

View File

@@ -24,7 +24,7 @@ log = logging.getLogger(__name__)
class CaptureDialog(QtWidgets.QDialog, Ui_CaptureDialog):
"""
This dialog allow configure the packet capture
This dialog allow to configure the packet capture
"""
def __init__(self, parent, file_name, auto_start, ethernet_link=True):

View File

@@ -19,7 +19,7 @@ import os
import sys
import shutil
from gns3.qt import QtWidgets
from gns3.qt import QtWidgets, QtGui
from gns3.local_config import LocalConfig
from gns3.ui.profile_select_dialog_ui import Ui_ProfileSelectDialog
from gns3.version import __version_info__
@@ -46,7 +46,7 @@ class ProfileSelectDialog(QtWidgets.QDialog, Ui_ProfileSelectDialog):
self.uiDeletePushButton.clicked.connect(self._deletePushButtonSlot)
# Center on screen
screen = QtWidgets.QApplication.desktop().screenGeometry()
screen = QtGui.QGuiApplication.primaryScreen().geometry()
self.move(screen.center() - self.rect().center())
version = "{}.{}".format(__version_info__[0], __version_info__[1])

View File

@@ -65,10 +65,13 @@ class StyleEditorDialogLink(QtWidgets.QDialog, Ui_StyleEditorDialog):
link.setHovered(True)
self._border_color = pen.color()
self.uiBorderColorPushButton.setStyleSheet("background-color: rgba({}, {}, {}, {});".format(self._border_color.red(),
self._border_color.green(),
self._border_color.blue(),
self._border_color.alpha()))
self.uiBorderColorPushButton.setStyleSheet("background-color: rgba({}, {}, {}, {});".format(
self._border_color.red(),
self._border_color.green(),
self._border_color.blue(),
self._border_color.alpha())
)
self.uiBorderWidthSpinBox.setValue(pen.width())
index = self.uiBorderStyleComboBox.findData(pen.style())
if index != -1:
@@ -102,8 +105,8 @@ class StyleEditorDialogLink(QtWidgets.QDialog, Ui_StyleEditorDialog):
new_link_style = {}
new_link_style["color"] = self._border_color.name()
new_link_style["width"] = self.uiBorderWidthSpinBox.value()
new_link_style["type"] = border_style
new_link_style["type"] = border_style.value
# Store values
self._link.setLinkStyle(new_link_style)
self._link.setHovered(False) # allow to see the new style

View File

@@ -56,7 +56,7 @@ class EthernetLinkItem(LinkItem):
if self._hovered:
self.setPen(QtGui.QPen(QtCore.Qt.GlobalColor.red, self._link._link_style["width"] + 1, QtCore.Qt.PenStyle.SolidLine, QtCore.Qt.PenCapStyle.RoundCap, QtCore.Qt.PenJoinStyle.RoundJoin))
else:
self.setPen(QtGui.QPen(QtGui.QColor(self._link._link_style["color"]), self._link._link_style["width"], self._link._link_style["type"], QtCore.Qt.PenCapStyle.RoundCap, QtCore.Qt.PenJoinStyle.RoundJoin))
self.setPen(QtGui.QPen(QtGui.QColor(self._link._link_style["color"]), self._link._link_style["width"], QtCore.Qt.PenStyle(self._link._link_style["type"]), QtCore.Qt.PenCapStyle.RoundCap, QtCore.Qt.PenJoinStyle.RoundJoin))
except:
if self._hovered:
self.setPen(QtGui.QPen(QtCore.Qt.GlobalColor.red, self._pen_width + 1, QtCore.Qt.PenStyle.SolidLine, QtCore.Qt.PenCapStyle.RoundCap, QtCore.Qt.PenJoinStyle.RoundJoin))

View File

@@ -54,7 +54,7 @@ class SerialLinkItem(LinkItem):
if self._hovered:
self.setPen(QtGui.QPen(QtCore.Qt.GlobalColor.red, self._link._link_style["width"] + 1, QtCore.Qt.PenStyle.SolidLine, QtCore.Qt.PenCapStyle.RoundCap, QtCore.Qt.PenJoinStyle.RoundJoin))
else:
self.setPen(QtGui.QPen(QtGui.QColor(self._link._link_style["color"]), self._link._link_style["width"], self._link._link_style["type"], QtCore.Qt.PenCapStyle.RoundCap, QtCore.Qt.PenJoinStyle.RoundJoin))
self.setPen(QtGui.QPen(QtGui.QColor(self._link._link_style["color"]), self._link._link_style["width"], QtCore.Qt.PenStyle(self._link._link_style["type"]), QtCore.Qt.PenCapStyle.RoundCap, QtCore.Qt.PenJoinStyle.RoundJoin))
except:
if self._hovered:
self.setPen(QtGui.QPen(QtCore.Qt.GlobalColor.red, self._pen_width + 1, QtCore.Qt.PenStyle.SolidLine, QtCore.Qt.PenCapStyle.RoundCap, QtCore.Qt.PenJoinStyle.RoundJoin))

View File

@@ -184,9 +184,9 @@ def main():
# catch exceptions to write them in a file
sys.excepthook = exceptionHook
# we only support Python 3 version >= 3.8
if sys.version_info < (3, 8):
raise SystemExit("Python 3.8 or higher is required")
# we only support Python 3 version >= 3.9
if sys.version_info < (3, 9):
raise SystemExit("Python 3.9 or higher is required")
if parse_version(QtCore.QT_VERSION_STR) < parse_version("6.3.1"):
raise SystemExit("Requirement is PyQt6 version 6.3.1 or higher, got version {}".format(QtCore.QT_VERSION_STR))

View File

@@ -194,6 +194,12 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.setWindowTitle("[*] GNS3")
# detect if the SVG module is correctly installed
supported_image_formats = [fmt.data().decode('utf-8') for fmt in QtGui.QImageReader().supportedImageFormats()]
log.debug("Supported image formats: %s", ", ".join(supported_image_formats))
if "svg" not in supported_image_formats:
log.warning("SVG image format is not supported, is the Qt SVG module installed?")
# load initial stuff once the event loop isn't busy
self.run_later(0, self.startupLoading)

View File

@@ -70,7 +70,7 @@ class IOSRouterWizard(VMWithImagesWizard, Ui_IOSRouterWizard):
self.uiTestIOSImagePushButton.clicked.connect(self._testIOSImageSlot)
self.uiIdlePCFinderPushButton.clicked.connect(self._idlePCFinderSlot)
self.uiEtherSwitchCheckBox.stateChanged.connect(self._etherSwitchSlot)
self.uiPlatformComboBox.currentIndexChanged[str].connect(self._platformChangedSlot)
self.uiPlatformComboBox.currentTextChanged.connect(self._platformChangedSlot)
self.uiPlatformComboBox.addItems(list(PLATFORMS_DEFAULT_RAM.keys()))
self._router = None

View File

@@ -40,7 +40,7 @@ class IOUDeviceWizard(VMWithImagesWizard, Ui_IOUDeviceWizard):
super().__init__(iou_devices, parent)
self.setPixmap(QtWidgets.QWizard.WizardPixmap.LogoPixmap, QtGui.QPixmap(":/symbols/multilayer_switch.svg"))
self.uiTypeComboBox.currentIndexChanged[str].connect(self._typeChangedSlot)
self.uiTypeComboBox.currentTextChanged.connect(self._typeChangedSlot)
if ComputeManager.instance().localPlatform().startswith("win") or ComputeManager.instance().localPlatform().startswith("darwin"):
# Cannot use IOU locally on Windows and Mac

View File

@@ -181,8 +181,7 @@ class LogQMessageBox(QtWidgets.QMessageBox):
Return a logger in the context of the caller
in order to have the correct information in the log
"""
if sys.version_info < (3, 5):
return logging.getLogger('qt')
try:
caller = inspect.stack()[2]
location = "{}:{}".format(os.path.basename(caller.filename), caller.lineno)

View File

@@ -23,7 +23,7 @@
# or negative for a release candidate or beta (after the base version
# number has been incremented)
__version__ = "2.2.56"
__version__ = "2.2.56.1"
__version_info__ = (2, 2, 56, 0)
if "dev" in __version__:

View File

@@ -1,7 +1,5 @@
jsonschema>=4.23,<4.24
sentry-sdk>=2.44.0,<2.45 # optional dependency
psutil>=7.1.3
jsonschema>=4.25.1,<4.26 # version 4.25.1 is the last to support Python 3.9
sentry-sdk>=2.50.0,<3 # optional dependency
psutil>=7.2.1
distro>=1.9.0
truststore>=0.10.0; python_version >= '3.10'
importlib-resources>=1.3; python_version < '3.9'
truststore>=0.10.4; python_version >= '3.10'

View File

@@ -19,9 +19,9 @@ import sys
from setuptools import setup, find_packages
from setuptools.command.test import test as TestCommand
# we only support Python 3 version >= 3.8
if len(sys.argv) >= 2 and sys.argv[1] == "install" and sys.version_info < (3, 8):
raise SystemExit("Python 3.8 or higher is required")
# we only support Python 3 version >= 3.9
if len(sys.argv) >= 2 and sys.argv[1] == "install" and sys.version_info < (3, 9):
raise SystemExit("Python 3.9 or higher is required")
class PyTest(TestCommand):
@@ -93,7 +93,6 @@ setup(
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",