From a2836dba1d1853a3cbed89634cc5d0e4cfa22b64 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 5 Jun 2007 18:48:46 +0000 Subject: [PATCH] Initial import of new GUI. Nowhere near functional --- src/libprs500/ebooks/lrf/html/convert_from.py | 2 - src/libprs500/gui2/Makefile | 8 + src/libprs500/gui2/images.qrc | 16 + src/libprs500/gui2/images/addfile.png | Bin 0 -> 8850 bytes src/libprs500/gui2/images/cherubs.jpg | Bin 0 -> 19373 bytes src/libprs500/gui2/images/clear.png | Bin 0 -> 5840 bytes src/libprs500/gui2/images/delfile.png | Bin 0 -> 11149 bytes src/libprs500/gui2/images/edit.png | Bin 0 -> 2517 bytes src/libprs500/gui2/images/fileopen.png | Bin 0 -> 4256 bytes src/libprs500/gui2/images/library.png | Bin 0 -> 31560 bytes .../gui2/images/memory_stick_unmount.png | Bin 0 -> 7715 bytes src/libprs500/gui2/images/minus.png | Bin 0 -> 10115 bytes src/libprs500/gui2/images/plus.png | Bin 0 -> 7408 bytes src/libprs500/gui2/images/reader.png | Bin 0 -> 1505 bytes src/libprs500/gui2/images/upload.png | Bin 0 -> 10502 bytes src/libprs500/gui2/main.py | 86 ++ src/libprs500/gui2/main.ui | 405 ++++++++ src/libprs500/gui2/main_ui.py | 196 ++++ src/libprs500/gui2/widgets.py | 863 ++++++++++++++++++ 19 files changed, 1574 insertions(+), 2 deletions(-) create mode 100644 src/libprs500/gui2/Makefile create mode 100644 src/libprs500/gui2/images.qrc create mode 100644 src/libprs500/gui2/images/addfile.png create mode 100644 src/libprs500/gui2/images/cherubs.jpg create mode 100644 src/libprs500/gui2/images/clear.png create mode 100644 src/libprs500/gui2/images/delfile.png create mode 100644 src/libprs500/gui2/images/edit.png create mode 100644 src/libprs500/gui2/images/fileopen.png create mode 100644 src/libprs500/gui2/images/library.png create mode 100644 src/libprs500/gui2/images/memory_stick_unmount.png create mode 100644 src/libprs500/gui2/images/minus.png create mode 100644 src/libprs500/gui2/images/plus.png create mode 100644 src/libprs500/gui2/images/reader.png create mode 100644 src/libprs500/gui2/images/upload.png create mode 100644 src/libprs500/gui2/main.py create mode 100644 src/libprs500/gui2/main.ui create mode 100644 src/libprs500/gui2/main_ui.py create mode 100644 src/libprs500/gui2/widgets.py diff --git a/src/libprs500/ebooks/lrf/html/convert_from.py b/src/libprs500/ebooks/lrf/html/convert_from.py index e3af458e72..df5ca537a5 100644 --- a/src/libprs500/ebooks/lrf/html/convert_from.py +++ b/src/libprs500/ebooks/lrf/html/convert_from.py @@ -233,8 +233,6 @@ class HTMLConverter(object): (re.compile(r'page-break-before:\s*\w+([\s;\}])'), lambda match: match.group(1)) ] - - class Link(object): def __init__(self, para, tag): self.para = para diff --git a/src/libprs500/gui2/Makefile b/src/libprs500/gui2/Makefile new file mode 100644 index 0000000000..391673edf1 --- /dev/null +++ b/src/libprs500/gui2/Makefile @@ -0,0 +1,8 @@ +main_ui.py : main.ui + pyuic4 main.ui | sed -s s/^.*Margin.*// | sed -e s/^.*boxlayout\.setObjectName.*// > main_ui.py + +images_rc.py : images.qrc + pyrcc4 images.qrc > images_rc.py + +clean : + rm main_ui.py images_rc.py diff --git a/src/libprs500/gui2/images.qrc b/src/libprs500/gui2/images.qrc new file mode 100644 index 0000000000..8f70ed6682 --- /dev/null +++ b/src/libprs500/gui2/images.qrc @@ -0,0 +1,16 @@ + + + images/addfile.png + images/cherubs.jpg + images/clear.png + images/delfile.png + images/edit.png + images/fileopen.png + images/library.png + images/memory_stick_unmount.png + images/minus.png + images/plus.png + images/upload.png + images/reader.png + + diff --git a/src/libprs500/gui2/images/addfile.png b/src/libprs500/gui2/images/addfile.png new file mode 100644 index 0000000000000000000000000000000000000000..c89f43c6acd7e9751db0069d726e8d93526e2e5c GIT binary patch literal 8850 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¬x4t>CVkOuHPo5GGs<7HoCqIKVa}K{0xn; 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 UrYK#6v;Y7A07*qoM6N<$f`M=e-T(jq literal 0 HcmV?d00001 diff --git a/src/libprs500/gui2/images/cherubs.jpg b/src/libprs500/gui2/images/cherubs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9147589ba65ac986a40f66d1be7cd070a9eccbae GIT binary patch literal 19373 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%0AlNsQA!23Rqv8qBRZ1Hprqz!H_2jejgGV*HJjHb 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 literal 0 HcmV?d00001 diff --git a/src/libprs500/gui2/images/delfile.png b/src/libprs500/gui2/images/delfile.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2218617ec0ecf16a73b8f342d043e21502a20a GIT binary patch literal 11149 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 DVx7dW literal 0 HcmV?d00001 diff --git a/src/libprs500/gui2/images/fileopen.png b/src/libprs500/gui2/images/fileopen.png new file mode 100644 index 0000000000000000000000000000000000000000..3f5b36c1eb4dd7c4f653e85570147e5e071a401d GIT binary patch literal 4256 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 LNkvXXu0mjfxah}a literal 0 HcmV?d00001 diff --git a/src/libprs500/gui2/images/memory_stick_unmount.png b/src/libprs500/gui2/images/memory_stick_unmount.png new file mode 100644 index 0000000000000000000000000000000000000000..f22c757dc875a3d34321aec4dbab5f4161e21616 GIT binary patch literal 7715 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 literal 0 HcmV?d00001 diff --git a/src/libprs500/gui2/images/minus.png b/src/libprs500/gui2/images/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..0f68cb7580b1878b5081970b3937d980c926d6dc GIT binary patch literal 10115 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 imuX#t2;*~H;Qs-DvPz1E)Btw?0000ypL z4@&PV|C={$-(=7rD-Zw_wO*Bto8HeVIEVwz7VCw3hI--&fIP5no~O(nq0pWPPn1VU zK%3`H05}k7ZD|MLbnpiHhg05U&P>l|XVcqSIm1KaSFe~d7}dP4K3&~wz8J!5A_*51 zPa;uTn%j|%Phz4I8XH>3@3PD-+!GSW^K*+YUy`yiaza8A`ucA`cy}i938=Jj7{Z*B9-^Zt% z9nndNZ>{0TudTf`wQPUv)6~>F7ONTSA4SbCrBX|7-?G`>-jS?IFqp^42W}&yv;X-6|K$Szpu zlrr!_XsQ$)YZd7bC6e+oym8UM%TW6WLCzd-#QEjf=p2tbjq)Ea(<&qPCY>O?sF4m& z4m&w1im1EvjN9R~DPes8-` z7Q8znbVS(9U>rM8b)#j&(dZF5Vkf=TJIkfby1#c(zm|Go*Q0?y`mxmmeF3HRKZ1N ze?Oqvo`knjUXf93M!7+sSBB5Bisd-j(T9(MDezqOnGgCO6vUyzvluU!4^tWmGL}<0 zn`{^s!Y{X}VdrUhvySP0Ic*05E(d%+@DR>Dtgp-pOjg!t8uXD-ObXdn?vB~yA=!E7 z7(D=N^7+%&@oN>i+N?-l8=!#nWn34k+eFWRt+JYF(;QK7M6e6U=FKG;F%G@g8iQ%L~ zBTAL>>`#fd%lWO9--cQs4C9J-PF5C)%}&2$Y%wPd_)X!edmRPyeV^bjGAodQ!<2Z_ zKH>DoQ_)&FN+c7WxSMHND)nfdqDe8r(5>qsp!!u;CvoTkSBeO;+{iQ0nZoxFzM5-Y zT)3uM$Q|AkfO9BMw_r4`kBFXxOx*oh|DHOiQ@u0017U0UQss57u?2hQt1<&}pYvBG zs>wyz&MKnbC;Yc08qJ)lui0G|F4xIqWSQQmVFXEbI6u>jrWQEPRKX&=peCMEGvA{g gS>`g|z9(k@)IkHfy02H~?_VA;gTTOrCay341>Trj<^TWy literal 0 HcmV?d00001 diff --git a/src/libprs500/gui2/images/upload.png b/src/libprs500/gui2/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..29b95d17cba04ccaad43d4e05b3f197ea0aeaf78 GIT binary patch literal 10502 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 literal 0 HcmV?d00001 diff --git a/src/libprs500/gui2/main.py b/src/libprs500/gui2/main.py new file mode 100644 index 0000000000..a4d40b115d --- /dev/null +++ b/src/libprs500/gui2/main.py @@ -0,0 +1,86 @@ +## Copyright (C) 2007 Kovid Goyal kovid@kovidgoyal.net +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License along +## with this program; if not, write to the Free Software Foundation, Inc., +## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.Warning +import os, tempfile, sys + +from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, \ + QSettings, QVariant, QSize, QEventLoop, QString, \ + QBuffer, QIODevice, QModelIndex +from PyQt4.QtGui import QPixmap, QErrorMessage, QLineEdit, \ + QMessageBox, QFileDialog, QIcon, QDialog, QInputDialog +from PyQt4.Qt import qDebug, qFatal, qWarning, qCritical + +from libprs500.gui2 import APP_TITLE, installErrorHandler +from libprs500.gui2.main_ui import Ui_MainWindow + +class Main(QObject, Ui_MainWindow): + + def __init__(self, window): + QObject.__init__(self) + Ui_MainWindow.__init__(self) + self.window = window + self.setupUi(window) + self.read_settings() + + ####################### Setup books view ######################## + self.library_view.set_database(self.database_path) + self.library_view.connect_to_search_box(self.search) + + window.closeEvent = self.close_event + window.show() + self.library_view.migrate_database() + self.library_view.sortByColumn(3, Qt.DescendingOrder) + self.library_view.resizeColumnsToContents() + self.library_view.resizeRowsToContents() + self.search.setFocus(Qt.OtherFocusReason) + + def read_settings(self): + settings = QSettings() + settings.beginGroup("MainWindow") + self.window.resize(settings.value("size", QVariant(QSize(1000, 700))).\ + toSize()) + settings.endGroup() + self.database_path = settings.value("database path", QVariant(os.path\ + .expanduser("~/library1.db"))).toString() + + def write_settings(self): + settings = QSettings() + settings.beginGroup("MainWindow") + settings.setValue("size", QVariant(self.window.size())) + settings.endGroup() + + def close_event(self, e): + self.write_settings() + e.accept() + +def main(): + lock = os.path.join(tempfile.gettempdir(),"libprs500_gui_lock") + if os.access(lock, os.F_OK): + print >>sys.stderr, "Another instance of", APP_TITLE, "is running" + print >>sys.stderr, "If you are sure this is not the case then "+\ + "manually delete the file", lock + sys.exit(1) + from PyQt4.Qt import QApplication, QMainWindow + app = QApplication(sys.argv) + window = QMainWindow() + window.setWindowTitle(APP_TITLE) + #window.setWindowIcon(QIcon(":/icon")) + installErrorHandler(QErrorMessage(window)) + QCoreApplication.setOrganizationName("KovidsBrain") + QCoreApplication.setApplicationName(APP_TITLE) + Main(window) + return app.exec_() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/src/libprs500/gui2/main.ui b/src/libprs500/gui2/main.ui new file mode 100644 index 0000000000..631ee38401 --- /dev/null +++ b/src/libprs500/gui2/main.ui @@ -0,0 +1,405 @@ + + Kovid Goyal + MainWindow + + + + 0 + 0 + 728 + 822 + + + + + 0 + 0 + + + + + + + + + + + + 6 + + + 9 + + + 9 + + + 9 + + + 9 + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 10000 + 90 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::DragDrop + + + QListView::TopToBottom + + + 20 + + + QListView::IconMode + + + + + + + + 0 + 0 + + + + + 16777215 + 90 + + + + For help visit <a href="https://libprs500.kovidgoyal.net/wiki/GuiUsage">http://libprs500.kovidgoyal.net</a><br><br><b>libprs500</b>: %1 by <b>Kovid Goyal</b> &copy; 2006<br>%2 %3 %4 + + + Qt::RichText + + + true + + + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + &Search: + + + search + + + + + + + true + + + false + + + Search the list of books by title or author<br><br>Words separated by spaces are ANDed + + + Search the list of books by title, author, publisher, tags and comments<br><br>Words separated by spaces are ANDed + + + false + + + + + + false + + + + + + + Reset Quick Search + + + ... + + + :/images/clear.png + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + 6 + + + + + + 0 + 10 + + + + true + + + true + + + false + + + QAbstractItemView::DragDrop + + + true + + + QAbstractItemView::SelectRows + + + false + + + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 60 + 80 + + + + true + + + + + + true + + + + + + + <table><tr><td><b>Title: </b>%1</td><td><b>&nbsp;Size:</b> %2</td></tr><tr><td><b>Author: </b>%3</td><td><b>&nbsp;Type: </b>%4</td></tr></table> + + + Qt::RichText + + + + + + + + + + + 0 + 0 + + + + false + + + Qt::Horizontal + + + + 64 + 64 + + + + Qt::ToolButtonTextUnderIcon + + + TopToolBarArea + + + false + + + + + + + + :/images/addfile.png + + + Add books to Library + + + A + + + false + + + + + :/images/delfile.png + + + Delete books + + + Del + + + + + :/images/edit.png + + + Edit meta-information + + + E + + + false + + + + + + CoverDisplay + QLabel +
widgets.h
+
+ + DeviceView + QListView +
widgets.h
+
+ + BooksView + QTableView +
library.h
+
+ + SearchBox + QLineEdit +
library.h
+
+
+ + + + + + clear_button + clicked() + search + clear() + + + 853 + 61 + + + 784 + 58 + + + + +
diff --git a/src/libprs500/gui2/main_ui.py b/src/libprs500/gui2/main_ui.py new file mode 100644 index 0000000000..14c98d18d0 --- /dev/null +++ b/src/libprs500/gui2/main_ui.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'main.ui' +# +# Created: Sun May 27 10:53:01 2007 +# by: PyQt4 UI code generator 4-snapshot-20070525 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(QtCore.QSize(QtCore.QRect(0,0,728,822).size()).expandedTo(MainWindow.minimumSizeHint())) + + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) + + self.centralwidget = QtGui.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + + self.vboxlayout = QtGui.QVBoxLayout(self.centralwidget) + self.vboxlayout.setSpacing(6) + + + + + + + self.hboxlayout = QtGui.QHBoxLayout() + self.hboxlayout.setSpacing(6) + + + + + + + self.device_tree = DeviceView(self.centralwidget) + + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.device_tree.sizePolicy().hasHeightForWidth()) + self.device_tree.setSizePolicy(sizePolicy) + self.device_tree.setMaximumSize(QtCore.QSize(10000,90)) + self.device_tree.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.device_tree.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.device_tree.setDragDropMode(QtGui.QAbstractItemView.DragDrop) + self.device_tree.setFlow(QtGui.QListView.TopToBottom) + self.device_tree.setSpacing(20) + self.device_tree.setViewMode(QtGui.QListView.IconMode) + self.device_tree.setObjectName("device_tree") + self.hboxlayout.addWidget(self.device_tree) + + self.df = QtGui.QLabel(self.centralwidget) + + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.df.sizePolicy().hasHeightForWidth()) + self.df.setSizePolicy(sizePolicy) + self.df.setMaximumSize(QtCore.QSize(16777215,90)) + self.df.setTextFormat(QtCore.Qt.RichText) + self.df.setOpenExternalLinks(True) + self.df.setObjectName("df") + self.hboxlayout.addWidget(self.df) + self.vboxlayout.addLayout(self.hboxlayout) + + self.hboxlayout1 = QtGui.QHBoxLayout() + self.hboxlayout1.setSpacing(6) + + + + + self.hboxlayout1.setObjectName("hboxlayout1") + + self.label = QtGui.QLabel(self.centralwidget) + self.label.setObjectName("label") + self.hboxlayout1.addWidget(self.label) + + self.search = SearchBox(self.centralwidget) + self.search.setEnabled(True) + self.search.setAcceptDrops(False) + self.search.setAutoFillBackground(False) + self.search.setFrame(True) + self.search.setObjectName("search") + self.hboxlayout1.addWidget(self.search) + + self.clear_button = QtGui.QToolButton(self.centralwidget) + self.clear_button.setIcon(QtGui.QIcon(":/images/clear.png")) + self.clear_button.setObjectName("clear_button") + self.hboxlayout1.addWidget(self.clear_button) + self.vboxlayout.addLayout(self.hboxlayout1) + + self.gridlayout = QtGui.QGridLayout() + + + + + self.gridlayout.setHorizontalSpacing(6) + self.gridlayout.setVerticalSpacing(6) + self.gridlayout.setObjectName("gridlayout") + + self.library_view = BooksView(self.centralwidget) + + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(10) + sizePolicy.setHeightForWidth(self.library_view.sizePolicy().hasHeightForWidth()) + self.library_view.setSizePolicy(sizePolicy) + self.library_view.setAcceptDrops(True) + self.library_view.setDragEnabled(True) + self.library_view.setDragDropOverwriteMode(False) + self.library_view.setDragDropMode(QtGui.QAbstractItemView.DragDrop) + self.library_view.setAlternatingRowColors(True) + self.library_view.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.library_view.setShowGrid(False) + self.library_view.setObjectName("library_view") + self.gridlayout.addWidget(self.library_view,1,0,1,1) + self.vboxlayout.addLayout(self.gridlayout) + + self.hboxlayout2 = QtGui.QHBoxLayout() + self.hboxlayout2.setSpacing(6) + + + + + self.hboxlayout2.setObjectName("hboxlayout2") + + self.book_cover = CoverDisplay(self.centralwidget) + self.book_cover.setMaximumSize(QtCore.QSize(60,80)) + self.book_cover.setAcceptDrops(True) + self.book_cover.setScaledContents(True) + self.book_cover.setObjectName("book_cover") + self.hboxlayout2.addWidget(self.book_cover) + + self.book_info = QtGui.QLabel(self.centralwidget) + self.book_info.setTextFormat(QtCore.Qt.RichText) + self.book_info.setObjectName("book_info") + self.hboxlayout2.addWidget(self.book_info) + self.vboxlayout.addLayout(self.hboxlayout2) + MainWindow.setCentralWidget(self.centralwidget) + + self.tool_bar = QtGui.QToolBar(MainWindow) + self.tool_bar.setMinimumSize(QtCore.QSize(0,0)) + self.tool_bar.setMovable(False) + self.tool_bar.setOrientation(QtCore.Qt.Horizontal) + self.tool_bar.setIconSize(QtCore.QSize(64,64)) + self.tool_bar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) + self.tool_bar.setObjectName("tool_bar") + MainWindow.addToolBar(self.tool_bar) + + self.action_add = QtGui.QAction(MainWindow) + self.action_add.setIcon(QtGui.QIcon(":/images/addfile.png")) + self.action_add.setAutoRepeat(False) + self.action_add.setObjectName("action_add") + + self.action_del = QtGui.QAction(MainWindow) + self.action_del.setIcon(QtGui.QIcon(":/images/delfile.png")) + self.action_del.setObjectName("action_del") + + self.action_edit = QtGui.QAction(MainWindow) + self.action_edit.setIcon(QtGui.QIcon(":/images/edit.png")) + self.action_edit.setAutoRepeat(False) + self.action_edit.setObjectName("action_edit") + self.tool_bar.addAction(self.action_add) + self.tool_bar.addAction(self.action_del) + self.tool_bar.addAction(self.action_edit) + self.label.setBuddy(self.search) + + self.retranslateUi(MainWindow) + QtCore.QObject.connect(self.clear_button,QtCore.SIGNAL("clicked()"),self.search.clear) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + self.df.setText(QtGui.QApplication.translate("MainWindow", "For help visit http://libprs500.kovidgoyal.net

