コード例 #1
0
class RCPGWindow(DockWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Rogudator's comic panel generator")

        mainLayout = QVBoxLayout()

        #l means label
        #b means push button
        #sp means spinbox
        #sl means slider
        #cb means combobox

        l_preview = QLabel(self)
        l_preview.setText("Preview:")
        mainLayout.addWidget(l_preview)

        self.rcpg_object = RCPG()
        self.rcpg_object.refresh_svg_renderer()

        renderer = self.rcpg_object.svg_renderer
        self.svg_item = QGraphicsSvgItem()
        self.svg_item.setSharedRenderer(renderer)

        self.preview = Page_preview()
        self.preview.scene().addItem(self.svg_item)
        mainLayout.addWidget(self.preview)

        self.set_clickable_gutters()

        l_generate = QLabel(self)
        l_generate.setText("Generate as:")
        mainLayout.addWidget(l_generate)

        b_layer = QPushButton(self)
        b_layer.setText("Layer")

        b_file = QPushButton(self)
        b_file.setText("File")

        file_and_layer = QHBoxLayout(self)
        file_and_layer.addWidget(b_layer)
        file_and_layer.addWidget(b_file)
        mainLayout.addLayout(file_and_layer)

        l_num_rows = QLabel(self)
        l_num_rows.setText("Number of rows:")
        mainLayout.addWidget(l_num_rows)

        self.sp_num_rows = QSpinBox(self)
        self.sp_num_rows.setValue(2)
        self.sp_num_rows.setMinimum(1)

        self.sl_num_rows = QSlider(self)
        self.sl_num_rows.setMinimum(1)
        self.sl_num_rows.setMaximum(6)
        self.sl_num_rows.setOrientation(Qt.Horizontal)
        self.sl_num_rows.setTickPosition(1)
        self.sl_num_rows.setTickInterval(1)
        self.sl_num_rows.setMinimumWidth(100)
        self.sl_num_rows.setValue(2)

        num_rows = QHBoxLayout(self)
        num_rows.addWidget(self.sp_num_rows)
        num_rows.addWidget(self.sl_num_rows)
        mainLayout.addLayout(num_rows)

        l_num_columns = QLabel(self)
        l_num_columns.setText("Numer of columns:")
        mainLayout.addWidget(l_num_columns)

        self.sp_num_columns = QSpinBox(self)
        self.sp_num_columns.setValue(2)
        self.sp_num_columns.setMinimum(1)

        self.sl_num_columns = QSlider(self)
        self.sl_num_columns.setMinimum(1)
        self.sl_num_columns.setMaximum(6)
        self.sl_num_columns.setOrientation(Qt.Horizontal)
        self.sl_num_columns.setTickPosition(1)
        self.sl_num_columns.setTickInterval(1)
        self.sl_num_columns.setMinimumWidth(100)
        self.sl_num_columns.setValue(2)

        num_columns = QHBoxLayout(self)
        num_columns.addWidget(self.sp_num_columns)
        num_columns.addWidget(self.sl_num_columns)
        mainLayout.addLayout(num_columns)

        l_gutter = QLabel(self)
        l_gutter.setText("Gutters")
        mainLayout.addWidget(l_gutter)

        self.cb_gutter_equal = QCheckBox(self)
        self.cb_gutter_equal.setText(
            "Horizontal and vertical gutters are equal")
        self.cb_gutter_equal.setChecked(True)
        mainLayout.addWidget(self.cb_gutter_equal)

        l_hgutter = QLabel(self)
        l_hgutter.setText("Size of a horizontal gutter:")
        mainLayout.addWidget(l_hgutter)

        self.hgutter_updated = True

        self.hgutter_max = int(self.rcpg_object.height_page /
                               (self.rcpg_object.rows + 1))

        self.sp_hgutter = QSpinBox(self)
        self.sp_hgutter.setValue(30)
        self.sp_hgutter.setMinimum(1)
        self.sp_hgutter.setMaximum(self.hgutter_max)

        self.sl_hgutter = QSlider(self)
        self.sl_hgutter.setMaximum(1)
        self.sl_hgutter.setMaximum(self.hgutter_max)
        self.sl_hgutter.setOrientation(Qt.Horizontal)
        self.sl_hgutter.setTickInterval(1)
        self.sl_hgutter.setMinimumWidth(100)
        self.sl_hgutter.setValue(30)

        hgutter = QHBoxLayout(self)
        hgutter.addWidget(self.sp_hgutter)
        hgutter.addWidget(self.sl_hgutter)
        mainLayout.addLayout(hgutter)

        l_vgutter = QLabel(self)
        l_vgutter.setText("Size of a vertical gutter:")
        mainLayout.addWidget(l_vgutter)

        self.vgutter_updated = True

        self.vgutter_max = int(self.rcpg_object.width_page /
                               (self.rcpg_object.columns + 1))

        self.sp_vgutter = QSpinBox(self)
        self.sp_vgutter.setValue(30)
        self.sp_vgutter.setMinimum(1)
        self.sp_vgutter.setMaximum(self.vgutter_max)

        self.sl_vgutter = QSlider(self)
        self.sl_vgutter.setMaximum(1)
        self.sl_vgutter.setMaximum(self.vgutter_max)
        self.sl_vgutter.setOrientation(Qt.Horizontal)
        self.sl_vgutter.setTickInterval(1)
        self.sl_vgutter.setMinimumWidth(100)
        self.sl_vgutter.setValue(30)

        vgutter = QHBoxLayout(self)
        vgutter.addWidget(self.sp_vgutter)
        vgutter.addWidget(self.sl_vgutter)
        mainLayout.addLayout(vgutter)

        l_cgutter = QLabel(self)
        l_cgutter.setText("Color of the gutter:")
        mainLayout.addWidget(l_cgutter)

        self.l_color_gutter = QLabel(self)
        self.l_color_gutter.setText("#000000")

        b_color_gutter = QPushButton(self)
        b_color_gutter.setText("Change")

        color_of_gutter = QHBoxLayout(self)
        color_of_gutter.addWidget(self.l_color_gutter)
        color_of_gutter.addWidget(b_color_gutter)
        mainLayout.addLayout(color_of_gutter)

        l_outline = QLabel(self)
        l_outline.setText("Size of panel outline:")
        mainLayout.addWidget(l_outline)

        self.sp_outline = QSpinBox(self)
        self.sp_outline.setValue(6)
        self.sp_outline.setMinimum(0)

        self.sl_outline = QSlider(self)
        self.sl_outline.setMinimum(0)
        self.sl_outline.setMaximum(98)
        self.sl_outline.setOrientation(Qt.Horizontal)
        self.sl_outline.setTickInterval(1)
        self.sl_outline.setMinimumWidth(100)
        self.sl_outline.setValue(6)

        outline = QHBoxLayout(self)
        outline.addWidget(self.sp_outline)
        outline.addWidget(self.sl_outline)
        mainLayout.addLayout(outline)

        l_color_outline = QLabel(self)
        l_color_outline.setText("Color of panel outline:")
        mainLayout.addWidget(l_color_outline)

        self.l_color_outline = QLabel(self)
        self.l_color_outline.setText("#ffffff")

        b_color_outline = QPushButton(self)
        b_color_outline.setText("Change")

        color_of_outline = QHBoxLayout(self)
        color_of_outline.addWidget(self.l_color_outline)
        color_of_outline.addWidget(b_color_outline)
        mainLayout.addLayout(color_of_outline)

        self.scrollMainLayout = QScrollArea(self)
        self.scrollMainLayout.setWidgetResizable(True)
        self.scrollMainLayout.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)

        b_file.clicked.connect(self.b_file_create)
        b_layer.clicked.connect(self.b_layer_create)
        self.sp_num_rows.valueChanged.connect(self.upd_sp_num_rows)
        self.sl_num_rows.valueChanged.connect(self.upd_sl_num_rows)
        self.sp_num_columns.valueChanged.connect(self.upd_sp_num_columns)
        self.sl_num_columns.valueChanged.connect(self.upd_sl_num_columns)
        self.sp_hgutter.valueChanged.connect(self.upd_sp_hgutter)
        self.sl_hgutter.valueChanged.connect(self.upd_sl_hgutter)
        self.sp_vgutter.valueChanged.connect(self.upd_sp_vgutter)
        self.sl_vgutter.valueChanged.connect(self.upd_sl_vgutter)
        b_color_gutter.clicked.connect(self.color_gutter_dialog)
        self.sp_outline.valueChanged.connect(self.upd_sp_outline)
        self.sl_outline.valueChanged.connect(self.upd_sl_outline)
        b_color_outline.clicked.connect(self.color_outline_dialog)

        self.window = QWidget(self)
        self.window.setLayout(mainLayout)
        self.scrollMainLayout.setWidget(self.window)
        self.setWidget(self.scrollMainLayout)
        self.show()

    def b_file_create(self):
        temp_dir = tempfile.gettempdir() + "/rcpg10.svg"
        body = self.rcpg_object.get_svg_string()
        with open(temp_dir, 'w', encoding='utf-8') as f:
            f.write(body)
        file = Krita.instance().openDocument(temp_dir)
        Krita.instance().activeWindow().addView(file)
        file.refreshProjection()

    def b_layer_create(self):
        temp_dir = tempfile.gettempdir() + "/rcpg10.svg"
        body = self.rcpg_object.get_svg_string()
        with open(temp_dir, 'w', encoding='utf-8') as f:
            f.write(body)
        app = Krita.instance()
        doc = app.activeDocument()
        if doc != None:
            root = doc.rootNode()
            layer = doc.createNode("Panels", "paintLayer")
            img = QImage(temp_dir)
            img = img.scaled(doc.width(),
                             doc.height(),
                             aspectRatioMode=Qt.KeepAspectRatio,
                             transformMode=Qt.SmoothTransformation)
            if not img.isNull():
                img.convertToFormat(QImage.Format_RGBA8888)
                ptr = img.constBits()
                ptr.setsize(img.byteCount())
                layer.setPixelData(bytes(ptr.asarray()), 0, 0, img.width(),
                                   img.height())
            root.addChildNode(layer, None)
            doc.refreshProjection()

    def upd_sp_num_rows(self):
        self.preview.scene().clear()
        rows = self.sp_num_rows.value()
        if rows > 0 and rows < 7:
            self.sl_num_rows.setValue(rows)

        self.hgutter_max = int(self.rcpg_object.height_page / (rows + 1))
        self.sp_hgutter.setMaximum(self.hgutter_max)
        self.sl_hgutter.setMaximum(self.hgutter_max)

        self.rcpg_object.rows = rows
        self.rcpg_object.upd_everything()
        self.rcpg_object.standard_grid()
        self.rcpg_object.refresh_svg_renderer()
        self.svg_item = QGraphicsSvgItem()
        self.svg_item.setSharedRenderer(self.rcpg_object.svg_renderer)
        self.preview.scene().addItem(self.svg_item)
        self.set_clickable_gutters()
        self.svg_item.update()

    def upd_sl_num_rows(self):
        self.sp_num_rows.setValue(self.sl_num_rows.value())

    def upd_sp_num_columns(self):
        self.preview.scene().clear()
        columns = self.sp_num_columns.value()
        if columns > 0 and columns < 7:
            self.sl_num_columns.setValue(columns)

        self.vgutter_max = int(self.rcpg_object.width_page / (columns + 1))
        self.sp_vgutter.setMaximum(self.vgutter_max)
        self.sl_vgutter.setMaximum(self.vgutter_max)

        self.rcpg_object.columns = columns
        self.rcpg_object.upd_everything()
        self.rcpg_object.standard_grid()
        self.rcpg_object.refresh_svg_renderer()
        self.svg_item = QGraphicsSvgItem()
        self.svg_item.setSharedRenderer(self.rcpg_object.svg_renderer)
        self.preview.scene().addItem(self.svg_item)
        self.set_clickable_gutters()
        self.svg_item.update()

    def upd_sl_num_columns(self):
        self.sp_num_columns.setValue(self.sl_num_columns.value())

    def upd_sp_hgutter(self):
        horizontal_gutter = self.sp_hgutter.value()
        if horizontal_gutter > 0 and horizontal_gutter < self.hgutter_max:
            self.sl_hgutter.setValue(horizontal_gutter)
        self.rcpg_object.horizontal_gutter = horizontal_gutter

        if self.cb_gutter_equal.isChecked() == True:
            self.hgutter_updated = False
            self.sp_vgutter.setValue(horizontal_gutter)
            if horizontal_gutter > 0 and horizontal_gutter < self.vgutter_max:
                self.sl_vgutter.setValue(horizontal_gutter)
            self.rcpg_object.vertical_gutter = horizontal_gutter

        if self.hgutter_updated == True:
            self.preview.scene().clear()
            self.rcpg_object.upd_everything()
            self.rcpg_object.standard_grid()
            self.rcpg_object.refresh_svg_renderer()
            self.svg_item = QGraphicsSvgItem()
            self.svg_item.setSharedRenderer(self.rcpg_object.svg_renderer)
            self.preview.scene().addItem(self.svg_item)
            self.set_clickable_gutters()
            self.svg_item.update()
        else:
            self.hgutter_updated = True

    def upd_sl_hgutter(self):
        horizontal_gutter = self.sl_hgutter.value()
        self.sp_hgutter.setValue(horizontal_gutter)
        self.rcpg_object.horizontal_gutter = horizontal_gutter

        if self.cb_gutter_equal.isChecked() == True:
            self.sp_vgutter.setValue(horizontal_gutter)
            if horizontal_gutter > 0 and horizontal_gutter < self.vgutter_max:
                self.sl_vgutter.setValue(horizontal_gutter)
            self.rcpg_object.vertical_gutter = horizontal_gutter

    def upd_sp_vgutter(self):
        vertical_gutter = self.sp_vgutter.value()
        if vertical_gutter > 0 and vertical_gutter < self.vgutter_max:
            self.sl_vgutter.setValue(vertical_gutter)
        self.rcpg_object.vertical_gutter = vertical_gutter

        if self.cb_gutter_equal.isChecked() == True:
            self.hgutter_updated = False
            self.sp_hgutter.setValue(vertical_gutter)
            if vertical_gutter > 0 and vertical_gutter < self.hgutter_max:
                self.sl_hgutter.setValue(vertical_gutter)
            self.rcpg_object.horizontal_gutter = vertical_gutter

        if self.vgutter_updated == True:
            self.preview.scene().clear()
            self.rcpg_object.upd_everything()
            self.rcpg_object.standard_grid()
            self.rcpg_object.refresh_svg_renderer()
            self.svg_item = QGraphicsSvgItem()
            self.svg_item.setSharedRenderer(self.rcpg_object.svg_renderer)
            self.preview.scene().addItem(self.svg_item)
            self.set_clickable_gutters()
            self.svg_item.update()
        else:
            self.vgutter_max = True

    def upd_sl_vgutter(self):
        vertical_gutter = self.sl_vgutter.value()
        self.sp_vgutter.setValue(vertical_gutter)
        self.rcpg_object.vertical_gutter = vertical_gutter

        if self.cb_gutter_equal.isChecked() == True:
            self.sp_hgutter.setValue(vertical_gutter)
            if vertical_gutter > 0 and vertical_gutter < self.hgutter_max:
                self.sl_hgutter.setValue(vertical_gutter)
            self.rcpg_object.vertical_gutter = vertical_gutter

    def color_gutter_dialog(self):
        color = QColorDialog.getColor(QColor(self.l_color_gutter.text()))
        self.l_color_gutter.setText(color.name())
        self.rcpg_object.gutter_color = self.l_color_gutter.text()
        self.rcpg_object.refresh_svg_renderer()
        self.svg_item.update()
        self.update()

    def upd_sp_outline(self):
        self.preview.scene().clear()
        outline = self.sp_outline.value()
        self.rcpg_object.outline = outline

        self.rcpg_object.upd_everything()
        self.rcpg_object.standard_grid()
        self.rcpg_object.refresh_svg_renderer()
        self.svg_item = QGraphicsSvgItem()
        self.svg_item.setSharedRenderer(self.rcpg_object.svg_renderer)
        self.preview.scene().addItem(self.svg_item)
        self.set_clickable_gutters()
        self.svg_item.update()

    def upd_sl_outline(self):
        outline = self.sl_outline.value()
        self.sp_outline.setValue(outline)

    def color_outline_dialog(self):
        color = QColorDialog.getColor(QColor(self.l_color_outline.text()))
        self.l_color_outline.setText(color.name())
        self.rcpg_object.outline_color = self.l_color_outline.text()
        self.rcpg_object.refresh_svg_renderer()
        self.svg_item.update()
        self.update()

    def set_clickable_gutters(self):
        for i in range(self.rcpg_object.rows_vertices - 1):
            for j in range(self.rcpg_object.columns_vertices - 1):
                x = self.rcpg_object.vertex_coordinate_x[j]
                y = self.rcpg_object.vertex_coordinate_y[i]
                width = self.rcpg_object.vertex_coordinate_x[
                    j + 1] - self.rcpg_object.vertex_coordinate_x[j]
                height = self.rcpg_object.vertex_coordinate_y[
                    i + 1] - self.rcpg_object.vertex_coordinate_y[i]
                gutter_plane = Clickable_gutter(x, y, width, height)
                gutter_plane.setAcceptHoverEvents(True)
                gutter_plane.setRCPGObject(self.rcpg_object, i, j)
                gutter_plane.setFlag(QGraphicsItem.ItemIsSelectable)
                self.preview.scene().addItem(gutter_plane)
        self.preview.get_rcpg_object_id(
            (self.rcpg_object.rows_vertices - 1) *
            (self.rcpg_object.columns_vertices - 1))

    def canvasChanged(self, canvas):
        app = Krita.instance()
        doc = app.activeDocument()
        if doc != None:
            self.preview.scene().clear()
            self.rcpg_object.height_page = doc.height()
            self.rcpg_object.width_page = doc.width()
            self.rcpg_object.upd_everything()
            self.rcpg_object.standard_grid()
            self.rcpg_object.refresh_svg_renderer()
            self.svg_item = QGraphicsSvgItem()
            self.svg_item.setSharedRenderer(self.rcpg_object.svg_renderer)
            self.preview.scene().addItem(self.svg_item)
            self.set_clickable_gutters()
            self.svg_item.update()
            iii = self.preview.scene().sceneRect()
            if doc.height() > doc.width():
                iii.setHeight(doc.height())
            else:
                iii.setHeight(doc.height())
                iii.setWidth(doc.width())
            self.preview.scene().setSceneRect(iii)
            self.preview.updateView()