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:
parent
3f28799437
commit
bb1d01f951
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue