Add sorting to grid view context menu

This commit is contained in:
Kovid Goyal 2013-08-02 11:18:38 +05:30
parent f17708760d
commit 0c427b046b
2 changed files with 33 additions and 3 deletions

View File

@ -11,11 +11,11 @@ from time import time
from collections import OrderedDict from collections import OrderedDict
from threading import Lock, Event, Thread from threading import Lock, Event, Thread
from Queue import Queue from Queue import Queue
from functools import wraps from functools import wraps, partial
from PyQt4.Qt import ( from PyQt4.Qt import (
QListView, QSize, QStyledItemDelegate, QModelIndex, Qt, QImage, pyqtSignal, QListView, QSize, QStyledItemDelegate, QModelIndex, Qt, QImage, pyqtSignal,
QPalette, QColor, QItemSelection, QPixmap) QPalette, QColor, QItemSelection, QPixmap, QMenu)
from calibre import fit_image from calibre import fit_image
@ -50,6 +50,7 @@ class AlternateViews(object):
view.setModel(self.main_view._model) view.setModel(self.main_view._model)
view.selectionModel().currentChanged.connect(self.slave_current_changed) view.selectionModel().currentChanged.connect(self.slave_current_changed)
view.selectionModel().selectionChanged.connect(self.slave_selection_changed) view.selectionModel().selectionChanged.connect(self.slave_selection_changed)
view.sort_requested.connect(self.main_view.sort_by_named_field)
def show_view(self, key=None): def show_view(self, key=None):
view = self.views[key] view = self.views[key]
@ -194,6 +195,7 @@ def join_with_timeout(q, timeout=2):
class GridView(QListView): class GridView(QListView):
update_item = pyqtSignal(object) update_item = pyqtSignal(object)
sort_requested = pyqtSignal(object, object)
def __init__(self, parent): def __init__(self, parent):
QListView.__init__(self, parent) QListView.__init__(self, parent)
@ -216,6 +218,7 @@ class GridView(QListView):
self.render_thread = None self.render_thread = None
self.update_item.connect(self.re_render, type=Qt.QueuedConnection) self.update_item.connect(self.re_render, type=Qt.QueuedConnection)
self.doubleClicked.connect(parent.iactions['View'].view_triggered) self.doubleClicked.connect(parent.iactions['View'].view_triggered)
self.gui = parent
self.context_menu = None self.context_menu = None
def shown(self): def shown(self):
@ -313,5 +316,25 @@ class GridView(QListView):
def contextMenuEvent(self, event): def contextMenuEvent(self, event):
if self.context_menu is not None: if self.context_menu is not None:
self.context_menu.popup(event.globalPos()) lv = self.gui.library_view
menu = self._temp_menu = QMenu(self)
sm = QMenu(_('Sort by'), menu)
db = self.model().db
for col in lv.visible_columns:
m = db.metadata_for_field(col)
last = self.model().sorted_on
ascending = True
extra = ''
if last[0] == col:
ascending = not last[1]
extra = ' [%s]' % _('reverse')
sm.addAction('%s%s' % (m.get('name', col), extra), partial(self.do_sort, col, ascending))
for ac in self.context_menu.actions():
menu.addAction(ac)
menu.addMenu(sm)
menu.popup(event.globalPos())
event.accept() event.accept()
def do_sort(self, column, ascending):
self.sort_requested.emit(column, ascending)

View File

@ -845,6 +845,13 @@ class BooksView(QTableView): # {{{
def column_map(self): def column_map(self):
return self._model.column_map return self._model.column_map
@property
def visible_columns(self):
h = self.horizontalHeader()
logical_indices = (x for x in xrange(h.count()) if not h.isSectionHidden(x))
rmap = {i:x for i, x in enumerate(self.column_map)}
return (rmap[h.visualIndex(x)] for x in logical_indices if h.visualIndex(x) > -1)
def refresh_book_details(self): def refresh_book_details(self):
idx = self.currentIndex() idx = self.currentIndex()
if idx.isValid(): if idx.isValid():