Compare commits
2 commits
dc6477019d
...
743b476d38
Author | SHA1 | Date | |
---|---|---|---|
743b476d38 | |||
ae99dd6a4a |
5 changed files with 58 additions and 6 deletions
|
@ -1,3 +1,5 @@
|
|||
⚠️ This repository has moved to https://git.jeena.net/jeena/recoder
|
||||
|
||||
<p align="center">
|
||||
<img src="src/resources/net.jeena.Recoder.svg" width="120" height="120" alt="Recoder logo">
|
||||
</p>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[project]
|
||||
name = "recoder"
|
||||
version = "1.0.1"
|
||||
version = "1.1.0"
|
||||
description = "A GTK4 video transcoding GUI application"
|
||||
readme = "README.md"
|
||||
authors = [{name = "Jeena", email = "hello@jeena.net"}]
|
||||
|
@ -24,4 +24,4 @@ include-package-data = true
|
|||
where = ["src"]
|
||||
|
||||
[tool.setuptools.package-data]
|
||||
recoder = ["resources.gresource"]
|
||||
recoder = ["resources.gresource"]
|
||||
|
|
|
@ -10,13 +10,23 @@ class DropHandler:
|
|||
self._accepting = self._compute_accept()
|
||||
self.app_state_manager.connect("notify::state", self.on_state_changed)
|
||||
|
||||
# --- Drag & Drop ---
|
||||
self.drop_target = Gtk.DropTarget.new(Gio.File, Gdk.DragAction.COPY)
|
||||
self.drop_target.connect("enter", self.on_drop_enter)
|
||||
self.drop_target.connect("leave", self.on_drop_leave)
|
||||
self.drop_target.connect("drop", self.on_drop)
|
||||
|
||||
self.w.overlay.add_controller(self.drop_target)
|
||||
|
||||
# --- Clipboard Paste (Ctrl+V) ---
|
||||
self.shortcut_ctrl_v = Gtk.ShortcutController()
|
||||
self.shortcut_ctrl_v.add_shortcut(
|
||||
Gtk.Shortcut.new(
|
||||
Gtk.ShortcutTrigger.parse_string("<Ctrl>V"),
|
||||
Gtk.CallbackAction.new(self.on_paste_clipboard)
|
||||
)
|
||||
)
|
||||
self.w.add_controller(self.shortcut_ctrl_v)
|
||||
|
||||
def _compute_accept(self):
|
||||
return self.app_state_manager.state not in {
|
||||
AppState.TRANSCODING,
|
||||
|
@ -33,7 +43,7 @@ class DropHandler:
|
|||
else:
|
||||
self.w.overlay.remove_controller(self.drop_target)
|
||||
|
||||
|
||||
# ---------------- Drag & Drop ----------------
|
||||
def on_drop_enter(self, *_):
|
||||
if not self._accepting:
|
||||
return False
|
||||
|
@ -47,10 +57,45 @@ class DropHandler:
|
|||
def on_drop(self, _, value, __, ___):
|
||||
if not self._accepting:
|
||||
return False
|
||||
self._start_processing(value)
|
||||
return True
|
||||
|
||||
# ---------------- Clipboard Paste ----------------
|
||||
def on_paste_clipboard(self, *_):
|
||||
if not self._accepting:
|
||||
return True
|
||||
|
||||
clipboard = self.w.get_clipboard()
|
||||
clipboard.read_text_async(None, self._on_clipboard_text_ready)
|
||||
return True
|
||||
|
||||
def _on_clipboard_text_ready(self, clipboard, res):
|
||||
try:
|
||||
text = clipboard.read_text_finish(res)
|
||||
except GLib.Error:
|
||||
return
|
||||
|
||||
if not text:
|
||||
return
|
||||
|
||||
# take the first non-empty line only
|
||||
uri = next((u.strip() for u in text.splitlines() if u.strip()), None)
|
||||
if not uri:
|
||||
return
|
||||
|
||||
if uri.startswith("file://"):
|
||||
gfile = Gio.File.new_for_uri(uri)
|
||||
else:
|
||||
gfile = Gio.File.new_for_path(uri)
|
||||
|
||||
self._start_processing(gfile)
|
||||
|
||||
# ---------------- Shared ----------------
|
||||
def _start_processing(self, value):
|
||||
if self.w.drop_hint.get_parent():
|
||||
self.w.overlay.remove_overlay(self.w.drop_hint)
|
||||
self.w.drop_hint.set_visible(False)
|
||||
self.w.progress_bar.set_visible(True)
|
||||
self.w.progress_bar.set_fraction(0.0)
|
||||
GLib.idle_add(partial(self.w.process_drop_value, value))
|
||||
return True
|
||||
|
||||
|
|
|
@ -58,5 +58,10 @@
|
|||
<p>Fix bad video quality.</p>
|
||||
</description>
|
||||
</release>
|
||||
<release version="1.1.0" date="2025-08-24">
|
||||
<description>
|
||||
<p>Add possibility to Ctrl-v a path instead only drag and drop.</p>
|
||||
</description>
|
||||
</release>
|
||||
</releases>
|
||||
</component>
|
||||
|
|
|
@ -144,7 +144,7 @@
|
|||
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label">Drop video files or folders here to get started</property>
|
||||
<property name="label">Drop video file or folder here, or press Ctrl+V to paste a path</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue