Move muted/audible API to own ".audio" object

This commit is contained in:
Florian Bruhin 2018-06-11 12:07:30 +02:00
parent 1c8d470bd7
commit a1fcdbcfd1
6 changed files with 70 additions and 40 deletions

View File

@ -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

View File

@ -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)

View File

@ -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()

View File

@ -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

View File

@ -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:

View File

@ -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'] = ''