mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-07-04 14:08:17 +02:00
extension manager improvement
This commit is contained in:
@@ -33,13 +33,14 @@ from enum import IntEnum
|
||||
from pathlib import Path
|
||||
|
||||
import requests
|
||||
from gi.repository import Gtk, Gdk, GLib
|
||||
from gi.repository import Gtk, Gdk, GLib, Pango
|
||||
|
||||
from app.commons import log, run_task, run_idle
|
||||
from app.ui.dialogs import translate
|
||||
from app.ui.uicommons import HeaderBar
|
||||
|
||||
EXT_URL = "https://api.github.com/repos/DYefremov/demoneditor-extensions/contents/extensions"
|
||||
EXT_URL = "https://api.github.com/repos/DYefremov/demoneditor-extensions/contents/extensions/"
|
||||
EXT_LIST_FILE = "https://raw.githubusercontent.com/DYefremov/demoneditor-extensions/main/extensions/extension-list"
|
||||
HEADERS = {"User-Agent": "Mozilla/5.0 (X11; Linux i686; rv:112.0) Gecko/20100101 Firefox/112.0",
|
||||
"Accept": "application/json"}
|
||||
|
||||
@@ -49,8 +50,9 @@ class ExtensionManager(Gtk.Window):
|
||||
TITLE = 0
|
||||
DESC = 1
|
||||
STATUS = 2
|
||||
URL = 3
|
||||
PATH = 4
|
||||
NAME = 3
|
||||
URL = 4
|
||||
PATH = 5
|
||||
|
||||
def __init__(self, app, **kwargs):
|
||||
super().__init__(title=translate("Extensions"), icon_name="demon-editor", application=app,
|
||||
@@ -64,21 +66,30 @@ class ExtensionManager(Gtk.Window):
|
||||
titles = (translate("Title"), translate("Description"), translate("Status"))
|
||||
margin = {"margin_start": 5, "margin_end": 5, "margin_top": 5, "margin_bottom": 5}
|
||||
# Title, Description, Satus, URL, Path.
|
||||
self._model = Gtk.ListStore.new((str, str, str, str, object))
|
||||
self._model = Gtk.ListStore.new((str, str, str, str, str, object))
|
||||
self._model.connect("row-deleted", self.on_model_changed)
|
||||
self._model.connect("row-inserted", self.on_model_changed)
|
||||
self._view = Gtk.TreeView(activate_on_single_click=True, enable_grid_lines=Gtk.TreeViewGridLines.BOTH)
|
||||
self._view.set_model(self._model)
|
||||
self._view.set_tooltip_column(self.Column.DESC)
|
||||
|
||||
for i, t in enumerate(titles):
|
||||
renderer = Gtk.CellRendererText(xalign=0.05)
|
||||
renderer = Gtk.CellRendererText(xalign=0.05, ellipsize=Pango.EllipsizeMode.END)
|
||||
column = Gtk.TreeViewColumn(title=t, cell_renderer=renderer, text=i)
|
||||
column.set_resizable(True)
|
||||
column.set_expand(True)
|
||||
column.set_alignment(0.5)
|
||||
column.set_min_width(50)
|
||||
self._view.append_column(column)
|
||||
|
||||
column = self._view.get_column(self.Column.TITLE)
|
||||
column.set_min_width(170)
|
||||
column.set_resizable(True)
|
||||
|
||||
column = self._view.get_column(self.Column.DESC)
|
||||
column.set_resizable(True)
|
||||
column.set_expand(True)
|
||||
|
||||
column = self._view.get_column(self.Column.STATUS)
|
||||
column.set_fixed_width(120)
|
||||
|
||||
main_box = Gtk.Box(spacing=5, orientation=Gtk.Orientation.VERTICAL)
|
||||
frame = Gtk.Frame(shadow_type=Gtk.ShadowType.IN, **margin)
|
||||
data_box = Gtk.Box(spacing=5, orientation=Gtk.Orientation.VERTICAL, **margin)
|
||||
@@ -90,9 +101,9 @@ class ExtensionManager(Gtk.Window):
|
||||
status_box.pack_start(self._count_label, False, False, 0)
|
||||
|
||||
data_box.pack_end(status_box, False, True, 0)
|
||||
scorelled = Gtk.ScrolledWindow(shadow_type=Gtk.ShadowType.IN)
|
||||
scorelled.add(self._view)
|
||||
data_box.pack_start(scorelled, True, True, 0)
|
||||
scrolled = Gtk.ScrolledWindow(shadow_type=Gtk.ShadowType.IN)
|
||||
scrolled.add(self._view)
|
||||
data_box.pack_start(scrolled, True, True, 0)
|
||||
frame.add(data_box)
|
||||
self.add(main_box)
|
||||
|
||||
@@ -138,6 +149,12 @@ class ExtensionManager(Gtk.Window):
|
||||
main_box.pack_start(frame, True, True, 0)
|
||||
main_box.show_all()
|
||||
|
||||
ws_property = "extension_manager_window_size"
|
||||
window_size = self._app.app_settings.get(ws_property, None)
|
||||
if window_size:
|
||||
self.resize(*window_size)
|
||||
|
||||
self.connect("delete-event", lambda w, e: self._app.app_settings.add(ws_property, w.get_size()))
|
||||
self.update()
|
||||
|
||||
def get_installed(self):
|
||||
@@ -150,14 +167,14 @@ class ExtensionManager(Gtk.Window):
|
||||
def update(self):
|
||||
installed = self.get_installed()
|
||||
extensions = []
|
||||
with requests.get(url=EXT_URL, headers=HEADERS, stream=True) as resp:
|
||||
with requests.get(url=EXT_LIST_FILE, stream=True) as resp:
|
||||
if resp.status_code == 200:
|
||||
try:
|
||||
for f in resp.json():
|
||||
if f.get("type") == "dir":
|
||||
name = f.get("name")
|
||||
path = installed.get(name)
|
||||
extensions.append((name, None, "Installed" if path else None, f.get("url", None), path))
|
||||
for e, d in resp.json().items():
|
||||
path = installed.get(e)
|
||||
url = f"{EXT_URL}{d.get('ref', '')}"
|
||||
desc = d.get("description", "")
|
||||
extensions.append((d.get('label'), desc, "Installed" if path else None, e, url, path))
|
||||
except ValueError as e:
|
||||
log(f"{self.__class__.__name__} [update] error: {e}")
|
||||
else:
|
||||
@@ -184,6 +201,8 @@ class ExtensionManager(Gtk.Window):
|
||||
else:
|
||||
model[paths][self.Column.PATH] = None
|
||||
model[paths][self.Column.STATUS] = translate("Removed")
|
||||
msg = translate('Restart the program to apply all changes.')
|
||||
self._app.show_info_message(msg, Gtk.MessageType.WARNING)
|
||||
|
||||
@run_task
|
||||
def on_download(self, item):
|
||||
@@ -209,7 +228,7 @@ class ExtensionManager(Gtk.Window):
|
||||
log(f"{self.__class__.__name__} [download] error: {resp.reason}")
|
||||
|
||||
if urls:
|
||||
path = f"{self._ext_path}{os.sep}{model[paths][0]}{os.sep}"
|
||||
path = f"{self._ext_path}{os.sep}{model[paths][self.Column.NAME]}{os.sep}"
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
if all((self.download_file(u, f"{path}{n}") for u, n in urls.items())):
|
||||
itr = model.get_iter(paths)
|
||||
|
||||
Reference in New Issue
Block a user