diff --git a/src/calibre/gui2/tweak_book/manage_fonts.py b/src/calibre/gui2/tweak_book/manage_fonts.py index 3173ec4cfd..152c637a97 100644 --- a/src/calibre/gui2/tweak_book/manage_fonts.py +++ b/src/calibre/gui2/tweak_book/manage_fonts.py @@ -6,20 +6,67 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' +import sys + from PyQt4.Qt import ( - QSplitter, QVBoxLayout, QTableView, QWidget, QSize, QTableModel) + QSplitter, QVBoxLayout, QTableView, QWidget, QLabel, QAbstractTableModel, + Qt, QApplication, QTimer, QPushButton) -from calibre.gui2.tweak_book.widgets import Dialog +from calibre.ebooks.oeb.polish.container import get_container +from calibre.ebooks.oeb.polish.fonts import font_family_data +from calibre.gui2.tweak_book import current_container, set_current_container +from calibre.gui2.tweak_book.widgets import Dialog, BusyCursor +from calibre.utils.icu import primary_sort_key as sort_key -class AllFonts(QTableModel): +class AllFonts(QAbstractTableModel): def __init__(self, parent=None): - QTableModel.__init__(self, parent) + QAbstractTableModel.__init__(self, parent) self.items = [] self.font_data = {} + self.sorted_on = ('name', True) + + def rowCount(self, parent=None): + return len(self.items) + + def columnCount(self, parent=None): + return 2 + + def headerData(self, section, orientation, role=Qt.DisplayRole): + if orientation == Qt.Horizontal and role == Qt.DisplayRole: + return _('Font family') if section == 1 else _('Embedded') + return QAbstractTableModel.headerData(self, section, orientation, role) def build(self): - self.beginResetModel() + with BusyCursor(): + self.beginResetModel() + self.font_data = font_family_data(current_container()) + self.do_sort() + self.endResetModel() + + def do_sort(self): + reverse = not self.sorted_on[1] + self.items = sorted(self.font_data.iterkeys(), key=sort_key, reverse=reverse) + if self.sorted_on[0] != 'name': + self.items.sort(key=self.font_data.get, reverse=reverse) + + def data(self, index, role=Qt.DisplayRole): + if role == Qt.DisplayRole: + row, col = index.row(), index.column() + try: + name = self.items[row] + embedded = '✓ ' if self.font_data[name] else '' + except (IndexError, KeyError): + return + return name if col == 1 else embedded + + def sort(self, col, order=Qt.AscendingOrder): + sorted_on = (('name' if col == 1 else 'embedded'), order == Qt.AscendingOrder) + if sorted_on != self.sorted_on: + self.sorted_on = sorted_on + self.beginResetModel() + self.do_sort() + self.endResetModel() class ManageFonts(Dialog): @@ -36,10 +83,52 @@ class ManageFonts(Dialog): l.addWidget(s), l.addWidget(self.bb) self.fonts_view = fv = QTableView(self) + self.model = m = AllFonts(fv) + fv.horizontalHeader().setStretchLastSection(True) + fv.setModel(m) + fv.setSortingEnabled(True) + fv.setShowGrid(False) + fv.setAlternatingRowColors(True) + fv.setSelectionMode(fv.ExtendedSelection) + fv.setSelectionBehavior(fv.SelectRows) + fv.horizontalHeader().setSortIndicator(1, Qt.AscendingOrder) self.container = c = QWidget() l = c.l = QVBoxLayout(c) c.setLayout(l) - s.addWidget(fv), s.addWidget(l) + s.addWidget(fv), s.addWidget(c) - def sizeHint(self): - return QSize(900, 600) + self.cb = b = QPushButton(_('&Change selected fonts')) + b.clicked.connect(self.change_fonts) + l.addWidget(b) + self.rb = b = QPushButton(_('&Remove selected fonts')) + b.clicked.connect(self.remove_fonts) + l.addWidget(b) + self.eb = b = QPushButton(_('&Embed all fonts')) + b.clicked.connect(self.embed_fonts) + l.addWidget(b) + + self.la = la = QLabel('

' + _( + ''' All the fonts declared in this book are shown to the left, along with whether they are embedded or not. + You can remove or replace any selected font and also embed any declared fonts that are not already embedded.''')) + la.setWordWrap(True) + l.addWidget(la) + + l.setAlignment(Qt.AlignTop | Qt.AlignHCenter) + QTimer.singleShot(0, m.build) + + def change_fonts(self): + pass + + def remove_fonts(self): + pass + + def embed_fonts(self): + pass + +if __name__ == '__main__': + app = QApplication([]) + c = get_container(sys.argv[-1], tweak_mode=True) + set_current_container(c) + d = ManageFonts() + d.exec_() + del app