diff --git a/resources/images/grid.png b/resources/images/grid.png new file mode 100644 index 0000000000..f1dbf40a65 Binary files /dev/null and b/resources/images/grid.png differ diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index feed5bb4ad..283823158d 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -15,7 +15,8 @@ from calibre.constants import (isosx, __appname__, preferred_encoding, get_version) from calibre.gui2 import config, is_widescreen, gprefs from calibre.gui2.library.views import BooksView, DeviceBooksView -from calibre.gui2.widgets import Splitter +from calibre.gui2.library.alternate_views import GridView +from calibre.gui2.widgets import Splitter, LayoutButton from calibre.gui2.tag_browser.ui import TagBrowserWidget from calibre.gui2.book_details import BookDetails from calibre.gui2.notify import get_notifier @@ -116,7 +117,13 @@ class LibraryWidget(Splitter): # {{{ shortcut=_('Shift+Alt+B')) parent.library_view = BooksView(parent) parent.library_view.setObjectName('library_view') - self.addWidget(parent.library_view) + stack = QStackedWidget(self) + av = parent.library_view.alternate_views + av.set_stack(stack) + parent.grid_view = GridView(parent) + parent.grid_view.setObjectName('grid_view') + av.add_view('grid', parent.grid_view) + self.addWidget(stack) # }}} class Stack(QStackedWidget): # {{{ @@ -251,7 +258,7 @@ class LayoutMixin(object): # {{{ self.bd_splitter.addWidget(self.book_details) self.bd_splitter.setCollapsible(self.bd_splitter.other_index, False) self.centralwidget.layout().addWidget(self.bd_splitter) - button_order = ('tb', 'bd', 'cb') + button_order = ('tb', 'bd', 'cb', 'gv') # }}} else: # wide {{{ self.bd_splitter = Splitter('book_details_splitter', @@ -266,13 +273,16 @@ class LayoutMixin(object): # {{{ self.bd_splitter.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.centralwidget.layout().addWidget(self.bd_splitter) - button_order = ('tb', 'cb', 'bd') + button_order = ('tb', 'cb', 'bd', 'gv') # }}} self.status_bar = StatusBar(self) stylename = unicode(self.style().objectName()) + self.grid_view_button = LayoutButton(I('grid.png'), _('Cover Grid'), parent=self, shortcut=_('Shift+Alt+G')) + self.grid_view_button.set_state_to_show() + for x in button_order: - button = getattr(self, x+'_splitter').button + button = self.grid_view_button if x == 'gv' else getattr(self, x+'_splitter').button button.setIconSize(QSize(24, 24)) if isosx and stylename != u'Calibre': button.setStyleSheet(''' diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py new file mode 100644 index 0000000000..6970dba94e --- /dev/null +++ b/src/calibre/gui2/library/alternate_views.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +from __future__ import (unicode_literals, division, absolute_import, + print_function) + +__license__ = 'GPL v3' +__copyright__ = '2013, Kovid Goyal ' + +from PyQt4.Qt import QListView + +class AlternateViews(object): + + def __init__(self, main_view): + self.views = {} + self.current_view = self.main_view = main_view + self.stack = None + + def set_stack(self, stack): + self.stack = stack + self.stack.addWidget(self.main_view) + + def add_view(self, key, view): + self.views[key] = view + self.stack.addWidget(view) + self.stack.setCurrentIndex(0) + +class GridView(QListView): + pass + diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 0cb827adea..dc412fc368 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -19,6 +19,7 @@ from calibre.gui2.library.delegates import (RatingDelegate, PubDateDelegate, CcBoolDelegate, CcCommentsDelegate, CcDateDelegate, CcTemplateDelegate, CcEnumDelegate, CcNumberDelegate, LanguagesDelegate) from calibre.gui2.library.models import BooksModel, DeviceBooksModel +from calibre.gui2.library.alternate_views import AlternateViews from calibre.utils.config import tweaks, prefs from calibre.gui2 import error_dialog, gprefs from calibre.gui2.library import DEFAULT_SORT @@ -141,6 +142,7 @@ class BooksView(QTableView): # {{{ QTableView.__init__(self, parent) self.setProperty('highlight_current_item', 150) self.row_sizing_done = False + self.alternate_views = AlternateViews(self) if not tweaks['horizontal_scrolling_per_column']: self.setHorizontalScrollMode(self.ScrollPerPixel) diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index a10366c471..43963d81fd 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -927,14 +927,15 @@ class SplitterHandle(QSplitterHandle): class LayoutButton(QToolButton): - def __init__(self, icon, text, splitter, parent=None, shortcut=None): + def __init__(self, icon, text, splitter=None, parent=None, shortcut=None): QToolButton.__init__(self, parent) self.label = text self.setIcon(QIcon(icon)) self.setCheckable(True) self.splitter = splitter - splitter.state_changed.connect(self.update_state) + if splitter is not None: + splitter.state_changed.connect(self.update_state) self.setCursor(Qt.PointingHandCursor) self.shortcut = '' if shortcut: @@ -942,14 +943,13 @@ class LayoutButton(QToolButton): def set_state_to_show(self, *args): self.setChecked(False) - label =_('Show') - self.setText(label + ' ' + self.label + u' (%s)'%self.shortcut) + self.setText(_('Show %(label)s [%(shortcut)s]')%dict(label=self.label, shortcut=self.shortcut)) self.setToolTip(self.text()) self.setStatusTip(self.text()) def set_state_to_hide(self, *args): self.setChecked(True) - self.setText(_('Hide %(label)s %(shortcut)s')%dict( + self.setText(_('Hide %(label)s [%(shortcut)s]')%dict( label=self.label, shortcut=self.shortcut)) self.setToolTip(self.text()) self.setStatusTip(self.text())