diff --git a/emmental/header/__init__.py b/emmental/header/__init__.py index 94d4df4..773455e 100644 --- a/emmental/header/__init__.py +++ b/emmental/header/__init__.py @@ -46,18 +46,24 @@ class Header(Gtk.HeaderBar): self._title = Adw.WindowTitle(title=self.title, subtitle=self.subtitle, tooltip_text=gsetup.env_string()) self._volume = volume.VolumeRow() + self._volume_icon = Gtk.Image(icon_name=_volume_icon(self.volume)) self._background = volume.BackgroundRow() + self._background_icon = Gtk.Image(icon_name="sound-wave") self._replaygain = replaygain.ReplayGainRow() + self._icons = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 6) + self._icons.append(self._volume_icon) + self._icons.append(self._background_icon) + 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) self._button = buttons.PopoverButton(popover_child=self._box, - icon_name=icon) + child=self._icons, + has_frame=False, margin_end=6) self.bind_property("title", self._title, "title") self.bind_property("subtitle", self._title, "subtitle") @@ -92,11 +98,19 @@ class Header(Gtk.HeaderBar): def __notify(self, header: typing.Self, param: GObject.ParamSpec) -> None: match param.name: + case "bg-enabled": + icon = "sound-wave-alt" if self.bg_enabled else "sound-wave" + self._background_icon.set_from_icon_name(icon) case "volume": - self._button.set_icon_name(_volume_icon(self.volume)) + self._volume_icon.set_from_icon_name(_volume_icon(self.volume)) + + bg_status = "off" + if self.bg_enabled: + bg_status = f"{round(self.bg_volume * 100)}%" rg_status = f"{self.rg_mode} mode" if self.rg_enabled else "off" status = (f"volume: {round(self.volume * 100)}%\n" + f"background listening: {bg_status}\n" f"normalizing: {rg_status}") self._button.set_tooltip_text(status) diff --git a/icons/scalable/actions/sound-wave-alt-symbolic.svg b/icons/scalable/actions/sound-wave-alt-symbolic.svg new file mode 100644 index 0000000..9dd83d9 --- /dev/null +++ b/icons/scalable/actions/sound-wave-alt-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/icons/scalable/actions/sound-wave-symbolic.svg b/icons/scalable/actions/sound-wave-symbolic.svg new file mode 100644 index 0000000..cc4ddbe --- /dev/null +++ b/icons/scalable/actions/sound-wave-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/tests/header/test_header.py b/tests/header/test_header.py index 6605451..97ae9d0 100644 --- a/tests/header/test_header.py +++ b/tests/header/test_header.py @@ -62,6 +62,19 @@ class TestHeader(tests.util.TestCase): self.header._settings.emit("clicked") mock_present.assert_called() + def test_volume_icons(self): + """Check that the volume icons box is set up properly.""" + self.assertIsInstance(self.header._icons, Gtk.Box) + self.assertIsInstance(self.header._volume_icon, Gtk.Image) + self.assertIsInstance(self.header._background_icon, Gtk.Image) + + self.assertEqual(self.header._icons.get_spacing(), 6) + + self.assertEqual(self.header._icons.get_first_child(), + self.header._volume_icon) + self.assertEqual(self.header._volume_icon.get_next_sibling(), + self.header._background_icon) + def test_volume(self): """Check that volume widgets work as expected.""" self.assertIsInstance(self.header._volume, @@ -80,27 +93,46 @@ class TestHeader(tests.util.TestCase): widget.volume = vol self.assertEqual(self.header.volume, vol) self.assertEqual(self.header._volume.volume, vol) - self.assertEqual(self.header._button.get_icon_name(), + self.assertEqual(self.header._volume_icon.get_icon_name(), f"audio-volume-{icon}-symbolic") self.assertEqual(self.header._button.get_tooltip_text(), - f"volume: {i*10}%\nnormalizing: off") + f"volume: {i*10}%\n" + "background listening: off\nnormalizing: off") def test_background_listening(self): """Test the background listening mode.""" self.assertIsInstance(self.header._background, emmental.header.volume.BackgroundRow) + self.assertEqual(self.header._background_icon.get_icon_name(), + "sound-wave") self.assertFalse(self.header.bg_enabled) + self.assertEqual(self.header.bg_volume, 0.5) + 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._background_icon.get_icon_name(), + "sound-wave-alt") + self.assertEqual(self.header._button.get_tooltip_text(), + "volume: 100%\nbackground listening: 50%\n" + "normalizing: off") - self.assertEqual(self.header.bg_volume, 0.5) self.header.bg_volume = 0.75 self.assertEqual(self.header._background.volume, 0.75) + self.assertEqual(self.header._button.get_tooltip_text(), + "volume: 100%\nbackground listening: 75%\n" + "normalizing: off") + self.header._background.volume = 0.25 self.assertEqual(self.header.bg_volume, 0.25) + self.assertEqual(self.header._button.get_tooltip_text(), + "volume: 100%\nbackground listening: 25%\n" + "normalizing: off") + + self.header._background.enabled = False + self.assertFalse(self.header.bg_enabled) + self.assertEqual(self.header._background_icon.get_icon_name(), + "sound-wave") def test_replaygain(self): """Test that we can configure ReplayGain as expected.""" @@ -114,23 +146,27 @@ class TestHeader(tests.util.TestCase): self.assertTrue(self.header._replaygain.enabled) self.assertEqual(self.header._replaygain.mode, "track") self.assertEqual(self.header._button.get_tooltip_text(), - "volume: 100%\nnormalizing: track mode") + "volume: 100%\nbackground listening: off\n" + "normalizing: track mode") self.header._replaygain.enabled = False self.header._replaygain.mode = "album" self.assertFalse(self.header.rg_enabled) self.assertEqual(self.header.rg_mode, "album") self.assertEqual(self.header._button.get_tooltip_text(), - "volume: 100%\nnormalizing: off") + "volume: 100%\nbackground listening: off\n" + "normalizing: off") def test_popover_button(self): """Check that the menu popover button was set up correctly.""" self.assertIsInstance(self.header._button, emmental.buttons.PopoverButton) - self.assertEqual(self.header._button.get_icon_name(), - "audio-volume-high-symbolic") self.assertEqual(self.header._button.popover_child, self.header._box) + self.assertEqual(self.header._button.get_child(), self.header._icons) + self.assertEqual(self.header._button.get_margin_end(), 6) + self.assertFalse(self.header._button.get_has_frame()) + def test_popover_child(self): """Check that the menu popover button child was set up correctly.""" self.assertIsInstance(self.header._box, Gtk.ListBox)