Fix #1245 (Unable to include all selected columns)

This commit is contained in:
Kovid Goyal 2008-11-21 14:55:15 -08:00
parent e9f3b6b735
commit c597cb136c
2 changed files with 29 additions and 61 deletions

View File

@ -131,6 +131,11 @@ class BooksModel(QAbstractTableModel):
if cols != self.column_map: if cols != self.column_map:
self.column_map = cols self.column_map = cols
self.reset() self.reset()
try:
idx = self.column_map.index('rating')
except ValueError:
idx = -1
self.emit(SIGNAL('columns_sorted(int)'), idx)
def set_database(self, db): def set_database(self, db):
@ -520,26 +525,26 @@ class BooksView(TableView):
def __init__(self, parent, modelcls=BooksModel): def __init__(self, parent, modelcls=BooksModel):
TableView.__init__(self, parent) TableView.__init__(self, parent)
self.rating_delegate = LibraryDelegate(self)
self.display_parent = parent self.display_parent = parent
self._model = modelcls(self) self._model = modelcls(self)
self.setModel(self._model) self.setModel(self._model)
self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setSortingEnabled(True) self.setSortingEnabled(True)
self.columns_sorted() try:
self.columns_sorted(self._model.column_map.index('rating'))
except ValueError:
pass
QObject.connect(self.selectionModel(), SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'), QObject.connect(self.selectionModel(), SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'),
self._model.current_changed) self._model.current_changed)
# Adding and removing rows should resize rows to contents self.connect(self._model, SIGNAL('columns_sorted(int)'), self.columns_sorted, Qt.QueuedConnection)
#QObject.connect(self.model(), SIGNAL('rowsRemoved(QModelIndex, int, int)'), self.resizeRowsToContents)
#QObject.connect(self.model(), SIGNAL('rowsInserted(QModelIndex, int, int)'), self.resizeRowsToContents)
self.set_visible_columns()
def columns_sorted(self): def columns_sorted(self, col):
if self.__class__.__name__ == 'BooksView': for i in range(self.model().columnCount(None)):
try: if self.itemDelegateForColumn(i) == self.rating_delegate:
idx = self._model.column_map.index('rating') self.setItemDelegateForColumn(i, self.itemDelegate())
self.setItemDelegateForColumn(idx, LibraryDelegate(self)) if col > -1:
except ValueError: self.setItemDelegateForColumn(col, self.rating_delegate)
pass
def sortByColumn(self, colname, order): def sortByColumn(self, colname, order):

View File

@ -6,7 +6,7 @@ from functools import partial
from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, QUrl, QTimer from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, QUrl, QTimer
from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \ from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \
QToolButton, QDialog, QDesktopServices, QFileDialog, \ QToolButton, QDialog, QDesktopServices, QFileDialog, \
QSystemTrayIcon, QApplication QSystemTrayIcon, QApplication, QKeySequence, QAction
from PyQt4.QtSvg import QSvgRenderer from PyQt4.QtSvg import QSvgRenderer
from calibre import __version__, __appname__, islinux, sanitize_file_name, \ from calibre import __version__, __appname__, islinux, sanitize_file_name, \
@ -31,16 +31,14 @@ from calibre.gui2.main_ui import Ui_MainWindow
from calibre.gui2.device import DeviceManager from calibre.gui2.device import DeviceManager
from calibre.gui2.status import StatusBar from calibre.gui2.status import StatusBar
from calibre.gui2.jobs2 import JobManager from calibre.gui2.jobs2 import JobManager
from calibre.gui2.news import NewsMenu
from calibre.gui2.dialogs.metadata_single import MetadataSingleDialog from calibre.gui2.dialogs.metadata_single import MetadataSingleDialog
from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog
from calibre.gui2.dialogs.jobs import JobsDialog from calibre.gui2.dialogs.jobs import JobsDialog
from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog
from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebooks, \ from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebooks, \
set_conversion_defaults, fetch_news, fetch_scheduled_recipe set_conversion_defaults, fetch_scheduled_recipe
from calibre.gui2.dialogs.config import ConfigDialog from calibre.gui2.dialogs.config import ConfigDialog
from calibre.gui2.dialogs.search import SearchDialog from calibre.gui2.dialogs.search import SearchDialog
from calibre.gui2.dialogs.user_profiles import UserProfiles
from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.gui2.dialogs.choose_format import ChooseFormatDialog
from calibre.gui2.dialogs.book_info import BookInfo from calibre.gui2.dialogs.book_info import BookInfo
from calibre.ebooks.metadata.meta import set_metadata from calibre.ebooks.metadata.meta import set_metadata
@ -100,8 +98,10 @@ class Main(MainWindow, Ui_MainWindow):
self.system_tray_menu = QMenu() self.system_tray_menu = QMenu()
self.restore_action = self.system_tray_menu.addAction(QIcon(':/images/page.svg'), _('&Restore')) self.restore_action = self.system_tray_menu.addAction(QIcon(':/images/page.svg'), _('&Restore'))
self.donate_action = self.system_tray_menu.addAction(QIcon(':/images/donate.svg'), _('&Donate')) self.donate_action = self.system_tray_menu.addAction(QIcon(':/images/donate.svg'), _('&Donate'))
self.quit_action = self.system_tray_menu.addAction(QIcon(':/images/window-close.svg'), _('&Quit')) self.quit_action = QAction(QIcon(':/images/window-close.svg'), _('&Quit'), self)
self.addAction(self.quit_action)
self.system_tray_menu.addAction(self.quit_action)
self.quit_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Q))
self.system_tray_icon.setContextMenu(self.system_tray_menu) self.system_tray_icon.setContextMenu(self.system_tray_menu)
self.connect(self.quit_action, SIGNAL('triggered(bool)'), self.quit) self.connect(self.quit_action, SIGNAL('triggered(bool)'), self.quit)
self.connect(self.donate_action, SIGNAL('triggered(bool)'), self.donate) self.connect(self.donate_action, SIGNAL('triggered(bool)'), self.donate)
@ -193,9 +193,6 @@ class Main(MainWindow, Ui_MainWindow):
self.action_sync.setMenu(sm) self.action_sync.setMenu(sm)
self.action_edit.setMenu(md) self.action_edit.setMenu(md)
self.action_save.setMenu(self.save_menu) self.action_save.setMenu(self.save_menu)
self.news_menu = NewsMenu(self.customize_feeds)
self.action_news.setMenu(self.news_menu)
QObject.connect(self.news_menu, SIGNAL('fetch_news(PyQt_PyObject)'), self.fetch_news)
cm = QMenu() cm = QMenu()
cm.addAction(_('Convert individually')) cm.addAction(_('Convert individually'))
cm.addAction(_('Bulk convert')) cm.addAction(_('Bulk convert'))
@ -209,7 +206,7 @@ class Main(MainWindow, Ui_MainWindow):
QObject.connect(cm.actions()[4], SIGNAL('triggered(bool)'), self.set_comic_conversion_defaults) QObject.connect(cm.actions()[4], SIGNAL('triggered(bool)'), self.set_comic_conversion_defaults)
QObject.connect(self.action_convert, SIGNAL('triggered(bool)'), self.convert_single) QObject.connect(self.action_convert, SIGNAL('triggered(bool)'), self.convert_single)
self.convert_menu = cm self.convert_menu = cm
self.tool_bar.widgetForAction(self.action_news).setPopupMode(QToolButton.InstantPopup) self.tool_bar.widgetForAction(self.action_news).setPopupMode(QToolButton.MenuButtonPopup)
self.tool_bar.widgetForAction(self.action_edit).setPopupMode(QToolButton.MenuButtonPopup) self.tool_bar.widgetForAction(self.action_edit).setPopupMode(QToolButton.MenuButtonPopup)
self.tool_bar.widgetForAction(self.action_sync).setPopupMode(QToolButton.MenuButtonPopup) self.tool_bar.widgetForAction(self.action_sync).setPopupMode(QToolButton.MenuButtonPopup)
self.tool_bar.widgetForAction(self.action_convert).setPopupMode(QToolButton.MenuButtonPopup) self.tool_bar.widgetForAction(self.action_convert).setPopupMode(QToolButton.MenuButtonPopup)
@ -303,16 +300,18 @@ class Main(MainWindow, Ui_MainWindow):
self.device_manager = DeviceManager(Dispatcher(self.device_detected), self.job_manager) self.device_manager = DeviceManager(Dispatcher(self.device_detected), self.job_manager)
self.device_manager.start() self.device_manager.start()
self.news_menu.set_custom_feeds(self.library_view.model().db.get_feeds())
if config['autolaunch_server']: if config['autolaunch_server']:
from calibre.library.server import start_threaded_server from calibre.library.server import start_threaded_server
from calibre.library import server_config from calibre.library import server_config
self.content_server = start_threaded_server(db, server_config().parse()) self.content_server = start_threaded_server(db, server_config().parse())
self.test_server_timer = QTimer.singleShot(10000, self.test_server) self.test_server_timer = QTimer.singleShot(10000, self.test_server)
self.scheduler = Scheduler(self) self.scheduler = Scheduler(self)
self.connect(self.news_menu.scheduler, SIGNAL('triggered(bool)'), lambda x :self.scheduler.show_dialog()) self.action_news.setMenu(self.scheduler.news_menu)
self.connect(self.action_news, SIGNAL('triggered(bool)'), self.scheduler.show_dialog)
def test_server(self, *args): def test_server(self, *args):
if self.content_server.exception is not None: if self.content_server.exception is not None:
@ -826,13 +825,6 @@ class Main(MainWindow, Ui_MainWindow):
############################### Fetch news ################################# ############################### Fetch news #################################
def customize_feeds(self, *args):
d = UserProfiles(self, self.library_view.model().db.get_feeds())
if d.exec_() == QDialog.Accepted:
feeds = tuple(d.profiles())
self.library_view.model().db.set_feeds(feeds)
self.news_menu.set_custom_feeds(feeds)
def download_scheduled_recipe(self, recipe, script, callback): def download_scheduled_recipe(self, recipe, script, callback):
func, args, desc, fmt, temp_files = fetch_scheduled_recipe(recipe, script) func, args, desc, fmt, temp_files = fetch_scheduled_recipe(recipe, script)
job = self.job_manager.run_job(Dispatcher(self.scheduled_recipe_fetched), func, args=args, job = self.job_manager.run_job(Dispatcher(self.scheduled_recipe_fetched), func, args=args,
@ -840,14 +832,6 @@ class Main(MainWindow, Ui_MainWindow):
self.conversion_jobs[job] = (temp_files, fmt, recipe, callback) self.conversion_jobs[job] = (temp_files, fmt, recipe, callback)
self.status_bar.showMessage(_('Fetching news from ')+recipe.title, 2000) self.status_bar.showMessage(_('Fetching news from ')+recipe.title, 2000)
def fetch_news(self, data):
func, args, desc, fmt, temp_files = fetch_news(data)
self.status_bar.showMessage(_('Fetching news from ')+data['title'], 2000)
job = self.job_manager.run_job(Dispatcher(self.news_fetched), func, args=args,
description=desc)
self.conversion_jobs[job] = (temp_files, fmt)
self.status_bar.showMessage(_('Fetching news from ')+data['title'], 2000)
def scheduled_recipe_fetched(self, job): def scheduled_recipe_fetched(self, job):
temp_files, fmt, recipe, callback = self.conversion_jobs.pop(job) temp_files, fmt, recipe, callback = self.conversion_jobs.pop(job)
pt = temp_files[0] pt = temp_files[0]
@ -861,26 +845,6 @@ class Main(MainWindow, Ui_MainWindow):
callback(recipe) callback(recipe)
self.status_bar.showMessage(recipe.title + _(' fetched.'), 3000) self.status_bar.showMessage(recipe.title + _(' fetched.'), 3000)
def news_fetched(self, job):
temp_files, fmt = self.conversion_jobs.pop(job)
pt = temp_files[0]
if job.exception is not None:
self.job_exception(job)
return
to_device = self.device_connected and fmt.lower() in self.device_manager.device_class.FORMATS
self._add_books([pt.name], to_device,
on_card=config.get('send_to_storage_card_by_default') and self.device_connected and bool(self.device_manager.device.card_prefix()))
if to_device:
self.status_bar.showMessage(_('News fetched. Uploading to device.'), 2000)
self.persistent_files.append(pt)
try:
if not to_device:
for f in temp_files:
if os.path.exists(f.name):
os.remove(f.name)
except:
pass
############################################################################ ############################################################################
############################### Convert #################################### ############################### Convert ####################################
@ -1116,7 +1080,6 @@ class Main(MainWindow, Ui_MainWindow):
if hasattr(d, 'directories'): if hasattr(d, 'directories'):
set_sidebar_directories(d.directories) set_sidebar_directories(d.directories)
self.library_view.model().read_config() self.library_view.model().read_config()
self.library_view.columns_sorted()
############################################################################ ############################################################################