Skip to content

Commit f4599b0

Browse files
add support for loading from CLI
current syntax: flatpak run --file-forwarding be.alexandervanhee.gradia @@ "/path/to/file.png" @@
1 parent a918346 commit f4599b0

File tree

4 files changed

+66
-4
lines changed

4 files changed

+66
-4
lines changed

data/be.alexandervanhee.gradia.desktop.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[Desktop Entry]
22
Name=Gradia
3+
Comment=Make your images ready for the world
34
Exec=gradia %f
45
Icon=be.alexandervanhee.gradia
56
Terminal=false
@@ -8,3 +9,4 @@ Categories=Graphics;
89
Keywords=Image;Gradient;Background;Screenshot;Edit;
910
StartupNotify=true
1011
DBusActivatable=true
12+
MimeType=image/png;image/jpeg;image/webp;

gradia/main.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import shutil
2121

2222
from collections.abc import Sequence
23+
from typing import Optional
2324

2425
from gi.repository import Adw, Gio
2526

@@ -32,15 +33,30 @@ class GradiaApp(Adw.Application):
3233
def __init__(self, version: str):
3334
super().__init__(
3435
application_id="be.alexandervanhee.gradia",
35-
flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE
36+
flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE | Gio.ApplicationFlags.HANDLES_OPEN
3637
)
3738
self.temp_dir = tempfile.mkdtemp()
3839
self.version = version
3940
self.init_with_screenshot = False
41+
self.file_to_open: Optional[str] = None
4042

4143
def do_command_line(self, command_line: Gio.ApplicationCommandLine) -> int:
4244
args = command_line.get_arguments()[1:]
45+
4346
self.init_with_screenshot = "--screenshot" in args
47+
48+
# Extract the first non-option argument
49+
for arg in args:
50+
if not arg.startswith("--"):
51+
try:
52+
file = Gio.File.new_for_commandline_arg(arg)
53+
path = file.get_path()
54+
if path:
55+
self.file_to_open = path
56+
break
57+
except Exception as e:
58+
print(f"Failed to parse file URI {arg}: {e}")
59+
4460
self.activate()
4561
return 0
4662

@@ -49,12 +65,18 @@ def do_activate(self):
4965
self.temp_dir,
5066
version=self.version,
5167
application=self,
52-
init_with_screenshot=self.init_with_screenshot
68+
init_with_screenshot=self.init_with_screenshot,
69+
file_path=self.file_to_open
5370
)
71+
print(self.file_to_open)
5472
self.ui.build_ui()
5573
self.ui.show()
5674

5775
def do_open(self, files: Sequence[Gio.File], hint: str):
76+
if files:
77+
path = files[0].get_path()
78+
if path:
79+
self.file_to_open = path
5880
self.activate()
5981

6082
def do_shutdown(self):
@@ -66,6 +88,7 @@ def do_shutdown(self):
6688
finally:
6789
Gio.Application.do_shutdown(self)
6890

91+
6992
def main(version: str):
7093
try:
7194
app = GradiaApp(version=version)

gradia/ui/image_loaders.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ def _is_supported_format(self, file_path: str) -> bool:
4848
def _set_image_and_update_ui(self, image_path: str, filename: str, location: str) -> None:
4949
"""Common method to set image and update UI"""
5050
self.window.image_path = image_path
51-
self.window.drawing_overlay.clear_drawing()
51+
if hasattr(self.window, 'drawing_overlay') and self.window.drawing_overlay:
52+
self.window.drawing_overlay.clear_drawing()
5253
self.window._update_sidebar_info(filename, location)
5354
self.window._start_processing()
5455

@@ -234,6 +235,34 @@ def _handle_screenshot_uri(self, uri: str) -> None:
234235
finally:
235236
self.window._set_loading_state(False)
236237

238+
class CommandlineLoader(BaseImageLoader):
239+
"""Handles loading images from command line arguments or programmatic file paths"""
240+
241+
def __init__(self, window: Gtk.ApplicationWindow, temp_dir: str) -> None:
242+
super().__init__(window, temp_dir)
243+
244+
def load_from_file(self, file_path: str) -> None:
245+
"""Load image from a given file path"""
246+
try:
247+
if not file_path:
248+
print("No file path provided")
249+
return
250+
251+
if not os.path.isfile(file_path):
252+
print(f"File does not exist: {file_path}")
253+
return
254+
255+
if not self._is_supported_format(file_path):
256+
print(f"Unsupported file format: {file_path}")
257+
return
258+
259+
filename = os.path.basename(file_path)
260+
directory = os.path.dirname(file_path)
261+
262+
self._set_image_and_update_ui(file_path, filename, directory)
263+
264+
except Exception as e:
265+
print(f"Error loading file from command line: {e}")
237266

238267
class ImportManager:
239268
def __init__(self, window: Gtk.ApplicationWindow, temp_dir: str) -> None:
@@ -244,6 +273,7 @@ def __init__(self, window: Gtk.ApplicationWindow, temp_dir: str) -> None:
244273
self.drag_drop_loader: DragDropImageLoader = DragDropImageLoader(window, temp_dir)
245274
self.clipboard_loader: ClipboardImageLoader = ClipboardImageLoader(window, temp_dir)
246275
self.screenshot_loader: ScreenshotImageLoader = ScreenshotImageLoader(window, temp_dir)
276+
self.commandline_loader: CommandlineLoader = CommandlineLoader(window, temp_dir)
247277

248278
def open_file_dialog(self) -> None:
249279
self.file_loader.open_file_dialog()
@@ -261,3 +291,6 @@ def load_from_clipboard(self) -> None:
261291

262292
def take_screenshot(self) -> None:
263293
self.screenshot_loader.take_screenshot()
294+
295+
def load_from_file(self, file_path: str) -> None:
296+
self.commandline_loader.load_from_file(file_path)

gradia/ui/window.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class GradientWindow(Adw.ApplicationWindow):
4646
# Temp file names
4747
TEMP_PROCESSED_FILENAME: str = "processed.png"
4848

49-
def __init__(self, temp_dir: str, version: str, init_with_screenshot: bool = False, **kwargs) -> None:
49+
def __init__(self, temp_dir: str, version: str, init_with_screenshot: bool = False, file_path: str = None, **kwargs) -> None:
5050
super().__init__(**kwargs)
5151

5252
self.app: Adw.Application = kwargs['application']
@@ -94,6 +94,7 @@ def __init__(self, temp_dir: str, version: str, init_with_screenshot: bool = Fal
9494
self.create_action_with_param("pen-color", lambda action, param: self._set_pen_color_from_string(param.get_string()))
9595
self.create_action_with_param("fill-color", lambda action, param: self._set_fill_color_from_string(param.get_string()))
9696
self.create_action("del-selected", lambda *_: self.drawing_overlay.remove_selected_action(), ["<Primary>x", "Delete"])
97+
self.file_path = file_path
9798

9899
if init_with_screenshot:
99100
self.import_manager.take_screenshot()
@@ -132,6 +133,9 @@ def build_ui(self) -> None:
132133
self._setup_sidebar()
133134
self._setup_main_layout()
134135

136+
if self.file_path:
137+
self.import_manager.load_from_file(self.file_path)
138+
135139
def _setup_window(self) -> None:
136140
self.set_title("Gradia")
137141
self.set_default_size(self.DEFAULT_WINDOW_WIDTH, self.DEFAULT_WINDOW_HEIGHT)

0 commit comments

Comments
 (0)