diff --git a/src/calibre/gui2/tweak_book/preview.py b/src/calibre/gui2/tweak_book/preview.py index bbc6e9b01e..eabf1e22c9 100644 --- a/src/calibre/gui2/tweak_book/preview.py +++ b/src/calibre/gui2/tweak_book/preview.py @@ -11,9 +11,9 @@ from threading import Thread from Queue import Queue, Empty from PyQt4.Qt import ( - QWidget, QVBoxLayout, QApplication, QSize, QNetworkAccessManager, + QWidget, QVBoxLayout, QApplication, QSize, QNetworkAccessManager, QMenu, QIcon, QNetworkReply, QTimer, QNetworkRequest, QUrl, Qt, QNetworkDiskCache, QToolBar) -from PyQt4.QtWebKit import QWebView +from PyQt4.QtWebKit import QWebView, QWebInspector from calibre import prints from calibre.constants import iswindows @@ -221,6 +221,7 @@ class WebView(QWebView): def __init__(self, parent=None): QWebView.__init__(self, parent) + self.inspector = QWebInspector(self) w = QApplication.instance().desktop().availableGeometry(self).width() self._size_hint = QSize(int(w/3), int(w/2)) settings = self.page().settings() @@ -260,6 +261,17 @@ class WebView(QWebView): def clear(self): self.setHtml('
') + def inspect(self): + self.inspector.parent().show() + self.inspector.parent().raise_() + self.pageAction(self.page().InspectElement).trigger() + + def contextMenuEvent(self, ev): + menu = QMenu(self) + menu.addAction(actions['reload-preview']) + menu.addAction(QIcon(I('debug.png')), _('Inspect element'), self.inspect) + menu.exec_(ev.globalPos()) + class Preview(QWidget): def __init__(self, parent=None): @@ -268,6 +280,8 @@ class Preview(QWidget): self.setLayout(l) l.setContentsMargins(0, 0, 0, 0) self.view = WebView(self) + self.inspector = self.view.inspector + self.inspector.setPage(self.view.page()) l.addWidget(self.view) self.bar = QToolBar(self) l.addWidget(self.bar) @@ -283,6 +297,8 @@ class Preview(QWidget): ac.triggered.connect(self.refresh) self.bar.addAction(ac) + actions['preview-dock'].toggled.connect(self.visibility_changed) + self.current_name = None self.last_sync_request = None self.refresh_timer = QTimer(self) @@ -313,8 +329,12 @@ class Preview(QWidget): def clear(self): self.view.clear() + @property + def is_visible(self): + return actions['preview-dock'].isChecked() + def start_refresh_timer(self): - if actions['auto-reload-preview'].isChecked(): + if self.is_visible and actions['auto-reload-preview'].isChecked(): self.refresh_timer.start(tprefs['preview_refresh_time'] * 1000) def stop_refresh_timer(self): @@ -324,3 +344,8 @@ class Preview(QWidget): actions['auto-reload-preview'].setToolTip(_( 'Auto reload preview when text changes in editor') if not checked else _( 'Disable auto reload of preview')) + + def visibility_changed(self, is_visible): + if is_visible: + self.refresh() + diff --git a/src/calibre/gui2/tweak_book/ui.py b/src/calibre/gui2/tweak_book/ui.py index 1ff98cecd4..56a58fc95b 100644 --- a/src/calibre/gui2/tweak_book/ui.py +++ b/src/calibre/gui2/tweak_book/ui.py @@ -195,8 +195,9 @@ class Main(MainWindow): self.boss.polish, 'smarten_punctuation', _('Smarten punctuation')), 'smarten-punctuation', (), _('Smarten punctuation')) # Preview actions + group = _('Preview') self.action_auto_reload_preview = reg('auto-reload.png', _('Auto reload preview'), None, 'auto-reload-preview', (), _('Auto reload preview')) - self.action_reload_preview = reg('view-refresh.png', _('Refresh preview'), None, 'reload-preview', (), _('Refresh preview')) + self.action_reload_preview = reg('view-refresh.png', _('Refresh preview'), None, 'reload-preview', ('F5', 'Ctrl+R'), _('Refresh preview')) def create_menubar(self): b = self.menuBar() @@ -239,20 +240,37 @@ class Main(MainWindow): b.addAction(self.action_smarten_punctuation) def create_docks(self): - self.file_list_dock = d = QDockWidget(_('&Files Browser'), self) - d.setObjectName('file_list_dock') # Needed for saveState + + def create(name, oname): + oname += '-dock' + d = QDockWidget(name, self) + d.setObjectName(oname) # Needed for saveState + ac = d.toggleViewAction() + desc = _('Toggle %s') % name.replace('&', '') + self.keyboard.register_shortcut( + oname, desc, description=desc, action=ac, group=_('Windows')) + actions[oname] = ac + setattr(self, oname.replace('-', '_'), d) + return d + + d = create(_('&Files Browser'), 'files-browser') d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.file_list = FileListWidget(d) d.setWidget(self.file_list) self.addDockWidget(Qt.LeftDockWidgetArea, d) - self.preview_dock = d = QDockWidget(_('File &Preview'), self) - d.setObjectName('file_preview') # Needed for saveState + d = create(_('File &Preview'), 'preview') d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.preview = Preview(d) d.setWidget(self.preview) self.addDockWidget(Qt.RightDockWidgetArea, d) + d = create(_('&Inspector'), 'inspector') + d.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.BottomDockWidgetArea | Qt.TopDockWidgetArea) + d.setWidget(self.preview.inspector) + self.preview.inspector.setParent(d) + self.addDockWidget(Qt.BottomDockWidgetArea, d) + def resizeEvent(self, ev): self.blocking_job.resize(ev.size()) return super(Main, self).resizeEvent(ev) @@ -282,3 +300,5 @@ class Main(MainWindow): state = tprefs.get('main_window_state', None) if state is not None: self.restoreState(state, self.STATE_VERSION) + # We never want to start with the inspector showing + self.inspector_dock.close()