%s | %s |
Browsing books by their covers is disabled.
Import of pictureflow module failed:
')+reason)
-
class StatusBar(QStatusBar):
resized = pyqtSignal(object)
+ files_dropped = pyqtSignal(object, object)
+ show_book_info = pyqtSignal()
- def initialize(self, jobs_dialog, systray=None):
+ def initialize(self, systray=None):
self.systray = systray
self.notifier = get_notifier(systray)
- self.movie_button = MovieButton(jobs_dialog)
- self.cover_flow_button = CoverFlowButton()
- self.addPermanentWidget(self.cover_flow_button)
- self.addPermanentWidget(self.movie_button)
self.book_info = BookInfoDisplay(self.clearMessage)
self.book_info.setAcceptDrops(True)
self.scroll_area = QScrollArea()
self.scroll_area.setWidget(self.book_info)
self.scroll_area.setWidgetResizable(True)
- self.connect(self.book_info, SIGNAL('show_book_info()'), self.show_book_info)
- self.connect(self.book_info,
- SIGNAL('files_dropped(PyQt_PyObject,PyQt_PyObject)'),
- self.files_dropped, Qt.QueuedConnection)
+ self.book_info.show_book_info.connect(self.show_book_info.emit,
+ type=Qt.QueuedConnection)
+ self.book_info.files_dropped.connect(self.files_dropped.emit,
+ type=Qt.QueuedConnection)
self.addWidget(self.scroll_area, 100)
self.setMinimumHeight(120)
self.resized.connect(self.book_info.cover_display.relayout)
@@ -241,10 +191,6 @@ class StatusBar(QStatusBar):
def resizeEvent(self, ev):
self.resized.emit(self.size())
- def files_dropped(self, event, paths):
- self.emit(SIGNAL('files_dropped(PyQt_PyObject, PyQt_PyObject)'), event,
- paths)
-
def reset_info(self):
self.book_info.show_data({})
@@ -259,33 +205,4 @@ class StatusBar(QStatusBar):
self.notifier(msg)
return ret
- def jobs(self):
- src = unicode(self.movie_button.jobs.text())
- return int(re.search(r'\d+', src).group())
-
- def show_book_info(self):
- self.emit(SIGNAL('show_book_info()'))
-
- def job_added(self, nnum):
- jobs = self.movie_button.jobs
- src = unicode(jobs.text())
- num = self.jobs()
- text = src.replace(str(num), str(nnum))
- jobs.setText(text)
- self.movie_button.start()
-
- def job_done(self, nnum):
- jobs = self.movie_button.jobs
- src = unicode(jobs.text())
- num = self.jobs()
- text = src.replace(str(num), str(nnum))
- jobs.setText(text)
- if nnum == 0:
- self.no_more_jobs()
-
- def no_more_jobs(self):
- if self.movie_button.is_running:
- self.movie_button.stop()
- QCoreApplication.instance().alert(self, 5000)
-
diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py
index 441ed18a9b..b35270f963 100644
--- a/src/calibre/gui2/ui.py
+++ b/src/calibre/gui2/ui.py
@@ -262,16 +262,10 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
SIGNAL('update_found(PyQt_PyObject)'), self.update_found)
self.update_checker.start(2000)
####################### Status Bar #####################
- self.status_bar.initialize(self.jobs_dialog, self.system_tray_icon)
- #self.setStatusBar(self.status_bar)
- QObject.connect(self.job_manager, SIGNAL('job_added(int)'),
- self.status_bar.job_added, Qt.QueuedConnection)
- QObject.connect(self.job_manager, SIGNAL('job_done(int)'),
- self.status_bar.job_done, Qt.QueuedConnection)
- QObject.connect(self.status_bar, SIGNAL('show_book_info()'),
- self.show_book_info)
- QObject.connect(self.status_bar, SIGNAL('files_dropped(PyQt_PyObject,PyQt_PyObject)'),
- self.files_dropped_on_book)
+ self.status_bar.initialize(self.system_tray_icon)
+ self.status_bar.show_book_info.connect(self.show_book_info)
+ self.status_bar.files_dropped.connect(self.files_dropped_on_book)
+
####################### Setup Toolbar #####################
md = QMenu()
md.addAction(_('Edit metadata individually'))
@@ -459,6 +453,10 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'),
self.do_advanced_search)
+ for ch in self.tool_bar.children():
+ if isinstance(ch, QToolButton):
+ ch.setCursor(Qt.PointingHandCursor)
+
####################### Library view ########################
similar_menu = QMenu(_('Similar books...'))
similar_menu.addAction(self.action_books_by_same_author)
@@ -554,12 +552,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.cover_cache = CoverCache(self.library_path)
self.cover_cache.start()
self.library_view.model().cover_cache = self.cover_cache
- self.tags_view.setVisible(False)
- self.tag_match.setVisible(False)
- self.popularity.setVisible(False)
- self.restriction_label.setVisible(False)
- self.edit_categories.setVisible(False)
- self.search_restriction.setVisible(False)
self.connect(self.edit_categories, SIGNAL('clicked()'), self.do_edit_categories)
self.tags_view.set_database(db, self.tag_match, self.popularity, self.search_restriction)
self.connect(self.tags_view,
@@ -626,22 +618,28 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
if not config['separate_cover_flow']:
self.library.layout().addWidget(self.cover_flow)
self.cover_flow.currentChanged.connect(self.sync_listview_to_cf)
- self.connect(self.status_bar.cover_flow_button,
- SIGNAL('toggled(bool)'), self.toggle_cover_flow)
- self.connect(self.cover_flow, SIGNAL('stop()'),
- self.status_bar.cover_flow_button.toggle)
self.library_view.selectionModel().currentRowChanged.connect(
self.sync_cf_to_listview)
self.db_images = DatabaseImages(self.library_view.model())
self.cover_flow.setImages(self.db_images)
- else:
- self.status_bar.cover_flow_button.disable(pictureflowerror)
self._calculated_available_height = min(max_available_height()-15,
self.height())
self.resize(self.width(), self._calculated_available_height)
self.search.setMaximumWidth(self.width()-150)
+ ####################### Side Bar ###############################
+
+ self.sidebar.initialize(self.jobs_dialog, self.cover_flow,
+ self.toggle_cover_flow, pictureflowerror,
+ self.vertical_splitter, self.horizontal_splitter)
+ QObject.connect(self.job_manager, SIGNAL('job_added(int)'),
+ self.sidebar.job_added, Qt.QueuedConnection)
+ QObject.connect(self.job_manager, SIGNAL('job_done(int)'),
+ self.sidebar.job_done, Qt.QueuedConnection)
+
+
+
if config['autolaunch_server']:
from calibre.library.server import start_threaded_server
from calibre.library import server_config
@@ -668,19 +666,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.location_view.setCurrentIndex(self.location_view.model().index(0))
- if self.cover_flow is not None and dynamic.get('cover_flow_visible', False):
- self.status_bar.cover_flow_button.toggle()
-
- tb_state = dynamic.get('tag_browser_state', None)
- if tb_state is not None:
- self.horizontal_splitter.restoreState(tb_state)
- self.toggle_tags_view(True)
-
- bi_state = dynamic.get('book_info_state', None)
- if bi_state is not None:
- self.vertical_splitter.restoreState(bi_state)
- self.horizontal_splitter.initialize()
- self.vertical_splitter.initialize()
self._add_filesystem_book = Dispatcher(self.__add_filesystem_book)
v = self.library_view
@@ -782,11 +767,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
if search:
self.search.set_search_string(join.join(search))
-
-
- def uncheck_cover_button(self, *args):
- self.status_bar.cover_flow_button.setChecked(False)
-
def toggle_cover_flow(self, show):
if config['separate_cover_flow']:
if show:
@@ -802,8 +782,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.cover_flow.setFocus(Qt.OtherFocusReason)
self.library_view.scrollTo(self.library_view.currentIndex())
d.show()
- self.connect(d, SIGNAL('finished(int)'),
- self.uncheck_cover_button)
+ d.finished.connect(self.sidebar.external_cover_flow_finished)
self.cf_dialog = d
self.cover_flow_sync_timer.start(500)
else:
@@ -825,8 +804,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.library_view.currentIndex())
self.cover_flow.setVisible(True)
self.cover_flow.setFocus(Qt.OtherFocusReason)
- #self.status_bar.book_info.book_data.setMaximumHeight(100)
- #self.status_bar.setMaximumHeight(120)
self.library_view.scrollTo(self.library_view.currentIndex())
self.cover_flow_sync_timer.start(500)
else:
@@ -837,26 +814,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
sm = self.library_view.selectionModel()
sm.select(idx, sm.ClearAndSelect|sm.Rows)
self.library_view.setCurrentIndex(idx)
- #self.status_bar.book_info.book_data.setMaximumHeight(1000)
- #self.resize(self.width(), self._calculated_available_height)
- #self.setMaximumHeight(available_height())
- def toggle_tags_view(self, show):
- if show:
- self.tags_view.setVisible(True)
- self.tag_match.setVisible(True)
- self.popularity.setVisible(True)
- self.restriction_label.setVisible(True)
- self.edit_categories.setVisible(True)
- self.search_restriction.setVisible(True)
- self.tags_view.setFocus(Qt.OtherFocusReason)
- else:
- self.tags_view.setVisible(False)
- self.tag_match.setVisible(False)
- self.popularity.setVisible(False)
- self.restriction_label.setVisible(False)
- self.edit_categories.setVisible(False)
- self.search_restriction.setVisible(False)
+
'''
Handling of the count of books in a restricted view requires that
@@ -2330,6 +2289,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
view.resizeColumnsToContents()
view.resize_on_select = False
self.status_bar.reset_info()
+ self.sidebar.location_changed(location)
if location == 'library':
self.action_edit.setEnabled(True)
self.action_merge.setEnabled(True)
@@ -2337,7 +2297,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.view_menu.actions()[1].setEnabled(True)
self.action_open_containing_folder.setEnabled(True)
self.action_sync.setEnabled(True)
- self.status_bar.cover_flow_button.setEnabled(True)
for action in list(self.delete_menu.actions())[1:]:
action.setEnabled(True)
else:
@@ -2347,7 +2306,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.view_menu.actions()[1].setEnabled(False)
self.action_open_containing_folder.setEnabled(False)
self.action_sync.setEnabled(False)
- self.status_bar.cover_flow_button.setEnabled(False)
for action in list(self.delete_menu.actions())[1:]:
action.setEnabled(False)
@@ -2463,11 +2421,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
def write_settings(self):
config.set('main_window_geometry', self.saveGeometry())
dynamic.set('sort_history', self.library_view.model().sort_history)
- dynamic.set('cover_flow_visible', self.cover_flow.isVisible())
- dynamic.set('tag_browser_state',
- str(self.horizontal_splitter.saveState()))
- dynamic.set('book_info_state',
- str(self.vertical_splitter.saveState()))
+ self.sidebar.save_state()
self.library_view.write_settings()
if self.device_connected:
self.save_device_view_settings()
diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py
index e39b06ea54..db5f222408 100644
--- a/src/calibre/gui2/widgets.py
+++ b/src/calibre/gui2/widgets.py
@@ -982,6 +982,12 @@ class SplitterHandle(QSplitterHandle):
class Splitter(QSplitter):
+ state_changed = pyqtSignal(object)
+
+ def __init__(self, *args):
+ QSplitter.__init__(self, *args)
+ self.splitterMoved.connect(self.splitter_moved, type=Qt.QueuedConnection)
+
def createHandle(self):
return SplitterHandle(self.orientation(), self)
@@ -990,6 +996,22 @@ class Splitter(QSplitter):
h = self.handle(i)
if h is not None:
h.splitter_moved()
+ self.state_changed.emit(not self.is_side_index_hidden)
+
+ def splitter_moved(self, *args):
+ self.state_changed.emit(not self.is_side_index_hidden)
+
+ @property
+ def side_index(self):
+ return 0 if self.orientation() == Qt.Horizontal else 1
+
+ @property
+ def is_side_index_hidden(self):
+ sizes = list(self.sizes())
+ return sizes[self.side_index] == 0
+
+ def toggle_side_index(self):
+ self.double_clicked(None)
def double_clicked(self, handle):
sizes = list(self.sizes())
@@ -997,8 +1019,7 @@ class Splitter(QSplitter):
idx = sizes.index(0)
sizes[idx] = 80
else:
- idx = 0 if self.orientation() == Qt.Horizontal else 1
- sizes[idx] = 0
+ sizes[self.side_index] = 0
self.setSizes(sizes)
self.initialize()