header: Add ReplayGain selector to the Header

And modify the Application to store ReplayGain settings in the database.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2022-05-31 10:18:53 -04:00
parent 3f28799437
commit bb1d01f951
4 changed files with 51 additions and 1 deletions

View File

@ -31,7 +31,10 @@ class Application(Adw.Application):
def build_header(self) -> header.Header:
"""Build a new header instance."""
hdr = header.Header(sql=self.db, title=VERSION_STRING)
self.db.settings.bind_setting("audio.volume", hdr, "volume")
for (setting, property) in [("audio.volume", "volume"),
("audio.replaygain.enabled", "rg-enabled"),
("audio.replaygain.mode", "rg-mode")]:
self.db.settings.bind_setting(setting, hdr, property)
return hdr
def build_window(self) -> window.Window:

View File

@ -5,6 +5,7 @@ from gi.repository import Gtk
from gi.repository import Adw
from .. import db
from .. import buttons
from . import replaygain
from . import volume
if __debug__:
from . import settings
@ -28,6 +29,8 @@ class Header(Gtk.HeaderBar):
sql = GObject.Property(type=db.Connection)
title = GObject.Property(type=str)
subtitle = GObject.Property(type=str)
rg_enabled = GObject.Property(type=bool, default=False)
rg_mode = GObject.Property(type=str, default="auto")
volume = GObject.Property(type=float, default=1.0)
def __init__(self, sql: db.Connection, title: str):
@ -35,9 +38,12 @@ class Header(Gtk.HeaderBar):
super().__init__(title=title, subtitle=SUBTITLE, sql=sql)
self._title = Adw.WindowTitle(title=self.title, subtitle=self.subtitle)
self._volume = volume.Controls()
self._replaygain = replaygain.Selector()
self._box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
self._box.append(self._volume)
self._box.append(Gtk.Separator())
self._box.append(self._replaygain)
icon = _volume_icon(self.volume)
self._button = buttons.PopoverButton(popover_child=self._box,
@ -45,6 +51,10 @@ class Header(Gtk.HeaderBar):
self.bind_property("title", self._title, "title")
self.bind_property("subtitle", self._title, "subtitle")
self.bind_property("rg-enabled", self._replaygain, "enabled",
GObject.BindingFlags.BIDIRECTIONAL)
self.bind_property("rg-mode", self._replaygain, "mode",
GObject.BindingFlags.BIDIRECTIONAL)
self.bind_property("volume", self._volume, "volume",
GObject.BindingFlags.BIDIRECTIONAL)

View File

@ -68,6 +68,23 @@ class TestHeader(tests.util.TestCase):
self.assertEqual(self.header._button.get_icon_name(),
f"audio-volume-{icon}-symbolic")
def test_replaygain(self):
"""Test that we can configure ReplayGain as expected."""
self.assertIsInstance(self.header._replaygain,
emmental.header.replaygain.Selector)
self.assertFalse(self.header.rg_enabled)
self.assertEqual(self.header.rg_mode, "auto")
self.header.rg_enabled = True
self.header.rg_mode = "track"
self.assertTrue(self.header._replaygain.enabled)
self.assertEqual(self.header._replaygain.mode, "track")
self.header._replaygain.enabled = False
self.header._replaygain.mode = "album"
self.assertFalse(self.header.rg_enabled)
self.assertEqual(self.header.rg_mode, "album")
def test_popover(self):
"""Check that the menu popover was set up correctly."""
self.assertIsInstance(self.header._button,
@ -83,3 +100,8 @@ class TestHeader(tests.util.TestCase):
self.assertEqual(self.header._button.popover_child, self.header._box)
self.assertEqual(self.header._box.get_first_child(),
self.header._volume)
sep = self.header._volume.get_next_sibling()
self.assertIsInstance(sep, Gtk.Separator)
self.assertEqual(sep.get_orientation(), Gtk.Orientation.HORIZONTAL)
self.assertEqual(sep.get_next_sibling(), self.header._replaygain)

View File

@ -40,3 +40,18 @@ class TestSettings(unittest.TestCase):
self.assertEqual(self.settings["audio.volume"], 0.5)
self.assertEqual(self.app.build_header().volume, 0.5)
def test_save_replaygain(self):
"""Check saving and loading replaygain state from the database."""
self.assertFalse(self.settings["audio.replaygain.enabled"])
self.assertEqual(self.settings["audio.replaygain.mode"], "auto")
self.win.header.rg_enabled = True
self.assertTrue(self.settings["audio.replaygain.enabled"])
self.win.header.rg_mode = "track"
self.assertEqual(self.settings["audio.replaygain.mode"], "track")
header = self.app.build_header()
self.assertTrue(header.rg_enabled)
self.assertEqual(header.rg_mode, "track")