Drag and drop now works. PEP-8 compliance a bit closer.

This commit is contained in:
Paul Chaplin 2010-02-02 18:48:55 +00:00
parent b5c2d73eec
commit 089e8beb4e
3 changed files with 144 additions and 110 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

After

Width:  |  Height:  |  Size: 542 B

Before After
Before After

View file

@ -2,139 +2,144 @@ import sys
from os import system from os import system
from PyQt4.QtCore import * from PyQt4.QtCore import *
from PyQt4.QtGui import * from PyQt4.QtGui import *
from hurry.filesize import * from hurry.filesize import *
from ui import Ui_trimage from ui import Ui_trimage
DEBUG = True
class StartQT4(QMainWindow): 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 = []
# connect signals with slots def __init__(self, parent=None):
QObject.connect(self.ui.addfiles, SIGNAL("clicked()"), self.file_dialog) QWidget.__init__(self, parent)
QObject.connect(self.ui.recompress, SIGNAL("clicked()"), self.recompress_files) self.ui = Ui_trimage()
QObject.connect(self.quit_shortcut, SIGNAL("activated()"), qApp, SLOT('quit()')) self.ui.setupUi(self)
QObject.connect(self.ui.processedfiles, SIGNAL("dragEnterEvent()"), self.file_drop) # todo use standardKey Quit.
self.quit_shortcut = QShortcut(QKeySequence("Ctrl+Q"), self)
# set recompress to false
self.ui.recompress.setEnabled(False)
self.imagelist = []
# 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()'))
QObject.connect(
self.ui.processedfiles, SIGNAL("dragEnterEvent()"), self.file_drop)
def file_drop(self): def file_drop(self):
print "booya" print "booya"
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): def enable_recompress(self):
fd = QFileDialog(self) self.ui.recompress.setEnabled(True)
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 recompress_files(self):
imagelistcopy = self.imagelist
self.imagelist = []
for image in imagelistcopy:
self.compress_file(image[-1])
def enable_recompress(self): def compress_file(self, filename):
self.ui.recompress.setEnabled(True) print 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)
def recompress_files(self): elif name.endsWith("png"):
imagelistcopy = self.imagelist #runstr = ('optipng -force -o7 "' + str(filename)
self.imagelist = [] #+ '"; advpng -z4 "' + str(filename) + '"') ## don't do advpng yet
for image in imagelistcopy: runstr = 'optipng -force -o7 "' + str(filename) + '"'
self.compress_file(image[-1]) runfile = system(runstr)
if runfile == 0:
newfile = QFile(filename)
newfilesize = newfile.size()
newfilesizestr = size(newfilesize, system=alternative)
def compress_file(self, filename): ratio = 100 - (float(newfilesize) / float(oldfilesize) * 100)
print filename ratiostr = "%.1f%%" % ratio
oldfile = QFileInfo(filename);
name = oldfile.fileName()
oldfilesize = oldfile.size()
oldfilesizestr = size(oldfilesize, system=alternative)
if name.endsWith("jpg"): self.imagelist.append(
runstr = 'jpegoptim --strip-all -f "' + str(filename) + '"' (name, oldfilesizestr, newfilesizestr, ratiostr, filename))
runfile = system(runstr) self.update_table()
elif name.endsWith("png"): else:
#runstr = 'optipng -force -o7 "' + str(filename) + '"; advpng -z4 "' + str(filename) + '"' ## don't do advpng yet print "uh. not good" #throw dialogbox error or something?
runstr = 'optipng -force -o7 "' + str(filename) + '"'
runfile = system(runstr)
if runfile == 0: def update_table(self):
newfile = QFile(filename) tview = self.ui.processedfiles
newfilesize = newfile.size()
newfilesizestr = size(newfilesize, system=alternative)
ratio = 100 - (float(newfilesize) / float(oldfilesize) * 100) # set table model
ratiostr = "%.1f%%" % ratio tmodel = tri_table_model(self, self.imagelist,
['Filename', 'Old Size', 'New Size', 'Compressed'])
tview.setModel(tmodel)
self.imagelist.append((name, oldfilesizestr, newfilesizestr, ratiostr, filename)) # set minimum size of table
self.update_table() vh = tview.verticalHeader()
vh.setVisible(False)
else: # set horizontal header properties
print "uh. not good" #throw dialogbox error or something? hh = tview.horizontalHeader()
hh.setStretchLastSection(True)
# set all row heights
def update_table(self): nrows = len(self.imagelist)
tview = self.ui.processedfiles for row in range(nrows):
tview.setRowHeight(row, 25)
# set table model tview.setColumnWidth(0, 300)
tmodel = tri_table_model(self, #tview.setDragDropMode(QAbstractItemView.DropOnly)
self.imagelist, #tview.setAcceptDrops(True)
['Filename', 'Old Size', 'New Size', 'Compressed']) self.enable_recompress()
tview.setModel(tmodel)
# 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()
class tri_table_model(QAbstractTableModel): class tri_table_model(QAbstractTableModel):
def __init__(self, parent, imagelist, header, *args):
""" def __init__(self, parent, imagelist, header, *args):
mydata is list of tuples """
header is list of strings mydata is list of tuples
tuple length has to match header length header is list of strings
""" tuple length has to match header length
QAbstractTableModel.__init__(self, parent, *args) """
self.imagelist = imagelist QAbstractTableModel.__init__(self, parent, *args)
self.header = header self.imagelist = imagelist
self.header = header
def rowCount(self, parent): def rowCount(self, parent):
return len(self.imagelist) return len(self.imagelist)
def columnCount(self, parent): def columnCount(self, parent):
return len(self.header) return len(self.header)
def data(self, index, role): def data(self, index, role):
if not index.isValid(): if not index.isValid():
return QVariant() return QVariant()
elif role != Qt.DisplayRole: elif role != Qt.DisplayRole:
return QVariant() return QVariant()
return QVariant(self.imagelist[index.row()][index.column()]) return QVariant(self.imagelist[index.row()][index.column()])
def headerData(self, col, orientation, role): def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole: if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return QVariant(self.header[col]) return QVariant(self.header[col])
return QVariant() return QVariant()
if __name__ == "__main__": if __name__ == "__main__":
@ -142,4 +147,3 @@ if __name__ == "__main__":
myapp = StartQT4() myapp = StartQT4()
myapp.show() myapp.show()
sys.exit(app.exec_()) sys.exit(app.exec_())

40
ui.py
View file

@ -8,6 +8,36 @@
# WARNING! All changes made in this file will be lost! # WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui 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): class Ui_trimage(object):
def setupUi(self, trimage): def setupUi(self, trimage):
@ -88,18 +118,18 @@ class Ui_trimage(object):
self.horizontalLayout.addWidget(self.recompress) self.horizontalLayout.addWidget(self.recompress)
self.verticalLayout_2.addLayout(self.horizontalLayout) self.verticalLayout_2.addLayout(self.horizontalLayout)
self.processedfiles = QtGui.QTableView(self.frame) self.processedfiles = TrimageTableView(self.frame)
self.processedfiles.setEnabled(True) self.processedfiles.setEnabled(True)
self.processedfiles.setAcceptDrops(True) # self.processedfiles.setAcceptDrops(True)
self.processedfiles.setDragDropMode(QtGui.QAbstractItemView.DropOnly) # self.processedfiles.setDragDropMode(QtGui.QAbstractItemView.DropOnly)
self.processedfiles.setFrameShape(QtGui.QFrame.NoFrame) self.processedfiles.setFrameShape(QtGui.QFrame.NoFrame)
self.processedfiles.setFrameShadow(QtGui.QFrame.Plain) self.processedfiles.setFrameShadow(QtGui.QFrame.Plain)
self.processedfiles.setLineWidth(0) self.processedfiles.setLineWidth(0)
self.processedfiles.setMidLineWidth(0) self.processedfiles.setMidLineWidth(0)
self.processedfiles.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.processedfiles.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.processedfiles.setTabKeyNavigation(True) self.processedfiles.setTabKeyNavigation(True)
self.processedfiles.setDragEnabled(False) # self.processedfiles.setDragEnabled(True)
self.processedfiles.setDragDropMode(QtGui.QAbstractItemView.DropOnly) # self.processedfiles.setDragDropMode(QtGui.QAbstractItemView.DropOnly)
self.processedfiles.setAlternatingRowColors(True) self.processedfiles.setAlternatingRowColors(True)
self.processedfiles.setTextElideMode(QtCore.Qt.ElideRight) self.processedfiles.setTextElideMode(QtCore.Qt.ElideRight)
self.processedfiles.setShowGrid(True) self.processedfiles.setShowGrid(True)