libprs500: %1 by Kovid Goyal © 2006
%2 %3 %4", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("MainWindow", "&Search:", None, QtGui.QApplication.UnicodeUTF8)) + self.search.setToolTip(QtGui.QApplication.translate("MainWindow", "Search the list of books by title or author

Words separated by spaces are ANDed", None, QtGui.QApplication.UnicodeUTF8)) + self.search.setWhatsThis(QtGui.QApplication.translate("MainWindow", "Search the list of books by title or author

Words separated by spaces are ANDed", None, QtGui.QApplication.UnicodeUTF8)) + self.clear_button.setToolTip(QtGui.QApplication.translate("MainWindow", "Reset Quick Search", None, QtGui.QApplication.UnicodeUTF8)) + self.clear_button.setText(QtGui.QApplication.translate("MainWindow", "...", None, QtGui.QApplication.UnicodeUTF8)) + self.book_info.setText(QtGui.QApplication.translate("MainWindow", "
Title: %1 Size: %2
Author: %3 Type: %4
", None, QtGui.QApplication.UnicodeUTF8)) + self.action_add.setText(QtGui.QApplication.translate("MainWindow", "Add books to Library", None, QtGui.QApplication.UnicodeUTF8)) + self.action_add.setShortcut(QtGui.QApplication.translate("MainWindow", "A", None, QtGui.QApplication.UnicodeUTF8)) + self.action_del.setText(QtGui.QApplication.translate("MainWindow", "Delete books", None, QtGui.QApplication.UnicodeUTF8)) + self.action_del.setShortcut(QtGui.QApplication.translate("MainWindow", "Del", None, QtGui.QApplication.UnicodeUTF8)) + self.action_edit.setText(QtGui.QApplication.translate("MainWindow", "Edit meta-information", None, QtGui.QApplication.UnicodeUTF8)) + self.action_edit.setShortcut(QtGui.QApplication.translate("MainWindow", "E", None, QtGui.QApplication.UnicodeUTF8)) + +from widgets import DeviceView, CoverDisplay +from library import BooksView, SearchBox +import images_rc diff --git a/src/libprs500/gui2/widgets.py b/src/libprs500/gui2/widgets.py new file mode 100644 index 0000000000..a23d47eb9c --- /dev/null +++ b/src/libprs500/gui2/widgets.py @@ -0,0 +1,863 @@ +## Copyright (C) 2006 Kovid Goyal kovid@kovidgoyal.net +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License along +## with this program; if not, write to the Free Software Foundation, Inc., +## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +import re +import os +import textwrap +import time +import traceback +from operator import itemgetter, attrgetter +from socket import gethostname +from urlparse import urlparse, urlunparse +from urllib import quote, unquote +from math import sin, cos, pi + +from libprs500.gui import Error, _Warning +from libprs500.ptempfile import PersistentTemporaryFile +from libprs500 import iswindows + +from PyQt4.QtCore import Qt, SIGNAL +from PyQt4.Qt import QApplication, QString, QFont, QAbstractListModel, \ + QVariant, QAbstractTableModel, QTableView, QListView, \ + QLabel, QAbstractItemView, QPixmap, QIcon, QSize, \ + QSpinBox, QPoint, QPainterPath, QItemDelegate, QPainter, \ + QPen, QColor, QLinearGradient, QBrush, QStyle, \ + QByteArray, QBuffer, QMimeData, \ + QDrag, QRect + +NONE = QVariant() #: Null value to return from the data function of item models +TIME_WRITE_FMT = "%d %b %Y" #: The display format used to show dates + +class FileDragAndDrop(object): + _drag_start_position = QPoint() + _dragged_files = [] + + @classmethod + def _bytes_to_string(cls, qba): + """ + Assumes qba is encoded in ASCII which is usually fine, since + this method is used mainly for escaped URIs. + @type qba: QByteArray + """ + return str(QString.fromAscii(qba.data())).strip() + + @classmethod + def _get_r_ok_files(cls, event): + """ + Return list of paths from event that point to files to + which the user has read permission. + """ + files = [] + md = event.mimeData() + if md.hasFormat("text/uri-list"): + candidates = cls._bytes_to_string(md.data("text/uri-list")).split() + for url in candidates: + o = urlparse(url) + if o.scheme and o.scheme != 'file': + _Warning(o.scheme + " not supported in drop events", None) + continue + path = unquote(o.path) + if iswindows and path.startswith('/'): + path = path[1:] + if not os.access(path, os.R_OK): + _Warning("You do not have read permission for: " + path, None) + continue + if os.path.isdir(path): + root, dirs, files2 = os.walk(path) + for _file in files2: + path = root + _file + if os.access(path, os.R_OK): + files.append(path) + else: + files.append(path) + return files + + def __init__(self, QtBaseClass, enable_drag=True): + self.QtBaseClass = QtBaseClass + self.enable_drag = enable_drag + + def mousePressEvent(self, event): + self.QtBaseClass.mousePressEvent(self, event) + if self.enable_drag: + if event.button == Qt.LeftButton: + self._drag_start_position = event.pos() + + + def mouseMoveEvent(self, event): + self.QtBaseClass.mousePressEvent(self, event) + if self.enable_drag: + if event.buttons() & Qt.LeftButton != Qt.LeftButton: + return + if (event.pos() - self._drag_start_position).manhattanLength() < \ + QApplication.startDragDistance(): + return + self.start_drag(self._drag_start_position) + + + def start_drag(self, pos): + raise NotImplementedError() + + def dragEnterEvent(self, event): + if event.mimeData().hasFormat("text/uri-list"): + event.acceptProposedAction() + + def dragMoveEvent(self, event): + event.acceptProposedAction() + + def dropEvent(self, event): + files = self._get_r_ok_files(event) + if files: + try: + event.setDropAction(Qt.CopyAction) + if self.files_dropped(files, event): + event.accept() + except Exception, e: + Error("There was an error processing the dropped files.", e) + raise e + + + def files_dropped(self, files, event): + raise NotImplementedError() + + def drag_object_from_files(self, files): + if files: + drag = QDrag(self) + mime_data = QMimeData() + self._dragged_files, urls = [], [] + for _file in files: + urls.append(urlunparse(('file', quote(gethostname()), \ + quote(_file.name.encode('utf-8')), '', '', ''))) + self._dragged_files.append(_file) + mime_data.setData("text/uri-list", QByteArray("\n".join(urls))) + user = os.getenv('USER') + if user: + mime_data.setData("text/x-xdnd-username", QByteArray(user)) + drag.setMimeData(mime_data) + return drag + + def drag_object(self, extensions): + if extensions: + files = [] + for ext in extensions: + f = PersistentTemporaryFile(suffix="."+ext) + files.append(f) + return self.drag_object_from_files(files), self._dragged_files + + +class TableView(FileDragAndDrop, QTableView): + wrapper = textwrap.TextWrapper(width=20) + + def __init__(self, parent): + FileDragAndDrop.__init__(self, QTableView) + QTableView.__init__(self, parent) + + @classmethod + def wrap(cls, s, width=20): + cls.wrapper.width = width + return cls.wrapper.fill(s) + + @classmethod + def human_readable(cls, size): + """ Convert a size in bytes into a human readable form """ + if size < 1024: + divisor, suffix = 1, "B" + elif size < 1024*1024: + divisor, suffix = 1024., "KB" + elif size < 1024*1024*1024: + divisor, suffix = 1024*1024, "MB" + elif size < 1024*1024*1024*1024: + divisor, suffix = 1024*1024, "GB" + size = str(size/divisor) + if size.find(".") > -1: + size = size[:size.find(".")+2] + return size + " " + suffix + + def render_to_pixmap(self, indices): + rect = self.visualRect(indices[0]) + rects = [] + for i in range(len(indices)): + rects.append(self.visualRect(indices[i])) + rect |= rects[i] + rect = rect.intersected(self.viewport().rect()) + pixmap = QPixmap(rect.size()) + pixmap.fill(self.palette().base().color()) + painter = QPainter(pixmap) + option = self.viewOptions() + option.state |= QStyle.State_Selected + for j in range(len(indices)): + option.rect = QRect(rects[j].topLeft() - rect.topLeft(), \ + rects[j].size()) + self.itemDelegate(indices[j]).paint(painter, option, indices[j]) + painter.end() + return pixmap + + def drag_object_from_files(self, files): + drag = FileDragAndDrop.drag_object_from_files(self, files) + drag.setPixmap(self.render_to_pixmap(self.selectedIndexes())) + return drag + + + +class CoverDisplay(FileDragAndDrop, QLabel): + def __init__(self, parent): + FileDragAndDrop.__init__(self, QLabel) + QLabel.__init__(self, parent) + def files_dropped(self, files, event): + pix = QPixmap() + for _file in files: + pix = QPixmap(_file) + if not pix.isNull(): break + if not pix.isNull(): + self.emit(SIGNAL("cover_received(QPixmap)"), pix) + return True + + def start_drag(self, event): + drag, files = self.drag_object(["jpeg"]) + if drag and files: + _file = files[0] + _file.close() + drag.setPixmap(self.pixmap().scaledToHeight(68, \ + Qt.SmoothTransformation)) + self.pixmap().save(os.path.abspath(_file.name)) + drag.start(Qt.MoveAction) + +class DeviceView(FileDragAndDrop, QListView): + def __init__(self, parent): + FileDragAndDrop.__init__(self, QListView, enable_drag=False) + QListView.__init__(self, parent) + + def hide_reader(self, x): + self.model().update_devices(reader=not x) + + def hide_card(self, x): + self.model().update_devices(card=not x) + + def files_dropped(self, files, event): + ids = [] + md = event.mimeData() + if md.hasFormat("application/x-libprs500-id"): + ids = [ int(id) for id in FileDragAndDrop._bytes_to_string(\ + md.data("application/x-libprs500-id")).split()] + index = self.indexAt(event.pos()) + if index.isValid(): + return self.model().files_dropped(files, index, ids) + +class DeviceBooksView(TableView): + def __init__(self, parent): + TableView.__init__(self, parent) + self.setSelectionBehavior(QAbstractItemView.SelectRows) + self.setSortingEnabled(True) + +class LibraryBooksView(TableView): + def __init__(self, parent): + TableView.__init__(self, parent) + self.setSelectionBehavior(QAbstractItemView.SelectRows) + self.setSortingEnabled(True) + self.setItemDelegate(LibraryDelegate(self, rating_column=4)) + + def dragEnterEvent(self, event): + if not event.mimeData().hasFormat("application/x-libprs500-id"): + FileDragAndDrop.dragEnterEvent(self, event) + + + def start_drag(self, pos): + index = self.indexAt(pos) + if index.isValid(): + rows = frozenset([ index.row() for index in self.selectedIndexes()]) + files = self.model().extract_formats(rows) + drag = self.drag_object_from_files(files) + if drag: + ids = [ str(self.model().id_from_row(row)) for row in rows ] + drag.mimeData().setData("application/x-libprs500-id", \ + QByteArray("\n".join(ids))) + drag.start() + + + def files_dropped(self, files, event): + if not files: return + index = self.indexAt(event.pos()) + if index.isValid(): + self.model().add_formats(files, index) + else: self.emit(SIGNAL('books_dropped'), files) + + + + +class LibraryDelegate(QItemDelegate): + COLOR = QColor("blue") + SIZE = 16 + PEN = QPen(COLOR, 1, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin) + + def __init__(self, parent, rating_column=-1): + QItemDelegate.__init__(self, parent) + self.rating_column = rating_column + self.star_path = QPainterPath() + self.star_path.moveTo(90, 50) + for i in range(1, 5): + self.star_path.lineTo(50 + 40 * cos(0.8 * i * pi), \ + 50 + 40 * sin(0.8 * i * pi)) + self.star_path.closeSubpath() + self.star_path.setFillRule(Qt.WindingFill) + gradient = QLinearGradient(0, 0, 0, 100) + gradient.setColorAt(0.0, self.COLOR) + gradient.setColorAt(1.0, self.COLOR) + self. brush = QBrush(gradient) + self.factor = self.SIZE/100. + + + def sizeHint(self, option, index): + if index.column() != self.rating_column: + return QItemDelegate.sizeHint(self, option, index) + num = index.model().data(index, Qt.DisplayRole).toInt()[0] + return QSize(num*(self.SIZE), self.SIZE+4) + + def paint(self, painter, option, index): + if index.column() != self.rating_column: + return QItemDelegate.paint(self, painter, option, index) + num = index.model().data(index, Qt.DisplayRole).toInt()[0] + def draw_star(): + painter.save() + painter.scale(self.factor, self.factor) + painter.translate(50.0, 50.0) + painter.rotate(-20) + painter.translate(-50.0, -50.0) + painter.drawPath(self.star_path) + painter.restore() + + painter.save() + try: + if option.state & QStyle.State_Selected: + painter.fillRect(option.rect, option.palette.highlight()) + painter.setRenderHint(QPainter.Antialiasing) + y = option.rect.center().y()-self.SIZE/2. + x = option.rect.right() - self.SIZE + painter.setPen(self.PEN) + painter.setBrush(self.brush) + painter.translate(x, y) + for i in range(num): + draw_star() + painter.translate(-self.SIZE, 0) + except Exception, e: + traceback.print_exc(e) + painter.restore() + + def createEditor(self, parent, option, index): + if index.column() != 4: + return QItemDelegate.createEditor(self, parent, option, index) + editor = QSpinBox(parent) + editor.setSuffix(" stars") + editor.setMinimum(0) + editor.setMaximum(5) + editor.installEventFilter(self) + return editor + + def setEditorData(self, editor, index): + if index.column() != 4: + return QItemDelegate.setEditorData(self, editor, index) + val = index.model()._data[index.row()]["rating"] + if not val: val = 0 + editor.setValue(val) + + def setModelData(self, editor, model, index): + if index.column() != 4: + return QItemDelegate.setModelData(self, editor, model, index) + editor.interpretText() + index.model().setData(index, QVariant(editor.value()), Qt.EditRole) + + def updateEditorGeometry(self, editor, option, index): + if index.column() != 4: + return QItemDelegate.updateEditorGeometry(self, editor, option, index) + editor.setGeometry(option.rect) + + + +class LibraryBooksModel(QAbstractTableModel): + FIELDS = ["id", "title", "authors", "size", "date", "rating", "publisher", \ + "tags", "comments"] + TIME_READ_FMT = "%Y-%m-%d %H:%M:%S" + def __init__(self, parent): + QAbstractTableModel.__init__(self, parent) + self.db = None + self._data = None + self._orig_data = None + + def extract_formats(self, rows): + files = [] + for row in rows: + _id = self.id_from_row(row) + au = self._data[row]["authors"] if self._data[row]["authors"] \ + else "Unknown" + basename = re.sub("\n", "", "_"+str(_id)+"_"+\ + self._data[row]["title"]+" by "+ au) + exts = self.db.get_extensions(_id) + for ext in exts: + fmt = self.db.get_format(_id, ext) + if not ext: + ext ="" + else: + ext = "."+ext + name = basename+ext + file = PersistentTemporaryFile(suffix=name) + if not fmt: + continue + file.write(fmt) + file.close() + files.append(file) + return files + + def update_cover(self, index, pix): + spix = pix.scaledToHeight(68, Qt.SmoothTransformation) + _id = self.id_from_index(index) + qb, sqb = QBuffer(), QBuffer() + qb.open(QBuffer.ReadWrite) + sqb.open(QBuffer.ReadWrite) + pix.save(qb, "JPG") + spix.save(sqb, "JPG") + data = str(qb.data()) + sdata = str(sqb.data()) + qb.close() + sqb.close() + self.db.update_cover(_id, data, scaled=sdata) + self.refresh_row(index.row()) + + def add_formats(self, paths, index): + for path in paths: + f = open(path, "rb") + title = os.path.basename(path) + ext = title[title.rfind(".")+1:].lower() if "." in title > -1 else None + _id = self.id_from_index(index) + self.db.add_format(_id, ext, f) + f.close() + self.refresh_row(index.row()) + self.emit(SIGNAL('formats_added'), index) + + def rowCount(self, parent): + return len(self._data) + + def columnCount(self, parent): + return len(self.FIELDS)-3 + + def setData(self, index, value, role): + done = False + if role == Qt.EditRole: + row = index.row() + _id = self._data[row]["id"] + col = index.column() + val = unicode(value.toString().toUtf8(), 'utf-8').strip() + if col == 0: + col = "title" + elif col == 1: + col = "authors" + elif col == 2: + return False + elif col == 3: + return False + elif col == 4: + col, val = "rating", int(value.toInt()[0]) + if val < 0: + val = 0 + if val > 5: + val = 5 + elif col == 5: + col = "publisher" + else: + return False + self.db.set_metadata_item(_id, col, val) + self._data[row][col] = val + self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), \ + index, index) + for i in range(len(self._orig_data)): + if self._orig_data[i]["id"] == self._data[row]["id"]: + self._orig_data[i][col] = self._data[row][col] + break + done = True + return done + + def update_tags_and_comments(self, index, tags, comments): + _id = self.id_from_index(index) + self.db.set_metadata_item(_id, "tags", tags) + self.db.set_metadata_item(_id, "comments", comments) + self.refresh_row(index.row()) + + def flags(self, index): + flags = QAbstractTableModel.flags(self, index) + if index.isValid(): + if index.column() not in [2, 3]: + flags |= Qt.ItemIsEditable + return flags + + def set_data(self, db): + self.db = db + self._data = self.db.get_table(self.FIELDS) + self._orig_data = self._data + self.sort(0, Qt.DescendingOrder) + self.reset() + + def headerData(self, section, orientation, role): + if role != Qt.DisplayRole: + return NONE + text = "" + if orientation == Qt.Horizontal: + if section == 0: text = "Title" + elif section == 1: text = "Author(s)" + elif section == 2: text = "Size" + elif section == 3: text = "Date" + elif section == 4: text = "Rating" + elif section == 5: text = "Publisher" + return QVariant(self.trUtf8(text)) + else: return QVariant(str(1+section)) + + def info(self, row): + row = self._data[row] + cover = self.db.get_cover(row["id"]) + exts = ",".join(self.db.get_extensions(row["id"])) + if cover: + pix = QPixmap() + pix.loadFromData(cover, "", Qt.AutoColor) + cover = None if pix.isNull() else pix + tags = row["tags"] + if not tags: tags = "" + comments = row["comments"] + if not comments: + comments = "" + comments = TableView.wrap(comments, width=80) + return exts, tags, comments, cover + + def id_from_index(self, index): return self._data[index.row()]["id"] + def id_from_row(self, row): return self._data[row]["id"] + + def refresh_row(self, row): + datum = self.db.get_row_by_id(self._data[row]["id"], self.FIELDS) + self._data[row:row+1] = [datum] + for i in range(len(self._orig_data)): + if self._orig_data[i]["id"] == datum["id"]: + self._orig_data[i:i+1] = [datum] + break + self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), \ + self.index(row, 0), self.index(row, self.columnCount(0)-1)) + + def book_info(self, _id): + """ Return title, authors and cover in a dict """ + cover = self.db.get_cover(_id) + info = self.db.get_row_by_id(_id, ["title", "authors"]) + info["cover"] = cover + return info + + def data(self, index, role): + if role == Qt.DisplayRole or role == Qt.EditRole: + row, col = index.row(), index.column() + text = None + row = self._data[row] + if col == 4: + r = row["rating"] if row["rating"] else 0 + if r < 0: + r = 0 + if r > 5: + r = 5 + return QVariant(r) + if col == 0: + text = TableView.wrap(row["title"], width=35) + elif col == 1: + au = row["authors"] + if au: + au = au.split("&") + jau = [ TableView.wrap(a, width=30).strip() for a in au ] + text = "\n".join(jau) + elif col == 2: + text = TableView.human_readable(row["size"]) + elif col == 3: + text = time.strftime(TIME_WRITE_FMT, \ + time.strptime(row["date"], self.TIME_READ_FMT)) + elif col == 5: + pub = row["publisher"] + if pub: + text = TableView.wrap(pub, 20) + if text == None: + text = "Unknown" + return QVariant(text) + elif role == Qt.TextAlignmentRole and index.column() in [2, 3, 4]: + return QVariant(Qt.AlignRight | Qt.AlignVCenter) + elif role == Qt.ToolTipRole and index.isValid(): + if index.column() in [0, 1, 4, 5]: + edit = "Double click to edit me

" + else: + edit = "" + return QVariant(edit + "You can drag and drop me to the \ + desktop to save all my formats to your hard disk.") + return NONE + + def sort(self, col, order): + descending = order != Qt.AscendingOrder + def getter(key, func): + return lambda x : func(itemgetter(key)(x)) + if col == 0: key, func = "title", lambda x : x.lower() + if col == 1: key, func = "authors", lambda x : x.split()[-1:][0].lower()\ + if x else "" + if col == 2: key, func = "size", int + if col == 3: key, func = "date", lambda x: time.mktime(\ + time.strptime(x, self.TIME_READ_FMT)) + if col == 4: key, func = "rating", lambda x: x if x else 0 + if col == 5: key, func = "publisher", lambda x : x.lower() if x else "" + self.emit(SIGNAL("layoutAboutToBeChanged()")) + self._data.sort(key=getter(key, func)) + if descending: self._data.reverse() + self.emit(SIGNAL("layoutChanged()")) + self.emit(SIGNAL("sorted()")) + + def search(self, query): + def query_in(book, q): + au = book["authors"] + if not au : au = "unknown" + pub = book["publisher"] + if not pub : pub = "unknown" + return q in book["title"].lower() or q in au.lower() or \ + q in pub.lower() + queries = unicode(query, 'utf-8').lower().split() + self.emit(SIGNAL("layoutAboutToBeChanged()")) + self._data = [] + for book in self._orig_data: + match = True + for q in queries: + if query_in(book, q) : continue + else: + match = False + break + if match: self._data.append(book) + self.emit(SIGNAL("layoutChanged()")) + self.emit(SIGNAL("searched()")) + + def delete(self, indices): + if len(indices): self.emit(SIGNAL("layoutAboutToBeChanged()")) + items = [ self._data[index.row()] for index in indices ] + for item in items: + _id = item["id"] + try: + self._data.remove(item) + except ValueError: continue + self.db.delete_by_id(_id) + for x in self._orig_data: + if x["id"] == _id: self._orig_data.remove(x) + self.emit(SIGNAL("layoutChanged()")) + self.emit(SIGNAL("deleted()")) + self.db.commit() + + def add_book(self, path): + """ Must call search and sort on this models view after this """ + _id = self.db.add_book(path) + self._orig_data.append(self.db.get_row_by_id(_id, self.FIELDS)) + +class DeviceBooksModel(QAbstractTableModel): + @apply + def booklist(): + doc = """ The booklist this model is based on """ + def fget(self): + return self._orig_data + return property(doc=doc, fget=fget) + + def __init__(self, parent): + QAbstractTableModel.__init__(self, parent) + self._data = [] + self._orig_data = [] + + def set_data(self, book_list): + self._data = book_list + self._orig_data = book_list + self.reset() + + def rowCount(self, parent): + return len(self._data) + + def columnCount(self, parent): + return 4 + + def headerData(self, section, orientation, role): + if role != Qt.DisplayRole: + return NONE + text = "" + if orientation == Qt.Horizontal: + if section == 0: text = "Title" + elif section == 1: text = "Author(s)" + elif section == 2: text = "Size" + elif section == 3: text = "Date" + return QVariant(self.trUtf8(text)) + else: return QVariant(str(1+section)) + + def data(self, index, role): + if role == Qt.DisplayRole: + row, col = index.row(), index.column() + book = self._data[row] + if col == 0: + text = TableView.wrap(book.title, width=40) + elif col == 1: + au = book.author + au = au.split("&") + jau = [ TableView.wrap(a, width=25).strip() for a in au ] + text = "\n".join(jau) + elif col == 2: + text = TableView.human_readable(book.size) + elif col == 3: + text = time.strftime(TIME_WRITE_FMT, book.datetime) + return QVariant(text) + elif role == Qt.TextAlignmentRole and index.column() in [2, 3]: + return QVariant(Qt.AlignRight | Qt.AlignVCenter) + return NONE + + def info(self, row): + row = self._data[row] + cover = None + try: + cover = row.thumbnail + pix = QPixmap() + pix.loadFromData(cover, "", Qt.AutoColor) + cover = None if pix.isNull() else pix + except: + traceback.print_exc() + au = row.author if row.author else "Unknown" + return row.title, au, TableView.human_readable(row.size), row.mime, cover + + def sort(self, col, order): + def getter(key, func): + return lambda x : func(attrgetter(key)(x)) + if col == 0: key, func = "title", lambda x : x.lower() + if col == 1: key, func = "author", lambda x : x.split()[-1:][0].lower() + if col == 2: key, func = "size", int + if col == 3: key, func = "datetime", lambda x: x + descending = order != Qt.AscendingOrder + self.emit(SIGNAL("layoutAboutToBeChanged()")) + self._data.sort(key=getter(key, func)) + if descending: self._data.reverse() + self.emit(SIGNAL("layoutChanged()")) + self.emit(SIGNAL("sorted()")) + + def search(self, query): + queries = unicode(query, 'utf-8').lower().split() + self.emit(SIGNAL("layoutAboutToBeChanged()")) + self._data = [] + for book in self._orig_data: + match = True + for q in queries: + if q in book.title.lower() or q in book.author.lower(): continue + else: + match = False + break + if match: self._data.append(book) + self.emit(SIGNAL("layoutChanged()")) + self.emit(SIGNAL("searched()")) + + def delete(self, indices): + paths = [] + rows = [ index.row() for index in indices ] + if not rows: + return + self.emit(SIGNAL("layoutAboutToBeChanged()")) + elems = [ self._data[row] for row in rows ] + for e in elems: + _id = e.id + paths.append(e.path) + self._orig_data.delete_book(_id) + try: + self._data.remove(e) + except ValueError: + pass + self.emit(SIGNAL("layoutChanged()")) + return paths + + def path(self, index): + return self._data[index.row()].path + def title(self, index): + return self._data[index.row()].title + + + + + +class DeviceModel(QAbstractListModel): + + memory_free = 0 + card_free = 0 + show_reader = False + show_card = False + + def update_devices(self, reader=None, card=None): + if reader != None: + self.show_reader = reader + if card != None: + self.show_card = card + self.emit(SIGNAL("layoutChanged()")) + + def rowCount(self, parent): + base = 1 + if self.show_reader: + base += 1 + if self.show_card: + base += 1 + return base + + def update_free_space(self, reader, card): + self.memory_free = reader + self.card_free = card + self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), \ + self.index(1), self.index(2)) + + def data(self, index, role): + row = index.row() + data = NONE + if role == Qt.DisplayRole: + text = None + if row == 0: + text = "Library" + if row == 1 and self.show_reader: + text = "Reader\n" + TableView.human_readable(self.memory_free) \ + + " available" + elif row == 2 and self.show_card: + text = "Card\n" + TableView.human_readable(self.card_free) \ + + " available" + if text: + data = QVariant(text) + elif role == Qt.DecorationRole: + icon = None + if row == 0: + icon = QIcon(":/library") + elif row == 1 and self.show_reader: + icon = QIcon(":/reader") + elif self.show_card: + icon = QIcon(":/card") + if icon: + data = QVariant(icon) + elif role == Qt.SizeHintRole: + if row == 1: + return QVariant(QSize(150, 70)) + elif role == Qt.FontRole: + font = QFont() + font.setBold(True) + data = QVariant(font) + return data + + def is_library(self, index): + return index.row() == 0 + def is_reader(self, index): + return index.row() == 1 + def is_card(self, index): + return index.row() == 2 + + def files_dropped(self, files, index, ids): + ret = False + if self.is_library(index) and not ids: + self.emit(SIGNAL("books_dropped"), files) + ret = True + elif self.is_reader(index): + self.emit(SIGNAL("upload_books"), "reader", files, ids) + elif self.is_card(index): + self.emit(SIGNAL("upload_books"), "card", files, ids) + return ret