diff --git a/gns3/console_view.py b/gns3/console_view.py index c8c85ee6..28c50617 100644 --- a/gns3/console_view.py +++ b/gns3/console_view.py @@ -116,9 +116,21 @@ class ConsoleView(PyCutExt, ConsoleCmd): # In any case, reprint promt + line self.write("\n" + sys.ps1 + str(self.line)) - def write_error(self, name, code, message): + def writeError(self, name, code, message): + """ + Write error messages coming from the server. - print("Error received from {} with code {} and message: {}\n".format(name, code, message)) + :param name: node name + :param code: error code + :param message: error message + """ + + #print("Error received from {} with code {} and message: {}\n".format(name, code, message)) + if name: + name = name + ": " + text = "Server error [{code}]: {name} {message}".format(code=code, name=name, message=message) + self.write(text, error=True) + self.write("\n") def _run(self): """ diff --git a/gns3/graphics_view.py b/gns3/graphics_view.py index 911828ac..676136f7 100644 --- a/gns3/graphics_view.py +++ b/gns3/graphics_view.py @@ -47,6 +47,10 @@ class GraphicsView(QtGui.QGraphicsView): def __init__(self, parent): + # Our parent is the central widget which parent + # is the main window. + self._main_window = parent.parent() + QtGui.QGraphicsView.__init__(self, parent) self._settings = {} self._loadSettings() @@ -479,10 +483,9 @@ class GraphicsView(QtGui.QGraphicsView): Opens the node configurator. """ - from .main_window import MainWindow if not items: items = self.scene().selectedItems() - node_configurator = NodeConfigurator(items, MainWindow.instance()) + node_configurator = NodeConfigurator(items, self._main_window) node_configurator.setModal(True) node_configurator.show() node_configurator.exec_() @@ -564,35 +567,41 @@ class GraphicsView(QtGui.QGraphicsView): configure_action.triggered.connect(self.configureActionSlot) menu.addAction(configure_action) - console_action = QtGui.QAction("Console", menu) - console_action.setIcon(QtGui.QIcon(':/icons/console.svg')) - console_action.triggered.connect(self.consoleActionSlot) - menu.addAction(console_action) + if True in list(map(lambda item: hasattr(item.node(), "console"), items)): + console_action = QtGui.QAction("Console", menu) + console_action.setIcon(QtGui.QIcon(':/icons/console.svg')) + console_action.triggered.connect(self.consoleActionSlot) + menu.addAction(console_action) - idlepc_action = QtGui.QAction("Idle-PC", menu) - idlepc_action.setIcon(QtGui.QIcon(':/icons/calculate.svg')) - idlepc_action.triggered.connect(self.idlepcActionSlot) - menu.addAction(idlepc_action) + if True in list(map(lambda item: hasattr(item.node(), "idlepcs"), items)): + idlepc_action = QtGui.QAction("Idle-PC", menu) + idlepc_action.setIcon(QtGui.QIcon(':/icons/calculate.svg')) + idlepc_action.triggered.connect(self.idlepcActionSlot) + menu.addAction(idlepc_action) - start_action = QtGui.QAction("Start", menu) - start_action.setIcon(QtGui.QIcon(':/icons/play.svg')) - start_action.triggered.connect(self.startActionSlot) - menu.addAction(start_action) + if True in list(map(lambda item: hasattr(item.node(), "start"), items)): + start_action = QtGui.QAction("Start", menu) + start_action.setIcon(QtGui.QIcon(':/icons/play.svg')) + start_action.triggered.connect(self.startActionSlot) + menu.addAction(start_action) - suspend_action = QtGui.QAction("Suspend", menu) - suspend_action.setIcon(QtGui.QIcon(':/icons/pause.svg')) - suspend_action.triggered.connect(self.suspendActionSlot) - menu.addAction(suspend_action) + if True in list(map(lambda item: hasattr(item.node(), "suspend"), items)): + suspend_action = QtGui.QAction("Suspend", menu) + suspend_action.setIcon(QtGui.QIcon(':/icons/pause.svg')) + suspend_action.triggered.connect(self.suspendActionSlot) + menu.addAction(suspend_action) - stop_action = QtGui.QAction("Stop", menu) - stop_action.setIcon(QtGui.QIcon(':/icons/stop.svg')) - stop_action.triggered.connect(self.stopActionSlot) - menu.addAction(stop_action) + if True in list(map(lambda item: hasattr(item.node(), "stop"), items)): + stop_action = QtGui.QAction("Stop", menu) + stop_action.setIcon(QtGui.QIcon(':/icons/stop.svg')) + stop_action.triggered.connect(self.stopActionSlot) + menu.addAction(stop_action) - reload_action = QtGui.QAction("Reload", menu) - reload_action.setIcon(QtGui.QIcon(':/icons/reload.svg')) - reload_action.triggered.connect(self.reloadActionSlot) - menu.addAction(reload_action) + if True in list(map(lambda item: hasattr(item.node(), "reload"), items)): + reload_action = QtGui.QAction("Reload", menu) + reload_action.setIcon(QtGui.QIcon(':/icons/reload.svg')) + reload_action.triggered.connect(self.reloadActionSlot) + menu.addAction(reload_action) delete_action = QtGui.QAction("Delete", menu) delete_action.setIcon(QtGui.QIcon(':/icons/delete.svg')) @@ -761,9 +770,7 @@ class GraphicsView(QtGui.QGraphicsView): if not node_module: raise ModuleError("Could not find any module for {}".format(node_class)) node = node_module.createNode(node_class) -# from .main_window import MainWindow -# mainwindow = MainWindow.instance() -# node.error_signal.connect(mainwindow.uiConsoleTextEdit.write_error) + node.error_signal.connect(self._main_window.uiConsoleTextEdit.writeError) node_item = NodeItem(node) node_module.setupNode(node) except ModuleError as e: diff --git a/gns3/pycutext.py b/gns3/pycutext.py index c48037e9..da440cc6 100644 --- a/gns3/pycutext.py +++ b/gns3/pycutext.py @@ -146,7 +146,7 @@ class PyCutExt(QtGui.QTextEdit): else: return self.line - def write(self, text): + def write(self, text, error=False): """ Simulates stdin, stdout, and stderr. """ @@ -164,7 +164,11 @@ class PyCutExt(QtGui.QTextEdit): # Set the format cursor.setPosition(pos1, QtGui.QTextCursor.KeepAnchor) char_format = cursor.charFormat() - char_format.setForeground(QtGui.QBrush(QtGui.QColor(0, 0, 0))) + if error: + color = QtGui.QColor(255, 0, 0) # red + else: + color = QtGui.QColor(0, 0, 0) # black + char_format.setForeground(QtGui.QBrush(color)) cursor.setCharFormat(char_format) def writelines(self, text): @@ -332,7 +336,7 @@ class PyCutExt(QtGui.QTextEdit): newpos = cursor.position() pos = -1 - while(newpos != pos): + while (newpos != pos): cursor.movePosition(QtGui.QTextCursor.NextWord) pos = newpos diff --git a/gns3/topology.py b/gns3/topology.py index c9d6c26d..a5534013 100644 --- a/gns3/topology.py +++ b/gns3/topology.py @@ -254,6 +254,7 @@ class Topology(object): if not node_module: raise ModuleError("Could not find any module for {}".format(topology_node["type"])) node = node_module.createNode(node_class) + node.error_signal.connect(main_window.uiConsoleTextEdit.writeError) except ModuleError as e: node_errors.append(str(e)) continue