diff --git a/emmental/header/__init__.py b/emmental/header/__init__.py index 8f90f6c..4457b39 100644 --- a/emmental/header/__init__.py +++ b/emmental/header/__init__.py @@ -55,6 +55,10 @@ class Header(Gtk.HeaderBar): self._menu_box.add_css_class("boxed-list") self._menu_box.append(self._open) + if __debug__: + self._settings = settings.Row(sql) + self._menu_box.append(self._settings) + icon = "open-menu-symbolic" self._menu_button = buttons.PopoverButton(popover_child=self._menu_box, icon_name=icon) @@ -95,12 +99,6 @@ class Header(Gtk.HeaderBar): GObject.BindingFlags.BIDIRECTIONAL) self.pack_start(self._show_sidebar) - if __debug__: - self._window = settings.Window(sql) - self._settings = Gtk.Button(icon_name="settings-symbolic", - tooltip_text="open settings editor") - self._settings.connect("clicked", self.__run_settings) - self.pack_start(self._settings) self.pack_start(self._menu_button) self.pack_end(self._vol_button) diff --git a/emmental/header/settings.py b/emmental/header/settings.py index 37544c0..bd026de 100644 --- a/emmental/header/settings.py +++ b/emmental/header/settings.py @@ -64,3 +64,21 @@ class Window(Adw.Window): def __filter(self, entry: entry.Filter) -> None: self._selection.get_model().filter(entry.get_query()) + + +class Row(Adw.ActionRow): + """An Adw.ActionRow for opening the Settings Window.""" + + def __init__(self, sql: db.Connection): + """Initialize our settings ActionRow.""" + super().__init__(activatable=True, title="Edit Settings", + subtitle="Open the settings editor (debug only)") + self._prefix = Gtk.Image(icon_name="settings-symbolic") + self._window = Window(sql) + + self.connect("activated", self.__on_activated) + self.add_prefix(self._prefix) + + def __on_activated(self, row: Adw.ActionRow) -> None: + self.get_ancestor(Gtk.Popover).popdown() + self._window.present() diff --git a/tests/header/test_header.py b/tests/header/test_header.py index dcadb49..23fe2f6 100644 --- a/tests/header/test_header.py +++ b/tests/header/test_header.py @@ -63,21 +63,11 @@ class TestHeader(tests.util.TestCase): signal.assert_called_with(self.header, pathlib.Path("/a/b/c/1.ogg")) def test_settings(self): - """Check that the Settings window is set up correctly.""" - self.assertIsInstance(self.header._settings, Gtk.Button) - self.assertIsInstance(self.header._window, - emmental.header.settings.Window) - - self.assertEqual(self.header.sql, self.sql) - self.assertEqual(self.header._settings.get_icon_name(), - "settings-symbolic") - self.assertEqual(self.header._settings.get_tooltip_text(), - "open settings editor") - - with unittest.mock.patch.object(self.header._window, - "present") as mock_present: - self.header._settings.emit("clicked") - mock_present.assert_called() + """Check that the SettingsRow is set up correctly.""" + self.assertIsInstance(self.header._settings, + emmental.header.settings.Row) + self.assertEqual(self.header._menu_box.get_row_at_index(1), + self.header._settings) def test_menu_button(self): """Check that the menu popover button is set up properly.""" diff --git a/tests/header/test_settings.py b/tests/header/test_settings.py index d910dc0..09a7b6c 100644 --- a/tests/header/test_settings.py +++ b/tests/header/test_settings.py @@ -141,3 +141,39 @@ class TestWindow(tests.util.TestCase): emmental.header.settings.ValueRow) self.assertEqual(columns[1].get_title(), "Value") self.assertEqual(columns[1].get_fixed_width(), 100) + + +class TestSettingsRow(tests.util.TestCase): + """Test the SettingsRow.""" + + def setUp(self): + """Set up common variables.""" + super().setUp() + self.row = emmental.header.settings.Row(sql=self.sql) + + def test_init(self): + """Test that the SettingsRow was set up properly.""" + self.assertIsInstance(self.row, Adw.ActionRow) + self.assertIsInstance(self.row._prefix, Gtk.Image) + self.assertIsInstance(self.row._window, + emmental.header.settings.Window) + + self.assertEqual(self.row.props.title, "Edit Settings") + self.assertEqual(self.row.props.subtitle, + "Open the settings editor (debug only)") + self.assertTrue(self.row.props.activatable) + + self.assertEqual(self.row._prefix.props.icon_name, "settings-symbolic") + + def test_activate(self): + """Test activating a SettingsRow.""" + listbox = Gtk.ListBox() + popover = Gtk.Popover(child=listbox) + listbox.append(self.row) + + with unittest.mock.patch.object(popover, "popdown") as mock_popdown: + with unittest.mock.patch.object(self.row._window, + "present") as mock_present: + self.row.emit("activated") + mock_popdown.assert_called() + mock_present.assert_called()