class ThumbnailVideoView(QWidget, Script): IconSize = 256 Frames = 10 def __init__(self): Script.__init__(self, "thumbnailvideo") self.icon = None self.vfs = vfs.vfs() def start(self, args): try: self.preview = args["preview"].value() except IndexError: self.preview = False try: self.node = args["file"].value() except KeyError: pass def g_display(self): QWidget.__init__(self) self.copyMenu = CopyMenu(self) self.copySelectionMenu = CopySelectionMenu(self) self.rubberBand = None self.hlayout = QVBoxLayout() self.setLayout(self.hlayout) self.menuLayout = QHBoxLayout() self.hlayout.addLayout(self.menuLayout) self.frameLayout = QFormLayout() self.menuLayout.addLayout(self.frameLayout) self.frameNumberEdit = QLineEdit(str(self.Frames)) self.frameNumberEdit.setFixedWidth(40) self.frameNumberEdit.setValidator(QIntValidator(0, 256)) self.frameLayout.addRow("Number of frame: ", self.frameNumberEdit) self.connect(self.frameNumberEdit, SIGNAL("textChanged(QString)"), self.setFrameNumber) self.iconLayout = QFormLayout() self.menuLayout.addLayout(self.iconLayout) self.iconSizeEdit = QLineEdit(str(self.IconSize)) self.iconSizeEdit.setFixedWidth(40) self.iconSizeEdit.setValidator(QIntValidator(0, 512)) self.iconLayout.addRow("Size: ", self.iconSizeEdit) self.connect(self.iconSizeEdit, SIGNAL("textChanged(QString)"), self.setIconSize) self.refreshButton = QPushButton("Refresh") self.menuLayout.addWidget(self.refreshButton) self.connect(self.refreshButton, SIGNAL("clicked()"), self.generateThumbnail) self.scrollArea = QScrollArea() self.hlayout.addWidget(self.scrollArea) self.generateThumbnail() def mousePressEvent(self, event): self.dragPosition = event.pos() if not self.rubberBand: self.rubberBand = QRubberBand(QRubberBand.Rectangle, self) self.rubberBand.setGeometry(QRect(self.dragPosition, QSize())) self.rubberBand.show() def mouseMoveEvent(self, event): self.rubberBand.setGeometry( QRect(self.dragPosition, event.pos()).normalized()) def mouseReleaseEvent(self, event): if not self.rubberBand.size().isEmpty(): rect = QRect(self.rubberBand.pos(), self.rubberBand.size()) rect.moveLeft(rect.left() - (self.width() - self.thumbLabel.pixmap().width()) / 2.0) rect.moveTop(rect.top() - (self.height() - self.thumbLabel.pixmap().height()) / 2.0) self.currentSelection = rect self.copySelectionMenu.popup(QCursor.pos()) else: self.copyMenu.popup(QCursor.pos()) self.rubberBand.hide() def copySelectionToClipboard(self): QApplication.clipboard().setPixmap(self.thumbLabel.pixmap().copy( self.currentSelection)) def copyPixmapToClipboard(self): QApplication.clipboard().setPixmap(self.thumbLabel.pixmap()) def setIconSize(self, size): ThumbnailVideoView.IconSize = int(size) def setFrameNumber(self, number): ThumbnailVideoView.Frames = int(number) def generateThumbnail(self): self.thumbnailer = Thumbnailer() self.connect(self.thumbnailer, SIGNAL("ThumbnailUpdate"), self.updateThumbnail) pixmap = self.thumbnailer.generate(self.node, iconSize=self.IconSize, frames=self.Frames) if pixmap: self.updateThumbnail(self.node, pixmap) def updateThumbnail(self, node, pixmap): if pixmap: self.thumbLabel = QLabel() self.thumbLabel.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.thumbLabel.setWordWrap(True) self.thumbLabel.setPixmap(pixmap) self.scrollArea.setWidget(self.thumbLabel) else: self.thumbLabel.setText("Can't render, video is corrupted.") self.thumbLabel.setAlignment(Qt.AlignCenter) self.thumbnailer.unregister() def updateWidget(self): pass
class PDFLabel(QLabel): def __init__(self, parent=None): QLabel.__init__(self, parent) self.currentPage = -1 self.doc = None self.rubberBand = None self.scaleFactor = 1.0 self.setAlignment(Qt.AlignCenter) self.dragPosition = QPoint() self.searchLocation = QRectF() self.copyMenu = CopyMenu(self) self.copySelectionMenu = CopySelectionMenu(self) def document(self): return self.doc def matrix(self): return QMatrix(self.scaleFactor * self.physicalDpiX() / 72.0, 0, 0, self.scaleFactor * self.physicalDpiY() / 72.0, 0, 0) def mousePressEvent(self, event): if not self.doc: return self.dragPosition = event.pos() if not self.rubberBand: self.rubberBand = QRubberBand(QRubberBand.Rectangle, self) self.rubberBand.setGeometry(QRect(self.dragPosition, QSize())) self.rubberBand.show() def mouseMoveEvent(self, event): if not self.doc: return self.rubberBand.setGeometry( QRect(self.dragPosition, event.pos()).normalized()) def mouseReleaseEvent(self, event): if not self.doc: return if not self.rubberBand.size().isEmpty(): rect = QRect(self.rubberBand.pos(), self.rubberBand.size()) rect.moveLeft(rect.left() - (self.width() - self.pixmap().width()) / 2.0) rect.moveTop(rect.top() - (self.height() - self.pixmap().height()) / 2.0) self.currentSelection = rect self.copySelectionMenu.popup(QCursor.pos()) #self.selectedText(rect) else: self.copyMenu.popup(QCursor.pos()) self.rubberBand.hide() def scale(self): return self.scaleFactor def showPage(self, page=-1): if (page != -1 and page != self.currentPage + 1): self.currentPage = page - 1 self.emit(SIGNAL("pageChanged"), page) image = self.doc.page(self.currentPage).renderToImage( self.scaleFactor * self.physicalDpiX(), self.scaleFactor * self.physicalDpiY()) if not self.searchLocation.isEmpty(): highlightRect = self.matrix().mapRect(self.searchLocation).toRect() highlightRect.adjust(-2, -2, 2, 2) highlight = image.copy(highlightRect) painter = QPainter() painter.begin(image) painter.fillRect(image.rect(), QColor(0, 0, 0, 128)) painter.drawImage(highlightRect, highlight) painter.end() self.setPixmap(QPixmap.fromImage(image)) def searchBackwards(self, text): oldLocation = self.searchLocation page = self.currentPage if oldLocation.isNull(): page -= 1 while page > -1: locations = [] self.searchLocation = QRectF() while self.doc.page(page).search(text, self.searchLocation, Poppler.Page.NextResult, Poppler.Page.CaseInsensitive): if self.searchLocation != oldLocation: locations.append(self.searchLocation) else: break try: index = locations.index(oldLocation) except: index = -1 if index == -1 and len(locations): self.searchLocation = locations[-1] self.showPage(page + 1) return self.searchLocation if index > 0: self.searchLocation = locations[index - 1] self.showPage(page + 1) return self.searchLocation oldLocation = QRectF() page -= 1 if self.currentPage == self.doc.numPages() - 1: return QRectF() oldLocation = QRectF() page = self.doc.numPages() - 1 while page > self.currentPage: locations = [] self.searchLocation = QRectF() while self.doc.page(page).search(text, self.searchLocation, Poppler.Page.NextResult, Poppler.Page.CaseInsensitive): locations.append(self.searchLocation) if len(locations): self.searchLocation = locations[-1] self.showPage(page + 1) return self.searchLocation page -= 1 return QRectF() def searchForwards(self, text): page = self.currentPage while page < self.doc.numPages(): if self.doc.page(page).search(text, self.searchLocation, Poppler.Page.NextResult, Poppler.Page.CaseInsensitive): if not self.searchLocation.isNull(): self.showPage(page + 1) return self.searchLocation page += 1 self.searchLocation = QRectF() page = 0 while page < self.currentPage: self.searchLocation = QRectF() if self.doc.page(page).search(text, self.searchLocation, Poppler.Page.NextResult, Poppler.Page.CaseInsensitive): if not self.searchLocation.isNull(): self.showPage(page + 1) return self.searchLocation page += 1 return QRectF() def copyTextToClipboard(self): selectedRect = self.matrix().inverted()[0].mapRect( self.currentSelection) r = ( selectedRect.x(), selectedRect.y(), selectedRect.width(), selectedRect.height(), ) text = self.doc.page(self.currentPage).text(QRectF(*r)) #Remove space #hadSpace = False #center = QPointF() #text = QString() #for box in self.doc.page(self.currentPage).textList(): #bounding = box.boundingBox() #r = (bounding.x(), bounding.y(), bounding.width(), bounding.height(),) #if selectedRect.intersects(QRect(*r)): #if hadSpace: #text += " " #if not text.isEmpty() and box.boundingBox().top() > center.y(): #text += "\n"; #text += box.text(); #hadSpace = box.hasSpaceAfter(); #center = box.boundingBox().center(); if not text.isEmpty(): QApplication.clipboard().setText(text, QClipboard.Clipboard) QApplication.clipboard().setText(text, QClipboard.Selection) def copySelectionToClipboard(self): #pixmap = self.currentSelection QApplication.clipboard().setPixmap(self.pixmap().copy( self.currentSelection)) def copyPixmapToClipboard(self): QApplication.clipboard().setPixmap(self.pixmap()) def setDocument(self, data): self.doc = Poppler.Document.loadFromData(data) if self.doc: #self.setVisible #change default behavior not visible if no document is set self.doc.setRenderHint(Poppler.Document.Antialiasing) self.doc.setRenderHint(Poppler.Document.TextAntialiasing) self.searchLocation = QRectF() self.currentPage = -1 self.setPage(1) return True return False def setError(self, errorMessage): self.setText(errorMessage) def setPage(self, page=-1): if page != self.currentPage + 1: self.searchLocation = QRectF() self.showPage(page) def setScale(self, scale): if self.scaleFactor != scale: self.scaleFactor = scale self.showPage()
class LoadedImage(QLabel): def __init__(self, parent): QLabel.__init__(self) self.parent = parent self.copyMenu = CopyMenu(self) self.copySelectionMenu = CopySelectionMenu(self) self.baseImage = QImage() self.matrix = QMatrix() self.zoomer = 1 self.maxsize = 1024 * 10 * 10 * 10 * 25 self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.setAlignment(Qt.AlignCenter) self.rubberBand = None def setParent(self, parent): self.parent = parent def load(self, node): self.matrix.reset() self.zoomer = 1 if node.size() < self.maxsize: self.node = node file = self.node.open() buff = file.read() file.close() if self.baseImage.loadFromData(buff): self.emit(SIGNAL("available(bool)"), True) else: self.baseImage.load(":file_broken.png") self.emit(SIGNAL("available(bool)"), False) else: self.baseImage.loadFromData("") self.emit(SIGNAL("available(bool)"), False) self.adjust() def adjust(self): if self.zoomer == 1: if self.baseImage.width() < self.parent.width() - 10: self.curWidth = self.baseImage.width() else: self.curWidth = self.parent.width() - 10 if self.baseImage.height() < self.parent.height() - 10: self.curHeight = self.baseImage.height() else: self.curHeight = self.parent.height() - 10 self.updateTransforms() def updateTransforms(self): if not self.baseImage.isNull(): self.currentImage = self.baseImage.transformed(self.matrix).scaled( QSize(self.curWidth, self.curHeight), Qt.KeepAspectRatio, Qt.FastTransformation) self.setPixmap(QPixmap.fromImage(self.currentImage)) else: self.clear() self.setText("File is too big to be processed") self.adjustSize() def rotateLeft(self): self.matrix.rotate(-90) self.updateTransforms() def rotateRight(self): self.matrix.rotate(90) self.updateTransforms() def enlarge(self): self.zoomer *= 1.25 self.curWidth *= 1.25 self.curHeight *= 1.25 self.updateTransforms() def shrink(self): self.zoomer *= 0.8 self.curWidth *= 0.8 self.curHeight *= 0.8 self.updateTransforms() def fit(self): self.zoomer = 1 self.adjust() def normal(self): self.curWidth = self.baseImage.width() self.curHeight = self.baseImage.height() self.updateTransforms() def mousePressEvent(self, event): self.dragPosition = event.pos() if not self.rubberBand: self.rubberBand = QRubberBand(QRubberBand.Rectangle, self) self.rubberBand.setGeometry(QRect(self.dragPosition, QSize())) self.rubberBand.show() def mouseMoveEvent(self, event): self.rubberBand.setGeometry( QRect(self.dragPosition, event.pos()).normalized()) def mouseReleaseEvent(self, event): if not self.rubberBand.size().isEmpty(): rect = QRect(self.rubberBand.pos(), self.rubberBand.size()) rect.moveLeft(rect.left() - (self.width() - self.pixmap().width()) / 2.0) rect.moveTop(rect.top() - (self.height() - self.pixmap().height()) / 2.0) self.currentSelection = rect self.copySelectionMenu.popup(QCursor.pos()) else: self.copyMenu.popup(QCursor.pos()) self.rubberBand.hide() def copySelectionToClipboard(self): QApplication.clipboard().setPixmap(self.pixmap().copy( self.currentSelection)) def copyPixmapToClipboard(self): QApplication.clipboard().setPixmap(self.pixmap())