Skip to content
This repository was archived by the owner on Jul 23, 2024. It is now read-only.

[WIP] : URL handler #773

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions data/com.github.GradienceTeam.Gradience.desktop.in.in
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ Terminal=false
Type=Application
Categories=GTK;
StartupNotify=true
MimeType=x-scheme-handler/gradience;
63 changes: 61 additions & 2 deletions gradience/frontend/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,21 @@
import os
import sys
import threading
import json

from pathlib import Path
from material_color_utilities_python import hexFromArgb
from gi.repository import GObject, Gtk, Gdk, Gio, Adw, GLib

from gradience.backend.globals import presets_dir, get_gtk_theme_dir
from gradience.backend.globals import presets_dir, get_gtk_theme_dir, preset_repos
from gradience.backend.css_parser import parse_css
from gradience.backend.models.preset import Preset
from gradience.backend.theming.preset import PresetUtils
from gradience.backend.theming.monet import Monet
from gradience.backend.utils.common import to_slug_case
from gradience.backend.utils.theming import generate_gtk_css
from gradience.backend.constants import rootdir, app_id, rel_ver
from gradience.backend.preset_downloader import PresetDownloader

from gradience.frontend.views.main_window import GradienceMainWindow
from gradience.frontend.views.plugins_list import GradiencePluginsList
Expand Down Expand Up @@ -63,7 +65,7 @@ class GradienceApplication(Adw.Application):
def __init__(self):
super().__init__(
application_id=app_id,
flags=Gio.ApplicationFlags.FLAGS_NONE
flags=Gio.ApplicationFlags.HANDLES_OPEN | Gio.ApplicationFlags.FLAGS_NONE
)

self.set_resource_base_path(rootdir)
Expand Down Expand Up @@ -170,6 +172,62 @@ def do_activate(self):
logging.debug("normal run")
self.win.present()

def do_open(self, files, _n_files, _hint):
# gradience://{repo,import}/{slug, url}

uri = files[0].get_uri().replace("gradience://", "")
logging.debug(uri)

if uri.startswith("import/"): # import from custom url
url = uri.replace("import/")
logging.debug(f"import {url}")

# TODO: import from custom URL
else:
# format: repo / slug
repo, slug = uri.split("/")
logging.debug(f"{repo} / {slug}")

try:
repo_url = preset_repos[repo.capitalize()]
explore_presets, urls = PresetDownloader().fetch_presets(repo_url)
except GLib.GError as e:
# TODO: handle offline
pass
except json.JSONDecodeError:
# TODO: handle error
pass
else:
for (preset, preset_name), preset_url in zip(
explore_presets.items(), urls
):
if to_slug_case(preset_name) == slug:
logging.debug("found preset")
try:
PresetDownloader().download_preset(to_slug_case(slug), repo, preset_url)
except (GLib.GError, json.JSONDecodeError, OSError):
logging.error("An error occurred while trying to download a preset.")
else:
self.activate()
self.load_preset_from_file(
os.path.join(
os.environ.get("XDG_CONFIG_HOME",
os.environ["HOME"] + "/.config"),
"presets",
repo,
slug + ".json",
)
)

logging.debug("Apply and download compeleted")
else:
# TODO: show warning
logging.error("no preset found")





def setup_signals(self):
# Custom signals
GObject.signal_new(
Expand Down Expand Up @@ -686,4 +744,5 @@ def reload_plugins(self):
def main():
"""The application's entry point."""
app = GradienceApplication()
print(sys.argv)
return app.run(sys.argv)