App-sitelenmute

 view release on metacpan or  search on metacpan

script/fcaption  view on Meta::CPAN

        formLayout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, QtWidgets.QLabel("Title:"))
        self.edit_title = QtWidgets.QLineEdit()
        formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.edit_title)
        formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, QtWidgets.QLabel("Description:"))
        self.edit_desc = QtWidgets.QPlainTextEdit()
        self.edit_desc.setLineWrapMode(QtWidgets.QPlainTextEdit.WidgetWidth)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(1)
        self.edit_desc.setSizePolicy(sizePolicy)
        formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.edit_desc)
        horizontalLayout.addLayout(formLayout)
        verticalLayout = QtWidgets.QVBoxLayout()
        verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
        self.btn_next = QtWidgets.QPushButton("&Next")
        verticalLayout.addWidget(self.btn_next)
        self.btn_undo = QtWidgets.QPushButton("&Undo")
        verticalLayout.addWidget(self.btn_undo)
        self.btn_prev = QtWidgets.QPushButton("&Previous")
        verticalLayout.addWidget(self.btn_prev)
        horizontalLayout.addLayout(verticalLayout)
        widget = QtWidgets.QWidget()
        widget.setLayout(horizontalLayout)
        verticalSplitter.addWidget(widget)
        horizontalSplitter.addWidget(verticalSplitter)
        self.list_files = QtWidgets.QListWidget()
        self.list_files.setIconSize(QtCore.QSize(64, 64))
        horizontalSplitter.addWidget(self.list_files)
        self.setCentralWidget(horizontalSplitter)

        # signals
        self.list_files.itemActivated.connect(self.on_list)
        self.btn_next.clicked.connect(self.on_next)
        self.btn_prev.clicked.connect(self.on_prev)
        self.btn_undo.clicked.connect(self.on_undo)
        self.edit_title.textEdited.connect(self.on_changed)
        self.edit_desc.textChanged.connect(self.on_changed)

        # initial state
        self.files = list()
        self.missing_thumbs = list()
        self.current = 0
        self.modified = False

    def on_next(self, ev):
        if self.modified: self.save()
        self.load((self.current + 1) % len(self.files))

    def on_prev(self, ev):
        if self.modified: self.save()
        self.load((self.current - 1) % len(self.files))

    def on_list(self, ev):
        if self.modified: self.save()
        self.load(self.list_files.currentRow())

    def on_undo(self, ev):
        self.load(self.current)

    def thumb_ready(self, thread, idx, path):
        icon = thread.image
        if not icon.isNull():
            crow = self.list_files.currentRow()
            item = self.list_files.takeItem(idx)
            item.setIcon(QtGui.QIcon(QtGui.QPixmap(icon)))
            self.list_files.insertItem(idx, item)
            self.list_files.setCurrentRow(crow)
        self.thumb_schedule()

    def thumb_schedule(self):
        if not self.missing_thumbs: return
        idx, path = self.missing_thumbs.pop(0)
        thread = BackgroundLoader(path, self.list_files.iconSize())
        thread.finished.connect(lambda: self.thumb_ready(thread, idx, path))
        thread.start()

    def set_files(self, files):
        self.files = list(files)
        self.list_files.clear()
        self.missing_thumbs = list(enumerate(files))
        for path in files:
            self.list_files.addItem(os.path.basename(path))
        if len(files) < 2:
            self.list_files.hide()
            self.btn_next.setEnabled(False)
            self.btn_prev.setEnabled(False)
        else:
            self.list_files.show()
            self.thumb_schedule()
            self.btn_next.setEnabled(True)
            self.btn_prev.setEnabled(True)
        self.load(0)

    def on_changed(self, *_):
        self.modified = True

    def load(self, idx):
        self.current = idx
        self.list_files.setCurrentRow(idx)

        path = self.files[idx]
        pixmap = QtGui.QPixmap(path)
        if pixmap.isNull():
            self.image.setPixmap(pixmap)
            self.image.setText('Cannot load {}'.format(path))
            self.edit_title.setEnabled(False)
            self.edit_desc.setEnabled(False)
            return

        self.image.clear()
        self.image.setPixmap(pixmap)

        self.edit_title.clear()
        self.edit_desc.clear()
        self.edit_title.setEnabled(True)
        self.edit_desc.setEnabled(True)

        base, _ = os.path.splitext(path)
        txt = base + '.txt'
        if os.path.isfile(txt):
            data = open(txt, 'rb').read().decode(ENCODING).split('\n', 1)
            if len(data) > 0:
                self.edit_title.setText(data[0].strip())
            if len(data) > 1:
                self.edit_desc.setPlainText(data[1].strip())

        self.modified = False
        self.edit_title.setFocus()

    def save(self):
        title = str(self.edit_title.text()).strip()
        desc = str(self.edit_desc.toPlainText()).strip()
        base, _ = os.path.splitext(self.files[self.current])
        txt = base + '.txt'
        if len(title) + len(desc) == 0:



( run in 0.718 second using v1.01-cache-2.11-cpan-817d5f8af8b )