curds: Rename ManagerModel to NodeTreeModel

This reflects how we're using the custom model to display the playlist
node tree.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-04-22 11:00:05 -04:00
parent 8f6be9b6f5
commit b49e81f580
7 changed files with 114 additions and 114 deletions

View File

@ -415,7 +415,7 @@ audio-volume-medium-symbolic</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkSearchEntry" id="playlist_search">
<object class="GtkSearchEntry" id="node_search">
<property name="can_focus">True</property>
<property name="margin_left">10</property>
<property name="margin_right">10</property>
@ -450,7 +450,7 @@ audio-volume-medium-symbolic</property>
<property name="can_focus">True</property>
<property name="vexpand">True</property>
<child>
<object class="GtkTreeView" id="manager_treeview">
<object class="GtkTreeView" id="node_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
@ -841,6 +841,22 @@ audio-volume-medium-symbolic</property>
</object>
</child>
</object>
<object class="GtkPopover" id="node_regex_popover">
<property name="can_focus">False</property>
<property name="relative_to">node_search</property>
<property name="position">right</property>
<property name="modal">False</property>
<child>
<object class="GtkLabel" id="node_regex_error">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
</child>
<style>
<class name="tooltip"/>
</style>
</object>
<object class="GtkPopover" id="pause_popover">
<property name="can_focus">False</property>
<property name="relative_to">pause_entry</property>
@ -854,20 +870,4 @@ audio-volume-medium-symbolic</property>
</object>
</child>
</object>
<object class="GtkPopover" id="playlist_regex_popover">
<property name="can_focus">False</property>
<property name="relative_to">playlist_search</property>
<property name="position">right</property>
<property name="modal">False</property>
<child>
<object class="GtkLabel" id="playlist_regex_error">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
</child>
<style>
<class name="tooltip"/>
</style>
</object>
</interface>

View File

@ -1,12 +1,12 @@
# Copyright 2019 (c) Anna Schumaker.
from . import gst
from . import gtk
from . import manager
from . import node
from . import playlist
Application = gtk.Application
Audio = gst.Audio
MgrModel = manager.MgrModel
MgrTreeview = manager.Treeview
PlistModel = playlist.PlistModel
PlTreeview = playlist.Treeview
Application = gtk.Application
Audio = gst.Audio
NodeModel = node.NodeModel
NodeTreeview = node.Treeview
PlistModel = playlist.PlistModel
PlTreeview = playlist.Treeview

View File

@ -11,7 +11,7 @@ Builder.add_from_file("emmental.ui")
UpArrow = Builder.get_object("up_arrow")
DownArrow = Builder.get_object("down_arrow")
PauseBox = Builder.get_object("pause_box")
PlistSearch = Builder.get_object("playlist_search")
NodeSearch = Builder.get_object("node_search")
ShowMore = Builder.get_object("show_more")
TrackSearch = Builder.get_object("track_search")
Window = Builder.get_object("window")
@ -73,11 +73,11 @@ def show_more_toggled(self, *args):
UpArrow.set_visible(active)
DownArrow.set_visible(not active)
PauseBox.set_visible(active)
PlistSearch.set_visible(active)
NodeSearch.set_visible(active)
TrackSearch.set_visible(active)
ShowMore.connect("toggled", show_more_toggled)
PlistSearch.connect("can-activate-accel", can_activate_entry)
NodeSearch.connect("can-activate-accel", can_activate_entry)
TrackSearch.connect("can-activate-accel", can_activate_entry)
Application = EmmentalApplication()

View File

