emmental/scanner/widgets.py

141 lines
4.4 KiB
Python

# 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()