scanner: Create a custom DirectoryChooser widget
It is set up to view and select directories only, with a shortcut added for the user's Music directory. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
7535b71724
commit
0157b1d4c0
|
@ -1,11 +1,18 @@
|
|||
# Copyright 2021 (c) Anna Schumaker.
|
||||
import db
|
||||
import pathlib
|
||||
import unittest
|
||||
from gi.repository import Gio
|
||||
from gi.repository import GLib
|
||||
from gi.repository import Gtk
|
||||
from . import queue
|
||||
from . import task
|
||||
from . import widgets
|
||||
|
||||
main_context = GLib.main_context_default()
|
||||
test_album = pathlib.Path("./data/Test Album/").absolute()
|
||||
test_subdir = test_album / "Test Subdir"
|
||||
|
||||
class FakeTask(task.Task):
|
||||
def run_task(self): return None
|
||||
|
||||
|
@ -29,6 +36,64 @@ class TestScannerProgressBar(unittest.TestCase):
|
|||
self.assertFalse(pb.get_visible())
|
||||
|
||||
|
||||
class DirectoryChooserWidget(unittest.TestCase):
|
||||
def test_directory_chooser_widget(self):
|
||||
dcw = widgets.DirectoryChooserWidget()
|
||||
|
||||
self.assertIsInstance(dcw, Gtk.FileChooserWidget)
|
||||
self.assertIsInstance(dcw.filter, Gtk.FileFilter)
|
||||
|
||||
self.assertEqual(dcw.get_action(), Gtk.FileChooserAction.SELECT_FOLDER)
|
||||
self.assertEqual(dcw.get_filter(), dcw.filter)
|
||||
self.assertFalse(dcw.get_create_folders())
|
||||
|
||||
gfile = Gio.File.new_for_path(str(test_album))
|
||||
self.assertTrue(dcw.set_current_folder(gfile))
|
||||
while main_context.iteration(may_block=False): pass
|
||||
self.assertEqual(dcw.selected_path(), test_album)
|
||||
|
||||
gfile = Gio.File.new_for_path(str(test_subdir))
|
||||
self.assertTrue(dcw.set_file(gfile))
|
||||
while main_context.iteration(may_block=False): pass
|
||||
self.assertEqual(dcw.selected_path(), test_subdir)
|
||||
|
||||
|
||||
class DirectoryChooserPopover(unittest.TestCase):
|
||||
def test_directory_chooser_popover(self):
|
||||
db.reset()
|
||||
q = queue.TaskQueue()
|
||||
dcp = widgets.DirectoryChooserPopover(q)
|
||||
|
||||
self.assertIsInstance(dcp, Gtk.Popover)
|
||||
self.assertIsInstance(dcp.chooser, widgets.DirectoryChooserWidget)
|
||||
self.assertIsInstance(dcp.cancel, Gtk.Button)
|
||||
self.assertIsInstance(dcp.select, Gtk.Button)
|
||||
self.assertIsInstance(dcp.grid, Gtk.Grid)
|
||||
|
||||
self.assertEqual(dcp.queue, q)
|
||||
self.assertEqual(dcp.cancel.get_label(), "Cancel")
|
||||
self.assertEqual(dcp.select.get_label(), "Add Folder")
|
||||
|
||||
self.assertTrue(dcp.has_css_class("normal-icons"))
|
||||
self.assertTrue(dcp.select.has_css_class("suggested-action"))
|
||||
|
||||
self.assertEqual(dcp.get_child(), dcp.grid)
|
||||
self.assertIn(dcp.chooser, dcp.grid)
|
||||
self.assertIn(dcp.cancel, dcp.grid)
|
||||
self.assertIn(dcp.select, dcp.grid)
|
||||
|
||||
gfile = Gio.File.new_for_path(str(test_album))
|
||||
self.assertTrue(dcp.chooser.set_current_folder(gfile))
|
||||
while main_context.iteration(may_block=False): pass
|
||||
|
||||
dcp.select.emit("clicked")
|
||||
self.assertIsNotNone(db.library.Table.find(test_album))
|
||||
self.assertEqual(len(q.tasks), 2)
|
||||
self.assertIsInstance(q.tasks[0], task.CheckSchedulerTask)
|
||||
self.assertIsInstance(q.tasks[1], task.DirectoryTask)
|
||||
q.tasks_finished()
|
||||
|
||||
|
||||
class TestScannerUpdateButton(unittest.TestCase):
|
||||
def test_update_button(self):
|
||||
lib = db.library.Table.find("/a/b/c")
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
# Copyright 2021 (c) Anna Schumaker.
|
||||
import db
|
||||
import pathlib
|
||||
from gi.repository import Gio
|
||||
from gi.repository import Gtk
|
||||
from . import task
|
||||
|
||||
|
@ -26,6 +28,57 @@ class ProgressBar(Gtk.ProgressBar):
|
|||
self.set_visible(False)
|
||||
|
||||
|
||||
class DirectoryChooserWidget(Gtk.FileChooserWidget):
|
||||
def __init__(self):
|
||||
Gtk.FileChooserWidget.__init__(self)
|
||||
self.filter = Gtk.FileFilter()
|
||||
self.filter.add_mime_type("inode/directory")
|
||||
|
||||
music_dir = pathlib.Path("~/Music").expanduser()
|
||||
music_gfile = Gio.File.new_for_path(str(music_dir))
|
||||
|
||||
self.add_shortcut_folder(music_gfile)
|
||||
self.set_action(Gtk.FileChooserAction.SELECT_FOLDER)
|
||||
self.set_create_folders(False)
|
||||
self.set_filter(self.filter)
|
||||
|
||||
def selected_path(self):
|
||||
if (file := self.get_file()) == None:
|
||||
file = self.get_current_folder()
|
||||
return pathlib.Path(file.get_path())
|
||||
|
||||
|
||||
class DirectoryChooserPopover(Gtk.Popover):
|
||||
def __init__(self, queue):
|
||||
Gtk.Popover.__init__(self)
|
||||
self.chooser = DirectoryChooserWidget()
|
||||
self.cancel = Gtk.Button.new_with_label("Cancel")
|
||||
self.select = Gtk.Button.new_with_label("Add Folder")
|
||||
self.queue = queue
|
||||
|
||||
self.cancel.connect("clicked", self.do_cancel)
|
||||
self.select.connect("clicked", self.do_select)
|
||||
|
||||
self.grid = Gtk.Grid()
|
||||
self.grid.attach(self.chooser, 0, 0, 2, 1)
|
||||
self.grid.attach(self.cancel, 0, 1, 1, 1)
|
||||
self.grid.attach(self.select, 1, 1, 1, 1)
|
||||
|
||||
self.select.add_css_class("suggested-action")
|
||||
self.add_css_class("normal-icons")
|
||||
self.set_child(self.grid)
|
||||
|
||||
def do_cancel(self, button):
|
||||
self.popdown()
|
||||
|
||||
def do_select(self, button):
|
||||
if (path := self.chooser.selected_path()) != None:
|
||||
library = db.library.Table.find(path)
|
||||
self.queue.push(task.CheckSchedulerTask(library))
|
||||
self.queue.push(task.DirectoryTask(library, library.path))
|
||||
self.popdown()
|
||||
|
||||
|
||||
class ScannerButton(Gtk.Button):
|
||||
def __init__(self, queue, icon_name):
|
||||
Gtk.Button.__init__(self)
|
||||
|
|
Loading…
Reference in New Issue