From 0e40e6a4e88c17ae469ff31aa3bf2ba1e2771880 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 31 May 2023 16:30:00 -0400 Subject: [PATCH] header: Add a BackgroundRow to the popover menu And wire up the properties so we can save the user's current setting. Implements: #50 ("Background Music Mode") Signed-off-by: Anna Schumaker --- emmental/__init__.py | 2 ++ emmental/header/__init__.py | 8 ++++++++ tests/header/test_header.py | 19 +++++++++++++++++++ tests/test_settings.py | 12 ++++++++++++ 4 files changed, 41 insertions(+) diff --git a/emmental/__init__.py b/emmental/__init__.py index 114791c..8039a1c 100644 --- a/emmental/__init__.py +++ b/emmental/__init__.py @@ -129,6 +129,8 @@ class Application(Adw.Application): hdr = header.Header(sql=self.db, title=VERSION_STRING) hdr.bind_property("volume", self.player, "volume") for (setting, property) in [("audio.volume", "volume"), + ("audio.background.enabled", "bg-enabled"), + ("audio.background.volume", "bg-volume"), ("audio.replaygain.enabled", "rg-enabled"), ("audio.replaygain.mode", "rg-mode")]: self.db.settings.bind_setting(setting, hdr, property) diff --git a/emmental/header/__init__.py b/emmental/header/__init__.py index 5f1ac98..94d4df4 100644 --- a/emmental/header/__init__.py +++ b/emmental/header/__init__.py @@ -33,6 +33,8 @@ class Header(Gtk.HeaderBar): sql = GObject.Property(type=db.Connection) title = GObject.Property(type=str) subtitle = GObject.Property(type=str) + bg_enabled = GObject.Property(type=bool, default=False) + bg_volume = GObject.Property(type=float, default=0.5) rg_enabled = GObject.Property(type=bool, default=False) rg_mode = GObject.Property(type=str, default="auto") volume = GObject.Property(type=float, default=1.0) @@ -44,11 +46,13 @@ class Header(Gtk.HeaderBar): self._title = Adw.WindowTitle(title=self.title, subtitle=self.subtitle, tooltip_text=gsetup.env_string()) self._volume = volume.VolumeRow() + self._background = volume.BackgroundRow() self._replaygain = replaygain.ReplayGainRow() self._box = Gtk.ListBox(selection_mode=Gtk.SelectionMode.NONE) self._box.add_css_class("boxed-list") self._box.append(self._volume) + self._box.append(self._background) self._box.append(self._replaygain) icon = _volume_icon(self.volume) @@ -57,6 +61,10 @@ class Header(Gtk.HeaderBar): self.bind_property("title", self._title, "title") self.bind_property("subtitle", self._title, "subtitle") + self.bind_property("bg-enabled", self._background, "enabled", + GObject.BindingFlags.BIDIRECTIONAL) + self.bind_property("bg-volume", self._background, "volume", + GObject.BindingFlags.BIDIRECTIONAL) self.bind_property("rg-enabled", self._replaygain, "enabled", GObject.BindingFlags.BIDIRECTIONAL) self.bind_property("rg-mode", self._replaygain, "mode", diff --git a/tests/header/test_header.py b/tests/header/test_header.py index 58267ae..6605451 100644 --- a/tests/header/test_header.py +++ b/tests/header/test_header.py @@ -85,6 +85,23 @@ class TestHeader(tests.util.TestCase): self.assertEqual(self.header._button.get_tooltip_text(), f"volume: {i*10}%\nnormalizing: off") + def test_background_listening(self): + """Test the background listening mode.""" + self.assertIsInstance(self.header._background, + emmental.header.volume.BackgroundRow) + + self.assertFalse(self.header.bg_enabled) + self.header.bg_enabled = True + self.assertTrue(self.header._background.enabled) + self.header._background.enabled = False + self.assertFalse(self.header.bg_enabled) + + self.assertEqual(self.header.bg_volume, 0.5) + self.header.bg_volume = 0.75 + self.assertEqual(self.header._background.volume, 0.75) + self.header._background.volume = 0.25 + self.assertEqual(self.header.bg_volume, 0.25) + def test_replaygain(self): """Test that we can configure ReplayGain as expected.""" self.assertIsInstance(self.header._replaygain, @@ -124,4 +141,6 @@ class TestHeader(tests.util.TestCase): self.assertEqual(self.header._box.get_row_at_index(0), self.header._volume) self.assertEqual(self.header._box.get_row_at_index(1), + self.header._background) + self.assertEqual(self.header._box.get_row_at_index(2), self.header._replaygain) diff --git a/tests/test_settings.py b/tests/test_settings.py index 512bb4a..b29280d 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -51,6 +51,18 @@ class TestSettings(unittest.TestCase): self.assertEqual(self.app.build_header().volume, 0.5) self.assertEqual(self.player.volume, 0.5) + def test_save_background_mode(self, mock_stdout: io.StringIO): + """Check saving and loading background mode from the database.""" + self.assertFalse(self.settings["audio.background.enabled"]) + self.assertEqual(self.settings["audio.background.volume"], 0.5) + + self.win.header.bg_enabled = True + self.win.header.bg_volume = 0.75 + + win = self.app.build_window() + self.assertTrue(win.header.bg_enabled) + self.assertEqual(win.header.bg_volume, 0.75) + def test_save_replaygain(self, mock_stdout: io.StringIO): """Check saving and loading replaygain state from the database.""" self.assertFalse(self.settings["audio.replaygain.enabled"])