@ -6,7 +6,7 @@ import os
import re
from gi.repository import GObject, Gtk, GLib
class ManagerModel(GObject.GObject, Gtk.TreeModel):
class NodeTreeModel(GObject.GObject, Gtk.TreeModel):
def __init__(self, *args, **kwargs):
GObject.GObject.__init__(self)
@ -182,18 +182,18 @@ LibraryCancel = gtk.Builder.get_object("library_cancel")
LibraryChooser = gtk.Builder.get_object("library_chooser")
LibraryOk = gtk.Builder.get_object("library_ok")
LibraryPopover = gtk.Builder.get_object("library_popover")
MgrModel = ManagerModel()
Treeview = gtk.Builder.get_object("manager_treeview")
SearchPopover = gtk.Builder.get_object("playlist_regex_popover")
SearchError = gtk.Builder.get_object("playlist_regex_error")
NodeModel = NodeTreeModel()
Treeview = gtk.Builder.get_object("node_treeview")
SearchPopover = gtk.Builder.get_object("node_regex_popover")
SearchError = gtk.Builder.get_object("node_regex_error")
LibraryAdd.connect("clicked", library_add_clicked)
LibraryCancel.connect("clicked", library_cancel_clicked)
LibraryOk.connect("clicked", library_ok_clicked)
Treeview.set_model(MgrModel.filter)
Treeview.get_selection().set_select_function(MgrModel.can_select_path)
Treeview.get_selection().connect("changed", MgrModel.on_selection_changed)
Treeview.connect("row-activated", MgrModel.on_row_activated)
Treeview.set_model(NodeModel.filter)
Treeview.get_selection().set_select_function(NodeModel.can_select_path)
Treeview.get_selection().connect("changed", NodeModel.on_selection_changed)
Treeview.connect("row-activated", NodeModel.on_row_activated)
gtk.PlistSearch.connect("search-changed", MgrModel.set_filter_text)
gtk.NodeSearch.connect("search-changed", NodeModel.set_filter_text)

View File

@ -48,13 +48,13 @@ class TestGtk(unittest.TestCase):
self.assertIsInstance(gtk.UpArrow, Gtk.Image)
self.assertIsInstance(gtk.DownArrow, Gtk.Image)
self.assertIsInstance(gtk.PauseBox, Gtk.Box)
self.assertIsInstance(gtk.PlistSearch, Gtk.SearchEntry)
self.assertIsInstance(gtk.NodeSearch, Gtk.SearchEntry)
self.assertIsInstance(gtk.TrackSearch, Gtk.SearchEntry)
self.assertFalse(gtk.ShowMore.get_active())
self.assertFalse(gtk.UpArrow.is_visible())
self.assertTrue( gtk.DownArrow.is_visible())
self.assertFalse(gtk.PlistSearch.is_visible())
self.assertFalse(gtk.NodeSearch.is_visible())
self.assertFalse(gtk.TrackSearch.is_visible())
self.assertFalse(gtk.PauseBox.is_visible())
@ -62,7 +62,7 @@ class TestGtk(unittest.TestCase):
self.assertTrue( gtk.ShowMore.get_active())
self.assertTrue( gtk.UpArrow.is_visible())
self.assertFalse(gtk.DownArrow.is_visible())
self.assertTrue( gtk.PlistSearch.is_visible())
self.assertTrue( gtk.NodeSearch.is_visible())
self.assertTrue( gtk.TrackSearch.is_visible())
self.assertTrue(gtk.PauseBox.is_visible())
@ -70,7 +70,7 @@ class TestGtk(unittest.TestCase):
self.assertFalse(gtk.ShowMore.get_active())
self.assertFalse(gtk.UpArrow.is_visible())
self.assertTrue( gtk.DownArrow.is_visible())
self.assertFalse(gtk.PlistSearch.is_visible())
self.assertFalse(gtk.NodeSearch.is_visible())
self.assertFalse(gtk.TrackSearch.is_visible())
self.assertFalse(gtk.PauseBox.is_visible())
@ -78,21 +78,21 @@ class TestGtk(unittest.TestCase):
play_button = gtk.Builder.get_object("play_button")
self.assertFalse(gtk.type_focused(Gtk.Entry))
gtk.PlistSearch.grab_focus()
gtk.NodeSearch.grab_focus()
self.assertTrue(gtk.type_focused(Gtk.Entry))
gtk.Window.grab_focus()
self.assertFalse(gtk.type_focused(Gtk.Entry))
signal = GObject.signal_lookup("activate", Gtk.Button)
self.assertTrue(play_button.can_activate_accel(signal))
gtk.PlistSearch.grab_focus()
gtk.NodeSearch.grab_focus()
self.assertFalse(play_button.can_activate_accel(signal))
gtk.Window.grab_focus()
self.assertFalse(gtk.ShowMore.get_active())
signal = GObject.signal_lookup("grab-focus", Gtk.SearchEntry)
self.assertTrue(gtk.PlistSearch.can_activate_accel(signal))
self.assertTrue(gtk.NodeSearch.can_activate_accel(signal))
self.assertTrue(gtk.ShowMore.get_active())
self.assertTrue(gtk.TrackSearch.can_activate_accel(signal))

