diff --git a/trimage.py b/trimage.py index 8b054df..2a75d61 100644 --- a/trimage.py +++ b/trimage.py @@ -3,174 +3,176 @@ from os import system from os import listdir from PyQt4.QtCore import * from PyQt4.QtGui import * - from hurry.filesize import * from optparse import OptionParser from ui import Ui_trimage +DEBUG = True + class StartQT4(QMainWindow): - def __init__(self, parent=None): - QWidget.__init__(self, parent) - self.ui = Ui_trimage() - self.ui.setupUi(self) - self.quit_shortcut = QShortcut(QKeySequence("Ctrl+Q"), self); # todo use standardKey Quit. - # set recompress to false - self.ui.recompress.setEnabled(False) - self.imagelist = [] - self.showapp = True + def __init__(self, parent=None): + QWidget.__init__(self, parent) + self.ui = Ui_trimage() + self.ui.setupUi(self) + self.quit_shortcut = QShortcut(QKeySequence("Ctrl+Q"), self); # todo use standardKey Quit. + # set recompress to false + self.ui.recompress.setEnabled(False) + self.imagelist = [] + self.showapp = True - # connect signals with slots - QObject.connect(self.ui.addfiles, SIGNAL("clicked()"), self.file_dialog) - QObject.connect(self.ui.recompress, SIGNAL("clicked()"), self.recompress_files) - QObject.connect(self.quit_shortcut, SIGNAL("activated()"), qApp, SLOT('quit()')) + # connect signals with slots + QObject.connect(self.ui.addfiles, SIGNAL("clicked()"), self.file_dialog) + QObject.connect(self.ui.recompress, SIGNAL("clicked()"), self.recompress_files) + QObject.connect(self.quit_shortcut, SIGNAL("activated()"), qApp, SLOT('quit()')) - parser = OptionParser(version="%prog 1.0", - description="GUI front-end to compress png and jpg images via optipng and jpegoptim") + parser = OptionParser(version="%prog 1.0", + description="GUI front-end to compress png and jpg images via optipng and jpegoptim") - parser.add_option("-f", "--file", - action="store", type="string", dest="filename", - help="image to compress") + parser.add_option("-f", "--file", + action="store", type="string", dest="filename", + help="image to compress") - parser.add_option("-d", "--directory", - action="store", type="string", dest="directory", - help="directory of images to compress") + parser.add_option("-d", "--directory", + action="store", type="string", dest="directory", + help="directory of images to compress") - (options, args) = parser.parse_args() + (options, args) = parser.parse_args() - if options.filename: - self.file_from_cmd(options.filename) + if options.filename: + self.file_from_cmd(options.filename) - if options.directory: - self.dir_from_cmd(options.directory) + if options.directory: + self.dir_from_cmd(options.directory) - def dir_from_cmd(self, directory): - self.showapp = False - imagedir = listdir(directory) - for image in imagedir: - image = directory + "/" + image - name = QFileInfo(image).fileName() - if self.checkname(name): - self.compress_file(image) + def dir_from_cmd(self, directory): + self.showapp = False + imagedir = listdir(directory) + for image in imagedir: + image = directory + "/" + image + name = QFileInfo(image).fileName() + if self.checkname(name): + self.compress_file(image) - def file_from_cmd(self, image): - self.showapp = False - if self.checkname(name): - self.compress_file(image) + def file_from_cmd(self, image): + self.showapp = False + if self.checkname(name): + self.compress_file(image) - def file_drop(self): - print "booya" + def file_drop(self): + print "booya" - def checkname(self, filename): - if filename.endsWith("png") or filename.endsWith("jpg"): - return True + def checkname(self, filename): + if filename.endsWith("png") or filename.endsWith("jpg"): + return True - def file_dialog(self): - fd = QFileDialog(self) - images = fd.getOpenFileNames(self, - "Select one or more image files to compress", - "", # directory - "Image files (*.png *.jpg)") - for image in images: - self.compress_file(image) + def file_dialog(self): + fd = QFileDialog(self) + images = fd.getOpenFileNames(self, + "Select one or more image files to compress", + "", # directory + "Image files (*.png *.jpg)") + for image in images: + self.compress_file(image) - def enable_recompress(self): - self.ui.recompress.setEnabled(True) + def enable_recompress(self): + self.ui.recompress.setEnabled(True) - def recompress_files(self): - imagelistcopy = self.imagelist - self.imagelist = [] - for image in imagelistcopy: - self.compress_file(image[-1]) + def recompress_files(self): + imagelistcopy = self.imagelist + self.imagelist = [] + for image in imagelistcopy: + self.compress_file(image[-1]) + def compress_file(self, filename): + print filename + oldfile = QFileInfo(filename) + name = oldfile.fileName() + oldfilesize = oldfile.size() + oldfilesizestr = size(oldfilesize, system=alternative) - def compress_file(self, filename): - oldfile = QFileInfo(filename) - name = oldfile.fileName() - oldfilesize = oldfile.size() - oldfilesizestr = size(oldfilesize, system=alternative) + if name.endsWith("jpg"): + runstr = 'jpegoptim --strip-all -f "' + str(filename) + '"' + runfile = system(runstr) - if name.endsWith("jpg"): - runstr = 'jpegoptim --strip-all -f "' + str(filename) + '"' - runfile = system(runstr) + elif name.endsWith("png"): + #runstr = ('optipng -force -o7 "' + str(filename) + #+ '"; advpng -z4 "' + str(filename) + '"') ## don't do advpng yet + runstr = 'optipng -force -o7 "' + str(filename) + '"' + runfile = system(runstr) - elif name.endsWith("png"): - #runstr = 'optipng -force -o7 "' + str(filename) + '"; advpng -z4 "' + str(filename) + '"' ## don't do advpng yet - runstr = 'optipng -force -o7 "' + str(filename) + '"' - runfile = system(runstr) + if runfile == 0: + newfile = QFile(filename) + newfilesize = newfile.size() + newfilesizestr = size(newfilesize, system=alternative) - if runfile == 0: - newfile = QFile(filename) - newfilesize = newfile.size() - newfilesizestr = size(newfilesize, system=alternative) + ratio = 100 - (float(newfilesize) / float(oldfilesize) * 100) + ratiostr = "%.1f%%" % ratio - ratio = 100 - (float(newfilesize) / float(oldfilesize) * 100) - ratiostr = "%.1f%%" % ratio + self.imagelist.append( + (name, oldfilesizestr, newfilesizestr, ratiostr, filename)) + self.update_table() - self.imagelist.append((name, oldfilesizestr, newfilesizestr, ratiostr, filename)) - self.update_table() + else: + print "uh. not good" #throw dialogbox error or something? - else: - print "uh. not good" #throw dialogbox error or something? + def update_table(self): + tview = self.ui.processedfiles + # set table model + tmodel = tri_table_model(self, self.imagelist, + ['Filename', 'Old Size', 'New Size', 'Compressed']) + tview.setModel(tmodel) - def update_table(self): - tview = self.ui.processedfiles + # set minimum size of table + vh = tview.verticalHeader() + vh.setVisible(False) - # set table model - tmodel = tri_table_model(self, - self.imagelist, - ['Filename', 'Old Size', 'New Size', 'Compressed']) - tview.setModel(tmodel) + # set horizontal header properties + hh = tview.horizontalHeader() + hh.setStretchLastSection(True) - # set minimum size of table - vh = tview.verticalHeader() - vh.setVisible(False) - - # set horizontal header properties - hh = tview.horizontalHeader() - hh.setStretchLastSection(True) - - # set all row heights - nrows = len(self.imagelist) - for row in range(nrows): - tview.setRowHeight(row, 25) - tview.setColumnWidth(0,300) - tview.setDragDropMode(QAbstractItemView.DropOnly) - tview.setAcceptDrops(True) - self.enable_recompress() + # set all row heights + nrows = len(self.imagelist) + for row in range(nrows): + tview.setRowHeight(row, 25) + tview.setColumnWidth(0, 300) + #tview.setDragDropMode(QAbstractItemView.DropOnly) + #tview.setAcceptDrops(True) + self.enable_recompress() class tri_table_model(QAbstractTableModel): - def __init__(self, parent, imagelist, header, *args): - """ - mydata is list of tuples - header is list of strings - tuple length has to match header length - """ - QAbstractTableModel.__init__(self, parent, *args) - self.imagelist = imagelist - self.header = header - def rowCount(self, parent): - return len(self.imagelist) + def __init__(self, parent, imagelist, header, *args): + """ + mydata is list of tuples + header is list of strings + tuple length has to match header length + """ + QAbstractTableModel.__init__(self, parent, *args) + self.imagelist = imagelist + self.header = header - def columnCount(self, parent): - return len(self.header) + def rowCount(self, parent): + return len(self.imagelist) - def data(self, index, role): - if not index.isValid(): - return QVariant() - elif role != Qt.DisplayRole: - return QVariant() - return QVariant(self.imagelist[index.row()][index.column()]) + def columnCount(self, parent): + return len(self.header) - def headerData(self, col, orientation, role): - if orientation == Qt.Horizontal and role == Qt.DisplayRole: - return QVariant(self.header[col]) - return QVariant() + def data(self, index, role): + if not index.isValid(): + return QVariant() + elif role != Qt.DisplayRole: + return QVariant() + return QVariant(self.imagelist[index.row()][index.column()]) + + def headerData(self, col, orientation, role): + if orientation == Qt.Horizontal and role == Qt.DisplayRole: + return QVariant(self.header[col]) + return QVariant() if __name__ == "__main__": diff --git a/ui.py b/ui.py index 198ab61..f084113 100644 --- a/ui.py +++ b/ui.py @@ -8,6 +8,36 @@ # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui +from PyQt4.QtCore import QUrl, QString +import trimage + + +class TrimageTableView(QtGui.QTableView): + def __init__(self, parent=None): + super(TrimageTableView, self).__init__(parent) + self.setAcceptDrops(True) + + def dragEnterEvent(self, event): + if event.mimeData().hasFormat("text/uri-list"): + if trimage.DEBUG: + print("Accepting event: %s" % list(event.mimeData().formats())) + event.accept() + else: + if trimage.DEBUG: + print("Rejecting event: %s" % list(event.mimeData().formats())) + event.ignore() + + def dragMoveEvent(self, event): + event.accept() + + def dropEvent(self, event): + files = str(event.mimeData().data("text/uri-list")).strip().split() + for i, file in enumerate(files): + files[i] = QUrl(QString(file)).toLocalFile() + if trimage.DEBUG: + for file in files: + print("Drop received: %s" % file) + class Ui_trimage(object): def setupUi(self, trimage): @@ -88,18 +118,18 @@ class Ui_trimage(object): self.horizontalLayout.addWidget(self.recompress) self.verticalLayout_2.addLayout(self.horizontalLayout) - self.processedfiles = QtGui.QTableView(self.frame) + self.processedfiles = TrimageTableView(self.frame) self.processedfiles.setEnabled(True) - self.processedfiles.setAcceptDrops(True) - self.processedfiles.setDragDropMode(QtGui.QAbstractItemView.DropOnly) +# self.processedfiles.setAcceptDrops(True) +# self.processedfiles.setDragDropMode(QtGui.QAbstractItemView.DropOnly) self.processedfiles.setFrameShape(QtGui.QFrame.NoFrame) self.processedfiles.setFrameShadow(QtGui.QFrame.Plain) self.processedfiles.setLineWidth(0) self.processedfiles.setMidLineWidth(0) self.processedfiles.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.processedfiles.setTabKeyNavigation(True) - self.processedfiles.setDragEnabled(False) - self.processedfiles.setDragDropMode(QtGui.QAbstractItemView.DropOnly) +# self.processedfiles.setDragEnabled(True) +# self.processedfiles.setDragDropMode(QtGui.QAbstractItemView.DropOnly) self.processedfiles.setAlternatingRowColors(True) self.processedfiles.setTextElideMode(QtCore.Qt.ElideRight) self.processedfiles.setShowGrid(True)