def generate_catalog(self): rows = self.gui.library_view.selectionModel().selectedRows() if not rows or len(rows) < 2: rows = xrange(self.gui.library_view.model().rowCount( QModelIndex())) ids = map(self.gui.library_view.model().id, rows) if not ids: return error_dialog(self.gui, _('No books selected'), _('No books selected for catalog generation'), show=True) db = self.gui.library_view.model().db dbspec = {} for id in ids: dbspec[id] = {'ondevice': db.ondevice(id, index_is_id=True)} # Calling gui2.tools:generate_catalog() ret = generate_catalog(self.gui, dbspec, ids, self.gui.device_manager, db) if ret is None: return func, args, desc, out, sync, title = ret fmt = os.path.splitext(out)[1][1:].upper() job = self.gui.job_manager.run_job(self.Dispatcher( self.catalog_generated), func, args=args, description=desc) job.catalog_file_path = out job.fmt = fmt job.catalog_sync, job.catalog_title = sync, title self.gui.status_bar.show_message(_('Generating %s catalog...') % fmt)
def update_result(self, plugin_name, width, height, data): if plugin_name.endswith('}'): # multi cover plugin plugin_name = plugin_name.partition('{')[0] plugin = [plugin for plugin in self.plugin_map if plugin.name == plugin_name] if not plugin: return plugin = plugin[0] last_row = max(self.plugin_map[plugin]) pmap = QPixmap() pmap.loadFromData(data) if pmap.isNull(): return self.beginInsertRows(QModelIndex(), last_row, last_row) for rows in self.plugin_map.itervalues(): for i in xrange(len(rows)): if rows[i] >= last_row: rows[i] += 1 self.plugin_map[plugin].insert(-1, last_row) self.covers.insert(last_row, self.get_item(plugin_name, pmap, waiting=False)) self.endInsertRows() else: # single cover plugin idx = None for plugin, rows in self.plugin_map.iteritems(): if plugin.name == plugin_name: idx = rows[0] break if idx is None: return pmap = QPixmap() pmap.loadFromData(data) if pmap.isNull(): return self.covers[idx] = self.get_item(plugin_name, pmap, waiting=False) self.dataChanged.emit(self.index(idx), self.index(idx))
def columnCount(self, index=QModelIndex()): return 3
def rowCount(self, index=QModelIndex()): return len(self.dustTxOutlist)
QToolButton, QIcon, QApplication, Qt, QWidget, QPoint, QSizePolicy, QPainter, QStaticText, pyqtSignal, QTextOption, QAbstractListModel, QModelIndex, QVariant, QStyledItemDelegate, QStyle, QListView, QTextDocument, QSize, QComboBox, QFrame, QCursor, QCheckBox, QSplitter, QPixmap, QRect, QGroupBox) from calibre import prepare_string_for_xml, human_readable from calibre.ebooks.oeb.polish.utils import lead_text, guess_type from calibre.gui2 import error_dialog, choose_files, choose_save_file, NONE, info_dialog, choose_images from calibre.gui2.tweak_book import tprefs, current_container from calibre.utils.icu import primary_sort_key, sort_key, primary_contains from calibre.utils.matcher import get_char, Matcher from calibre.gui2.complete2 import EditWithComplete ROOT = QModelIndex() class BusyCursor(object): def __enter__(self): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) def __exit__(self, *args): QApplication.restoreOverrideCursor() class Dialog(QDialog): def __init__(self, title, name, parent=None): QDialog.__init__(self, parent) self.setWindowTitle(title) self.name = name
def columnCount(self, parent=QModelIndex()): parentPref = self.index2Pref(parent) return parentPref.qt_col_count()
def columnCount(self, parent=QModelIndex()): return 3
def rowCount(self, parent=QModelIndex()): return len(self.filtered_searches)
def plugin_to_index(self, display_plugin): for i, p in enumerate(self.display_plugins): if display_plugin == p: return self.index(i, 0, QModelIndex()) return QModelIndex()
def hide_all(self, *args): self.model.hide_jobs( list(xrange(0, self.model.rowCount(QModelIndex())))) self.proxy_model.reset()
def rowCount(self, parent=QModelIndex()): return len(self.jobs)
def remove_row(self, row): self.beginRemoveRows(QModelIndex(), row, row) del self.bookmarks[row] self.endRemoveRows()
def insertRows(self, rows, count, parent=QModelIndex()): for row in rows: self.targets.append(row) self.beginInsertRows(parent, len(self.targets), len(self.targets)) self.endInsertRows() return True
def insertRow(self, row, parent=QModelIndex()): self.insertRows(row, 1, parent)
def removeRows(self, rows, count, parent=QModelIndex()): for row in rows: if row in self.targets: self.targets.remove(row) self.beginRemoveRows(parent, len(self.targets), len(self.targets)) self.endRemoveRows()
def index(self, row, column, parent=QModelIndex()): return self.createIndex(row, column)
def parent(self, index): if not index.isValid() or index.internalId() == 0: return QModelIndex() return self.createIndex(0, 0)
def itemToIndex(self, item): try: return self.indexdict[item] except KeyError: return QModelIndex()
def hide(self): self.setCurrentIndex(QModelIndex()) QListView.hide(self)
def get_ids_from_selected_rows(): rows = self.gui.library_view.selectionModel().selectedRows() if not rows or len(rows) < 2: rows = xrange(self.gui.library_view.model().rowCount(QModelIndex())) ids = map(self.gui.library_view.model().id, rows) return ids
def rowCount(self, parent=QModelIndex()): parentPref = self.index2Pref(parent) return parentPref.qt_row_count()
def hide_all(self, *args): self.model.hide_jobs( list(xrange(0, self.model.rowCount(QModelIndex())))) self.proxy_model.beginResetModel(), self.proxy_model.endResetModel()
def paint(self, painter, option, index): QStyledItemDelegate.paint( self, painter, option, QModelIndex()) # draw the hover and selection highlights m = index.model() db = m.db try: book_id = db.id(index.row()) except (ValueError, IndexError, KeyError): return if book_id in m.ids_to_highlight_set: painter.save() try: painter.setPen(self.highlight_color) painter.setRenderHint(QPainter.Antialiasing, True) painter.drawRoundedRect(option.rect, 10, 10, Qt.RelativeSize) finally: painter.restore() marked = db.data.get_marked(book_id) db = db.new_api cdata = self.cover_cache[book_id] device_connected = self.parent().gui.device_connected is not None on_device = device_connected and db.field_for('ondevice', book_id) painter.save() right_adjust = 0 try: rect = option.rect rect.adjust(self.MARGIN, self.MARGIN, -self.MARGIN, -self.MARGIN) orect = QRect(rect) if cdata is None or cdata is False: title = db.field_for('title', book_id, default_value='') authors = ' & '.join( db.field_for('authors', book_id, default_value=())) painter.setRenderHint(QPainter.TextAntialiasing, True) painter.drawText(rect, Qt.AlignCenter | Qt.TextWordWrap, '%s\n\n%s' % (title, authors)) if cdata is False: self.render_queue.put(book_id) else: if self.title_height != 0: trect = QRect(rect) rect.setBottom(rect.bottom() - self.title_height) if self.animating is not None and self.animating.row( ) == index.row(): cdata = cdata.scaled(cdata.size() * self._animated_size) dx = max(0, int((rect.width() - cdata.width()) / 2.0)) dy = max(0, rect.height() - cdata.height()) right_adjust = dx rect.adjust(dx, dy, -dx, 0) painter.drawPixmap(rect, cdata) if self.title_height != 0: rect = trect rect.setTop(rect.bottom() - self.title_height + 5) painter.setRenderHint(QPainter.TextAntialiasing, True) title = self.render_field(db, book_id) metrics = painter.fontMetrics() painter.setPen(self.highlight_color) painter.drawText( rect, Qt.AlignCenter | Qt.TextSingleLine, metrics.elidedText(title, Qt.ElideRight, rect.width())) if marked: try: p = self.marked_emblem except AttributeError: p = self.marked_emblem = m.marked_icon.pixmap(48, 48) drect = QRect(orect) drect.setLeft(drect.left() + right_adjust) drect.setRight(drect.left() + p.width()) drect.setBottom(drect.bottom() - self.title_height) drect.setTop(drect.bottom() - p.height()) painter.drawPixmap(drect, p) if on_device: try: p = self.on_device_emblem except AttributeError: p = self.on_device_emblem = QPixmap(I('ok.png')).scaled( 48, 48, transformMode=Qt.SmoothTransformation) drect = QRect(orect) drect.setRight(drect.right() - right_adjust) drect.setBottom(drect.bottom() - self.title_height) drect.setTop(drect.bottom() - p.height() + 1) drect.setLeft(drect.right() - p.width() + 1) painter.drawPixmap(drect, p) finally: painter.restore()
def rowCount(self, parent=QModelIndex()): """ :rtype: int """ return len(self.lst)