From a1fcdbcfd199b45e89f1d5e602e32171ff9acfa2 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 11 Jun 2018 12:07:30 +0200 Subject: [PATCH] Move muted/audible API to own ".audio" object --- qutebrowser/browser/browsertab.py | 40 +++++++++++++------ qutebrowser/browser/commands.py | 2 +- qutebrowser/browser/webengine/webenginetab.py | 34 ++++++++++------ qutebrowser/browser/webkit/webkittab.py | 26 +++++++----- qutebrowser/mainwindow/tabbedbrowser.py | 4 +- qutebrowser/mainwindow/tabwidget.py | 4 +- 6 files changed, 70 insertions(+), 40 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index c285ba764..22761b1cc 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -606,6 +606,33 @@ class AbstractElements: raise NotImplementedError +class AbstractAudio(QObject): + + """Handling of audio/muting for this tab.""" + + muted_changed = pyqtSignal(bool) + recently_audible_changed = pyqtSignal(bool) + + def __init__(self, parent=None): + super().__init__(parent) + self._widget = None + + def set_muted(self, muted: bool): + """Set this tab as muted or not.""" + raise NotImplementedError + + def is_muted(self): + """Whether this tab is muted.""" + raise NotImplementedError + + def toggle_muted(self): + self.set_muted(not self.is_muted()) + + def is_recently_audible(self): + """Whether this tab has had audio playing recently.""" + raise NotImplementedError + + class AbstractTab(QWidget): """A wrapper over the given widget to hide its API and expose another one. @@ -702,6 +729,7 @@ class AbstractTab(QWidget): self.printing._widget = widget self.action._widget = widget self.elements._widget = widget + self.audio._widget = widget self.settings._settings = widget.settings() self._install_event_filter() @@ -932,15 +960,3 @@ class AbstractTab(QWidget): def is_deleted(self): return sip.isdeleted(self._widget) - - def set_muted(self, muted: bool): - """Set this tab as muted or not.""" - raise NotImplementedError - - def is_muted(self): - """Whether this tab is muted.""" - raise NotImplementedError - - def is_recently_audible(self): - """Whether this tab has had audio playing recently.""" - raise NotImplementedError diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 796c26b39..4cdd2604b 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -2238,6 +2238,6 @@ class CommandDispatcher: if tab is None: return try: - tab.set_muted(not tab.is_muted()) + tab.audio.toggle_muted() except browsertab.WebTabError as e: raise cmdexc.CommandError(e) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index cc6f2b5ce..ff75416c5 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -617,6 +617,26 @@ class WebEngineElements(browsertab.AbstractElements): self._tab.run_js_async(js_code, js_cb) +class WebEngineAudio(browsertab.AbstractAudio): + + def _connect_signals(self): + page = self._widget.page() + page.audioMutedChanged.connect(self.muted_changed) + page.recentlyAudibleChanged.connect(self.recently_audible_changed) + + def set_muted(self, muted: bool): + page = self._widget.page() + page.setAudioMuted(muted) + + def is_muted(self): + page = self._widget.page() + return page.isAudioMuted() + + def is_recently_audible(self): + page = self._widget.page() + return page.recentlyAudible() + + class WebEngineTab(browsertab.AbstractTab): """A QtWebEngine tab in the browser. @@ -643,6 +663,7 @@ class WebEngineTab(browsertab.AbstractTab): self.printing = WebEnginePrinting() self.elements = WebEngineElements(tab=self) self.action = WebEngineAction(tab=self) + self.audio = WebEngineAudio() # We're assigning settings in _set_widget self.settings = webenginesettings.WebEngineSettings(settings=None) self._set_widget(widget) @@ -1141,18 +1162,7 @@ class WebEngineTab(browsertab.AbstractTab): page.loadFinished.connect(self._on_load_finished) self.predicted_navigation.connect(self._on_predicted_navigation) + self.audio._connect_signals() # pylint: disable=protected-access def event_target(self): return self._widget.render_widget() - - def set_muted(self, muted: bool): - page = self._widget.page() - page.setAudioMuted(muted) - - def is_muted(self): - page = self._widget.page() - return page.isAudioMuted() - - def is_recently_audible(self): - page = self._widget.page() - return page.recentlyAudible() diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 1681bffdb..1f178a032 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -651,6 +651,20 @@ class WebKitElements(browsertab.AbstractElements): callback(elem) +class WebKitAudio(browsertab.AbstractAudio): + + """Dummy handling of audio status for QtWebKit.""" + + def set_muted(self, muted: bool): + raise browsertab.WebTabError('Muting is not supported on QtWebKit!') + + def is_muted(self): + return False + + def is_recently_audible(self): + return False + + class WebKitTab(browsertab.AbstractTab): """A QtWebKit tab in the browser.""" @@ -671,6 +685,7 @@ class WebKitTab(browsertab.AbstractTab): self.printing = WebKitPrinting() self.elements = WebKitElements(tab=self) self.action = WebKitAction(tab=self) + self.audio = WebKitAudio() # We're assigning settings in _set_widget self.settings = webkitsettings.WebKitSettings(settings=None) self._set_widget(widget) @@ -839,14 +854,3 @@ class WebKitTab(browsertab.AbstractTab): def event_target(self): return self._widget - - def set_muted(self, muted: bool): - raise browsertab.WebTabError('Muting is not supported on QtWebKit!') - - def is_muted(self): - # Dummy value for things that read muted status - return False - - def is_recently_audible(self): - # Dummy value for things that read audible status - return False diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 27d2581f0..6b4e16950 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -238,9 +238,9 @@ class TabbedBrowser(QWidget): functools.partial(self.on_window_close_requested, tab)) tab.renderer_process_terminated.connect( functools.partial(self._on_renderer_process_terminated, tab)) - tab.audio_muted_changed.connect( + tab.audio.muted_changed.connect( functools.partial(self._on_audio_changed, tab)) - tab.recently_audible_changed.connect( + tab.audio.recently_audible_changed.connect( functools.partial(self._on_audio_changed, tab)) tab.new_tab_requested.connect(self.tabopen) if not self.private: diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py index 8540ef24a..ac81eba29 100644 --- a/qutebrowser/mainwindow/tabwidget.py +++ b/qutebrowser/mainwindow/tabwidget.py @@ -174,9 +174,9 @@ class TabWidget(QTabWidget): fields['backend'] = objects.backend.name fields['private'] = ' [Private Mode] ' if tab.private else '' try: - if tab.is_muted(): + if tab.audio.is_muted(): fields['audio'] = '[M] ' - elif tab.is_recently_audible(): + elif tab.audio.is_recently_audible(): fields['audio'] = '[A] ' else: fields['audio'] = ''