81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
import os
|
|
from typing import Mapping, Sequence
|
|
|
|
from gi.repository import Gtk
|
|
|
|
from .i18n import translate
|
|
from .config import SCRIPT_DIR
|
|
from .plugin_loader import PluginLoader
|
|
from .plugin_api import OomoxPlugin
|
|
|
|
|
|
class PluginInfo(Gtk.ListBoxRow):
|
|
|
|
def __init__(self, plugin: OomoxPlugin) -> None:
|
|
super().__init__()
|
|
self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
|
|
self.add(self.box)
|
|
|
|
plugin_name = Gtk.Label()
|
|
plugin_name.set_markup(f"<b>{plugin.display_name or plugin.name}</b>")
|
|
plugin_name.set_halign(Gtk.Align.START)
|
|
self.box.add(plugin_name)
|
|
|
|
for attr in ('about_text', 'description',):
|
|
value = getattr(plugin, attr, None)
|
|
if value:
|
|
about = Gtk.Label(value)
|
|
about.set_halign(Gtk.Align.START)
|
|
about.set_line_wrap(True)
|
|
self.box.add(about)
|
|
|
|
for link_info in plugin.about_links or []:
|
|
link = Gtk.LinkButton.new_with_label(
|
|
link_info['url'],
|
|
link_info['name']
|
|
)
|
|
link.set_hexpand(False)
|
|
# link.set_halign(Gtk.Align.CENTER)
|
|
link.set_halign(Gtk.Align.START)
|
|
self.box.add(link)
|
|
|
|
|
|
def show_about(parent_window: Gtk.Window) -> None:
|
|
path = os.path.join(SCRIPT_DIR, 'about.ui')
|
|
builder = Gtk.Builder.new_from_file(path)
|
|
|
|
about_window = builder.get_object("about")
|
|
about_window.set_transient_for(parent_window)
|
|
about_window.set_title("About Themix GUI / Oomox")
|
|
about_window.set_wmclass("oomox", "Oomox")
|
|
about_window.set_role("Oomox-About")
|
|
about_window.show()
|
|
plugins_box = builder.get_object("plugins_box")
|
|
|
|
def update_listbox_header(row: Gtk.ListBoxRow, before: bool) -> None:
|
|
if before and not row.get_header():
|
|
separator = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL) # type: ignore[call-arg]
|
|
separator.set_margin_top(4)
|
|
separator.set_margin_bottom(8)
|
|
row.set_header(separator)
|
|
|
|
data: Sequence[tuple[str, Mapping[str, OomoxPlugin]]] = (
|
|
(translate('Theme Plugins'), PluginLoader.get_theme_plugins(), ),
|
|
(translate('Icon Plugins'), PluginLoader.get_icons_plugins(), ),
|
|
(translate('Import Plugins'), PluginLoader.get_import_plugins(), ),
|
|
(translate('Export Plugins'), PluginLoader.get_export_plugins(), ),
|
|
)
|
|
for title, plugin_list in data:
|
|
section_label = Gtk.Label(title)
|
|
section_label.set_margin_top(8)
|
|
section_label.set_margin_bottom(4)
|
|
plugins_box.add(section_label)
|
|
listbox = Gtk.ListBox()
|
|
listbox.set_selection_mode(Gtk.SelectionMode.NONE)
|
|
listbox.set_header_func(update_listbox_header)
|
|
plugins_box.add(listbox)
|
|
for plugin in plugin_list.values():
|
|
listbox.add(PluginInfo(plugin))
|
|
|
|
plugins_box.show_all()
|