Ejemplo n.º 1
0
class comics_project_page_viewer(QDialog):
    pageIndex = 0
    spread = True

    def __init__(self):
        super().__init__()

        self.setModal(False)
        self.setWindowTitle('Untitled')
        self.setWindowFlags(Qt.WindowTitleHint | Qt.WindowMinimizeButtonHint
                            | Qt.WindowMaximizeButtonHint
                            | Qt.WindowCloseButtonHint)
        self.resize(1024, 768)
        self.setLayout(QVBoxLayout())

        self.left_viewer = page_viewer()
        self.left_viewer.align_right()
        self.left_viewer.clicked.connect(self.prev_page)
        self.right_viewer = page_viewer()
        self.right_viewer.align_left()
        self.right_viewer.clicked.connect(self.next_page)
        self.single_viewer = page_viewer()
        self.single_viewer.align_center()
        self.single_viewer.clicked.connect(self.next_page)
        self.single_viewer.hide()

        self.page_layout = QHBoxLayout()
        self.layout().addLayout(self.page_layout)
        self.page_layout.addWidget(self.left_viewer)
        self.page_layout.addWidget(self.right_viewer)
        self.page_layout.addWidget(self.single_viewer)

        # Keyboard shortcuts
        self.home_shortcut = QShortcut('Home', self)
        self.home_shortcut.activated.connect(self.first_page)
        self.left_shortcut = QShortcut('Left', self)
        self.left_shortcut.activated.connect(self.prev_page)
        self.right_shortcut = QShortcut('Right', self)
        self.right_shortcut.activated.connect(self.next_page)
        self.space_shortcut = QShortcut('Space', self)
        self.space_shortcut.activated.connect(self.next_page)
        self.end_shortcut = QShortcut('End', self)
        self.end_shortcut.activated.connect(self.last_page)

        self.first_btn = QPushButton('First')
        self.first_btn.clicked.connect(self.first_page)
        self.prev_btn = QPushButton('Previous')
        self.prev_btn.clicked.connect(self.prev_page)
        self.spread_btn = QPushButton('Single Page')
        self.spread_btn.clicked.connect(self.toggle_spread)
        self.next_btn = QPushButton('Next')
        self.next_btn.clicked.connect(self.next_page)
        self.last_btn = QPushButton('Last')
        self.last_btn.clicked.connect(self.last_page)

        self.buttons_layout = QHBoxLayout()
        self.layout().addLayout(self.buttons_layout)
        self.buttons_layout.addWidget(self.first_btn)
        self.buttons_layout.addWidget(self.prev_btn)
        self.buttons_layout.addWidget(self.spread_btn)
        self.buttons_layout.addWidget(self.next_btn)
        self.buttons_layout.addWidget(self.last_btn)

    def load_comic(self, path_to_config):
        self.path_to_config = path_to_config
        configFile = open(self.path_to_config,
                          "r",
                          newline="",
                          encoding="utf-16")
        self.setupDictionary = json.load(configFile)
        self.projecturl = os.path.dirname(str(self.path_to_config))
        if 'readingDirection' in self.setupDictionary:
            if self.setupDictionary['readingDirection'] == "leftToRight":
                self.setLayoutDirection(Qt.LeftToRight)
                self.left_shortcut.disconnect()
                self.right_shortcut.disconnect()
                self.left_shortcut.activated.connect(self.prev_page)
                self.right_shortcut.activated.connect(self.next_page)
            else:
                self.left_shortcut.disconnect()
                self.right_shortcut.disconnect()
                self.setLayoutDirection(Qt.RightToLeft)
                self.left_shortcut.activated.connect(self.next_page)
                self.right_shortcut.activated.connect(self.prev_page)
        else:
            self.left_shortcut.disconnect()
            self.right_shortcut.disconnect()
            self.setLayoutDirection(Qt.LeftToRight)
            self.left_shortcut.activated.connect(self.prev_page)
            self.right_shortcut.activated.connect(self.next_page)
        configFile.close()

    def go_to_page_index(self, index):
        if index >= 0 and index < len(self.setupDictionary['pages']):
            self.pageIndex = index
        else:
            self.pageIndex = 0
        self.flip_page()

    def toggle_spread(self):
        if self.spread:
            self.spread = False
            self.spread_btn.setText('Double Spread')
            self.update_single_page(self.pageIndex)
            self.left_viewer.hide()
            self.right_viewer.hide()
            self.single_viewer.show()
            self.flip_page()
        else:
            self.spread = True
            self.spread_btn.setText('Single Page')
            self.left_viewer.show()
            self.right_viewer.show()
            self.single_viewer.hide()
            self.flip_page()

    def update_single_page(self, index):
        image = self.get_mergedimage(index)
        self.single_viewer.set_image(image)

    def update_left_page(self, index):
        image = self.get_mergedimage(index)
        self.left_viewer.set_image(image)

    def update_right_page(self, index):
        image = self.get_mergedimage(index)
        self.right_viewer.set_image(image)

    def first_page(self):
        self.pageIndex = 0
        self.flip_page()

    def prev_page(self):
        if self.pageIndex <= 0:
            self.pageIndex = len(self.setupDictionary['pages']) - 1
        else:
            if self.spread:
                self.pageIndex -= 2
            else:
                self.pageIndex -= 1
        self.flip_page()

    def next_page(self):
        if self.pageIndex >= len(self.setupDictionary['pages']) - 1:
            self.pageIndex = 0
        else:
            if self.spread:
                self.pageIndex += 2
            else:
                self.pageIndex += 1
        self.flip_page()

    def last_page(self):
        self.pageIndex = len(self.setupDictionary['pages']) - 1
        self.flip_page()

    def flip_page(self):
        if self.spread:
            if self.pageIndex % 2 == 0:  # Even/Left
                left_page_number = self.pageIndex - 1
                right_page_number = self.pageIndex
            else:  # Odd/Right
                left_page_number = self.pageIndex
                right_page_number = self.pageIndex + 1
            self.update_left_page(left_page_number)
            self.update_right_page(right_page_number)
            if left_page_number < 0:
                page_numbers = str(right_page_number + 1)
            elif right_page_number >= len(self.setupDictionary['pages']):
                page_numbers = str(left_page_number + 1)
            else:
                page_numbers = '{left} / {right}'.format(
                    left=str(left_page_number + 1),
                    right=str(right_page_number + 1))
            self.setWindowTitle('{name} - {page_numbers}'.format(
                name=self.setupDictionary['projectName'],
                page_numbers=page_numbers))
        else:
            if self.pageIndex >= len(self.setupDictionary['pages']):
                self.pageIndex = len(self.setupDictionary['pages']) - 1
            if self.pageIndex < 0:
                self.pageIndex = 0
            self.update_single_page(self.pageIndex)
            self.setWindowTitle('{name} - {page_numbers}'.format(
                name=self.setupDictionary['projectName'],
                page_numbers=str(self.pageIndex + 1)))

    def get_mergedimage(self, index):
        if index < len(self.setupDictionary['pages']) and index > -1:
            image_url = os.path.join(self.projecturl,
                                     self.setupDictionary['pages'][index])
            if os.path.exists(image_url):
                page = zipfile.ZipFile(image_url, "r")
                image = QImage.fromData(page.read("mergedimage.png"))
                page.close()
                return image
        image = QImage(QSize(10, 10), QImage.Format_ARGB32)
        image.fill(Qt.GlobalColor(19))
        return image