Add an option to show image from editor in folder (#3412)

* Add "Show in folder" option to images in editor

Credits: @abdnh's Reveal in File Manager add-on (https://github.com/abdnh/anki-misc/tree/master/reveal_in_file_manager)

* Refactor
This commit is contained in:
user1823 2024-09-20 17:08:44 +05:30 committed by GitHub
parent 5bd66db3c6
commit 02d2566998
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 53 additions and 17 deletions

View file

@ -36,6 +36,7 @@ editing-mathjax-chemistry = MathJax chemistry
editing-mathjax-inline = MathJax inline editing-mathjax-inline = MathJax inline
editing-mathjax-placeholder = Press { $accept } to accept, { $newline } for new line. editing-mathjax-placeholder = Press { $accept } to accept, { $newline } for new line.
editing-media = Media editing-media = Media
editing-show-in-folder = Show in folder
editing-ordered-list = Ordered list editing-ordered-list = Ordered list
editing-outdent = Decrease indent editing-outdent = Decrease indent
editing-paste = Paste editing-paste = Paste

View file

@ -36,8 +36,8 @@ from anki.hooks import runFilter
from anki.httpclient import HttpClient from anki.httpclient import HttpClient
from anki.models import NotetypeId, StockNotetype from anki.models import NotetypeId, StockNotetype
from anki.notes import Note, NoteFieldsCheckResult, NoteId from anki.notes import Note, NoteFieldsCheckResult, NoteId
from anki.utils import checksum, is_lin, is_win, namedtmp from anki.utils import checksum, is_lin, is_mac, is_win, namedtmp
from aqt import AnkiQt, colors, gui_hooks from aqt import AnkiQt, colors, gui_hooks, mw
from aqt.operations import QueryOp from aqt.operations import QueryOp
from aqt.operations.note import update_note from aqt.operations.note import update_note
from aqt.operations.notetype import update_notetype_legacy from aqt.operations.notetype import update_notetype_legacy
@ -55,6 +55,7 @@ from aqt.utils import (
saveGeom, saveGeom,
shortcut, shortcut,
showInfo, showInfo,
showinFolder,
showWarning, showWarning,
tooltip, tooltip,
tr, tr,
@ -1599,28 +1600,34 @@ class EditorWebView(AnkiWebView):
def contextMenuEvent(self, evt: QContextMenuEvent) -> None: def contextMenuEvent(self, evt: QContextMenuEvent) -> None:
m = QMenu(self) m = QMenu(self)
self._maybe_add_cut_action(m) if self.hasSelection():
self._maybe_add_copy_action(m) self._add_cut_action(m)
self._add_copy_action(m)
a = m.addAction(tr.editing_paste()) a = m.addAction(tr.editing_paste())
qconnect(a.triggered, self.onPaste) qconnect(a.triggered, self.onPaste)
self._maybe_add_copy_image_action(m) if self._opened_context_menu_on_image():
self._add_image_menu(AnkiWebView(self), m)
gui_hooks.editor_will_show_context_menu(self, m) gui_hooks.editor_will_show_context_menu(self, m)
m.popup(QCursor.pos()) m.popup(QCursor.pos())
def _maybe_add_cut_action(self, menu: QMenu) -> None: def _add_cut_action(self, menu: QMenu) -> None:
if self.hasSelection(): a = menu.addAction(tr.editing_cut())
a = menu.addAction(tr.editing_cut()) qconnect(a.triggered, self.onCut)
qconnect(a.triggered, self.onCut)
def _maybe_add_copy_action(self, menu: QMenu) -> None: def _add_copy_action(self, menu: QMenu) -> None:
if self.hasSelection(): a = menu.addAction(tr.actions_copy())
a = menu.addAction(tr.actions_copy()) qconnect(a.triggered, self.onCopy)
qconnect(a.triggered, self.onCopy)
def _maybe_add_copy_image_action(self, menu: QMenu) -> None: def _add_image_menu(self, webview: AnkiWebView, menu: QMenu) -> None:
if self._opened_context_menu_on_image(): a = menu.addAction(tr.editing_copy_image())
a = menu.addAction(tr.editing_copy_image()) qconnect(a.triggered, self.on_copy_image)
qconnect(a.triggered, self.on_copy_image)
if is_win or is_mac:
url = webview.lastContextMenuRequest().mediaUrl()
file_name = url.fileName()
path = os.path.join(mw.col.media.dir(), file_name)
a = menu.addAction(tr.editing_show_in_folder())
qconnect(a.triggered, lambda: showinFolder(path))
# QFont returns "Kozuka Gothic Pro L" but WebEngine expects "Kozuka Gothic Pro Light" # QFont returns "Kozuka Gothic Pro L" but WebEngine expects "Kozuka Gothic Pro Light"

View file

@ -21,6 +21,7 @@ from anki._legacy import DeprecatedNamesMixinForModule
from anki.collection import Collection, HelpPage from anki.collection import Collection, HelpPage
from anki.lang import TR, tr_legacyglobal # pylint: disable=unused-import from anki.lang import TR, tr_legacyglobal # pylint: disable=unused-import
from anki.utils import ( from anki.utils import (
call,
invalid_filename, invalid_filename,
is_mac, is_mac,
is_win, is_win,
@ -885,6 +886,33 @@ def openFolder(path: str) -> None:
QDesktopServices.openUrl(QUrl(f"file://{path}")) QDesktopServices.openUrl(QUrl(f"file://{path}"))
def showinFolder(path: str) -> None:
if is_win:
call(["explorer", "/select,", f"file://{path}"])
elif is_mac:
script = f"""
tell application "Finder"
activate
select POSIX file '{path}'
end tell
"""
call(osascript_to_args(script))
else:
# Just open the file in any other platform
with no_bundled_libs():
QDesktopServices.openUrl(QUrl(f"file://{path}"))
def osascript_to_args(script: str):
args = [
item
for line in script.splitlines()
for item in ("-e", line.strip())
if line.strip()
]
return ["osascript"] + args
def shortcut(key: str) -> str: def shortcut(key: str) -> str:
if is_mac: if is_mac:
return re.sub("(?i)ctrl", "Command", key) return re.sub("(?i)ctrl", "Command", key)