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 )