# Copyright 2021 (c) Anna Schumaker. import db import pathlib from gi.repository import Gio from gi.repository import Gtk from . import task class ProgressBar(Gtk.ProgressBar): def __init__(self, queue): Gtk.ProgressBar.__init__(self) self.queue = queue self.queue.connect("task-pushed", self.on_task_pushed) self.queue.connect("run-task", self.on_run_task) self.queue.connect("tasks-finished", self.on_tasks_finished) self.set_valign(Gtk.Align.CENTER) self.set_hexpand(True) self.set_visible(len(queue.tasks) > 0) def on_task_pushed(self, queue, task): self.set_visible(True) def on_run_task(self, queue, task): self.set_fraction(queue.progress) def on_tasks_finished(self, queue): 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 AddFolderButton(Gtk.MenuButton): def __init__(self, queue): Gtk.MenuButton.__init__(self) self.popover = DirectoryChooserPopover(queue) self.set_popover(self.popover) self.set_icon_name("folder-new") self.set_direction(Gtk.ArrowType.UP) class ScannerButton(Gtk.Button): def __init__(self, queue, icon_name): Gtk.Button.__init__(self) self.set_icon_name(icon_name) self.set_hexpand(True) self.queue = queue class UpdateButton(ScannerButton): def __init__(self, library, queue): ScannerButton.__init__(self, queue, "view-refresh") self.library = library def do_clicked(self): self.queue.push(task.CheckSchedulerTask(self.library)) self.queue.push(task.DirectoryTask(self.library, self.library.path)) class UpdateAllButton(ScannerButton): def __init__(self, queue): ScannerButton.__init__(self, queue, "view-refresh") def do_clicked(self): for i in range(db.library.Table.get_n_items()): library = db.library.Table.get_item(i) self.queue.push(task.CheckSchedulerTask(library)) self.queue.push(task.DirectoryTask(library, library.path)) class RemoveButton(ScannerButton): def __init__(self, library, queue): ScannerButton.__init__(self, queue, "list-remove") self.library = library def do_clicked(self): self.queue.push(task.RemoveLibrarySchedulerTask(self.library)) class EnableSwitch(Gtk.Switch): def __init__(self, library, queue): Gtk.Switch.__init__(self) self.set_active(library.enabled) self.set_halign(Gtk.Align.CENTER) self.set_valign(Gtk.Align.CENTER) self.connect("notify::active", self.switched) self.library = library self.queue = queue def switched(self, switch, param): self.library.enabled = switch.get_active()