Adds multi select support in all device template pages.

* Also adds "Delete" as part of the context menu of devices.
* (Some methods are reordered for consistency; Legacy signaling is fixed to the new one where encountered)
* Patched build_pyqt.py for Windows, and for it to remove the path of the .ui file in the comment.
* Shrinked the minimum width of all preference dialogs.
* Removed zorder nodes (PyQt5 complains...) and regenerated all preference dialogs.
This commit is contained in:
Vasil Rangelov
2015-05-02 04:55:32 +03:00
committed by Julien Duponchelle
parent fcd93c8db8
commit f280445138
69 changed files with 193470 additions and 193394 deletions

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/builtin/ui/cloud_configuration_page.ui'
# Form implementation generated from reading ui file 'cloud_configuration_page.ui'
#
# Created: Mon May 4 12:01:30 2015
# Created: Wed May 6 14:31:55 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -63,28 +63,89 @@ class IOSRouterPreferencesPage(QtWidgets.QWidget, Ui_IOSRouterPreferencesPageWid
self.uiNewIOSRouterPushButton.clicked.connect(self._iosRouterNewSlot)
self.uiEditIOSRouterPushButton.clicked.connect(self._iosRouterEditSlot)
self.uiDeleteIOSRouterPushButton.clicked.connect(self._iosRouterDeleteSlot)
self.uiIOSRoutersTreeWidget.currentItemChanged.connect(self._iosRouterChangedSlot)
self.uiIOSRoutersTreeWidget.itemSelectionChanged.connect(self._iosRouterChangedSlot)
self.uiIOSRoutersTreeWidget.itemPressed.connect(self._iosRouterPressedSlot)
self.uiDecompressIOSPushButton.clicked.connect(self._decompressIOSSlot)
def _iosRouterChangedSlot(self, current, previous):
def _createSectionItem(self, name):
section_item = QtWidgets.QTreeWidgetItem(self.uiIOSRouterInfoTreeWidget)
section_item.setText(0, name)
font = section_item.font(0)
font.setBold(True)
section_item.setFont(0, font)
return section_item
def _refreshInfo(self, ios_router):
self.uiIOSRouterInfoTreeWidget.clear()
# fill out the General section
section_item = self._createSectionItem("General")
QtWidgets.QTreeWidgetItem(section_item, ["Name:", ios_router["name"]])
QtWidgets.QTreeWidgetItem(section_item, ["Server:", ios_router["server"]])
QtWidgets.QTreeWidgetItem(section_item, ["Platform:", ios_router["platform"]])
if ios_router["chassis"]:
QtWidgets.QTreeWidgetItem(section_item, ["Chassis:", ios_router["chassis"]])
QtWidgets.QTreeWidgetItem(section_item, ["Image:", ios_router["image"]])
if ios_router["idlepc"]:
QtWidgets.QTreeWidgetItem(section_item, ["Idle-PC:", ios_router["idlepc"]])
if ios_router["startup_config"]:
QtWidgets.QTreeWidgetItem(section_item, ["Startup-config:", ios_router["startup_config"]])
if ios_router["private_config"]:
QtWidgets.QTreeWidgetItem(section_item, ["Private-config:", ios_router["private_config"]])
if ios_router["platform"] == "c7200":
QtWidgets.QTreeWidgetItem(section_item, ["Midplane:", ios_router["midplane"]])
QtWidgets.QTreeWidgetItem(section_item, ["NPE:", ios_router["npe"]])
# fill out the Memories and disk section
section_item = self._createSectionItem("Memories and disks")
QtWidgets.QTreeWidgetItem(section_item, ["RAM:", "{} MiB".format(ios_router["ram"])])
QtWidgets.QTreeWidgetItem(section_item, ["NVRAM:", "{} KiB".format(ios_router["nvram"])])
if "iomem" in ios_router and ios_router["iomem"]:
QtWidgets.QTreeWidgetItem(section_item, ["I/O memory:", "{}%".format(ios_router["iomem"])])
QtWidgets.QTreeWidgetItem(section_item, ["PCMCIA disk0:", "{} MiB".format(ios_router["disk0"])])
QtWidgets.QTreeWidgetItem(section_item, ["PCMCIA disk1:", "{} MiB".format(ios_router["disk1"])])
# fill out the Adapters section
section_item = self._createSectionItem("Adapters")
for slot_id in range(0, 7):
slot = "slot{}".format(slot_id)
if slot in ios_router and ios_router[slot]:
QtWidgets.QTreeWidgetItem(section_item, ["Slot {}:".format(slot_id), ios_router[slot]])
if section_item.childCount() == 0:
self.uiIOSRouterInfoTreeWidget.takeTopLevelItem(self.uiIOSRouterInfoTreeWidget.indexOfTopLevelItem(section_item))
# fill out the WICs section
section_item = self._createSectionItem("WICs")
for wic_id in range(0, 3):
wic = "wic{}".format(wic_id)
if wic in ios_router and ios_router[wic]:
QtWidgets.QTreeWidgetItem(section_item, ["WIC {}:".format(wic_id), ios_router[wic]])
if section_item.childCount() == 0:
self.uiIOSRouterInfoTreeWidget.takeTopLevelItem(self.uiIOSRouterInfoTreeWidget.indexOfTopLevelItem(section_item))
self.uiIOSRouterInfoTreeWidget.expandAll()
self.uiIOSRouterInfoTreeWidget.resizeColumnToContents(0)
self.uiIOSRouterInfoTreeWidget.resizeColumnToContents(1)
def _iosRouterChangedSlot(self):
"""
Loads a selected an IOS router from the tree widget.
:param current: current QTreeWidgetItem instance
:param previous: ignored
"""
if not current:
self.uiIOSRouterInfoTreeWidget.clear()
return
selection = self.uiIOSRoutersTreeWidget.selectedItems()
self.uiDeleteIOSRouterPushButton.setEnabled(len(selection) != 0)
single_selected = len(selection) == 1
self.uiEditIOSRouterPushButton.setEnabled(single_selected)
self.uiDecompressIOSPushButton.setEnabled(single_selected)
self.uiEditIOSRouterPushButton.setEnabled(True)
self.uiDeleteIOSRouterPushButton.setEnabled(True)
self.uiDecompressIOSPushButton.setEnabled(True)
key = current.data(0, QtCore.Qt.UserRole)
ios_router = self._ios_routers[key]
self._refreshInfo(ios_router)
if single_selected:
key = selection[0].data(0, QtCore.Qt.UserRole)
ios_router = self._ios_routers[key]
self._refreshInfo(ios_router)
else:
self.uiIOSRouterInfoTreeWidget.clear()
def _iosRouterNewSlot(self):
"""
@@ -153,11 +214,6 @@ class IOSRouterPreferencesPage(QtWidgets.QWidget, Ui_IOSRouterPreferencesPageWid
self._items.append(item)
self.uiIOSRoutersTreeWidget.setCurrentItem(item)
def _imageUploadComplete(self):
if self._upload_image_progress_dialog.wasCanceled():
return
self._upload_image_progress_dialog.accept()
def _iosRouterEditSlot(self):
"""
Edits an IOS router.
@@ -190,17 +246,138 @@ class IOSRouterPreferencesPage(QtWidgets.QWidget, Ui_IOSRouterPreferencesPageWid
Deletes an IOS router.
"""
for item in self.uiIOSRoutersTreeWidget.selectedItems():
if item:
key = item.data(0, QtCore.Qt.UserRole)
ios_router = self._ios_routers[key]
del self._ios_routers[key]
self.uiIOSRoutersTreeWidget.takeTopLevelItem(self.uiIOSRoutersTreeWidget.indexOfTopLevelItem(item))
if self._ios_routers == {}:
self.uiEditIOSRouterPushButton.setEnabled(False)
self.uiDeleteIOSRouterPushButton.setEnabled(False)
self.uiDecompressIOSPushButton.setEnabled(False)
def _iosRouterPressedSlot(self, item, column):
"""
Slot for item pressed.
:param item: ignored
:param column: ignored
"""
if QtWidgets.QApplication.mouseButtons() & QtCore.Qt.RightButton:
self._showContextualMenu()
def _showContextualMenu(self):
"""
Contextual menu.
"""
menu = QtWidgets.QMenu()
change_symbol_action = QtWidgets.QAction("Change symbol", menu)
change_symbol_action.setIcon(QtGui.QIcon(":/icons/node_conception.svg"))
change_symbol_action.setEnabled(len(self.uiIOSRoutersTreeWidget.selectedItems()) == 1)
change_symbol_action.triggered.connect(self._changeSymbolSlot)
menu.addAction(change_symbol_action)
delete_action = QtWidgets.QAction("Delete", menu)
delete_action.triggered.connect(self._iosRouterDeleteSlot)
menu.addAction(delete_action)
menu.exec_(QtGui.QCursor.pos())
def _changeSymbolSlot(self):
"""
Change a symbol for an IOS router.
"""
item = self.uiIOSRoutersTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
ios_router = self._ios_routers[key]
dialog = SymbolSelectionDialog(self, symbol=ios_router["default_symbol"], category=ios_router["category"])
dialog.show()
if dialog.exec_():
normal_symbol, selected_symbol = dialog.getSymbols()
category = dialog.getCategory()
item.setIcon(0, QtGui.QIcon(normal_symbol))
ios_router["default_symbol"] = normal_symbol
ios_router["hover_symbol"] = selected_symbol
ios_router["category"] = category
del self._ios_routers[key]
self.uiIOSRoutersTreeWidget.takeTopLevelItem(self.uiIOSRoutersTreeWidget.indexOfTopLevelItem(item))
if self._ios_routers == {}:
self.uiEditIOSRouterPushButton.setEnabled(False)
self.uiDeleteIOSRouterPushButton.setEnabled(False)
self.uiDecompressIOSPushButton.setEnabled(False)
def loadPreferences(self):
"""
Loads the IOS router preferences.
"""
dynamips_module = Dynamips.instance()
self._ios_routers = copy.deepcopy(dynamips_module.iosRouters())
self._items.clear()
for key, ios_router in self._ios_routers.items():
item = QtWidgets.QTreeWidgetItem(self.uiIOSRoutersTreeWidget)
item.setText(0, ios_router["name"])
item.setIcon(0, QtGui.QIcon(ios_router["default_symbol"]))
item.setData(0, QtCore.Qt.UserRole, key)
self._items.append(item)
if self._items:
self.uiIOSRoutersTreeWidget.setCurrentItem(self._items[0])
self.uiIOSRoutersTreeWidget.sortByColumn(0, QtCore.Qt.AscendingOrder)
def savePreferences(self):
"""
Saves the IOS router preferences.
"""
Dynamips.instance().setIOSRouters(self._ios_routers)
def _imageUploadComplete(self):
if self._upload_image_progress_dialog.wasCanceled():
return
self._upload_image_progress_dialog.accept()
def _decompressIOSSlot(self):
"""
Slot to decompress an IOS image.
"""
item = self.uiIOSRoutersTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
ios_router = self._ios_routers[key]
path = ios_router["image"]
if not os.path.isfile(path):
QtWidgets.QMessageBox.critical(self, "IOS image", "IOS image file {} is does not exist".format(path))
return
try:
if not isIOSCompressed(path):
QtWidgets.QMessageBox.critical(self, "IOS image", "IOS image {} is not compressed".format(os.path.basename(path)))
return
except (OSError, ValueError) as e:
# errno 22, invalid argument means the file system where the IOS image is located doesn't support mmap
if e.errno == 22:
QtWidgets.QMessageBox.critical(self, "IOS image", "IOS image {} cannot be memory mapped, most likely because the file system doesn't support it".format(os.path.basename(path)))
else:
QtWidgets.QMessageBox.critical(self, "IOS image", "Could not determine if the IOS image is compressed: {}".format(e))
return
decompressed_image_path = os.path.splitext(path)[0] + ".image"
if os.path.isfile(decompressed_image_path):
QtWidgets.QMessageBox.critical(self, "IOS image", "Decompressed IOS image {} already exist".format(os.path.basename(decompressed_image_path)))
return
thread = DecompressIOSThread(path, decompressed_image_path)
progress_dialog = ProgressDialog(thread,
"IOS image",
"Decompressing IOS image {}...".format(path),
"Cancel", busy=True, parent=self)
progress_dialog.show()
if progress_dialog.exec_() is not False:
ios_router["image"] = decompressed_image_path
self._refreshInfo(ios_router)
thread.wait()
@staticmethod
def getIOSImage(parent):
@@ -318,175 +495,3 @@ class IOSRouterPreferencesPage(QtWidgets.QWidget, Ui_IOSRouterPreferencesPageWid
decompressed_size = (decompressed_size / (1000 * 1000)) + 1
# round up to the closest multiple of 32 (step of the RAM SpinBox)
return math.ceil(decompressed_size / 32) * 32
def _decompressIOSSlot(self):
"""
Slot to decompress an IOS image.
"""
item = self.uiIOSRoutersTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
ios_router = self._ios_routers[key]
path = ios_router["image"]
if not os.path.isfile(path):
QtWidgets.QMessageBox.critical(self, "IOS image", "IOS image file {} is does not exist".format(path))
return
try:
if not isIOSCompressed(path):
QtWidgets.QMessageBox.critical(self, "IOS image", "IOS image {} is not compressed".format(os.path.basename(path)))
return
except (OSError, ValueError) as e:
# errno 22, invalid argument means the file system where the IOS image is located doesn't support mmap
if e.errno == 22:
QtWidgets.QMessageBox.critical(self, "IOS image", "IOS image {} cannot be memory mapped, most likely because the file system doesn't support it".format(os.path.basename(path)))
else:
QtWidgets.QMessageBox.critical(self, "IOS image", "Could not determine if the IOS image is compressed: {}".format(e))
return
decompressed_image_path = os.path.splitext(path)[0] + ".image"
if os.path.isfile(decompressed_image_path):
QtWidgets.QMessageBox.critical(self, "IOS image", "Decompressed IOS image {} already exist".format(os.path.basename(decompressed_image_path)))
return
thread = DecompressIOSThread(path, decompressed_image_path)
progress_dialog = ProgressDialog(thread,
"IOS image",
"Decompressing IOS image {}...".format(path),
"Cancel", busy=True, parent=self)
progress_dialog.show()
if progress_dialog.exec_() is not False:
ios_router["image"] = decompressed_image_path
self._refreshInfo(ios_router)
thread.wait()
def _createSectionItem(self, name):
section_item = QtWidgets.QTreeWidgetItem(self.uiIOSRouterInfoTreeWidget)
section_item.setText(0, name)
font = section_item.font(0)
font.setBold(True)
section_item.setFont(0, font)
return section_item
def _refreshInfo(self, ios_router):
self.uiIOSRouterInfoTreeWidget.clear()
# fill out the General section
section_item = self._createSectionItem("General")
QtWidgets.QTreeWidgetItem(section_item, ["Name:", ios_router["name"]])
QtWidgets.QTreeWidgetItem(section_item, ["Server:", ios_router["server"]])
QtWidgets.QTreeWidgetItem(section_item, ["Platform:", ios_router["platform"]])
if ios_router["chassis"]:
QtWidgets.QTreeWidgetItem(section_item, ["Chassis:", ios_router["chassis"]])
QtWidgets.QTreeWidgetItem(section_item, ["Image:", ios_router["image"]])
if ios_router["idlepc"]:
QtWidgets.QTreeWidgetItem(section_item, ["Idle-PC:", ios_router["idlepc"]])
if ios_router["startup_config"]:
QtWidgets.QTreeWidgetItem(section_item, ["Startup-config:", ios_router["startup_config"]])
if ios_router["private_config"]:
QtWidgets.QTreeWidgetItem(section_item, ["Private-config:", ios_router["private_config"]])
if ios_router["platform"] == "c7200":
QtWidgets.QTreeWidgetItem(section_item, ["Midplane:", ios_router["midplane"]])
QtWidgets.QTreeWidgetItem(section_item, ["NPE:", ios_router["npe"]])
# fill out the Memories and disk section
section_item = self._createSectionItem("Memories and disks")
QtWidgets.QTreeWidgetItem(section_item, ["RAM:", "{} MiB".format(ios_router["ram"])])
QtWidgets.QTreeWidgetItem(section_item, ["NVRAM:", "{} KiB".format(ios_router["nvram"])])
if "iomem" in ios_router and ios_router["iomem"]:
QtWidgets.QTreeWidgetItem(section_item, ["I/O memory:", "{}%".format(ios_router["iomem"])])
QtWidgets.QTreeWidgetItem(section_item, ["PCMCIA disk0:", "{} MiB".format(ios_router["disk0"])])
QtWidgets.QTreeWidgetItem(section_item, ["PCMCIA disk1:", "{} MiB".format(ios_router["disk1"])])
# fill out the Adapters section
section_item = self._createSectionItem("Adapters")
for slot_id in range(0, 7):
slot = "slot{}".format(slot_id)
if slot in ios_router and ios_router[slot]:
QtWidgets.QTreeWidgetItem(section_item, ["Slot {}:".format(slot_id), ios_router[slot]])
if section_item.childCount() == 0:
self.uiIOSRouterInfoTreeWidget.takeTopLevelItem(self.uiIOSRouterInfoTreeWidget.indexOfTopLevelItem(section_item))
# fill out the WICs section
section_item = self._createSectionItem("WICs")
for wic_id in range(0, 3):
wic = "wic{}".format(wic_id)
if wic in ios_router and ios_router[wic]:
QtWidgets.QTreeWidgetItem(section_item, ["WIC {}:".format(wic_id), ios_router[wic]])
if section_item.childCount() == 0:
self.uiIOSRouterInfoTreeWidget.takeTopLevelItem(self.uiIOSRouterInfoTreeWidget.indexOfTopLevelItem(section_item))
self.uiIOSRouterInfoTreeWidget.expandAll()
self.uiIOSRouterInfoTreeWidget.resizeColumnToContents(0)
self.uiIOSRouterInfoTreeWidget.resizeColumnToContents(1)
def _iosRouterPressedSlot(self, item, column):
"""
Slot for item pressed.
:param item: ignored
:param column: ignored
"""
if QtWidgets.QApplication.mouseButtons() & QtCore.Qt.RightButton:
self._showContextualMenu()
def _showContextualMenu(self):
"""
Contextual menu.
"""
menu = QtWidgets.QMenu()
change_symbol_action = QtWidgets.QAction("Change symbol", menu)
change_symbol_action.setIcon(QtGui.QIcon(":/icons/node_conception.svg"))
self.connect(change_symbol_action, QtCore.SIGNAL('triggered()'), self._changeSymbolSlot)
menu.addAction(change_symbol_action)
menu.exec_(QtGui.QCursor.pos())
def _changeSymbolSlot(self):
"""
Change a symbol for an IOS router.
"""
item = self.uiIOSRoutersTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
ios_router = self._ios_routers[key]
dialog = SymbolSelectionDialog(self, symbol=ios_router["default_symbol"], category=ios_router["category"])
dialog.show()
if dialog.exec_():
normal_symbol, selected_symbol = dialog.getSymbols()
category = dialog.getCategory()
item.setIcon(0, QtGui.QIcon(normal_symbol))
ios_router["default_symbol"] = normal_symbol
ios_router["hover_symbol"] = selected_symbol
ios_router["category"] = category
def loadPreferences(self):
"""
Loads the IOS router preferences.
"""
dynamips_module = Dynamips.instance()
self._ios_routers = copy.deepcopy(dynamips_module.iosRouters())
self._items.clear()
for key, ios_router in self._ios_routers.items():
item = QtWidgets.QTreeWidgetItem(self.uiIOSRoutersTreeWidget)
item.setText(0, ios_router["name"])
item.setIcon(0, QtGui.QIcon(ios_router["default_symbol"]))
item.setData(0, QtCore.Qt.UserRole, key)
self._items.append(item)
if self._items:
self.uiIOSRoutersTreeWidget.setCurrentItem(self._items[0])
self.uiIOSRoutersTreeWidget.sortByColumn(0, QtCore.Qt.AscendingOrder)
def savePreferences(self):
"""
Saves the IOS router preferences.
"""
Dynamips.instance().setIOSRouters(self._ios_routers)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/atm_bridge_configuration_page.ui'
# Form implementation generated from reading ui file 'atm_bridge_configuration_page.ui'
#
# Created: Mon May 4 12:01:30 2015
# Created: Wed May 6 14:31:55 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/atm_switch_configuration_page.ui'
# Form implementation generated from reading ui file 'atm_switch_configuration_page.ui'
#
# Created: Mon May 4 12:01:30 2015
# Created: Wed May 6 14:31:55 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>430</width>
<height>539</height>
<width>435</width>
<height>200</height>
</rect>
</property>
<property name="windowTitle">
@@ -154,8 +154,6 @@
</spacer>
</item>
</layout>
<zorder>spacer_2</zorder>
<zorder>uiMemoryUsageOptimisationGroupBox</zorder>
</widget>
</widget>
</item>

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/dynamips_preferences_page.ui'
# Form implementation generated from reading ui file 'dynamips_preferences_page.ui'
#
# Created: Mon May 4 12:01:31 2015
# Created: Wed May 6 14:31:55 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_DynamipsPreferencesPageWidget(object):
def setupUi(self, DynamipsPreferencesPageWidget):
DynamipsPreferencesPageWidget.setObjectName("DynamipsPreferencesPageWidget")
DynamipsPreferencesPageWidget.resize(430, 539)
DynamipsPreferencesPageWidget.resize(435, 200)
self.vboxlayout = QtWidgets.QVBoxLayout(DynamipsPreferencesPageWidget)
self.vboxlayout.setObjectName("vboxlayout")
self.uiTabWidget = QtWidgets.QTabWidget(DynamipsPreferencesPageWidget)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/ethernet_hub_configuration_page.ui'
# Form implementation generated from reading ui file 'ethernet_hub_configuration_page.ui'
#
# Created: Mon May 4 12:01:31 2015
# Created: Wed May 6 14:31:55 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/ethernet_switch_configuration_page.ui'
# Form implementation generated from reading ui file 'ethernet_switch_configuration_page.ui'
#
# Created: Mon May 4 12:01:31 2015
# Created: Wed May 6 14:31:55 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/frame_relay_switch_configuration_page.ui'
# Form implementation generated from reading ui file 'frame_relay_switch_configuration_page.ui'
#
# Created: Mon May 4 12:01:31 2015
# Created: Wed May 6 14:31:56 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/ios_router_configuration_page.ui'
# Form implementation generated from reading ui file 'ios_router_configuration_page.ui'
#
# Created: Mon May 4 12:01:31 2015
# Created: Wed May 6 14:31:56 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>560</width>
<height>518</height>
<width>505</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
@@ -38,6 +38,9 @@
<bold>true</bold>
</font>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="iconSize">
<size>
<width>32</width>

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/ios_router_preferences_page.ui'
# Form implementation generated from reading ui file 'ios_router_preferences_page.ui'
#
# Created: Mon May 4 12:01:31 2015
# Created: Wed May 6 14:31:56 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_IOSRouterPreferencesPageWidget(object):
def setupUi(self, IOSRouterPreferencesPageWidget):
IOSRouterPreferencesPageWidget.setObjectName("IOSRouterPreferencesPageWidget")
IOSRouterPreferencesPageWidget.resize(560, 518)
IOSRouterPreferencesPageWidget.resize(505, 350)
self.gridLayout = QtWidgets.QGridLayout(IOSRouterPreferencesPageWidget)
self.gridLayout.setObjectName("gridLayout")
self.uiIOSRoutersTreeWidget = QtWidgets.QTreeWidget(IOSRouterPreferencesPageWidget)
@@ -30,6 +30,7 @@ class Ui_IOSRouterPreferencesPageWidget(object):
font.setBold(True)
font.setWeight(75)
self.uiIOSRoutersTreeWidget.setFont(font)
self.uiIOSRoutersTreeWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.uiIOSRoutersTreeWidget.setIconSize(QtCore.QSize(32, 32))
self.uiIOSRoutersTreeWidget.setRootIsDecorated(False)
self.uiIOSRoutersTreeWidget.setObjectName("uiIOSRoutersTreeWidget")

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/dynamips/ui/ios_router_wizard.ui'
# Form implementation generated from reading ui file 'ios_router_wizard.ui'
#
# Created: Mon May 4 12:01:31 2015
# Created: Wed May 6 14:31:56 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -55,26 +55,64 @@ class IOUDevicePreferencesPage(QtWidgets.QWidget, Ui_IOUDevicePreferencesPageWid
self.uiNewIOUDevicePushButton.clicked.connect(self._iouDeviceNewSlot)
self.uiEditIOUDevicePushButton.clicked.connect(self._iouDeviceEditSlot)
self.uiDeleteIOUDevicePushButton.clicked.connect(self._iouDeviceDeleteSlot)
self.uiIOUDevicesTreeWidget.currentItemChanged.connect(self._iouDeviceChangedSlot)
self.uiIOUDevicesTreeWidget.itemSelectionChanged.connect(self._iouDeviceChangedSlot)
self.uiIOUDevicesTreeWidget.itemPressed.connect(self._iouDevicePressedSlot)
def _iouDeviceChangedSlot(self, current, previous):
def _createSectionItem(self, name):
section_item = QtWidgets.QTreeWidgetItem(self.uiIOUDeviceInfoTreeWidget)
section_item.setText(0, name)
font = section_item.font(0)
font.setBold(True)
section_item.setFont(0, font)
return section_item
def _refreshInfo(self, iou_device):
self.uiIOUDeviceInfoTreeWidget.clear()
# fill out the General section
section_item = self._createSectionItem("General")
QtWidgets.QTreeWidgetItem(section_item, ["Name:", iou_device["name"]])
QtWidgets.QTreeWidgetItem(section_item, ["Server:", iou_device["server"]])
QtWidgets.QTreeWidgetItem(section_item, ["Image:", iou_device["image"]])
if iou_device["initial_config"]:
QtWidgets.QTreeWidgetItem(section_item, ["Initial config:", iou_device["initial_config"]])
if iou_device["use_default_iou_values"]:
QtWidgets.QTreeWidgetItem(section_item, ["RAM:", "default"])
QtWidgets.QTreeWidgetItem(section_item, ["NVRAM:", "default"])
else:
QtWidgets.QTreeWidgetItem(section_item, ["RAM:", "{} MiB".format(iou_device["ram"])])
QtWidgets.QTreeWidgetItem(section_item, ["NVRAM:", "{} KiB".format(iou_device["nvram"])])
# fill out the Network section
section_item = self._createSectionItem("Network")
QtWidgets.QTreeWidgetItem(section_item, ["Ethernet adapters:", "{} ({} interfaces)".format(iou_device["ethernet_adapters"],
iou_device["ethernet_adapters"] * 4)])
QtWidgets.QTreeWidgetItem(section_item, ["Serial adapters:", "{} ({} interfaces)".format(iou_device["serial_adapters"],
iou_device["serial_adapters"] * 4)])
self.uiIOUDeviceInfoTreeWidget.expandAll()
self.uiIOUDeviceInfoTreeWidget.resizeColumnToContents(0)
self.uiIOUDeviceInfoTreeWidget.resizeColumnToContents(1)
def _iouDeviceChangedSlot(self):
"""
Loads a selected an IOU device from the tree widget.
:param current: current QTreeWidgetItem instance
:param previous: ignored
"""
if not current:
self.uiIOUDeviceInfoTreeWidget.clear()
return
selection = self.uiIOUDevicesTreeWidget.selectedItems()
self.uiDeleteIOUDevicePushButton.setEnabled(len(selection) != 0)
single_selected = len(selection) == 1
self.uiEditIOUDevicePushButton.setEnabled(single_selected)
self.uiEditIOUDevicePushButton.setEnabled(True)
self.uiDeleteIOUDevicePushButton.setEnabled(True)
key = current.data(0, QtCore.Qt.UserRole)
iou_device = self._iou_devices[key]
self._refreshInfo(iou_device)
if single_selected:
key = selection[0].data(0, QtCore.Qt.UserRole)
iou_device = self._iou_devices[key]
self._refreshInfo(iou_device)
else:
self.uiIOUDeviceInfoTreeWidget.clear()
def _iouDeviceNewSlot(self):
"""
@@ -119,11 +157,6 @@ class IOUDevicePreferencesPage(QtWidgets.QWidget, Ui_IOUDevicePreferencesPageWid
log.error(e)
QtWidgets.QMessageBox.critical(self, "IOU image upload", "Error uploading IOU image: {}".format(e))
def _imageUploadComplete(self):
if self._upload_image_progress_dialog.wasCanceled():
return
self._upload_image_progress_dialog.accept()
def _iouDeviceEditSlot(self):
"""
Edits an IOU device.
@@ -154,50 +187,93 @@ class IOUDevicePreferencesPage(QtWidgets.QWidget, Ui_IOUDevicePreferencesPageWid
Deletes an IOU device.
"""
for item in self.uiIOUDevicesTreeWidget.selectedItems():
if item:
key = item.data(0, QtCore.Qt.UserRole)
del self._iou_devices[key]
self.uiIOUDevicesTreeWidget.takeTopLevelItem(self.uiIOUDevicesTreeWidget.indexOfTopLevelItem(item))
def _iouDevicePressedSlot(self, item, column):
"""
Slot for item pressed.
:param item: ignored
:param column: ignored
"""
if QtWidgets.QApplication.mouseButtons() & QtCore.Qt.RightButton:
self._showContextualMenu()
def _showContextualMenu(self):
"""
Contextual menu.
"""
menu = QtWidgets.QMenu()
change_symbol_action = QtWidgets.QAction("Change symbol", menu)
change_symbol_action.setIcon(QtGui.QIcon(":/icons/node_conception.svg"))
change_symbol_action.setEnabled(len(self.uiIOUDevicesTreeWidget.selectedItems()) == 1)
change_symbol_action.triggered.connect(self._changeSymbolSlot)
menu.addAction(change_symbol_action)
delete_action = QtWidgets.QAction("Delete", menu)
delete_action.triggered.connect(self._iouDeviceDeleteSlot)
menu.addAction(delete_action)
menu.exec_(QtGui.QCursor.pos())
def _changeSymbolSlot(self):
"""
Change a symbol for an IOU device.
"""
item = self.uiIOUDevicesTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
del self._iou_devices[key]
self.uiIOUDevicesTreeWidget.takeTopLevelItem(self.uiIOUDevicesTreeWidget.indexOfTopLevelItem(item))
iou_device = self._iou_devices[key]
dialog = SymbolSelectionDialog(self, symbol=iou_device["default_symbol"], category=iou_device["category"])
dialog.show()
if dialog.exec_():
normal_symbol, selected_symbol = dialog.getSymbols()
category = dialog.getCategory()
item.setIcon(0, QtGui.QIcon(normal_symbol))
iou_device["default_symbol"] = normal_symbol
iou_device["hover_symbol"] = selected_symbol
iou_device["category"] = category
def _createSectionItem(self, name):
def loadPreferences(self):
"""
Loads the IOU devices preferences.
"""
section_item = QtWidgets.QTreeWidgetItem(self.uiIOUDeviceInfoTreeWidget)
section_item.setText(0, name)
font = section_item.font(0)
font.setBold(True)
section_item.setFont(0, font)
return section_item
iou_module = IOU.instance()
self._iou_devices = copy.deepcopy(iou_module.iouDevices())
self._items.clear()
def _refreshInfo(self, iou_device):
for key, iou_device in self._iou_devices.items():
item = QtWidgets.QTreeWidgetItem(self.uiIOUDevicesTreeWidget)
item.setText(0, iou_device["name"])
item.setIcon(0, QtGui.QIcon(iou_device["default_symbol"]))
item.setData(0, QtCore.Qt.UserRole, key)
self._items.append(item)
self.uiIOUDeviceInfoTreeWidget.clear()
if self._items:
self.uiIOUDevicesTreeWidget.setCurrentItem(self._items[0])
self.uiIOUDevicesTreeWidget.sortByColumn(0, QtCore.Qt.AscendingOrder)
# fill out the General section
section_item = self._createSectionItem("General")
QtWidgets.QTreeWidgetItem(section_item, ["Name:", iou_device["name"]])
QtWidgets.QTreeWidgetItem(section_item, ["Server:", iou_device["server"]])
QtWidgets.QTreeWidgetItem(section_item, ["Image:", iou_device["image"]])
if iou_device["initial_config"]:
QtWidgets.QTreeWidgetItem(section_item, ["Initial config:", iou_device["initial_config"]])
def savePreferences(self):
"""
Saves the IOU devices preferences.
"""
if iou_device["use_default_iou_values"]:
QtWidgets.QTreeWidgetItem(section_item, ["RAM:", "default"])
QtWidgets.QTreeWidgetItem(section_item, ["NVRAM:", "default"])
else:
QtWidgets.QTreeWidgetItem(section_item, ["RAM:", "{} MiB".format(iou_device["ram"])])
QtWidgets.QTreeWidgetItem(section_item, ["NVRAM:", "{} KiB".format(iou_device["nvram"])])
# self._iouImageSaveSlot()
IOU.instance().setIOUDevices(self._iou_devices)
# fill out the Network section
section_item = self._createSectionItem("Network")
QtWidgets.QTreeWidgetItem(section_item, ["Ethernet adapters:", "{} ({} interfaces)".format(iou_device["ethernet_adapters"],
iou_device["ethernet_adapters"] * 4)])
QtWidgets.QTreeWidgetItem(section_item, ["Serial adapters:", "{} ({} interfaces)".format(iou_device["serial_adapters"],
iou_device["serial_adapters"] * 4)])
self.uiIOUDeviceInfoTreeWidget.expandAll()
self.uiIOUDeviceInfoTreeWidget.resizeColumnToContents(0)
self.uiIOUDeviceInfoTreeWidget.resizeColumnToContents(1)
def _imageUploadComplete(self):
if self._upload_image_progress_dialog.wasCanceled():
return
self._upload_image_progress_dialog.accept()
@staticmethod
def getIOUImage(parent):
@@ -272,73 +348,3 @@ class IOUDevicePreferencesPage(QtWidgets.QWidget, Ui_IOUDevicePreferencesPageWid
QtWidgets.QMessageBox.warning(parent, "IOU image", "{} is not executable".format(path))
return path
def _iouDevicePressedSlot(self, item, column):
"""
Slot for item pressed.
:param item: ignored
:param column: ignored
"""
if QtWidgets.QApplication.mouseButtons() & QtCore.Qt.RightButton:
self._showContextualMenu()
def _showContextualMenu(self):
"""
Contextual menu.
"""
menu = QtWidgets.QMenu()
change_symbol_action = QtWidgets.QAction("Change symbol", menu)
change_symbol_action.setIcon(QtGui.QIcon(":/icons/node_conception.svg"))
self.connect(change_symbol_action, QtCore.SIGNAL('triggered()'), self._changeSymbolSlot)
menu.addAction(change_symbol_action)
menu.exec_(QtGui.QCursor.pos())
def _changeSymbolSlot(self):
"""
Change a symbol for an IOU device.
"""
item = self.uiIOUDevicesTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
iou_device = self._iou_devices[key]
dialog = SymbolSelectionDialog(self, symbol=iou_device["default_symbol"], category=iou_device["category"])
dialog.show()
if dialog.exec_():
normal_symbol, selected_symbol = dialog.getSymbols()
category = dialog.getCategory()
item.setIcon(0, QtGui.QIcon(normal_symbol))
iou_device["default_symbol"] = normal_symbol
iou_device["hover_symbol"] = selected_symbol
iou_device["category"] = category
def loadPreferences(self):
"""
Loads the IOU devices preferences.
"""
iou_module = IOU.instance()
self._iou_devices = copy.deepcopy(iou_module.iouDevices())
self._items.clear()
for key, iou_device in self._iou_devices.items():
item = QtWidgets.QTreeWidgetItem(self.uiIOUDevicesTreeWidget)
item.setText(0, iou_device["name"])
item.setIcon(0, QtGui.QIcon(iou_device["default_symbol"]))
item.setData(0, QtCore.Qt.UserRole, key)
self._items.append(item)
if self._items:
self.uiIOUDevicesTreeWidget.setCurrentItem(self._items[0])
self.uiIOUDevicesTreeWidget.sortByColumn(0, QtCore.Qt.AscendingOrder)
def savePreferences(self):
"""
Saves the IOU devices preferences.
"""
# self._iouImageSaveSlot()
IOU.instance().setIOUDevices(self._iou_devices)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/iou/ui/iou_device_configuration_page.ui'
# Form implementation generated from reading ui file 'iou_device_configuration_page.ui'
#
# Created: Mon May 4 12:01:32 2015
# Created: Wed May 6 14:31:56 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,56 +6,50 @@
<rect>
<x>0</x>
<y>0</y>
<width>506</width>
<height>508</height>
<width>505</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
<string>IOU devices</string>
<string>IOU Devices</string>
</property>
<property name="accessibleName">
<string>IOU device templates</string>
<string>IOU Device templates</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" rowspan="2">
<widget class="QTreeWidget" name="uiIOUDevicesTreeWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>160</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QPushButton" name="uiNewIOUDevicePushButton">
<property name="text">
<string>&amp;New</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="uiEditIOUDevicePushButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Edit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="uiDeleteIOUDevicePushButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Delete</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<widget class="QTreeWidget" name="uiIOUDeviceInfoTreeWidget">
@@ -86,39 +80,55 @@
</column>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QPushButton" name="uiNewIOUDevicePushButton">
<property name="text">
<string>&amp;New</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="uiEditIOUDevicePushButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Edit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="uiDeleteIOUDevicePushButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Delete</string>
</property>
</widget>
</item>
</layout>
<item row="0" column="0" rowspan="2">
<widget class="QTreeWidget" name="uiIOUDevicesTreeWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>160</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>uiNewIOUDevicePushButton</tabstop>
<tabstop>uiDeleteIOUDevicePushButton</tabstop>
</tabstops>
<resources/>
<connections/>
<designerdata>

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/iou/ui/iou_device_preferences_page.ui'
# Form implementation generated from reading ui file 'iou_device_preferences_page.ui'
#
# Created: Mon May 4 12:01:32 2015
# Created: Wed May 6 14:31:56 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,9 +15,35 @@ class Ui_IOUDevicePreferencesPageWidget(object):
def setupUi(self, IOUDevicePreferencesPageWidget):
IOUDevicePreferencesPageWidget.setObjectName("IOUDevicePreferencesPageWidget")
IOUDevicePreferencesPageWidget.resize(506, 508)
IOUDevicePreferencesPageWidget.resize(505, 350)
IOUDevicePreferencesPageWidget.setAccessibleDescription("")
self.gridLayout = QtWidgets.QGridLayout(IOUDevicePreferencesPageWidget)
self.gridLayout.setObjectName("gridLayout")
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.uiNewIOUDevicePushButton = QtWidgets.QPushButton(IOUDevicePreferencesPageWidget)
self.uiNewIOUDevicePushButton.setObjectName("uiNewIOUDevicePushButton")
self.horizontalLayout_5.addWidget(self.uiNewIOUDevicePushButton)
self.uiEditIOUDevicePushButton = QtWidgets.QPushButton(IOUDevicePreferencesPageWidget)
self.uiEditIOUDevicePushButton.setEnabled(False)
self.uiEditIOUDevicePushButton.setObjectName("uiEditIOUDevicePushButton")
self.horizontalLayout_5.addWidget(self.uiEditIOUDevicePushButton)
self.uiDeleteIOUDevicePushButton = QtWidgets.QPushButton(IOUDevicePreferencesPageWidget)
self.uiDeleteIOUDevicePushButton.setEnabled(False)
self.uiDeleteIOUDevicePushButton.setObjectName("uiDeleteIOUDevicePushButton")
self.horizontalLayout_5.addWidget(self.uiDeleteIOUDevicePushButton)
self.gridLayout.addLayout(self.horizontalLayout_5, 1, 1, 1, 1)
self.uiIOUDeviceInfoTreeWidget = QtWidgets.QTreeWidget(IOUDevicePreferencesPageWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.uiIOUDeviceInfoTreeWidget.sizePolicy().hasHeightForWidth())
self.uiIOUDeviceInfoTreeWidget.setSizePolicy(sizePolicy)
self.uiIOUDeviceInfoTreeWidget.setIndentation(10)
self.uiIOUDeviceInfoTreeWidget.setAllColumnsShowFocus(True)
self.uiIOUDeviceInfoTreeWidget.setObjectName("uiIOUDeviceInfoTreeWidget")
self.uiIOUDeviceInfoTreeWidget.header().setVisible(False)
self.gridLayout.addWidget(self.uiIOUDeviceInfoTreeWidget, 0, 1, 1, 1)
self.uiIOUDevicesTreeWidget = QtWidgets.QTreeWidget(IOUDevicePreferencesPageWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
@@ -30,47 +56,24 @@ class Ui_IOUDevicePreferencesPageWidget(object):
font.setBold(True)
font.setWeight(75)
self.uiIOUDevicesTreeWidget.setFont(font)
self.uiIOUDevicesTreeWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.uiIOUDevicesTreeWidget.setIconSize(QtCore.QSize(32, 32))
self.uiIOUDevicesTreeWidget.setRootIsDecorated(False)
self.uiIOUDevicesTreeWidget.setObjectName("uiIOUDevicesTreeWidget")
self.uiIOUDevicesTreeWidget.headerItem().setText(0, "1")
self.uiIOUDevicesTreeWidget.header().setVisible(False)
self.gridLayout.addWidget(self.uiIOUDevicesTreeWidget, 0, 0, 2, 1)
self.uiIOUDeviceInfoTreeWidget = QtWidgets.QTreeWidget(IOUDevicePreferencesPageWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.uiIOUDeviceInfoTreeWidget.sizePolicy().hasHeightForWidth())
self.uiIOUDeviceInfoTreeWidget.setSizePolicy(sizePolicy)
self.uiIOUDeviceInfoTreeWidget.setIndentation(10)
self.uiIOUDeviceInfoTreeWidget.setAllColumnsShowFocus(True)
self.uiIOUDeviceInfoTreeWidget.setObjectName("uiIOUDeviceInfoTreeWidget")
self.uiIOUDeviceInfoTreeWidget.header().setVisible(False)
self.gridLayout.addWidget(self.uiIOUDeviceInfoTreeWidget, 0, 1, 1, 1)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.uiNewIOUDevicePushButton = QtWidgets.QPushButton(IOUDevicePreferencesPageWidget)
self.uiNewIOUDevicePushButton.setObjectName("uiNewIOUDevicePushButton")
self.horizontalLayout_6.addWidget(self.uiNewIOUDevicePushButton)
self.uiEditIOUDevicePushButton = QtWidgets.QPushButton(IOUDevicePreferencesPageWidget)
self.uiEditIOUDevicePushButton.setEnabled(False)
self.uiEditIOUDevicePushButton.setObjectName("uiEditIOUDevicePushButton")
self.horizontalLayout_6.addWidget(self.uiEditIOUDevicePushButton)
self.uiDeleteIOUDevicePushButton = QtWidgets.QPushButton(IOUDevicePreferencesPageWidget)
self.uiDeleteIOUDevicePushButton.setEnabled(False)
self.uiDeleteIOUDevicePushButton.setObjectName("uiDeleteIOUDevicePushButton")
self.horizontalLayout_6.addWidget(self.uiDeleteIOUDevicePushButton)
self.gridLayout.addLayout(self.horizontalLayout_6, 1, 1, 1, 1)
self.retranslateUi(IOUDevicePreferencesPageWidget)
QtCore.QMetaObject.connectSlotsByName(IOUDevicePreferencesPageWidget)
IOUDevicePreferencesPageWidget.setTabOrder(self.uiNewIOUDevicePushButton, self.uiDeleteIOUDevicePushButton)
def retranslateUi(self, IOUDevicePreferencesPageWidget):
_translate = gns3.qt.translate
IOUDevicePreferencesPageWidget.setWindowTitle(_translate("IOUDevicePreferencesPageWidget", "IOU devices"))
IOUDevicePreferencesPageWidget.setAccessibleName(_translate("IOUDevicePreferencesPageWidget", "IOU device templates"))
self.uiIOUDeviceInfoTreeWidget.headerItem().setText(0, _translate("IOUDevicePreferencesPageWidget", "1"))
self.uiIOUDeviceInfoTreeWidget.headerItem().setText(1, _translate("IOUDevicePreferencesPageWidget", "2"))
IOUDevicePreferencesPageWidget.setWindowTitle(_translate("IOUDevicePreferencesPageWidget", "IOU Devices"))
IOUDevicePreferencesPageWidget.setAccessibleName(_translate("IOUDevicePreferencesPageWidget", "IOU Device templates"))
self.uiNewIOUDevicePushButton.setText(_translate("IOUDevicePreferencesPageWidget", "&New"))
self.uiEditIOUDevicePushButton.setText(_translate("IOUDevicePreferencesPageWidget", "&Edit"))
self.uiDeleteIOUDevicePushButton.setText(_translate("IOUDevicePreferencesPageWidget", "&Delete"))
self.uiIOUDeviceInfoTreeWidget.headerItem().setText(0, _translate("IOUDevicePreferencesPageWidget", "1"))
self.uiIOUDeviceInfoTreeWidget.headerItem().setText(1, _translate("IOUDevicePreferencesPageWidget", "2"))

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/iou/ui/iou_device_wizard.ui'
# Form implementation generated from reading ui file 'iou_device_wizard.ui'
#
# Created: Mon May 4 12:01:32 2015
# Created: Wed May 6 14:31:56 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>425</width>
<height>467</height>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/iou/ui/iou_preferences_page.ui'
# Form implementation generated from reading ui file 'iou_preferences_page.ui'
#
# Created: Mon May 4 12:01:32 2015
# Created: Wed May 6 14:31:57 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_IOUPreferencesPageWidget(object):
def setupUi(self, IOUPreferencesPageWidget):
IOUPreferencesPageWidget.setObjectName("IOUPreferencesPageWidget")
IOUPreferencesPageWidget.resize(425, 467)
IOUPreferencesPageWidget.resize(400, 300)
self.vboxlayout = QtWidgets.QVBoxLayout(IOUPreferencesPageWidget)
self.vboxlayout.setObjectName("vboxlayout")
self.uiTabWidget = QtWidgets.QTabWidget(IOUPreferencesPageWidget)

View File

@@ -54,7 +54,7 @@ class QemuVMPreferencesPage(QtWidgets.QWidget, Ui_QemuVMPreferencesPageWidget):
self.uiNewQemuVMPushButton.clicked.connect(self._qemuVMNewSlot)
self.uiEditQemuVMPushButton.clicked.connect(self._qemuVMEditSlot)
self.uiDeleteQemuVMPushButton.clicked.connect(self._qemuVMDeleteSlot)
self.uiQemuVMsTreeWidget.currentItemChanged.connect(self._qemuVMChangedSlot)
self.uiQemuVMsTreeWidget.itemSelectionChanged.connect(self._qemuVMChangedSlot)
self.uiQemuVMsTreeWidget.itemPressed.connect(self._qemuVMPressedSlot)
def _createSectionItem(self, name):
@@ -122,23 +122,22 @@ class QemuVMPreferencesPage(QtWidgets.QWidget, Ui_QemuVMPreferencesPageWidget):
self.uiQemuVMInfoTreeWidget.resizeColumnToContents(0)
self.uiQemuVMInfoTreeWidget.resizeColumnToContents(1)
def _qemuVMChangedSlot(self, current, previous):
def _qemuVMChangedSlot(self):
"""
Loads a selected QEMU VM from the tree widget.
:param current: current QTreeWidgetItem instance
:param previous: ignored
"""
if not current:
self.uiQemuVMInfoTreeWidget.clear()
return
selection = self.uiQemuVMsTreeWidget.selectedItems()
self.uiDeleteQemuVMPushButton.setEnabled(len(selection) != 0)
single_selected = len(selection) == 1
self.uiEditQemuVMPushButton.setEnabled(single_selected)
self.uiEditQemuVMPushButton.setEnabled(True)
self.uiDeleteQemuVMPushButton.setEnabled(True)
key = current.data(0, QtCore.Qt.UserRole)
qemu_vm = self._qemu_vms[key]
self._refreshInfo(qemu_vm)
if single_selected:
key = selection[0].data(0, QtCore.Qt.UserRole)
qemu_vm = self._qemu_vms[key]
self._refreshInfo(qemu_vm)
else:
self.uiQemuVMInfoTreeWidget.clear()
def _qemuVMNewSlot(self):
"""
@@ -168,6 +167,122 @@ class QemuVMPreferencesPage(QtWidgets.QWidget, Ui_QemuVMPreferencesPageWidget):
self._qemu_vms[key]["options"] = "-nographic"
self._uploadImages(new_vm_settings)
def _qemuVMEditSlot(self):
"""
Edits a QEMU VM.
"""
item = self.uiQemuVMsTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
qemu_vm = self._qemu_vms[key]
dialog = ConfigurationDialog(qemu_vm["name"], qemu_vm, QemuVMConfigurationPage(), parent=self)
dialog.show()
if dialog.exec_():
if qemu_vm["name"] != item.text(0):
new_key = "{server}:{name}".format(server=qemu_vm["server"], name=qemu_vm["name"])
if new_key in self._qemu_vms:
QtWidgets.QMessageBox.critical(self, "QEMU VM", "QEMU VM name {} already exists for server {}".format(qemu_vm["name"],
qemu_vm["server"]))
qemu_vm["name"] = item.text(0)
return
self._qemu_vms[new_key] = self._qemu_vms[key]
del self._qemu_vms[key]
item.setText(0, qemu_vm["name"])
item.setData(0, QtCore.Qt.UserRole, new_key)
if qemu_vm["server"] == 'cloud':
self._uploadImages(qemu_vm)
self._refreshInfo(qemu_vm)
def _qemuVMDeleteSlot(self):
"""
Deletes a QEMU VM.
"""
for item in self.uiQemuVMsTreeWidget.selectedItems():
if item:
key = item.data(0, QtCore.Qt.UserRole)
del self._qemu_vms[key]
self.uiQemuVMsTreeWidget.takeTopLevelItem(self.uiQemuVMsTreeWidget.indexOfTopLevelItem(item))
def _qemuVMPressedSlot(self, item, column):
"""
Slot for item pressed.
:param item: ignored
:param column: ignored
"""
if QtWidgets.QApplication.mouseButtons() & QtCore.Qt.RightButton:
self._showContextualMenu()
def _showContextualMenu(self):
"""
Contextual menu.
"""
menu = QtWidgets.QMenu()
change_symbol_action = QtWidgets.QAction("Change symbol", menu)
change_symbol_action.setIcon(QtGui.QIcon(":/icons/node_conception.svg"))
change_symbol_action.setEnabled(len(self.uiQemuVMsTreeWidget.selectedItems()) == 1)
change_symbol_action.triggered.connect(self._changeSymbolSlot)
menu.addAction(change_symbol_action)
delete_action = QtWidgets.QAction("Delete", menu)
delete_action.triggered.connect(self._qemuVMDeleteSlot)
menu.addAction(delete_action)
menu.exec_(QtGui.QCursor.pos())
def _changeSymbolSlot(self):
"""
Change a symbol for a QEMU VM.
"""
item = self.uiQemuVMsTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
qemu_vm = self._qemu_vms[key]
dialog = SymbolSelectionDialog(self, symbol=qemu_vm["default_symbol"], category=qemu_vm["category"])
dialog.show()
if dialog.exec_():
normal_symbol, selected_symbol = dialog.getSymbols()
category = dialog.getCategory()
item.setIcon(0, QtGui.QIcon(normal_symbol))
qemu_vm["default_symbol"] = normal_symbol
qemu_vm["hover_symbol"] = selected_symbol
qemu_vm["category"] = category
def loadPreferences(self):
"""
Loads the QEMU VM preferences.
"""
qemu_module = Qemu.instance()
self._qemu_vms = copy.deepcopy(qemu_module.qemuVMs())
self._items.clear()
for key, qemu_vm in self._qemu_vms.items():
item = QtWidgets.QTreeWidgetItem(self.uiQemuVMsTreeWidget)
item.setText(0, qemu_vm["name"])
item.setIcon(0, QtGui.QIcon(qemu_vm["default_symbol"]))
item.setData(0, QtCore.Qt.UserRole, key)
self._items.append(item)
if self._items:
self.uiQemuVMsTreeWidget.setCurrentItem(self._items[0])
self.uiQemuVMsTreeWidget.sortByColumn(0, QtCore.Qt.AscendingOrder)
def savePreferences(self):
"""
Saves the QEMU VM preferences.
"""
Qemu.instance().setQemuVMs(self._qemu_vms)
def _imageUploadComplete(self):
if self._upload_image_progress_dialog.wasCanceled():
return
@@ -232,109 +347,3 @@ class QemuVMPreferencesPage(QtWidgets.QWidget, Ui_QemuVMPreferencesPageWidget):
log = logging.getLogger(__name__)
log.error(e)
QtWidgets.QMessageBox.critical(self, "Qemu image upload", "Error uploading Qemu image: {}".format(e))
def _qemuVMEditSlot(self):
"""
Edits a QEMU VM.
"""
item = self.uiQemuVMsTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
qemu_vm = self._qemu_vms[key]
dialog = ConfigurationDialog(qemu_vm["name"], qemu_vm, QemuVMConfigurationPage(), parent=self)
dialog.show()
if dialog.exec_():
if qemu_vm["name"] != item.text(0):
new_key = "{server}:{name}".format(server=qemu_vm["server"], name=qemu_vm["name"])
if new_key in self._qemu_vms:
QtWidgets.QMessageBox.critical(self, "QEMU VM", "QEMU VM name {} already exists for server {}".format(qemu_vm["name"],
qemu_vm["server"]))
qemu_vm["name"] = item.text(0)
return
self._qemu_vms[new_key] = self._qemu_vms[key]
del self._qemu_vms[key]
item.setText(0, qemu_vm["name"])
item.setData(0, QtCore.Qt.UserRole, new_key)
if qemu_vm["server"] == 'cloud':
self._uploadImages(qemu_vm)
self._refreshInfo(qemu_vm)
def _qemuVMDeleteSlot(self):
"""
Deletes a QEMU VM.
"""
item = self.uiQemuVMsTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
del self._qemu_vms[key]
self.uiQemuVMsTreeWidget.takeTopLevelItem(self.uiQemuVMsTreeWidget.indexOfTopLevelItem(item))
def _qemuVMPressedSlot(self, item, column):
"""
Slot for item pressed.
"""
if QtWidgets.QApplication.mouseButtons() & QtCore.Qt.RightButton:
self._showContextualMenu()
def _showContextualMenu(self):
"""
Contextual menu.
"""
menu = QtWidgets.QMenu()
change_symbol_action = QtWidgets.QAction("Change symbol", menu)
change_symbol_action.setIcon(QtGui.QIcon(":/icons/node_conception.svg"))
self.connect(change_symbol_action, QtCore.SIGNAL('triggered()'), self._changeSymbolSlot)
menu.addAction(change_symbol_action)
menu.exec_(QtGui.QCursor.pos())
def _changeSymbolSlot(self):
"""
Change a symbol for a QEMU VM.
"""
item = self.uiQemuVMsTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
qemu_vm = self._qemu_vms[key]
dialog = SymbolSelectionDialog(self, symbol=qemu_vm["default_symbol"], category=qemu_vm["category"])
dialog.show()
if dialog.exec_():
normal_symbol, selected_symbol = dialog.getSymbols()
category = dialog.getCategory()
item.setIcon(0, QtGui.QIcon(normal_symbol))
qemu_vm["default_symbol"] = normal_symbol
qemu_vm["hover_symbol"] = selected_symbol
qemu_vm["category"] = category
def loadPreferences(self):
"""
Loads the QEMU VM preferences.
"""
qemu_module = Qemu.instance()
self._qemu_vms = copy.deepcopy(qemu_module.qemuVMs())
self._items.clear()
for key, qemu_vm in self._qemu_vms.items():
item = QtWidgets.QTreeWidgetItem(self.uiQemuVMsTreeWidget)
item.setText(0, qemu_vm["name"])
item.setIcon(0, QtGui.QIcon(qemu_vm["default_symbol"]))
item.setData(0, QtCore.Qt.UserRole, key)
self._items.append(item)
if self._items:
self.uiQemuVMsTreeWidget.setCurrentItem(self._items[0])
self.uiQemuVMsTreeWidget.sortByColumn(0, QtCore.Qt.AscendingOrder)
def savePreferences(self):
"""
Saves the QEMU VM preferences.
"""
Qemu.instance().setQemuVMs(self._qemu_vms)

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>374</width>
<height>495</height>
<width>200</width>
<height>200</height>
</rect>
</property>
<property name="windowTitle">

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/qemu/ui/qemu_preferences_page.ui'
# Form implementation generated from reading ui file 'qemu_preferences_page.ui'
#
# Created: Mon May 4 12:01:32 2015
# Created: Wed May 6 14:31:57 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_QemuPreferencesPageWidget(object):
def setupUi(self, QemuPreferencesPageWidget):
QemuPreferencesPageWidget.setObjectName("QemuPreferencesPageWidget")
QemuPreferencesPageWidget.resize(374, 495)
QemuPreferencesPageWidget.resize(200, 200)
self.verticalLayout = QtWidgets.QVBoxLayout(QemuPreferencesPageWidget)
self.verticalLayout.setObjectName("verticalLayout")
self.uiTabWidget = QtWidgets.QTabWidget(QemuPreferencesPageWidget)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/qemu/ui/qemu_vm_configuration_page.ui'
# Form implementation generated from reading ui file 'qemu_vm_configuration_page.ui'
#
# Created: Mon May 4 12:01:32 2015
# Created: Wed May 6 14:31:57 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,86 +6,20 @@
<rect>
<x>0</x>
<y>0</y>
<width>511</width>
<height>543</height>
<width>505</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
<string>QEMU VMs</string>
<string>Qemu VMs</string>
</property>
<property name="accessibleName">
<string>QEMU VM templates</string>
<string>Qemu VM templates</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" rowspan="2">
<widget class="QTreeWidget" name="uiQemuVMsTreeWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>160</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
<item row="0" column="1">
<widget class="QTreeWidget" name="uiQemuVMInfoTreeWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="indentation">
<number>10</number>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>1</string>
</property>
</column>
<column>
<property name="text">
<string>2</string>
</property>
</column>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
@@ -117,6 +51,78 @@
</item>
</layout>
</item>
<item row="0" column="1">
<widget class="QTreeWidget" name="uiQemuVMInfoTreeWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="indentation">
<number>10</number>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>1</string>
</property>
</column>
<column>
<property name="text">
<string>2</string>
</property>
</column>
</widget>
</item>
<item row="0" column="0" rowspan="2">
<widget class="QTreeWidget" name="uiQemuVMsTreeWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>160</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
<tabstops>

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/qemu/ui/qemu_vm_preferences_page.ui'
# Form implementation generated from reading ui file 'qemu_vm_preferences_page.ui'
#
# Created: Mon May 4 12:01:32 2015
# Created: Wed May 6 14:31:57 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,38 +15,10 @@ class Ui_QemuVMPreferencesPageWidget(object):
def setupUi(self, QemuVMPreferencesPageWidget):
QemuVMPreferencesPageWidget.setObjectName("QemuVMPreferencesPageWidget")
QemuVMPreferencesPageWidget.resize(511, 543)
QemuVMPreferencesPageWidget.resize(505, 350)
QemuVMPreferencesPageWidget.setAccessibleDescription("")
self.gridLayout = QtWidgets.QGridLayout(QemuVMPreferencesPageWidget)
self.gridLayout.setObjectName("gridLayout")
self.uiQemuVMsTreeWidget = QtWidgets.QTreeWidget(QemuVMPreferencesPageWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.uiQemuVMsTreeWidget.sizePolicy().hasHeightForWidth())
self.uiQemuVMsTreeWidget.setSizePolicy(sizePolicy)
self.uiQemuVMsTreeWidget.setMaximumSize(QtCore.QSize(160, 16777215))
font = QtGui.QFont()
font.setPointSize(11)
font.setBold(True)
font.setWeight(75)
self.uiQemuVMsTreeWidget.setFont(font)
self.uiQemuVMsTreeWidget.setIconSize(QtCore.QSize(32, 32))
self.uiQemuVMsTreeWidget.setRootIsDecorated(False)
self.uiQemuVMsTreeWidget.setObjectName("uiQemuVMsTreeWidget")
self.uiQemuVMsTreeWidget.headerItem().setText(0, "1")
self.uiQemuVMsTreeWidget.header().setVisible(False)
self.gridLayout.addWidget(self.uiQemuVMsTreeWidget, 0, 0, 2, 1)
self.uiQemuVMInfoTreeWidget = QtWidgets.QTreeWidget(QemuVMPreferencesPageWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.uiQemuVMInfoTreeWidget.sizePolicy().hasHeightForWidth())
self.uiQemuVMInfoTreeWidget.setSizePolicy(sizePolicy)
self.uiQemuVMInfoTreeWidget.setIndentation(10)
self.uiQemuVMInfoTreeWidget.setAllColumnsShowFocus(True)
self.uiQemuVMInfoTreeWidget.setObjectName("uiQemuVMInfoTreeWidget")
self.uiQemuVMInfoTreeWidget.header().setVisible(False)
self.gridLayout.addWidget(self.uiQemuVMInfoTreeWidget, 0, 1, 1, 1)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.uiNewQemuVMPushButton = QtWidgets.QPushButton(QemuVMPreferencesPageWidget)
@@ -61,6 +33,36 @@ class Ui_QemuVMPreferencesPageWidget(object):
self.uiDeleteQemuVMPushButton.setObjectName("uiDeleteQemuVMPushButton")
self.horizontalLayout_5.addWidget(self.uiDeleteQemuVMPushButton)
self.gridLayout.addLayout(self.horizontalLayout_5, 1, 1, 1, 1)
self.uiQemuVMInfoTreeWidget = QtWidgets.QTreeWidget(QemuVMPreferencesPageWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.uiQemuVMInfoTreeWidget.sizePolicy().hasHeightForWidth())
self.uiQemuVMInfoTreeWidget.setSizePolicy(sizePolicy)
self.uiQemuVMInfoTreeWidget.setIndentation(10)
self.uiQemuVMInfoTreeWidget.setAllColumnsShowFocus(True)
self.uiQemuVMInfoTreeWidget.setObjectName("uiQemuVMInfoTreeWidget")
self.uiQemuVMInfoTreeWidget.header().setVisible(False)
self.gridLayout.addWidget(self.uiQemuVMInfoTreeWidget, 0, 1, 1, 1)
self.uiQemuVMsTreeWidget = QtWidgets.QTreeWidget(QemuVMPreferencesPageWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.uiQemuVMsTreeWidget.sizePolicy().hasHeightForWidth())
self.uiQemuVMsTreeWidget.setSizePolicy(sizePolicy)
self.uiQemuVMsTreeWidget.setMaximumSize(QtCore.QSize(160, 16777215))
font = QtGui.QFont()
font.setPointSize(11)
font.setBold(True)
font.setWeight(75)
self.uiQemuVMsTreeWidget.setFont(font)
self.uiQemuVMsTreeWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.uiQemuVMsTreeWidget.setIconSize(QtCore.QSize(32, 32))
self.uiQemuVMsTreeWidget.setRootIsDecorated(False)
self.uiQemuVMsTreeWidget.setObjectName("uiQemuVMsTreeWidget")
self.uiQemuVMsTreeWidget.headerItem().setText(0, "1")
self.uiQemuVMsTreeWidget.header().setVisible(False)
self.gridLayout.addWidget(self.uiQemuVMsTreeWidget, 0, 0, 2, 1)
self.retranslateUi(QemuVMPreferencesPageWidget)
QtCore.QMetaObject.connectSlotsByName(QemuVMPreferencesPageWidget)
@@ -68,10 +70,10 @@ class Ui_QemuVMPreferencesPageWidget(object):
def retranslateUi(self, QemuVMPreferencesPageWidget):
_translate = gns3.qt.translate
QemuVMPreferencesPageWidget.setWindowTitle(_translate("QemuVMPreferencesPageWidget", "QEMU VMs"))
QemuVMPreferencesPageWidget.setAccessibleName(_translate("QemuVMPreferencesPageWidget", "QEMU VM templates"))
self.uiQemuVMInfoTreeWidget.headerItem().setText(0, _translate("QemuVMPreferencesPageWidget", "1"))
self.uiQemuVMInfoTreeWidget.headerItem().setText(1, _translate("QemuVMPreferencesPageWidget", "2"))
QemuVMPreferencesPageWidget.setWindowTitle(_translate("QemuVMPreferencesPageWidget", "Qemu VMs"))
QemuVMPreferencesPageWidget.setAccessibleName(_translate("QemuVMPreferencesPageWidget", "Qemu VM templates"))
self.uiNewQemuVMPushButton.setText(_translate("QemuVMPreferencesPageWidget", "&New"))
self.uiEditQemuVMPushButton.setText(_translate("QemuVMPreferencesPageWidget", "&Edit"))
self.uiDeleteQemuVMPushButton.setText(_translate("QemuVMPreferencesPageWidget", "&Delete"))
self.uiQemuVMInfoTreeWidget.headerItem().setText(0, _translate("QemuVMPreferencesPageWidget", "1"))
self.uiQemuVMInfoTreeWidget.headerItem().setText(1, _translate("QemuVMPreferencesPageWidget", "2"))

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/qemu/ui/qemu_vm_wizard.ui'
# Form implementation generated from reading ui file 'qemu_vm_wizard.ui'
#
# Created: Mon May 4 12:01:33 2015
# Created: Wed May 6 14:31:57 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -50,27 +50,9 @@ class VirtualBoxVMPreferencesPage(QtWidgets.QWidget, Ui_VirtualBoxVMPreferencesP
self.uiNewVirtualBoxVMPushButton.clicked.connect(self._vboxVMNewSlot)
self.uiEditVirtualBoxVMPushButton.clicked.connect(self._vboxVMEditSlot)
self.uiDeleteVirtualBoxVMPushButton.clicked.connect(self._vboxVMDeleteSlot)
self.uiVirtualBoxVMsTreeWidget.currentItemChanged.connect(self._vboxVMChangedSlot)
self.uiVirtualBoxVMsTreeWidget.itemSelectionChanged.connect(self._vboxVMChangedSlot)
self.uiVirtualBoxVMsTreeWidget.itemPressed.connect(self._vboxVMPressedSlot)
def _vboxVMChangedSlot(self, current, previous):
"""
Loads a selected VirtualBox VM from the tree widget.
:param current: current QTreeWidgetItem instance
:param previous: ignored
"""
if not current:
self.uiVirtualBoxVMInfoTreeWidget.clear()
return
self.uiEditVirtualBoxVMPushButton.setEnabled(True)
self.uiDeleteVirtualBoxVMPushButton.setEnabled(True)
key = current.data(0, QtCore.Qt.UserRole)
vbox_vm = self._virtualbox_vms[key]
self._refreshInfo(vbox_vm)
def _createSectionItem(self, name):
section_item = QtWidgets.QTreeWidgetItem(self.uiVirtualBoxVMInfoTreeWidget)
@@ -103,6 +85,23 @@ class VirtualBoxVMPreferencesPage(QtWidgets.QWidget, Ui_VirtualBoxVMPreferencesP
self.uiVirtualBoxVMInfoTreeWidget.resizeColumnToContents(0)
self.uiVirtualBoxVMInfoTreeWidget.resizeColumnToContents(1)
def _vboxVMChangedSlot(self):
"""
Loads a selected VirtualBox VM from the tree widget.
"""
selection = self.uiVirtualBoxVMsTreeWidget.selectedItems()
self.uiDeleteVirtualBoxVMPushButton.setEnabled(len(selection) != 0)
single_selected = len(selection) == 1
self.uiEditVirtualBoxVMPushButton.setEnabled(single_selected)
if single_selected:
key = selection[0].data(0, QtCore.Qt.UserRole)
vbox_vm = self._virtualbox_vms[key]
self._refreshInfo(vbox_vm)
else:
self.uiVirtualBoxVMInfoTreeWidget.clear()
def _vboxVMNewSlot(self):
"""
Creates a new VirtualBox VM.
@@ -154,11 +153,11 @@ class VirtualBoxVMPreferencesPage(QtWidgets.QWidget, Ui_VirtualBoxVMPreferencesP
Deletes a VirtualBox VM.
"""
item = self.uiVirtualBoxVMsTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
del self._virtualbox_vms[key]
self.uiVirtualBoxVMsTreeWidget.takeTopLevelItem(self.uiVirtualBoxVMsTreeWidget.indexOfTopLevelItem(item))
for item in self.uiVirtualBoxVMsTreeWidget.selectedItems():
if item:
key = item.data(0, QtCore.Qt.UserRole)
del self._virtualbox_vms[key]
self.uiVirtualBoxVMsTreeWidget.takeTopLevelItem(self.uiVirtualBoxVMsTreeWidget.indexOfTopLevelItem(item))
def _vboxVMPressedSlot(self, item, column):
"""
@@ -177,10 +176,17 @@ class VirtualBoxVMPreferencesPage(QtWidgets.QWidget, Ui_VirtualBoxVMPreferencesP
"""
menu = QtWidgets.QMenu()
change_symbol_action = QtWidgets.QAction("Change symbol", menu)
change_symbol_action.setIcon(QtGui.QIcon(":/icons/node_conception.svg"))
self.connect(change_symbol_action, QtCore.SIGNAL('triggered()'), self._changeSymbolSlot)
change_symbol_action.setEnabled(len(self.uiVirtualBoxVMsTreeWidget.selectedItems()) == 1)
change_symbol_action.triggered.connect(self._changeSymbolSlot)
menu.addAction(change_symbol_action)
delete_action = QtWidgets.QAction("Delete", menu)
delete_action.triggered.connect(self._vboxVMDeleteSlot)
menu.addAction(delete_action)
menu.exec_(QtGui.QCursor.pos())
def _changeSymbolSlot(self):

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>430</width>
<height>490</height>
<width>450</width>
<height>250</height>
</rect>
</property>
<property name="windowTitle">

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/virtualbox/ui/virtualbox_preferences_page.ui'
# Form implementation generated from reading ui file 'virtualbox_preferences_page.ui'
#
# Created: Mon May 4 12:01:33 2015
# Created: Wed May 6 14:31:57 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_VirtualBoxPreferencesPageWidget(object):
def setupUi(self, VirtualBoxPreferencesPageWidget):
VirtualBoxPreferencesPageWidget.setObjectName("VirtualBoxPreferencesPageWidget")
VirtualBoxPreferencesPageWidget.resize(430, 490)
VirtualBoxPreferencesPageWidget.resize(450, 250)
self.verticalLayout_2 = QtWidgets.QVBoxLayout(VirtualBoxPreferencesPageWidget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.uiTabWidget = QtWidgets.QTabWidget(VirtualBoxPreferencesPageWidget)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/virtualbox/ui/virtualbox_vm_configuration_page.ui'
# Form implementation generated from reading ui file 'virtualbox_vm_configuration_page.ui'
#
# Created: Mon May 4 12:01:33 2015
# Created: Wed May 6 14:31:58 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>499</width>
<height>546</height>
<width>505</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
@@ -101,6 +101,9 @@
<bold>true</bold>
</font>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="iconSize">
<size>
<width>32</width>
@@ -122,6 +125,10 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>uiNewVirtualBoxVMPushButton</tabstop>
<tabstop>uiDeleteVirtualBoxVMPushButton</tabstop>
</tabstops>
<resources/>
<connections/>
<designerdata>

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/virtualbox/ui/virtualbox_vm_preferences_page.ui'
# Form implementation generated from reading ui file 'virtualbox_vm_preferences_page.ui'
#
# Created: Mon May 4 12:01:33 2015
# Created: Wed May 6 14:31:58 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_VirtualBoxVMPreferencesPageWidget(object):
def setupUi(self, VirtualBoxVMPreferencesPageWidget):
VirtualBoxVMPreferencesPageWidget.setObjectName("VirtualBoxVMPreferencesPageWidget")
VirtualBoxVMPreferencesPageWidget.resize(499, 546)
VirtualBoxVMPreferencesPageWidget.resize(505, 350)
VirtualBoxVMPreferencesPageWidget.setAccessibleDescription("")
self.gridLayout = QtWidgets.QGridLayout(VirtualBoxVMPreferencesPageWidget)
self.gridLayout.setObjectName("gridLayout")
@@ -56,6 +56,7 @@ class Ui_VirtualBoxVMPreferencesPageWidget(object):
font.setBold(True)
font.setWeight(75)
self.uiVirtualBoxVMsTreeWidget.setFont(font)
self.uiVirtualBoxVMsTreeWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.uiVirtualBoxVMsTreeWidget.setIconSize(QtCore.QSize(32, 32))
self.uiVirtualBoxVMsTreeWidget.setRootIsDecorated(False)
self.uiVirtualBoxVMsTreeWidget.setObjectName("uiVirtualBoxVMsTreeWidget")
@@ -65,6 +66,7 @@ class Ui_VirtualBoxVMPreferencesPageWidget(object):
self.retranslateUi(VirtualBoxVMPreferencesPageWidget)
QtCore.QMetaObject.connectSlotsByName(VirtualBoxVMPreferencesPageWidget)
VirtualBoxVMPreferencesPageWidget.setTabOrder(self.uiNewVirtualBoxVMPushButton, self.uiDeleteVirtualBoxVMPushButton)
def retranslateUi(self, VirtualBoxVMPreferencesPageWidget):
_translate = gns3.qt.translate

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/virtualbox/ui/virtualbox_vm_wizard.ui'
# Form implementation generated from reading ui file 'virtualbox_vm_wizard.ui'
#
# Created: Mon May 4 12:01:33 2015
# Created: Wed May 6 14:31:58 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -50,27 +50,9 @@ class VMwareVMPreferencesPage(QtWidgets.QWidget, Ui_VMwareVMPreferencesPageWidge
self.uiNewVMwareVMPushButton.clicked.connect(self._vmwareVMNewSlot)
self.uiEditVMwareVMPushButton.clicked.connect(self._vmwareVMEditSlot)
self.uiDeleteVMwareVMPushButton.clicked.connect(self._vmwareVMDeleteSlot)
self.uiVMwareVMsTreeWidget.currentItemChanged.connect(self._vmwareVMChangedSlot)
self.uiVMwareVMsTreeWidget.itemSelectionChanged.connect(self._vmwareVMChangedSlot)
self.uiVMwareVMsTreeWidget.itemPressed.connect(self._vmwareVMPressedSlot)
def _vmwareVMChangedSlot(self, current, previous):
"""
Loads a selected VMware VM from the tree widget.
:param current: current QTreeWidgetItem instance
:param previous: ignored
"""
if not current:
self.uiVMwareVMInfoTreeWidget.clear()
return
self.uiEditVMwareVMPushButton.setEnabled(True)
self.uiDeleteVMwareVMPushButton.setEnabled(True)
key = current.data(0, QtCore.Qt.UserRole)
vmware_vm = self._vmware_vms[key]
self._refreshInfo(vmware_vm)
def _createSectionItem(self, name):
section_item = QtWidgets.QTreeWidgetItem(self.uiVMwareVMInfoTreeWidget)
@@ -96,6 +78,23 @@ class VMwareVMPreferencesPage(QtWidgets.QWidget, Ui_VMwareVMPreferencesPageWidge
self.uiVMwareVMInfoTreeWidget.resizeColumnToContents(0)
self.uiVMwareVMInfoTreeWidget.resizeColumnToContents(1)
def _vmwareVMChangedSlot(self):
"""
Loads a selected VMware VM from the tree widget.
"""
selection = self.uiVMwareVMsTreeWidget.selectedItems()
self.uiDeleteVMwareVMPushButton.setEnabled(len(selection) != 0)
single_selected = len(selection) == 1
self.uiEditVMwareVMPushButton.setEnabled(single_selected)
if single_selected:
key = selection[0].data(0, QtCore.Qt.UserRole)
vmware_vm = self._vmware_vms[key]
self._refreshInfo(vmware_vm)
else:
self.uiVMwareVMInfoTreeWidget.clear()
def _vmwareVMNewSlot(self):
"""
Creates a new VMware VM.
@@ -147,11 +146,11 @@ class VMwareVMPreferencesPage(QtWidgets.QWidget, Ui_VMwareVMPreferencesPageWidge
Deletes a VMware VM.
"""
item = self.uiVMwareVMsTreeWidget.currentItem()
if item:
key = item.data(0, QtCore.Qt.UserRole)
del self._vmware_vms[key]
self.uiVMwareVMsTreeWidget.takeTopLevelItem(self.uiVMwareVMsTreeWidget.indexOfTopLevelItem(item))
for item in self.uiVMwareVMsTreeWidget.selectedItems():
if item:
key = item.data(0, QtCore.Qt.UserRole)
del self._vmware_vms[key]
self.uiVMwareVMsTreeWidget.takeTopLevelItem(self.uiVMwareVMsTreeWidget.indexOfTopLevelItem(item))
def _vmwareVMPressedSlot(self, item, column):
"""
@@ -170,10 +169,17 @@ class VMwareVMPreferencesPage(QtWidgets.QWidget, Ui_VMwareVMPreferencesPageWidge
"""
menu = QtWidgets.QMenu()
change_symbol_action = QtWidgets.QAction("Change symbol", menu)
change_symbol_action.setIcon(QtGui.QIcon(":/icons/node_conception.svg"))
self.connect(change_symbol_action, QtCore.SIGNAL('triggered()'), self._changeSymbolSlot)
change_symbol_action.setEnabled(len(self.uiVMwareVMsTreeWidget.selectedItems()) == 1)
change_symbol_action.triggered.connect(self._changeSymbolSlot)
menu.addAction(change_symbol_action)
delete_action = QtWidgets.QAction("Delete", menu)
delete_action.triggered.connect(self._vmwareVMDeleteSlot)
menu.addAction(delete_action)
menu.exec_(QtGui.QCursor.pos())
def _changeSymbolSlot(self):

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>430</width>
<height>490</height>
<width>450</width>
<height>250</height>
</rect>
</property>
<property name="windowTitle">

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/vmware/ui/vmware_preferences_page.ui'
# Form implementation generated from reading ui file 'vmware_preferences_page.ui'
#
# Created: Mon May 4 12:01:33 2015
# Created: Wed May 6 14:31:58 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_VMwarePreferencesPageWidget(object):
def setupUi(self, VMwarePreferencesPageWidget):
VMwarePreferencesPageWidget.setObjectName("VMwarePreferencesPageWidget")
VMwarePreferencesPageWidget.resize(430, 490)
VMwarePreferencesPageWidget.resize(450, 250)
self.verticalLayout_2 = QtWidgets.QVBoxLayout(VMwarePreferencesPageWidget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.uiTabWidget = QtWidgets.QTabWidget(VMwarePreferencesPageWidget)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/vmware/ui/vmware_vm_configuration_page.ui'
# Form implementation generated from reading ui file 'vmware_vm_configuration_page.ui'
#
# Created: Mon May 4 12:01:33 2015
# Created: Wed May 6 14:31:58 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,15 +6,15 @@
<rect>
<x>0</x>
<y>0</y>
<width>499</width>
<height>546</height>
<width>505</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
<string>VMware VMs</string>
</property>
<property name="accessibleName">
<string>VirtualBox VM templates</string>
<string>VMware VM templates</string>
</property>
<property name="accessibleDescription">
<string/>
@@ -101,6 +101,9 @@
<bold>true</bold>
</font>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="iconSize">
<size>
<width>32</width>
@@ -122,6 +125,10 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>uiNewVMwareVMPushButton</tabstop>
<tabstop>uiDeleteVMwareVMPushButton</tabstop>
</tabstops>
<resources/>
<connections/>
<designerdata>

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/vmware/ui/vmware_vm_preferences_page.ui'
# Form implementation generated from reading ui file 'vmware_vm_preferences_page.ui'
#
# Created: Mon May 4 12:01:33 2015
# Created: Wed May 6 14:31:58 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_VMwareVMPreferencesPageWidget(object):
def setupUi(self, VMwareVMPreferencesPageWidget):
VMwareVMPreferencesPageWidget.setObjectName("VMwareVMPreferencesPageWidget")
VMwareVMPreferencesPageWidget.resize(499, 546)
VMwareVMPreferencesPageWidget.resize(505, 350)
VMwareVMPreferencesPageWidget.setAccessibleDescription("")
self.gridLayout = QtWidgets.QGridLayout(VMwareVMPreferencesPageWidget)
self.gridLayout.setObjectName("gridLayout")
@@ -56,6 +56,7 @@ class Ui_VMwareVMPreferencesPageWidget(object):
font.setBold(True)
font.setWeight(75)
self.uiVMwareVMsTreeWidget.setFont(font)
self.uiVMwareVMsTreeWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.uiVMwareVMsTreeWidget.setIconSize(QtCore.QSize(32, 32))
self.uiVMwareVMsTreeWidget.setRootIsDecorated(False)
self.uiVMwareVMsTreeWidget.setObjectName("uiVMwareVMsTreeWidget")
@@ -65,11 +66,12 @@ class Ui_VMwareVMPreferencesPageWidget(object):
self.retranslateUi(VMwareVMPreferencesPageWidget)
QtCore.QMetaObject.connectSlotsByName(VMwareVMPreferencesPageWidget)
VMwareVMPreferencesPageWidget.setTabOrder(self.uiNewVMwareVMPushButton, self.uiDeleteVMwareVMPushButton)
def retranslateUi(self, VMwareVMPreferencesPageWidget):
_translate = gns3.qt.translate
VMwareVMPreferencesPageWidget.setWindowTitle(_translate("VMwareVMPreferencesPageWidget", "VMware VMs"))
VMwareVMPreferencesPageWidget.setAccessibleName(_translate("VMwareVMPreferencesPageWidget", "VirtualBox VM templates"))
VMwareVMPreferencesPageWidget.setAccessibleName(_translate("VMwareVMPreferencesPageWidget", "VMware VM templates"))
self.uiNewVMwareVMPushButton.setText(_translate("VMwareVMPreferencesPageWidget", "&New"))
self.uiEditVMwareVMPushButton.setText(_translate("VMwareVMPreferencesPageWidget", "&Edit"))
self.uiDeleteVMwareVMPushButton.setText(_translate("VMwareVMPreferencesPageWidget", "&Delete"))

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/vmware/ui/vmware_vm_wizard.ui'
# Form implementation generated from reading ui file 'vmware_vm_wizard.ui'
#
# Created: Mon May 4 12:01:34 2015
# Created: Wed May 6 14:31:58 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/vpcs/ui/vpcs_device_configuration_page.ui'
# Form implementation generated from reading ui file 'vpcs_device_configuration_page.ui'
#
# Created: Mon May 4 12:01:34 2015
# Created: Wed May 6 14:31:59 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>430</width>
<height>469</height>
<width>450</width>
<height>200</height>
</rect>
</property>
<property name="windowTitle">

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/modules/vpcs/ui/vpcs_preferences_page.ui'
# Form implementation generated from reading ui file 'vpcs_preferences_page.ui'
#
# Created: Mon May 4 12:01:34 2015
# Created: Wed May 6 14:31:59 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_VPCSPreferencesPageWidget(object):
def setupUi(self, VPCSPreferencesPageWidget):
VPCSPreferencesPageWidget.setObjectName("VPCSPreferencesPageWidget")
VPCSPreferencesPageWidget.resize(430, 469)
VPCSPreferencesPageWidget.resize(450, 200)
self.verticalLayout_2 = QtWidgets.QVBoxLayout(VPCSPreferencesPageWidget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.uiTabWidget = QtWidgets.QTabWidget(VPCSPreferencesPageWidget)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/about_dialog.ui'
# Form implementation generated from reading ui file 'about_dialog.ui'
#
# Created: Mon May 4 12:01:28 2015
# Created: Wed May 6 14:31:52 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/cloud_preferences_page.ui'
# Form implementation generated from reading ui file 'cloud_preferences_page.ui'
#
# Created: Mon May 4 12:01:28 2015
# Created: Wed May 6 14:31:52 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/configuration_dialog.ui'
# Form implementation generated from reading ui file 'configuration_dialog.ui'
#
# Created: Mon May 4 12:01:28 2015
# Created: Wed May 6 14:31:52 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/exec_command_dialog.ui'
# Form implementation generated from reading ui file 'exec_command_dialog.ui'
#
# Created: Mon May 4 12:01:28 2015
# Created: Wed May 6 14:31:52 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>467</width>
<height>536</height>
<width>450</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/general_preferences_page.ui'
# Form implementation generated from reading ui file 'general_preferences_page.ui'
#
# Created: Mon May 4 12:01:28 2015
# Created: Wed May 6 14:31:52 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_GeneralPreferencesPageWidget(object):
def setupUi(self, GeneralPreferencesPageWidget):
GeneralPreferencesPageWidget.setObjectName("GeneralPreferencesPageWidget")
GeneralPreferencesPageWidget.resize(467, 536)
GeneralPreferencesPageWidget.resize(450, 480)
self.verticalLayout = QtWidgets.QVBoxLayout(GeneralPreferencesPageWidget)
self.verticalLayout.setObjectName("verticalLayout")
self.uiMiscTabWidget = QtWidgets.QTabWidget(GeneralPreferencesPageWidget)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/getting_started_dialog.ui'
# Form implementation generated from reading ui file 'getting_started_dialog.ui'
#
# Created: Mon May 4 12:01:28 2015
# Created: Wed May 6 14:31:53 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/idlepc_dialog.ui'
# Form implementation generated from reading ui file 'idlepc_dialog.ui'
#
# Created: Mon May 4 12:01:28 2015
# Created: Wed May 6 14:31:53 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/import_cloud_project_dialog.ui'
# Form implementation generated from reading ui file 'import_cloud_project_dialog.ui'
#
# Created: Mon May 4 12:01:29 2015
# Created: Wed May 6 14:31:53 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/main_window.ui'
# Form implementation generated from reading ui file 'main_window.ui'
#
# Created: Mon May 4 12:01:29 2015
# Created: Wed May 6 14:31:53 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -368,9 +368,9 @@ class Ui_MainWindow(object):
self.uiAddLinkAction = QtWidgets.QAction(MainWindow)
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/cancel-connection.svg"), QtGui.QIcon.Normal, QtGui.QIcon.On)
icon29.addPixmap(QtGui.QPixmap(":/icons/cancel-connection.svg"), QtGui.QIcon.Active, QtGui.QIcon.On)
icon29.addPixmap(QtGui.QPixmap(":/icons/connection-new.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.uiAddLinkAction.setIcon(icon29)
self.uiAddLinkAction.setObjectName("uiAddLinkAction")
@@ -649,8 +649,8 @@ class Ui_MainWindow(object):
self.uiActionFullscreen.setShortcut(_translate("MainWindow", "Ctrl+F"))
self.uiVPCSAction.setText(_translate("MainWindow", "&VPCS multi-host"))
from ..nodes_view import NodesView
from ..topology_summary_view import TopologySummaryView
from ..graphics_view import GraphicsView
from ..console_view import ConsoleView
from ..nodes_view import NodesView
from ..graphics_view import GraphicsView
from . import resources_rc

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/new_project_dialog.ui'
# Form implementation generated from reading ui file 'new_project_dialog.ui'
#
# Created: Mon May 4 12:01:29 2015
# Created: Wed May 6 14:31:53 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/news_dock_widget.ui'
# Form implementation generated from reading ui file 'news_dock_widget.ui'
#
# Created: Mon May 4 12:01:29 2015
# Created: Wed May 6 14:31:53 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/node_configurator_dialog.ui'
# Form implementation generated from reading ui file 'node_configurator_dialog.ui'
#
# Created: Mon May 4 12:01:29 2015
# Created: Wed May 6 14:31:53 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>409</width>
<height>290</height>
<width>400</width>
<height>250</height>
</rect>
</property>
<property name="windowTitle">

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/packet_capture_preferences_page.ui'
# Form implementation generated from reading ui file 'packet_capture_preferences_page.ui'
#
# Created: Mon May 4 12:01:29 2015
# Created: Wed May 6 14:31:54 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_PacketCapturePreferencesPageWidget(object):
def setupUi(self, PacketCapturePreferencesPageWidget):
PacketCapturePreferencesPageWidget.setObjectName("PacketCapturePreferencesPageWidget")
PacketCapturePreferencesPageWidget.resize(409, 290)
PacketCapturePreferencesPageWidget.resize(400, 250)
self.gridLayout = QtWidgets.QGridLayout(PacketCapturePreferencesPageWidget)
self.gridLayout.setObjectName("gridLayout")
self.uiSettingsGroupBox = QtWidgets.QGroupBox(PacketCapturePreferencesPageWidget)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/preferences_dialog.ui'
# Form implementation generated from reading ui file 'preferences_dialog.ui'
#
# Created: Mon May 4 12:01:29 2015
# Created: Wed May 6 14:31:54 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

File diff suppressed because it is too large Load Diff

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>430</width>
<height>503</height>
<width>435</width>
<height>445</height>
</rect>
</property>
<property name="windowTitle">
@@ -228,10 +228,6 @@
</spacer>
</item>
</layout>
<zorder>uiConsolePortRangeGroupBox</zorder>
<zorder>uiUDPPortRangeGroupBox</zorder>
<zorder>uiGeneralSettingsGroupBox</zorder>
<zorder>uiLocalServerAutoStartCheckBox</zorder>
</widget>
<widget class="QWidget" name="uiRemoteTabWidget">
<attribute name="title">
@@ -334,13 +330,6 @@
</widget>
</item>
</layout>
<zorder>spacer_2</zorder>
<zorder>uiRemoteServerPortLabel</zorder>
<zorder>uiRemoteServerPortSpinBox</zorder>
<zorder>uiRemoteServerHostLabel</zorder>
<zorder>uiRemoteServerPortLineEdit</zorder>
<zorder>uiRemoteServersTreeWidget</zorder>
<zorder>horizontalSpacer_2</zorder>
</widget>
</widget>
</item>

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/server_preferences_page.ui'
# Form implementation generated from reading ui file 'server_preferences_page.ui'
#
# Created: Mon May 4 12:01:30 2015
# Created: Wed May 6 14:31:54 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!
@@ -15,7 +15,7 @@ class Ui_ServerPreferencesPageWidget(object):
def setupUi(self, ServerPreferencesPageWidget):
ServerPreferencesPageWidget.setObjectName("ServerPreferencesPageWidget")
ServerPreferencesPageWidget.resize(430, 503)
ServerPreferencesPageWidget.resize(435, 445)
self.vboxlayout = QtWidgets.QVBoxLayout(ServerPreferencesPageWidget)
self.vboxlayout.setObjectName("vboxlayout")
self.uiTabWidget = QtWidgets.QTabWidget(ServerPreferencesPageWidget)

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/snapshots_dialog.ui'
# Form implementation generated from reading ui file 'snapshots_dialog.ui'
#
# Created: Mon May 4 12:01:30 2015
# Created: Wed May 6 14:31:54 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/style_editor_dialog.ui'
# Form implementation generated from reading ui file 'style_editor_dialog.ui'
#
# Created: Mon May 4 12:01:30 2015
# Created: Wed May 6 14:31:54 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/symbol_selection_dialog.ui'
# Form implementation generated from reading ui file 'symbol_selection_dialog.ui'
#
# Created: Mon May 4 12:01:30 2015
# Created: Wed May 6 14:31:54 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/Users/noplay/code/gns3/gns3-gui/gns3/ui/text_editor_dialog.ui'
# Form implementation generated from reading ui file 'text_editor_dialog.ui'
#
# Created: Mon May 4 12:01:30 2015
# Created: Wed May 6 14:31:54 2015
# by: PyQt5 UI code generator 5.4
#
# WARNING! All changes made in this file will be lost!

View File

@@ -99,8 +99,6 @@
<file>icons/stop-hover.svg</file>
<file>icons/reload.svg</file>
<file>icons/add-note.svg</file>
<file>icons/import_config.svg</file>
<file>icons/export_config.svg</file>
<file>icons/inspect.svg</file>
<file>icons/capture-start.svg</file>
<file>icons/capture-stop.svg</file>

View File

@@ -19,7 +19,7 @@ args = parser.parse_args()
if args.qt4:
if sys.platform.startswith('win'):
PATH = os.path.join(os.path.dirname(sys.executable), "Lib/site-packages/PyQt4")
PATH = os.path.join(os.path.dirname(sys.executable), "Lib\\site-packages\\PyQt4")
if os.access(os.path.join(PATH, "bin"), os.R_OK):
PATH = os.path.join(PATH, "bin")
PYUIC = os.path.join(PATH, "pyuic4")
@@ -30,7 +30,7 @@ if args.qt4:
PYRCC_PYTHON3_FLAG = "-py3"
else:
if sys.platform.startswith('win'):
PATH = os.path.join(os.path.dirname(sys.executable), "Lib/site-packages/PyQt5")
PATH = os.path.join(os.path.dirname(sys.executable), "Lib\\site-packages\\PyQt5")
if os.access(os.path.join(PATH, "bin"), os.R_OK):
PATH = os.path.join(PATH, "bin")
PYUIC = os.path.join(PATH, "pyuic5")
@@ -51,7 +51,14 @@ def build_ui(path):
print("Building UI {}".format(source))
if args.force and os.access(target, os.F_OK):
os.remove(target)
subprocess.call(command)
if sys.platform.startswith('win'):
for i, arg in enumerate(command):
command[i] = '"' + arg.replace('"', '"""') + '"'
command = ' '.join(command)
subprocess.call(command, shell=True)
else:
subprocess.call(command)
patch_file_qt4_5(target)
@@ -68,6 +75,10 @@ def build_resources(path, target):
print("Building resources {}".format(source))
if args.force and os.access(target, os.F_OK):
os.remove(target)
if sys.platform.startswith('win'):
for i, arg in enumerate(command):
command[i] = '"' + arg.replace('"', '"""') + '"'
command = ' '.join(command)
subprocess.call(command)
patch_file_qt4_5(target)
@@ -79,12 +90,17 @@ def patch_file_qt4_5(target):
# We patch the file in order to support both version of Qt
out = ""
print("Patch {} for Qt4 and Qt5 support".format(target))
with open(target) as f:
original_from = re.compile(r"^from PyQt[45] ", re.U)
original_translate = re.compile(r"_translate = QtCore\.QCoreApplication\.translate", re.U)
gen_line = r"# Form implementation generated from reading ui file '";
with open(target, 'r', encoding="utf-8") as f:
for line in f.readlines():
line = re.sub(r"^from PyQt[45] ", "import gns3.qt\nfrom gns3.qt ", line)
line = re.sub(r"_translate = QtCore\.QCoreApplication\.translate", "_translate = gns3.qt.translate", line)
if line.startswith(gen_line):
line = line[0:len(gen_line)] + line[line.rfind(os.sep)+len(os.sep):]
line = original_from.sub("import gns3.qt\nfrom gns3.qt ", line)
line = original_translate.sub("_translate = gns3.qt.translate", line)
out += line
with open(target, 'w') as f:
with open(target, 'w', encoding="utf-8") as f:
f.write(out)