def __init__(self, parent=None): super(MainForm, self).__init__(parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self._init_blocks_widget() self.scheme = graphscheme.GraphScheme(self) self.ui.graphicsView.setScene(self.scheme) self.ui.graphicsView.setAlignment( QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft) self.ui.graphicsView.setRenderHint(QtGui.QPainter.Antialiasing) # Block preview objects self.previewPixmapItem1 = QtGui.QGraphicsPixmapItem() self.previewPixmapItem2 = QtGui.QGraphicsPixmapItem() self.previewScene1 = QtGui.QGraphicsScene() self.previewScene2 = QtGui.QGraphicsScene() self.previewScene1.addItem(self.previewPixmapItem1) self.previewScene2.addItem(self.previewPixmapItem2) self.ui.previewView1.setScene(self.previewScene1) self.ui.previewView2.setScene(self.previewScene2) self.properties_model = None self.init_actions() # Set property editor item delegate self.editor_delegate = propertyeditor.PropertyEditorDelegate() self.ui.propertyTable.setItemDelegate(self.editor_delegate) self.editor_delegate.closeEditor.connect(self.update_window) # Preview block self.previewBlock1 = None self.previewBlock2 = None # File name of current file, new file have None as file name self.current_file_name = None self.update_window_title() self.scale_factor = 1.0
class MainForm(QtGui.QMainWindow): def __init__(self, parent=None): super(MainForm, self).__init__(parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self._init_blocks_widget() self.scheme = graphscheme.GraphScheme(self) self.ui.graphicsView.setScene(self.scheme) self.ui.graphicsView.setAlignment( QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft) self.ui.graphicsView.setRenderHint(QtGui.QPainter.Antialiasing) # Block preview objects self.previewPixmapItem1 = QtGui.QGraphicsPixmapItem() self.previewPixmapItem2 = QtGui.QGraphicsPixmapItem() self.previewScene1 = QtGui.QGraphicsScene() self.previewScene2 = QtGui.QGraphicsScene() self.previewScene1.addItem(self.previewPixmapItem1) self.previewScene2.addItem(self.previewPixmapItem2) self.ui.previewView1.setScene(self.previewScene1) self.ui.previewView2.setScene(self.previewScene2) self.properties_model = None self.init_actions() # Set property editor item delegate self.editor_delegate = propertyeditor.PropertyEditorDelegate() self.ui.propertyTable.setItemDelegate(self.editor_delegate) self.editor_delegate.closeEditor.connect(self.update_window) # Preview block self.previewBlock1 = None self.previewBlock2 = None # File name of current file, new file have None as file name self.current_file_name = None self.update_window_title() self.scale_factor = 1.0 def _init_blocks_widget(self): self.block_classes = get_ipfblock_classes() categories = set() for block in self.block_classes.values(): categories.add(block.category) category_items = dict() for category in categories: category_items[category] = QtGui.QTreeWidgetItem(None) category_items[category].setText(0, category) for block in self.block_classes.values(): block_item = QtGui.QTreeWidgetItem(category_items[block.category]) block_item.setText(0, block.type) self.ui.blocks_tree.insertTopLevelItems(0, category_items.values()) def block_selected(self, graph_block_ref): self.show_block_properties(graph_block_ref().ipf_block_ref) if not self.ui.keepPreview1.isChecked(): self.previewBlock1 = graph_block_ref if not self.ui.keepPreview2.isChecked(): self.previewBlock2 = graph_block_ref self.update_window() def show_block_properties(self, ipf_block_ref): self.properties_model = propertiesmodel.PropertiesModel(ipf_block_ref) self.ui.propertyTable.setModel(self.properties_model) self.properties_model.dataChanged.connect(self.process_flow_and_update_window) self.ui.propertyTable.resizeRowsToContents() self.ui.propertyTable.setColumnWidth(0, 120) self.ui.propertyTable.setColumnWidth(1, 120) def init_actions(self): self.ui.actionAbout_Garland.triggered.connect(self.about) self.ui.actionArrange_scheme.triggered.connect(self.arrange_scheme) self.ui.actionCopy.triggered.connect(self.copy) self.ui.actionCut.triggered.connect(self.cut) self.ui.actionDelete.triggered.connect(self.delete) self.ui.actionExit.triggered.connect(QtGui.QApplication.exit) self.ui.actionFind.triggered.connect(self.find) self.ui.actionHelp_contents.triggered.connect(self.help_contents) self.ui.actionIcon_mode.triggered.connect(self.icon_mode) self.ui.actionImage_mode.triggered.connect(self.image_mode) self.ui.actionOpen.triggered.connect(self.open_file) self.ui.actionPaste.triggered.connect(self.paste) self.ui.actionText_mode.triggered.connect(self.text_mode) self.ui.actionSave.triggered.connect(self.save_file) self.ui.actionSave_As.triggered.connect(self.save_file_as) self.ui.actionStart.triggered.connect(self.processing_start) self.ui.actionStop.triggered.connect(self.processing_stop) self.ui.actionZoom_in.triggered.connect(self.zoom_in) self.ui.actionZoom_out.triggered.connect(self.zoom_out) def open_file(self): file_name, file_type = QtGui.QFileDialog.getOpenFileName( self, self.tr("Open image processing graph"), "./", self.tr("Garland files (*.xml *.garland)")) if len(file_name) > 0: self.scheme.load_graph(load(file_name)) self.current_file_name = file_name self.update_window_title() def save_file(self): if self.current_file_name is None: self.save_file_as() else: self._save(self.current_file_name) self.update_window_title() def save_file_as(self): file_name, file_type = QtGui.QFileDialog.getSaveFileName( self, self.tr("Save image processing graph"), "./", self.tr("Garland files (*.xml *.garland)")) if len(file_name) > 0: self._save(file_name) self.update_window_title() def _save(self, file_name): if len(file_name) > 0: self.scheme.save_graph(file_name) self.current_file_name = file_name def cut(self): pass def copy(self): pass def paste(self): pass def arrange_scheme(self): self.scheme.rearrange() def find(self): pass def delete(self): selected_block = self.scheme.get_selected_block() if self.previewBlock1 is not None and \ self.previewBlock1() == selected_block: self.previewBlock1 = None if self.previewBlock2 is not None and \ self.previewBlock2() == selected_block: self.previewBlock2 = None self.properties_model = propertiesmodel.PropertiesModel() self.ui.propertyTable.setModel(self.properties_model) self.scheme.delete_selected() self.process_flow_and_update_window() def processing_start(self): self.process_flow_and_update_window() def processing_stop(self): pass def zoom_in(self): self.scale_factor += 0.1 self.ui.graphicsView.resetTransform() self.ui.graphicsView.scale(self.scale_factor, self.scale_factor) pass def zoom_out(self): self.scale_factor -= 0.1 self.ui.graphicsView.resetTransform() self.ui.graphicsView.scale(self.scale_factor, self.scale_factor) pass def text_mode(self): self.scheme.set_block_paint_mode(GraphBlock.TEXT_PAINT_MODE) def image_mode(self): self.scheme.set_block_paint_mode(GraphBlock.IMAGE_PAINT_MODE) def icon_mode(self): self.scheme.set_block_paint_mode(GraphBlock.ICON_PAINT_MODE) def help_contents(self): pass def about(self): pass def update_window(self): """ Update all window GUI elements """ if self.previewBlock1 is not None: self._update_preview(self.previewBlock1, self.previewPixmapItem1, self.ui.previewView1) if self.previewBlock2 is not None: self._update_preview(self.previewBlock2, self.previewPixmapItem2, self.ui.previewView2) def process_flow_and_update_window(self): # Perform image processing self.scheme.process() self.scheme.update() self.update_window() def _update_preview(self, graph_block_ref, previewPixmapItem, previewView): """ Update preview image for block in previewPixmapItem """ if graph_block_ref is None or graph_block_ref() is None: previewPixmapItem.setPixmap(QtGui.QPixmap()) else: pixmap = graph_block_ref().get_preview_image() previewPixmapItem.setPixmap(pixmap) previewView.fitInView(previewPixmapItem, \ QtCore.Qt.KeepAspectRatio) def graph_changed(self): """ Notify function, called when image processing graph is changed """ self.process_flow_and_update_window() def update_window_title(self): # Update window caption with current file name if self.current_file_name is None: self.setWindowTitle(self.tr("Untitled")) else: self.setWindowTitle(self.current_file_name)