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 <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2023-05-31 16:30:00 -04:00
parent deea9caa37
commit 0e40e6a4e8
4 changed files with 41 additions and 0 deletions

View File

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

View File

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

View File

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

View File

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