sidebar: Create a Stack with pages
Additionally, we save the current page when it is changed and restore on startup. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
31695863de
commit
16038a16f1
|
@ -0,0 +1,37 @@
|
|||
# Copyright 2021 (c) Anna Schumaker.
|
||||
import db
|
||||
import lib
|
||||
from gi.repository import GObject
|
||||
from gi.repository import Gtk
|
||||
from . import view
|
||||
|
||||
class Stack(Gtk.Stack):
|
||||
def __init__(self):
|
||||
Gtk.Stack.__init__(self)
|
||||
self.set_transition_type(Gtk.StackTransitionType.OVER_UP_DOWN)
|
||||
self.set_vexpand(True)
|
||||
|
||||
self.add_page(db.user.Table, "Playlists", "audio-x-generic")
|
||||
self.add_page(db.artist.Table, "Artists", "avatar-default-symbolic")
|
||||
self.add_page(db.genre.Table, "Genres", "emblem-generic")
|
||||
self.add_page(db.decade.Table, "Decades", "x-office-calendar")
|
||||
self.add_page(db.library.Table, "Libraries", "folder-music")
|
||||
|
||||
lib.settings.initialize("sidebar.page", "Playlists")
|
||||
self.set_visible_child_name(lib.settings.get("sidebar.page"))
|
||||
self.connect("notify::visible-child-name", self.change_page)
|
||||
|
||||
def add_page(self, table, name, icon):
|
||||
window = view.TableWindow(table)
|
||||
self.add_named(window, name).set_icon_name(icon)
|
||||
window.get_selection().connect("selection-changed", self.selection_changed)
|
||||
|
||||
def change_page(self, stack, param):
|
||||
lib.settings.set("sidebar.page", self.get_visible_child_name())
|
||||
self.emit("playlist-changed", self.get_visible_child().get_selected_playlist())
|
||||
|
||||
def selection_changed(self, selection, pos, n_items):
|
||||
self.emit("playlist-changed", selection.get_selected_playlist())
|
||||
|
||||
@GObject.Signal(arg_types=(db.playlist.Playlist,))
|
||||
def playlist_changed(self, plist): pass
|
|
@ -0,0 +1,75 @@
|
|||
# Copyright 2021 (c) Anna Schumaker.
|
||||
import db
|
||||
import lib
|
||||
import unittest
|
||||
from gi.repository import Gtk
|
||||
from . import stack
|
||||
from . import view
|
||||
|
||||
class TestStack(unittest.TestCase):
|
||||
def playlist_changed(self, stack, playlist):
|
||||
self.changed = playlist
|
||||
|
||||
def test_init(self):
|
||||
s = stack.Stack()
|
||||
self.assertIsInstance(s, Gtk.Stack)
|
||||
self.assertTrue(s.get_vexpand())
|
||||
self.assertEqual(s.get_transition_type(),
|
||||
Gtk.StackTransitionType.OVER_UP_DOWN)
|
||||
|
||||
def test_pages(self):
|
||||
s = stack.Stack()
|
||||
|
||||
child = s.get_child_by_name("Playlists")
|
||||
self.assertIsInstance(child, view.TableWindow)
|
||||
self.assertEqual(child.get_table(), db.user.Table)
|
||||
self.assertEqual(s.get_page(child).get_icon_name(), "audio-x-generic")
|
||||
|
||||
child = s.get_child_by_name("Artists")
|
||||
self.assertIsInstance(child, view.TableWindow)
|
||||
self.assertEqual(child.get_table(), db.artist.Table)
|
||||
self.assertEqual(s.get_page(child).get_icon_name(), "avatar-default-symbolic")
|
||||
|
||||
child = s.get_child_by_name("Genres")
|
||||
self.assertIsInstance(child, view.TableWindow)
|
||||
self.assertEqual(child.get_table(), db.genre.Table)
|
||||
self.assertEqual(s.get_page(child).get_icon_name(), "emblem-generic")
|
||||
|
||||
child = s.get_child_by_name("Decades")
|
||||
self.assertIsInstance(child, view.TableWindow)
|
||||
self.assertEqual(child.get_table(), db.decade.Table)
|
||||
self.assertEqual(s.get_page(child).get_icon_name(), "x-office-calendar")
|
||||
|
||||
child = s.get_child_by_name("Libraries")
|
||||
self.assertIsInstance(child, view.TableWindow)
|
||||
self.assertEqual(child.get_table(), db.library.Table)
|
||||
self.assertEqual(s.get_page(child).get_icon_name(), "folder-music")
|
||||
|
||||
def test_change_page(self):
|
||||
lib.settings.reset()
|
||||
genre = db.genre.Table.find("Test Genre")
|
||||
s = stack.Stack()
|
||||
s.connect("playlist-changed", self.playlist_changed)
|
||||
|
||||
self.assertEqual(lib.settings.get("sidebar.page"), "Playlists")
|
||||
self.assertEqual(s.get_visible_child_name(), "Playlists")
|
||||
s.set_visible_child(s.get_child_by_name("Genres"))
|
||||
self.assertEqual(lib.settings.get("sidebar.page"), "Genres")
|
||||
self.assertEqual(self.changed, genre)
|
||||
|
||||
s2 = stack.Stack()
|
||||
self.assertEqual(s2.get_visible_child_name(), "Genres")
|
||||
|
||||
def test_change_selected(self):
|
||||
g1 = db.genre.Table.find("Test Genre")
|
||||
g2 = db.genre.Table.find("Test Genre 2")
|
||||
s = stack.Stack()
|
||||
|
||||
child = s.get_child_by_name("Genres")
|
||||
s.set_visible_child(child)
|
||||
s.connect("playlist-changed", self.playlist_changed)
|
||||
|
||||
child.get_selection().set_selected(1)
|
||||
self.assertEqual(self.changed, g2)
|
||||
child.get_selection().set_selected(0)
|
||||
self.assertEqual(self.changed, g1)
|
Loading…
Reference in New Issue