View File

@ -1,6 +1,6 @@
# Copyright 2019 (c) Anna Schumaker.
from . import gtk
from . import manager
from . import node
from . import playlist
import curds
import os
@ -12,13 +12,13 @@ plist_root = curds.playlist.Root
test_album1 = os.path.abspath("./trier/Test Library/Test Artist 02/Test Album 1")
test_album2 = os.path.abspath("./trier/Test Library/Test Artist 02/Test Album 2")
class TestManager(unittest.TestCase):
class TestNodeTreeModel(unittest.TestCase):
def setUp(self):
curds.reset()
curds.notify.register("playlist-changed", manager.MgrModel.on_playlist_changed, queue=True)
curds.notify.register("node-inserted", manager.MgrModel.on_node_inserted)
curds.notify.register("playlist-changed", node.NodeModel.on_playlist_changed, queue=True)
curds.notify.register("node-inserted", node.NodeModel.on_node_inserted)
self.model = manager.ManagerModel()
self.model = node.NodeTreeModel()
self.artist = curds.playlist.Root.lookup("Artists")
self.decade = curds.playlist.Root.lookup("Decades")
self.genre = curds.playlist.Root.lookup("Genres")
@ -34,19 +34,19 @@ class TestManager(unittest.TestCase):
self.assertEqual(iter.user_data3, ud[2])
def test_init(self):
self.assertIsInstance(gtk.Builder.get_object("manager_treeview"), Gtk.TreeView)
self.assertIsInstance(manager.LibraryAdd, Gtk.Button)
self.assertIsInstance(manager.LibraryCancel, Gtk.Button)
self.assertIsInstance(manager.LibraryChooser, Gtk.FileChooser)
self.assertIsInstance(manager.LibraryOk, Gtk.Button)
self.assertIsInstance(manager.LibraryPopover, Gtk.Popover)
self.assertIsInstance(manager.MgrModel, Gtk.TreeModel)
self.assertIsInstance(manager.SearchPopover, Gtk.Popover)
self.assertIsInstance(manager.SearchError, Gtk.Label)
self.assertIsInstance(gtk.Builder.get_object("node_treeview"), Gtk.TreeView)
self.assertIsInstance(node.LibraryAdd, Gtk.Button)
self.assertIsInstance(node.LibraryCancel, Gtk.Button)
self.assertIsInstance(node.LibraryChooser, Gtk.FileChooser)
self.assertIsInstance(node.LibraryOk, Gtk.Button)
self.assertIsInstance(node.LibraryPopover, Gtk.Popover)
self.assertIsInstance(node.NodeModel, Gtk.TreeModel)
self.assertIsInstance(node.SearchPopover, Gtk.Popover)
self.assertIsInstance(node.SearchError, Gtk.Label)
self.assertEqual(manager.Treeview, gtk.Builder.get_object("manager_treeview"))
self.assertEqual(manager.Treeview.get_model(), manager.MgrModel.filter)
self.assertEqual(manager.MgrModel.filter.get_model(), manager.MgrModel)
self.assertEqual(node.Treeview, gtk.Builder.get_object("node_treeview"))
self.assertEqual(node.Treeview.get_model(), node.NodeModel.filter)
self.assertEqual(node.NodeModel.filter.get_model(), node.NodeModel)
def test_model_init(self):
self.assertEqual(self.model.get_n_columns(), 3)
@ -86,16 +86,16 @@ class TestManager(unittest.TestCase):
self.assertEqual(path.get_indices(), [ iter.user_data - 1, i ])
def test_model_get_value(self):
col = manager.Treeview.get_column(1)
rect = manager.Treeview.get_cell_area(Gtk.TreePath(0), col)
col = node.Treeview.get_column(1)
rect = node.Treeview.get_cell_area(Gtk.TreePath(0), col)
iter = Gtk.TreeIter()
for i, node in enumerate(plist_root.children):
text = str(node) if i != 0 else f"<b>{str(node)}</b>"
for i, child in enumerate(plist_root.children):
text = str(child) if i != 0 else f"<b>{str(child)}</b>"
iter.user_data = i + 1
self.assertEqual(self.model.get_value(iter, 0), node.icon)
self.assertEqual(self.model.get_value(iter, 0), child.icon)
self.assertEqual(self.model.get_value(iter, 1), text)
if isinstance(node, curds.Playlist):
if isinstance(child, curds.Playlist):
self.assertEqual(self.model.get_value(iter, 2), -1)
else:
self.assertEqual(self.model.get_value(iter, 2), rect.height)
@ -252,109 +252,109 @@ class TestManager(unittest.TestCase):
self.assertTrue(valid)
self.assertTreeIterEqual(child, (iter.user_data, i + 1, 0))
def test_manager_selection(self):
selection = manager.Treeview.get_selection()
def test_node_selection(self):
selection = node.Treeview.get_selection()
self.assertIsInstance(selection, Gtk.TreeSelection)
for i, node in enumerate(plist_root.children):
for i, child in enumerate(plist_root.children):
path = Gtk.TreePath(i)
selection.select_path(path)
if isinstance(node, curds.Playlist):
if isinstance(child, curds.Playlist):
self.assertTrue( selection.path_is_selected(path))
self.assertEqual(playlist.PlistModel.playlist, node)
self.assertEqual(playlist.PlistModel.playlist, child)
else:
self.assertFalse(selection.path_is_selected(path))
selection.unselect_all()
self.assertEqual(playlist.PlistModel.playlist, plist_root.lookup("Previous"))
def test_manager_activate(self):
column = manager.Treeview.get_column(1)
def test_node_activate(self):
column = node.Treeview.get_column(1)
filter = self.model.filter
child = self.model.playlist_iter(self.genre.nth_child(0))
(res, iter) = filter.convert_child_iter_to_iter(child)
path = filter.get_path(iter)
manager.Treeview.row_activated(path, column)
node.Treeview.row_activated(path, column)
self.assertEqual(plist_root.current[0], self.genre.nth_child(0))
for i in range(3):
path = Gtk.TreePath(i)
manager.Treeview.row_activated(path, column)
node.Treeview.row_activated(path, column)
self.assertEqual(plist_root.current[0], plist_root.lookup("Collection"))
def test_manager_filtering(self):
def test_node_filtering(self):
filter = self.model.filter
entry = gtk.PlistSearch
entry = gtk.NodeSearch
iter = filter.get_iter_first()
self.assertIsNotNone(iter)
self.assertEqual(self.model.filter_re.pattern, "")
self.assertFalse(entry.get_style_context().has_class("warning"))
self.assertFalse(manager.SearchPopover.is_visible())
self.assertFalse(node.SearchPopover.is_visible())
for i, node in enumerate(plist_root.children):
for i, child in enumerate(plist_root.children):
iter = filter.iter_nth_child(None, i)
text = str(node) if i != 0 else f"<b>{str(node)}</b>"
text = str(child) if i != 0 else f"<b>{str(child)}</b>"
self.assertEqual(filter.get_value(iter, 1), text)
if node not in [ self.artist, self.decade, self.genre ]:
if child not in [ self.artist, self.decade, self.genre ]:
self.assertIsNone(filter.iter_nth_child(iter, 0))
else:
for i, cnode in enumerate(node.children):
child = filter.iter_nth_child(iter, i)
self.assertEqual(filter.get_value(child, 1), str(cnode))
for i, cnode in enumerate(child.children):
c = filter.iter_nth_child(iter, i)
self.assertEqual(filter.get_value(c, 1), str(cnode))
entry.set_text("*v")
self.model.set_filter_text(entry)
self.assertEqual(self.model.filter_re.pattern, "")
self.assertTrue(entry.get_style_context().has_class("warning"))
self.assertTrue(manager.SearchPopover.is_visible())
self.assertEqual(manager.SearchError.get_text(), "Nothing to repeat at position 0")
self.assertTrue(node.SearchPopover.is_visible())
self.assertEqual(node.SearchError.get_text(), "Nothing to repeat at position 0")
entry.set_text("gen(.*)2")
self.model.set_filter_text(entry)
gtk.main_loop(iteration_delay=0.1)
self.assertEqual(self.model.filter_re.pattern, "gen(.*)2")
self.assertFalse(entry.get_style_context().has_class("warning"))
self.assertFalse(manager.SearchPopover.is_visible())
self.assertFalse(node.SearchPopover.is_visible())
for i, node in enumerate(plist_root.children[2:]):
for i, child in enumerate(plist_root.children[2:]):
iter = filter.iter_nth_child(None, i)
self.assertEqual(filter.get_value(iter, 1), str(node))
child = filter.iter_nth_child(iter, 0)
if node != self.genre:
self.assertIsNone(child)
self.assertEqual(filter.get_value(iter, 1), str(child))
c = filter.iter_nth_child(iter, 0)
if child != self.genre:
self.assertIsNone(c)
else:
self.assertEqual(filter.get_value(child, 1), str(self.genre.nth_child(1)))
self.assertEqual(filter.get_value(c, 1), str(self.genre.nth_child(1)))
entry.set_text("")
self.model.set_filter_text(entry)
def test_manager_new_library(self):
def test_node_new_library(self):
music_dir = os.path.join(os.path.expanduser("~"), "Music")
self.assertFalse(manager.LibraryPopover.is_visible())
manager.LibraryAdd.clicked()
self.assertFalse(node.LibraryPopover.is_visible())
node.LibraryAdd.clicked()
gtk.main_loop()
self.assertTrue(manager.LibraryPopover.is_visible())
self.assertTrue(node.LibraryPopover.is_visible())
self.assertEqual(plist_root.lookup("Libraries").n_children(), 0)
manager.LibraryCancel.clicked()
node.LibraryCancel.clicked()
gtk.main_loop(iteration_delay=0.1)
self.assertFalse(manager.LibraryPopover.is_visible())
self.assertFalse(node.LibraryPopover.is_visible())
self.assertEqual(plist_root.lookup("Libraries").n_children(), 0)
manager.LibraryAdd.clicked()
node.LibraryAdd.clicked()
gtk.main_loop()
self.assertEqual(manager.LibraryChooser.get_filename(), music_dir)
self.assertTrue(manager.LibraryPopover.is_visible())
self.assertEqual(node.LibraryChooser.get_filename(), music_dir)
self.assertTrue(node.LibraryPopover.is_visible())
self.assertEqual(plist_root.lookup("Libraries").n_children(), 0)
manager.LibraryChooser.set_filename(test_album1)
node.LibraryChooser.set_filename(test_album1)
gtk.main_loop(delay=0.1)
self.assertEqual(manager.LibraryChooser.get_filename(), test_album1)
self.assertEqual(node.LibraryChooser.get_filename(), test_album1)
manager.LibraryOk.clicked()
node.LibraryOk.clicked()
gtk.main_loop(iteration_delay=0.1)
self.assertEqual(plist_root.lookup("Libraries").n_children(), 1)
self.assertFalse(manager.LibraryPopover.is_visible())
self.assertFalse(node.LibraryPopover.is_visible())

View File

@ -19,12 +19,12 @@ class TestEmmental(unittest.TestCase):
self.assertIsInstance(curds.playlist.Root, curds.playlist.root.PlaylistRoot)
def test_import_rind(self):
self.assertEqual(rind.Application, rind.gtk.Application)
self.assertEqual(rind.Audio, rind.gst.Audio)
self.assertEqual(rind.MgrModel, rind.manager.MgrModel)
self.assertEqual(rind.MgrTreeview, rind.manager.Treeview)
self.assertEqual(rind.PlistModel, rind.playlist.PlistModel)
self.assertEqual(rind.PlTreeview, rind.playlist.Treeview)
self.assertEqual(rind.Application, rind.gtk.Application)
self.assertEqual(rind.Audio, rind.gst.Audio)
self.assertEqual(rind.NodeModel, rind.node.NodeModel)
self.assertEqual(rind.NodeTreeview, rind.node.Treeview)
self.assertEqual(rind.PlistModel, rind.playlist.PlistModel)
self.assertEqual(rind.PlTreeview, rind.playlist.Treeview)
def test_reset_stop_curds(self):
path = os.path.join("trier", "Test Album", "01 - Test Track.ogg")