Ejemplo n.º 1
0
class PluginConfigPreviewDialog(PluginConfigDialog):
    def __init__(self, context, config, title, codec, icon=None):
        super(PluginConfigPreviewDialog,
              self).__init__(context, config, title, codec, icon)

    def _init_main_layout(self):
        main_layout = QVBoxLayout()
        main_layout.addWidget(self._init_input_frame())
        main_layout.addWidget(self._init_preview_frame())
        main_layout.addWidget(self._init_error_frame())
        self._btn_box = self._init_button_box()
        main_layout.addWidget(self._btn_box)
        return main_layout

    def _init_preview_frame(self):
        view_frame = QFrame(self)
        view_frame_layout = QHBoxLayout()
        self._txt_preview = QPlainTextEdit(self)
        self._txt_preview.setReadOnly(True)
        self._txt_preview.setLineWrapMode(QPlainTextEdit.NoWrap)
        self._txt_preview.customContextMenuRequested.connect(
            self._show_preview_frame_context_menu)
        self._txt_preview.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        view_frame_layout.addWidget(self._txt_preview)
        view_frame.setLayout(view_frame_layout)
        return view_frame

    def _init_input_frame(self):
        input_frame = QGroupBox()
        self._input_frame_layout = QHBoxLayout()
        input_frame.setLayout(self._input_frame_layout)
        return input_frame

    def _add_option_widget(self, label: QLabel, widget):
        self._input_frame_layout.addWidget(label)
        self._input_frame_layout.addWidget(widget)

    def _on_change(self):
        super(PluginConfigPreviewDialog, self)._on_change()
        if self._validate():
            self._do_preview()

    def _do_preview(self):
        try:
            result = self._codec(self.config, self._input)
            self._txt_preview.setPlainText(result)
            return True
        except BaseException as e:
            return False

    def _show_preview_frame_context_menu(self, point: QPoint = None):
        """ Displays a customized context menu for the plain view. """
        def _on_plain_text_context_menu_wrap_lines(e: QEvent):
            """ Un-/wraps lines when user clicks the wrap-lines action within the plain views context-menu. """
            if self._txt_preview.lineWrapMode() == QPlainTextEdit.NoWrap:
                self._txt_preview.setLineWrapMode(QPlainTextEdit.WidgetWidth)
            else:
                self._txt_preview.setLineWrapMode(QPlainTextEdit.NoWrap)

        if not point:
            point = QCursor.pos()
        context_menu = self._txt_preview.createStandardContextMenu()
        context_menu.addSeparator()
        wrap_lines_action = QAction(self)
        wrap_lines_action.setText("Wrap Lines")
        wrap_lines_action.setCheckable(True)
        wrap_lines_action.setChecked(
            self._txt_preview.lineWrapMode() == QPlainTextEdit.WidgetWidth)
        wrap_lines_action.triggered.connect(
            _on_plain_text_context_menu_wrap_lines)
        context_menu.addAction(wrap_lines_action)
        context_menu.exec(self._txt_preview.mapToGlobal(point))