Refine: system clipboard

- New settings for controlling visibility of the clipboard toolbar for extenrally copied images and paths
This commit is contained in:
aleksey-hoffman committed 2026-06-30 13:38:34 +03:00
1 parent 846d6373bc
commit 195ad1cf4e
30 files changed
+604 -23

No files matched your search

+7
View File
@@ -310,6 +310,12 @@
"title": "工具提示",
"delay": "工具提示延迟({n} 毫秒)"
},
"clipboard": {
"title": "剪贴板",
"showToolbarForExternalImages": "显示在其他应用中复制的图像的剪贴板工具栏",
"showToolbarForExternalPaths": "显示在其他应用中复制的文件路径的剪贴板工具栏",
"pasteStillWorksWhenHidden": "禁用这些选项后,使用 {shortcut} 粘贴仍然有效,只是不会显示剪贴板工具栏。"
},
"homePageMediaBanner": {
"title": "主页媒体横幅"
},
@@ -446,6 +452,7 @@
"uiElements": "ui、元素、视觉、输入、重音、颜色、时间线、仪表板、页面、最近、卡片、主页、驱动器、空间、指示器、样式",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "剪贴板, 粘贴, 复制, 剪切, 工具栏, 图像, 截图, 路径, 文件",
"homePageMediaBanner": "主页、页面、媒体、横幅、背景、图像、视频",
"navigator": "设计、用户界面、导航器、分隔线、标题、排序、视图、布局、列表、网格、项目、文件、目录、悬停、缩放、突出显示、强迫症",
"shortcuts": "快捷键",
+7
View File
@@ -310,6 +310,12 @@
"title": "Tooltips",
"delay": "Tooltip-Verzögerung ({n} ms)"
},
"clipboard": {
"title": "Zwischenablage",
"showToolbarForExternalImages": "Zwischenablage-Symbolleiste für in anderen Apps kopierte Bilder anzeigen",
"showToolbarForExternalPaths": "Zwischenablage-Symbolleiste für in anderen Apps kopierte Dateipfade anzeigen",
"pasteStillWorksWhenHidden": "Einfügen mit {shortcut} funktioniert weiterhin, wenn diese Optionen deaktiviert sind. Die Zwischenablage-Symbolleiste wird nur ausgeblendet."
},
"homePageMediaBanner": {
"title": "Homepage-Medienbanner"
},
@@ -446,6 +452,7 @@
"uiElements": "UI, Elemente, visuell, Eingabe, Akzent, Farbe, Zeitleiste, Dashboard, Seite, aktuell, Karten, Startseite, Laufwerk, Raum, Anzeige, Stil",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "Zwischenablage, einfügen, kopieren, ausschneiden, Symbolleiste, Bild, Screenshot, Pfad, Dateien",
"homePageMediaBanner": "Startseite, Seite, Medien, Banner, Hintergrund, Bild, Video",
"navigator": "design, ui, navigator, dividers, titles, sorting, view, layout, list, grid, item, file, directory, hover, scale, highlight, OCD",
"shortcuts": "Abkürzungen",
+7
View File
@@ -339,6 +339,12 @@
"title": "Tooltips",
"delay": "Tooltip delay ({n} ms)"
},
"clipboard": {
"title": "Clipboard",
"showToolbarForExternalImages": "Show clipboard toolbar for images copied in other apps",
"showToolbarForExternalPaths": "Show clipboard toolbar for file paths copied in other apps",
"pasteStillWorksWhenHidden": "Paste with {shortcut} will still work when these options are disabled. You just won't see the clipboard toolbar."
},
"homePageMediaBanner": {
"title": "Home page media banner"
},
@@ -475,6 +481,7 @@
"uiElements": "ui, elements, visual, input, accent, color, timeline, dashboard, page, recent, cards, home, drive, space, indicator, style",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "clipboard, paste, copy, cut, toolbar, image, screenshot, path, files",
"homePageMediaBanner": "home, page, media, banner, background, image, video",
"infoPanelPreview": "info, panel, preview, image, thumbnail, memory, original, full-size, quick view, video, mute, autoplay",
"navigator": "design, ui, navigator, dividers, titles, sorting, view, layout, list, grid, item, file, directory, hover, scale, highlight, OCD",
+7
View File
@@ -310,6 +310,12 @@
"title": "Información emergente",
"delay": "Retraso del tooltip ({n} ms)"
},
"clipboard": {
"title": "Portapapeles",
"showToolbarForExternalImages": "Mostrar barra de herramientas del portapapeles para imágenes copiadas en otras apps",
"showToolbarForExternalPaths": "Mostrar barra de herramientas del portapapeles para rutas de archivos copiadas en otras apps",
"pasteStillWorksWhenHidden": "Pegar con {shortcut} seguirá funcionando cuando estas opciones estén desactivadas. Simplemente no verás la barra de herramientas del portapapeles."
},
"homePageMediaBanner": {
"title": "Banner de medios de la página de inicio"
},
@@ -446,6 +452,7 @@
"uiElements": "ui, elementos, visual, entrada, acento, color, línea de tiempo, tablero, página, reciente, tarjetas, inicio, unidad, espacio, indicador, estilo",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "portapapeles, pegar, copiar, cortar, barra de herramientas, imagen, captura, ruta, archivos",
"homePageMediaBanner": "inicio, página, medios, banner, fondo, imagen, video",
"navigator": "diseño, interfaz de usuario, navegador, divisores, títulos, clasificación, vista, diseño, lista, cuadrícula, elemento, archivo, directorio, desplazamiento, escala, resaltado, OCD",
"shortcuts": "atajos",
+7
View File
@@ -306,6 +306,12 @@
"title": "راهنماها",
"delay": "تأخیر راهنما ({n} ms)"
},
"clipboard": {
"title": "کلیپ‌بورد",
"showToolbarForExternalImages": "نمایش نوار ابزار کلیپ‌بورد برای تصاویر کپی‌شده در برنامه‌های دیگر",
"showToolbarForExternalPaths": "نمایش نوار ابزار کلیپ‌بورد برای مسیرهای فایل کپی‌شده در برنامه‌های دیگر",
"pasteStillWorksWhenHidden": "وقتی این گزینه‌ها غیرفعال هستند، چسباندن با {shortcut} همچنان کار می‌کند. فقط نوار ابزار کلیپ‌بورد نمایش داده نمی‌شود."
},
"homePageMediaBanner": {
"title": "بنر رسانه صفحه اصلی"
},
@@ -442,6 +448,7 @@
"uiElements": "رابط کاربری، عناصر، بصری، ورودی، لهجه، رنگ، جدول زمانی، داشبورد، صفحه، اخیر، کارت‌ها، خانه، درایو، فضا، نشانگر، سبک",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "کلیپ‌بورد, چسباندن, کپی, برش, نوار ابزار, تصویر, اسکرین‌شات, مسیر, فایل",
"homePageMediaBanner": "خانه، صفحه، رسانه، بنر، پس زمینه، تصویر، ویدئو",
"navigator": "طراحی، رابط کاربری، ناوبر، تقسیم‌کننده‌ها، عنوان‌ها، مرتب‌سازی، نمایش، طرح‌بندی، فهرست، شبکه، آیتم، فایل، فهرست، شناور، مقیاس، برجسته‌سازی، OCD",
"shortcuts": "میانبرها",
+7
View File
@@ -310,6 +310,12 @@
"title": "Info-bulles",
"delay": "Délai de l'info-bulle ({n} ms)"
},
"clipboard": {
"title": "Presse-papiers",
"showToolbarForExternalImages": "Afficher la barre d'outils du presse-papiers pour les images copiées dans d'autres apps",
"showToolbarForExternalPaths": "Afficher la barre d'outils du presse-papiers pour les chemins de fichiers copiés dans d'autres apps",
"pasteStillWorksWhenHidden": "Coller avec {shortcut} fonctionnera toujours lorsque ces options sont désactivées. Vous ne verrez simplement pas la barre d'outils du presse-papiers."
},
"homePageMediaBanner": {
"title": "Bannière média de la page d'accueil"
},
@@ -446,6 +452,7 @@
"uiElements": "interface utilisateur, éléments, visuel, entrée, accent, couleur, chronologie, tableau de bord, page, récent, cartes, accueil, lecteur, espace, indicateur, style",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "presse-papiers, coller, copier, couper, barre d'outils, image, capture, chemin, fichiers",
"homePageMediaBanner": "accueil, page, média, bannière, arrière-plan, image, vidéo",
"navigator": "conception, interface utilisateur, navigateur, séparateurs, titres, tri, vue, mise en page, liste, grille, élément, fichier, répertoire, survol, échelle, surbrillance, OCD",
"shortcuts": "raccourcis",
+7
View File
@@ -339,6 +339,12 @@
"title": "תיאורי כלי",
"delay": "השהיית תיאור הכלי ({n} מ\"ש)"
},
"clipboard": {
"title": "לוח העריכה",
"showToolbarForExternalImages": "הצג סרגל כלים של לוח העריכה לתמונות שהועתקו באפליקציות אחרות",
"showToolbarForExternalPaths": "הצג סרגל כלים של לוח העריכה לנתיבי קבצים שהועתקו באפליקציות אחרות",
"pasteStillWorksWhenHidden": "הדבקה עם {shortcut} תמשיך לעבוד גם כשהאפשרויות מושבתות. פשוט לא תראה את סרגל כלי לוח העריכה."
},
"homePageMediaBanner": {
"title": "באנר המדיה של דף הבית"
},
@@ -475,6 +481,7 @@
"uiElements": "ממשק, רכיבים, חזותי, קלט, צבע הדגשה, ציר זמן, לוח מחוונים, דף, אחרונים, כרטיסים, דף הבית, כונן, שטח, מחוון, סגנון",
"quickAccess": "גישה מהירה, לוח, ריחוף, סרגל צד, לוח מחוונים",
"tooltips": "תיאור כלי, ריחוף, השהיה, תזמון",
"clipboard": "לוח העריכה, הדבקה, העתקה, גזירה, סרגל כלים, תמונה, צילום מסך, נתיב, קבצים",
"homePageMediaBanner": "דף הבית, מדיה, באנר, רקע, תמונה, סרטון",
"navigator": "עיצוב, ממשק, ניווט, מפרידים, כותרות, מיון, תצוגה, פריסה, רשימה, רשת, פריט, קובץ, תיקייה, ריחוף, הדגשה",
"shortcuts": "קיצורי דרך",
+7
View File
@@ -339,6 +339,12 @@
"title": "टूलटिप्स",
"delay": "टूलटिप विलंब ({n} ms)"
},
"clipboard": {
"title": "क्लिपबोर्ड",
"showToolbarForExternalImages": "अन्य ऐप्स में कॉपी की गई छवियों के लिए क्लिपबोर्ड टूलबार दिखाएं",
"showToolbarForExternalPaths": "अन्य ऐप्स में कॉपी किए गए फ़ाइल पथों के लिए क्लिपबोर्ड टूलबार दिखाएं",
"pasteStillWorksWhenHidden": "जब ये विकल्प अक्षम हों, {shortcut} से पेस्ट करना फिर भी काम करेगा। आपको बस क्लिपबोर्ड टूलबार दिखाई नहीं देगा।"
},
"homePageMediaBanner": {
"title": "होम पेज मीडिया बैनर"
},
@@ -475,6 +481,7 @@
"uiElements": "यूआई, तत्व, दृश्य, इनपुट, उच्चारण, रंग, समयरेखा, डैशबोर्ड, पृष्ठ, हाल ही में, कार्ड, होम, ड्राइव, स्थान, संकेतक, शैली",
"quickAccess": "त्वरित, पहुंच, पैनल, होवर, साइडबार, डैशबोर्ड",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "क्लिपबोर्ड, पेस्ट, कॉपी, कट, टूलबार, छवि, स्क्रीनशॉट, पथ, फ़ाइल",
"homePageMediaBanner": "होम, पेज, मीडिया, बैनर, पृष्ठभूमि, छवि, वीडियो",
"navigator": "डिज़ाइन, यूआई, नेविगेटर, डिवाइडर, शीर्षक, सॉर्टिंग, दृश्य, लेआउट, सूची, ग्रिड, आइटम, फ़ाइल, निर्देशिका, होवर, स्केल, हाइलाइट, ओसीडी",
"shortcuts": "शॉर्टकट",
+7
View File
@@ -310,6 +310,12 @@
"title": "Suggerimenti",
"delay": "Ritardo del suggerimento ({n} ms)"
},
"clipboard": {
"title": "Appunti",
"showToolbarForExternalImages": "Mostra barra degli strumenti degli appunti per immagini copiate in altre app",
"showToolbarForExternalPaths": "Mostra barra degli strumenti degli appunti per percorsi file copiati in altre app",
"pasteStillWorksWhenHidden": "Incollare con {shortcut} continuerà a funzionare quando queste opzioni sono disattivate. Non vedrai solo la barra degli strumenti degli appunti."
},
"homePageMediaBanner": {
"title": "Banner multimediale nella pagina iniziale"
},
@@ -446,6 +452,7 @@
"uiElements": "ui, elementi, visivo, input, accento, colore, cronologia, dashboard, pagina, recenti, schede, inizio, drive, spazio, indicatore, stile",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "appunti, incolla, copia, taglia, barra strumenti, immagine, screenshot, percorso, file",
"homePageMediaBanner": "home, pagina, media, banner, sfondo, immagine, video",
"navigator": "design, ui, navigatore, divisori, titoli, ordinamento, visualizzazione, layout, elenco, griglia, elemento, file, directory, hover, scala, evidenziazione, OCD",
"shortcuts": "scorciatoie",
+7
View File
@@ -310,6 +310,12 @@
"title": "ツールチップ",
"delay": "ツールチップ表示までの遅延({n} ms)"
},
"clipboard": {
"title": "クリップボード",
"showToolbarForExternalImages": "他のアプリでコピーした画像のクリップボードツールバーを表示",
"showToolbarForExternalPaths": "他のアプリでコピーしたファイルパスのクリップボードツールバーを表示",
"pasteStillWorksWhenHidden": "これらのオプションを無効にしても {shortcut} による貼り付けは引き続き利用できます。クリップボードツールバーだけが表示されなくなります。"
},
"homePageMediaBanner": {
"title": "ホームページメディアバナー"
},
@@ -446,6 +452,7 @@
"uiElements": "UI、要素、ビジュアル、入力、アクセント、色、タイムライン、ダッシュボード、ページ、最近、カード、ホーム、ドライブ、スペース、インジケーター、スタイル",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "クリップボード, 貼り付け, コピー, 切り取り, ツールバー, 画像, スクリーンショット, パス, ファイル",
"homePageMediaBanner": "ホーム、ページ、メディア、バナー、背景、画像、動画",
"navigator": "デザイン、UI、ナビゲーター、ディバイダー、タイトル、ソート、ビュー、レイアウト、リスト、グリッド、アイテム、ファイル、ディレクトリ、ホバー、スケール、ハイライト、OCD",
"shortcuts": "ショートカット",
+7
View File
@@ -310,6 +310,12 @@
"title": "Dicas",
"delay": "Atraso da dica ({n} ms)"
},
"clipboard": {
"title": "Área de transferência",
"showToolbarForExternalImages": "Mostrar barra de ferramentas da área de transferência para imagens copiadas em outros apps",
"showToolbarForExternalPaths": "Mostrar barra de ferramentas da área de transferência para caminhos de arquivo copiados em outros apps",
"pasteStillWorksWhenHidden": "Colar com {shortcut} continuará funcionando quando estas opções estiverem desativadas. Você apenas não verá a barra de ferramentas da área de transferência."
},
"homePageMediaBanner": {
"title": "Banner de mídia da página inicial"
},
@@ -446,6 +452,7 @@
"uiElements": "ui, elementos, visual, entrada, acento, cor, linha do tempo, painel, página, recente, cartões, página inicial, unidade, espaço, indicador, estilo",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "área de transferência, colar, copiar, recortar, barra de ferramentas, imagem, captura, caminho, arquivos",
"homePageMediaBanner": "home, página, mídia, banner, plano de fundo, imagem, vídeo",
"navigator": "layout, interface do usuário, navegador, divisórias, títulos, classificação, visualização, layout, lista, grade, item, arquivo, diretório, rolagem, escala, destaque, OCD",
"shortcuts": "atalhos",
+7
View File
@@ -339,6 +339,12 @@
"title": "Подсказки",
"delay": "Задержка подсказки ({n} мс)"
},
"clipboard": {
"title": "Буфер обмена",
"showToolbarForExternalImages": "Показывать панель буфера обмена для изображений, скопированных в других приложениях",
"showToolbarForExternalPaths": "Показывать панель буфера обмена для путей файлов, скопированных в других приложениях",
"pasteStillWorksWhenHidden": "Вставка через {shortcut} будет работать и при отключенных опциях. Просто панель буфера обмена не будет отображаться."
},
"homePageMediaBanner": {
"title": "Медиа-баннер на главной странице"
},
@@ -475,6 +481,7 @@
"uiElements": "пользовательский интерфейс, элементы, визуальный элемент, ввод, акцент, цвет, временная шкала, информационная панель, страница, недавние, карточки, главная страница, диск, пространство, индикатор, стиль",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "буфер обмена, вставить, копировать, вырезать, панель, изображение, скриншот, путь, файлы",
"homePageMediaBanner": "главная, страница, медиа, баннер, фон, изображение, видео",
"navigator": "дизайн, пользовательский интерфейс, навигатор, разделители, заголовки, сортировка, вид, макет, список, сетка, элемент, файл, папка, наведение, масштаб, выделение, OCD",
"shortcuts": "шорткаты",
+7
View File
@@ -339,6 +339,12 @@
"title": "Namigi",
"delay": "Zakasnitev namiga ({n} ms)"
},
"clipboard": {
"title": "Odložišče",
"showToolbarForExternalImages": "Prikaži orodno vrstico odložišča za slike, kopirane v drugih aplikacijah",
"showToolbarForExternalPaths": "Prikaži orodno vrstico odložišča za poti datotek, kopirane v drugih aplikacijah",
"pasteStillWorksWhenHidden": "Lepljenje s {shortcut} bo še vedno delovalo, ko so te možnosti onemogočene. Orodna vrstica odložišča se samo ne bo prikazala."
},
"homePageMediaBanner": {
"title": "Medijska pasica domače strani"
},
@@ -475,6 +481,7 @@
"uiElements": "ui, elements, visual, input, accent, color, timeline, dashboard, page, recent, cards, home, drive, space, indicator, style",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "odložišče, prilepi, kopiraj, izreži, orodna vrstica, slika, posnetek zaslona, pot, datoteke",
"homePageMediaBanner": "home, page, media, banner, background, image, video",
"navigator": "design, ui, navigator, dividers, titles, sorting, view, layout, list, grid, item, file, directory, hover, scale, highlight, OCD",
"shortcuts": "shortcuts",
+7
View File
@@ -310,6 +310,12 @@
"title": "İpuçları",
"delay": "İpucu gecikmesi ({n} ms)"
},
"clipboard": {
"title": "Pano",
"showToolbarForExternalImages": "Diğer uygulamalarda kopyalanan görseller için pano araç çubuğunu göster",
"showToolbarForExternalPaths": "Diğer uygulamalarda kopyalanan dosya yolları için pano araç çubuğunu göster",
"pasteStillWorksWhenHidden": "Bu seçenekler devre dışı bırakıldığında {shortcut} ile yapıştırma yine de çalışır. Yalnızca pano araç çubuğu görünmez."
},
"homePageMediaBanner": {
"title": "Ana sayfa medya banner'ı"
},
@@ -446,6 +452,7 @@
"uiElements": "ui, öğeler, görsel, giriş, vurgu, renk, zaman çizelgesi, pano, sayfa, son, kartlar, ev, sürücü, boşluk, gösterge, stil",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "pano, yapıştır, kopyala, kes, araç çubuğu, görsel, ekran görüntüsü, yol, dosya",
"homePageMediaBanner": "ana sayfa, sayfa, medya, afiş, arka plan, resim, video",
"navigator": "tasarım, kullanıcı arabirimi, gezgin, bölücüler, başlıklar, sıralama, görünüm, düzen, liste, ızgara, öğe, dosya, dizin, vurgulu, ölçek, vurgulama, OKB",
"shortcuts": "kısayollar",
+7
View File
@@ -339,6 +339,12 @@
"title": "ٹول ٹپس",
"delay": "ٹول ٹپ میں تاخیر ({n} ms)"
},
"clipboard": {
"title": "کلپ بورڈ",
"showToolbarForExternalImages": "دوسری ایپس میں کاپی کی گئی تصاویر کے لیے کلپ بورڈ ٹول بار دکھائیں",
"showToolbarForExternalPaths": "دوسری ایپس میں کاپی کیے گئے فائل راستوں کے لیے کلپ بورڈ ٹول بار دکھائیں",
"pasteStillWorksWhenHidden": "جب یہ اختیارات غیر فعال ہوں، {shortcut} سے پیسٹ کرنا پھر بھی کام کرے گا۔ آپ کو صرف کلپ بورڈ ٹول بار نظر نہیں آئے گا۔"
},
"homePageMediaBanner": {
"title": "ہوم صفحے میڈیا بینر"
},
@@ -475,6 +481,7 @@
"uiElements": "ui, عناصر, ڈیش بورڈ, کارڈ, ٹائم لائن",
"quickAccess": "فوری رسائی, سائیڈ بار, ہوور",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "کلپ بورڈ, پیسٹ, کاپی, کٹ, ٹول بار, تصویر, اسکرین شاٹ, راستہ, فائل",
"homePageMediaBanner": "ہوم, میڈیا, بینر, پس منظر",
"navigator": "نیویگیٹر, لے آؤٹ, فہرست, گرڈ, ترتیب",
"shortcuts": "شارٹ کٹس",
+7
View File
@@ -310,6 +310,12 @@
"title": "Chú thích",
"delay": "Độ trễ chú thích ({n} ms)"
},
"clipboard": {
"title": "Bảng nhớ tạm",
"showToolbarForExternalImages": "Hiển thị thanh công cụ bảng nhớ tạm cho hình ảnh được sao chép trong ứng dụng khác",
"showToolbarForExternalPaths": "Hiển thị thanh công cụ bảng nhớ tạm cho đường dẫn tệp được sao chép trong ứng dụng khác",
"pasteStillWorksWhenHidden": "Dán bằng {shortcut} vẫn hoạt động khi các tùy chọn này bị tắt. Bạn chỉ sẽ không thấy thanh công cụ bảng nhớ tạm."
},
"homePageMediaBanner": {
"title": "Biểu ngữ truyền thông trang chủ"
},
@@ -446,6 +452,7 @@
"uiElements": "ui, thành phần, hình ảnh, đầu vào, dấu, màu sắc, dòng thời gian, bảng điều khiển, trang, gần đây, thẻ, nhà, ổ đĩa, không gian, chỉ báo, kiểu",
"quickAccess": "quick, access, panel, hover, sidebar, dashboard",
"tooltips": "tooltip, tooltips, hover, delay, timing",
"clipboard": "bảng nhớ tạm, dán, sao chép, cắt, thanh công cụ, hình ảnh, ảnh chụp màn hình, đường dẫn, tệp",
"homePageMediaBanner": "trang chủ, trang, phương tiện, biểu ngữ, nền, hình ảnh, video",
"navigator": "thiết kế, giao diện người dùng, bộ điều hướng, bộ chia, tiêu đề, sắp xếp, chế độ xem, bố cục, danh sách, lưới, mục, tệp, thư mục, di chuột, tỷ lệ, đánh dấu, OCD",
"shortcuts": "phím tắt",
@@ -18,6 +18,18 @@ import ClipboardToolbar from '../clipboard-toolbar.vue';
const invokeMock = vi.hoisted(() => vi.fn());
const convertFileSrcMock = vi.hoisted(() => vi.fn((path: string) => `asset://${path}`));
const clipboardSettingsMock = vi.hoisted(() => ({
showToolbarForExternalImages: true,
showToolbarForExternalPaths: true,
}));
vi.mock('@/stores/storage/user-settings', () => ({
useUserSettingsStore: () => ({
userSettings: {
clipboard: clipboardSettingsMock,
},
}),
}));
vi.mock('@tauri-apps/api/core', () => ({
convertFileSrc: (path: string) => convertFileSrcMock(path),
@@ -269,7 +269,7 @@ function removeClipboardItem(entry: ClipboardToolbarItem) {
<template>
<Transition name="clipboard-slide">
<div
v-if="clipboardStore.showToolbar"
v-if="clipboardStore.showClipboardUi"
class="clipboard-toolbar-container"
>
<Popover
@@ -39,7 +39,7 @@ const platformStore = usePlatformStore();
const clipboardStore = useClipboardStore();
const dirSizesStore = useDirSizesStore();
const itemCountsStore = useItemCountsStore();
const { clipboardItems, clipboardType, isToolbarSuppressed } = storeToRefs(clipboardStore);
const { clipboardItems, clipboardType, showClipboardUi } = storeToRefs(clipboardStore);
const { t } = useI18n();
const previewRef = ref<HTMLElement | null>(null);
const isPreviewInLoadRange = ref(false);
@@ -56,7 +56,7 @@ const { previewSize } = useDevicePixelPreviewSize({
});
const clipboardPathsMap = computed(() => {
if (isToolbarSuppressed.value) {
if (!showClipboardUi.value) {
return new Map<string, string>();
}
@@ -109,7 +109,7 @@ const linkMetadataStore = useLinkMetadataStore();
const itemCountsStore = useItemCountsStore();
const userSettingsStore = useUserSettingsStore();
const platformStore = usePlatformStore();
const { clipboardItems, clipboardType, isToolbarSuppressed } = storeToRefs(clipboardStore);
const { clipboardItems, clipboardType, showClipboardUi } = storeToRefs(clipboardStore);
const { t, locale } = useI18n();
const activeTagSelectorPath = ref<string | null>(null);
@@ -161,7 +161,7 @@ const {
} = useFileBrowserTags();
const clipboardPathsMap = computed(() => {
if (isToolbarSuppressed.value) {
if (!showClipboardUi.value) {
return new Map<string, string>();
}
@@ -0,0 +1,110 @@
<!-- SPDX-License-Identifier: GPL-3.0-or-later
License: GNU GPLv3 or later. See the license file in the project root for more information.
Copyright © 2021 - present Aleksey Hoffman. All rights reserved.
-->
<script setup lang="ts">
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { ClipboardIcon } from '@lucide/vue';
import { Switch } from '@/components/ui/switch';
import { SettingsItem } from '@/modules/settings';
import { useUserSettingsStore } from '@/stores/storage/user-settings';
import { useShortcutsStore } from '@/stores/runtime/shortcuts';
const userSettingsStore = useUserSettingsStore();
const shortcutsStore = useShortcutsStore();
const { t } = useI18n();
const pasteShortcutLabel = computed(() => shortcutsStore.getShortcutLabel('paste'));
const showToolbarForExternalImages = computed({
get: () => userSettingsStore.userSettings.clipboard.showToolbarForExternalImages,
set: (value: boolean) => {
userSettingsStore.set('clipboard.showToolbarForExternalImages', value);
},
});
const showToolbarForExternalPaths = computed({
get: () => userSettingsStore.userSettings.clipboard.showToolbarForExternalPaths,
set: (value: boolean) => {
userSettingsStore.set('clipboard.showToolbarForExternalPaths', value);
},
});
</script>
<template>
<SettingsItem
:title="t('settings.clipboard.title')"
:icon="ClipboardIcon"
>
<template #description>
<i18n-t
keypath="settings.clipboard.pasteStillWorksWhenHidden"
tag="span"
>
<template #shortcut>
<kbd class="clipboard-settings__shortcut">{{ pasteShortcutLabel }}</kbd>
</template>
</i18n-t>
</template>
<template #nested>
<div class="clipboard-settings">
<div class="clipboard-settings__row">
<span class="clipboard-settings__label">
{{ t('settings.clipboard.showToolbarForExternalImages') }}
</span>
<Switch
:model-value="showToolbarForExternalImages"
@update:model-value="showToolbarForExternalImages = $event"
/>
</div>
<div class="clipboard-settings__row">
<span class="clipboard-settings__label">
{{ t('settings.clipboard.showToolbarForExternalPaths') }}
</span>
<Switch
:model-value="showToolbarForExternalPaths"
@update:model-value="showToolbarForExternalPaths = $event"
/>
</div>
</div>
</template>
</SettingsItem>
</template>
<style scoped>
.clipboard-settings {
display: flex;
width: 100%;
flex-direction: column;
gap: 1rem;
}
.clipboard-settings__row {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 1rem 2rem;
}
.clipboard-settings__label {
min-width: min(100%, 16rem);
flex: 1 1 12rem;
color: hsl(var(--foreground));
font-size: 0.875rem;
}
.clipboard-settings__shortcut {
display: inline-block;
padding: 0.125rem 0.375rem;
border: 1px solid hsl(var(--border));
border-radius: 0.25rem;
background: hsl(var(--muted));
color: hsl(var(--foreground));
font-family: inherit;
font-size: 0.8125rem;
line-height: 1.2;
}
</style>
@@ -0,0 +1,96 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// License: GNU GPLv3 or later. See the license file in the project root for more information.
// Copyright © 2021 - present Aleksey Hoffman. All rights reserved.
import { describe, expect, it } from 'vitest';
import type { DirEntry } from '@/types/dir-entry';
import {
hasSameFileClipboardContent,
shouldShowClipboardUi,
} from '@/stores/runtime/clipboard-visibility';
function createEntry(path: string): DirEntry {
return {
name: path.split(/[/\\]/).pop() || path,
ext: 'txt',
path,
size: 10,
item_count: null,
modified_time: 0,
accessed_time: 0,
created_time: 0,
mime: 'text/plain',
is_file: true,
is_dir: false,
is_symlink: false,
is_hidden: false,
link_type: null,
link_target: null,
link_status: null,
hard_link_count: null,
};
}
const defaultSettings = {
showToolbarForExternalImages: true,
showToolbarForExternalPaths: true,
};
describe('clipboard visibility', () => {
it('matches file clipboard content regardless of path casing', () => {
expect(hasSameFileClipboardContent(
[createEntry('C:/Source/file.txt')],
'copy',
['c:/source/file.txt'],
'copy',
)).toBe(true);
});
it('does not match when operations differ', () => {
expect(hasSameFileClipboardContent(
[createEntry('C:/Source/file.txt')],
'copy',
['C:/Source/file.txt'],
'move',
)).toBe(false);
});
it('shows internal clipboard UI regardless of external settings', () => {
expect(shouldShowClipboardUi({
hasItems: true,
origin: 'internal',
hasImageContent: false,
hasFileItems: true,
settings: {
showToolbarForExternalImages: false,
showToolbarForExternalPaths: false,
},
})).toBe(true);
});
it('hides external file clipboard UI when the paths setting is disabled', () => {
expect(shouldShowClipboardUi({
hasItems: true,
origin: 'external',
hasImageContent: false,
hasFileItems: true,
settings: {
...defaultSettings,
showToolbarForExternalPaths: false,
},
})).toBe(false);
});
it('hides external image clipboard UI when the images setting is disabled', () => {
expect(shouldShowClipboardUi({
hasItems: true,
origin: 'external',
hasImageContent: true,
hasFileItems: false,
settings: {
...defaultSettings,
showToolbarForExternalImages: false,
},
})).toBe(false);
});
});
+131 -2
View File
@@ -17,11 +17,23 @@ const invokeMock = vi.hoisted(() => vi.fn());
const copyMoveStartJobMock = vi.hoisted(() => vi.fn());
const handleDirectoryContentsChangedMock = vi.hoisted(() => vi.fn());
const invalidateDirSizesMock = vi.hoisted(() => vi.fn());
const clipboardSettingsMock = vi.hoisted(() => ({
showToolbarForExternalImages: true,
showToolbarForExternalPaths: true,
}));
vi.mock('@tauri-apps/api/core', () => ({
invoke: invokeMock,
}));
vi.mock('@/stores/storage/user-settings', () => ({
useUserSettingsStore: () => ({
userSettings: {
clipboard: clipboardSettingsMock,
},
}),
}));
vi.mock('@/stores/runtime/copy-move-jobs', () => ({
useCopyMoveJobsStore: () => ({
startJob: copyMoveStartJobMock,
@@ -92,6 +104,8 @@ describe('clipboard store', () => {
copyMoveStartJobMock.mockReset();
handleDirectoryContentsChangedMock.mockReset();
invalidateDirSizesMock.mockReset();
clipboardSettingsMock.showToolbarForExternalImages = true;
clipboardSettingsMock.showToolbarForExternalPaths = true;
});
afterEach(() => {
@@ -113,7 +127,7 @@ describe('clipboard store', () => {
});
expect(store.hasFileItems).toBe(true);
expect(store.hasImageContent).toBe(false);
expect(store.showToolbar).toBe(true);
expect(store.showClipboardUi).toBe(true);
});
it('waits for a pending system clipboard write before syncing from the system clipboard', async () => {
@@ -162,9 +176,45 @@ describe('clipboard store', () => {
expect(invokeMock).toHaveBeenCalledWith('read_system_clipboard_files');
expect(store.clipboardItems).toHaveLength(1);
expect(store.clipboardItems[0].path).toBe('C:/Source/file.txt');
expect(store.showClipboardUi).toBe(true);
});
it('syncs file-list clipboard content from the system clipboard before checking for images', async () => {
it('preserves internal clipboard UI after syncing equivalent system paths', async () => {
invokeMock.mockImplementation(async (commandName: string, args?: unknown) => {
if (commandName === 'read_system_clipboard_files') {
return {
paths: ['c:/source/file.txt'],
operation: 'copy',
};
}
if (commandName === 'paths_are_directories') {
return [false];
}
if (commandName === 'get_dir_entry_with_timeout') {
return createEntry({
path: (args as { path: string }).path,
});
}
return undefined;
});
const store = useClipboardStore();
store.setClipboard('copy', [
createEntry({ path: 'C:/Source/file.txt' }),
], {
syncToSystemClipboard: false,
});
await store.syncFromSystemClipboard();
expect(store.showClipboardUi).toBe(true);
expect(store.hasFileItems).toBe(true);
});
it('marks file paths synced from the system clipboard as external', async () => {
invokeMock.mockImplementation(async (commandName: string, args?: unknown) => {
if (commandName === 'read_system_clipboard_files') {
return {
@@ -202,6 +252,7 @@ describe('clipboard store', () => {
expect(store.hasFileItems).toBe(true);
expect(store.hasImageContent).toBe(false);
expect(store.clipboardItems[0].path).toBe('C:/External/photo.png');
expect(store.showClipboardUi).toBe(true);
expect(invokeMock).not.toHaveBeenCalledWith('read_system_clipboard_image_info');
});
@@ -239,6 +290,7 @@ describe('clipboard store', () => {
expect(store.hasItems).toBe(true);
expect(store.hasFileItems).toBe(false);
expect(store.hasImageContent).toBe(true);
expect(store.showClipboardUi).toBe(true);
expect(store.itemCount).toBe(1);
expect(store.clipboardImage).toEqual({
width: 252,
@@ -508,4 +560,81 @@ describe('clipboard store', () => {
expect(consumed).toBe(false);
expect(store.hasFileItems).toBe(true);
});
it('hides the toolbar for external file paths when the setting is disabled', async () => {
clipboardSettingsMock.showToolbarForExternalPaths = false;
invokeMock.mockImplementation(async (commandName: string, args?: unknown) => {
if (commandName === 'read_system_clipboard_files') {
return {
paths: ['C:/External/file.txt'],
operation: 'copy',
};
}
if (commandName === 'paths_are_directories') {
return [false];
}
if (commandName === 'get_dir_entry_with_timeout') {
return createEntry({
path: (args as { path: string }).path,
});
}
return undefined;
});
const store = useClipboardStore();
await store.syncFromSystemClipboard();
expect(store.hasItems).toBe(true);
expect(store.showClipboardUi).toBe(false);
});
it('hides the clipboard UI for external images when the setting is disabled', async () => {
clipboardSettingsMock.showToolbarForExternalImages = false;
invokeMock.mockImplementation(async (commandName: string) => {
if (commandName === 'read_system_clipboard_files') {
return {
paths: [],
operation: 'copy',
};
}
if (commandName === 'read_system_clipboard_image_info') {
return {
width: 100,
height: 50,
sizeBytes: 20000,
clipboardSequence: 4,
};
}
return undefined;
});
const store = useClipboardStore();
await store.syncFromSystemClipboard();
expect(store.hasItems).toBe(true);
expect(store.showClipboardUi).toBe(false);
expect(store.canPasteTo('C:/Target')).toBe(true);
});
it('always shows the clipboard UI for internal clipboard even when external settings are disabled', async () => {
clipboardSettingsMock.showToolbarForExternalImages = false;
clipboardSettingsMock.showToolbarForExternalPaths = false;
invokeMock.mockResolvedValue(undefined);
const store = useClipboardStore();
store.setClipboard('copy', [
createEntry({ path: 'C:/Source/file.txt' }),
], {
syncToSystemClipboard: false,
});
expect(store.showClipboardUi).toBe(true);
});
});
@@ -0,0 +1,63 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// License: GNU GPLv3 or later. See the license file in the project root for more information.
// Copyright © 2021 - present Aleksey Hoffman. All rights reserved.
import type { DirEntry } from '@/types/dir-entry';
import type { ClipboardSettings } from '@/types/user-settings';
import { arePathsEquivalent } from '@/utils/file-operation-paths';
export type ClipboardOrigin = 'internal' | 'external' | '';
type FileClipboardOperationType = 'copy' | 'move' | '';
export function hasSameFileClipboardContent(
localItems: DirEntry[],
localType: FileClipboardOperationType,
systemPaths: string[],
systemOperation: 'copy' | 'move',
): boolean {
if (localType !== systemOperation || localItems.length !== systemPaths.length) {
return false;
}
const unmatchedSystemPaths = [...systemPaths];
for (const localItem of localItems) {
const matchingPathIndex = unmatchedSystemPaths.findIndex(systemPath =>
arePathsEquivalent(localItem.path, systemPath),
);
if (matchingPathIndex === -1) {
return false;
}
unmatchedSystemPaths.splice(matchingPathIndex, 1);
}
return unmatchedSystemPaths.length === 0;
}
export function shouldShowClipboardUi(options: {
hasItems: boolean;
origin: ClipboardOrigin;
hasImageContent: boolean;
hasFileItems: boolean;
settings: ClipboardSettings;
}): boolean {
if (!options.hasItems) {
return false;
}
if (options.origin === 'internal') {
return true;
}
if (options.hasImageContent) {
return options.settings.showToolbarForExternalImages;
}
if (options.hasFileItems) {
return options.settings.showToolbarForExternalPaths;
}
return false;
}
+37 -15
View File
@@ -16,7 +16,14 @@ import {
import { getPathLeafName } from '@/utils/normalize-path';
import { isVirtualLocationPath } from '@/utils/virtual-locations';
import { isTransientClipboardAccessError } from '@/utils/system-clipboard-errors';
import { useUserSettingsStore } from '@/stores/storage/user-settings';
import {
hasSameFileClipboardContent,
shouldShowClipboardUi,
type ClipboardOrigin,
} from '@/stores/runtime/clipboard-visibility';
export type { ClipboardOrigin } from '@/stores/runtime/clipboard-visibility';
export type ClipboardOperationType = 'copy' | 'move' | '';
export type ConflictResolution = 'replace' | 'skip' | 'auto-rename';
@@ -77,18 +84,25 @@ export interface ConflictItem {
}
export const useClipboardStore = defineStore('clipboard', () => {
const userSettingsStore = useUserSettingsStore();
const clipboardType = ref<ClipboardOperationType>('');
const clipboardItems = ref<DirEntry[]>([]);
const clipboardImage = ref<SystemClipboardImageInfo | null>(null);
const clipboardOrigin = ref<ClipboardOrigin>('');
const isOperationInProgress = ref(false);
const isToolbarSuppressed = ref(false);
let pendingSystemClipboardMutation: Promise<void> | null = null;
let pendingSystemClipboardImageSave: Promise<SystemClipboardImageInfo | null> | null = null;
const hasFileItems = computed(() => clipboardItems.value.length > 0);
const hasImageContent = computed(() => clipboardImage.value !== null);
const hasItems = computed(() => hasFileItems.value || hasImageContent.value);
const showToolbar = computed(() => hasItems.value && !isToolbarSuppressed.value);
const showClipboardUi = computed(() => shouldShowClipboardUi({
hasItems: hasItems.value,
origin: clipboardOrigin.value,
hasImageContent: hasImageContent.value,
hasFileItems: hasFileItems.value,
settings: userSettingsStore.userSettings.clipboard,
}));
const itemCount = computed(() => hasImageContent.value ? 1 : clipboardItems.value.length);
const isCopyOperation = computed(() => clipboardType.value === 'copy');
const isMoveOperation = computed(() => clipboardType.value === 'move');
@@ -105,14 +119,13 @@ export const useClipboardStore = defineStore('clipboard', () => {
type: ClipboardOperationType,
items: DirEntry[],
options?: {
keepToolbarHidden?: boolean;
syncToSystemClipboard?: boolean;
},
) {
clipboardType.value = type;
clipboardItems.value = items.map(item => ({ ...item }));
clipboardImage.value = null;
isToolbarSuppressed.value = options?.keepToolbarHidden === true;
clipboardOrigin.value = 'internal';
if (options?.syncToSystemClipboard !== false) {
void syncToSystemClipboard();
@@ -123,13 +136,12 @@ export const useClipboardStore = defineStore('clipboard', () => {
type: ClipboardOperationType,
items: DirEntry[],
options?: {
keepToolbarHidden?: boolean;
syncToSystemClipboard?: boolean;
},
) {
clipboardType.value = type;
clipboardImage.value = null;
isToolbarSuppressed.value = options?.keepToolbarHidden === true;
clipboardOrigin.value = 'internal';
for (const item of items) {
const itemAlreadyAdded = clipboardItems.value.some(
@@ -163,7 +175,7 @@ export const useClipboardStore = defineStore('clipboard', () => {
clipboardType.value = '';
clipboardItems.value = [];
clipboardImage.value = null;
isToolbarSuppressed.value = false;
clipboardOrigin.value = '';
}
function trackSystemClipboardMutation(mutation: Promise<void>): Promise<void> {
@@ -205,13 +217,13 @@ export const useClipboardStore = defineStore('clipboard', () => {
type: ClipboardOperationType;
items: DirEntry[];
image: SystemClipboardImageInfo | null;
suppressed: boolean;
origin: ClipboardOrigin;
} {
return {
type: clipboardType.value,
items: clipboardItems.value.map(item => ({ ...item })),
image: clipboardImage.value ? { ...clipboardImage.value } : null,
suppressed: isToolbarSuppressed.value,
origin: clipboardOrigin.value,
};
}
@@ -219,7 +231,7 @@ export const useClipboardStore = defineStore('clipboard', () => {
clipboardType.value = snapshot.type;
clipboardItems.value = snapshot.items;
clipboardImage.value = snapshot.image ? { ...snapshot.image } : null;
isToolbarSuppressed.value = snapshot.suppressed;
clipboardOrigin.value = snapshot.origin;
}
async function readSystemClipboardFiles(): Promise<{
@@ -266,11 +278,14 @@ export const useClipboardStore = defineStore('clipboard', () => {
}
}
function setClipboardImage(imageInfo: SystemClipboardImageInfo) {
function setClipboardImage(
imageInfo: SystemClipboardImageInfo,
origin: Exclude<ClipboardOrigin, ''> = 'external',
) {
clipboardType.value = 'copy';
clipboardItems.value = [];
clipboardImage.value = { ...imageInfo };
isToolbarSuppressed.value = false;
clipboardOrigin.value = origin;
}
async function syncToSystemClipboard(): Promise<void> {
@@ -482,10 +497,18 @@ export const useClipboardStore = defineStore('clipboard', () => {
return;
}
const preserveInternalOrigin = clipboardOrigin.value === 'internal'
&& hasSameFileClipboardContent(
clipboardItems.value,
clipboardType.value,
systemClipboard.paths,
systemClipboard.operation,
);
clipboardType.value = systemClipboard.operation;
clipboardItems.value = systemClipboardItems;
clipboardImage.value = null;
isToolbarSuppressed.value = false;
clipboardOrigin.value = preserveInternalOrigin ? 'internal' : 'external';
}
function canReuseSavedClipboardImage(imageInfo: SystemClipboardImageInfo): boolean {
@@ -738,11 +761,10 @@ export const useClipboardStore = defineStore('clipboard', () => {
clipboardItems,
clipboardImage,
isOperationInProgress,
isToolbarSuppressed,
hasFileItems,
hasImageContent,
hasItems,
showToolbar,
showClipboardUi,
itemCount,
isCopyOperation,
isMoveOperation,
+9
View File
@@ -151,6 +151,7 @@ export const useSettingsStore = defineStore('settings', () => {
{ default: DropdownFocusSection },
{ default: QuickAccessHoverSection },
{ default: TooltipsSection },
{ default: ClipboardSection },
{ default: InfoPanelSection },
{ default: GlobalSearchSection },
{ default: ShortcutsSection },
@@ -180,6 +181,7 @@ export const useSettingsStore = defineStore('settings', () => {
import('@/modules/settings/ui/categories/appearance/dropdown-focus.vue'),
import('@/modules/settings/ui/categories/appearance/quick-access-hover.vue'),
import('@/modules/settings/ui/categories/appearance/tooltips.vue'),
import('@/modules/settings/ui/categories/appearance/clipboard.vue'),
import('@/modules/settings/ui/categories/appearance/info-panel.vue'),
import('@/modules/settings/ui/categories/search/global-search.vue'),
import('@/modules/settings/ui/categories/shortcuts/shortcuts.vue'),
@@ -324,6 +326,13 @@ export const useSettingsStore = defineStore('settings', () => {
component: markRaw(TooltipsSection),
category: 'appearance',
},
{
key: 'clipboard',
titleKey: 'settings.clipboard.title',
tags: 'settingsTags.clipboard',
component: markRaw(ClipboardSection),
category: 'appearance',
},
{
key: 'infoPanel',
titleKey: 'settings.infoPanel.title',
@@ -172,4 +172,17 @@ describe('migrateUserSettingsStorage', () => {
expect(storage.values.get(USER_SETTINGS_SCHEMA_VERSION_KEY)).toBe(USER_SETTINGS_SCHEMA_VERSION);
expect(storage.save).toHaveBeenCalledOnce();
});
it('defaults clipboard toolbar settings when migrating from schema version 19', async () => {
const storage = createStorageAdapter({
[USER_SETTINGS_SCHEMA_VERSION_KEY]: 19,
});
await migrateUserSettingsStorage(storage);
expect(storage.values.get('clipboard.showToolbarForExternalImages')).toBe(true);
expect(storage.values.get('clipboard.showToolbarForExternalPaths')).toBe(true);
expect(storage.values.get(USER_SETTINGS_SCHEMA_VERSION_KEY)).toBe(USER_SETTINGS_SCHEMA_VERSION);
expect(storage.save).toHaveBeenCalledOnce();
});
});
+6 -1
View File
@@ -16,7 +16,7 @@ import {
import { BUILTIN_NAVIGATOR_ICON_THEME_IDS } from '@/types/icon-theme';
export const USER_SETTINGS_SCHEMA_VERSION_KEY = '__schemaVersion';
export const USER_SETTINGS_SCHEMA_VERSION = 19;
export const USER_SETTINGS_SCHEMA_VERSION = 20;
export const DEFAULT_GLOBAL_SEARCH_IGNORED_PATHS = [
'/node_modules',
@@ -418,6 +418,11 @@ async function migrateUserSettingsStep(storage: StorageAdapter, fromVersion: num
await setDefaultBooleanIfMissing(storage, 'performance.prelaunchPrintViewWindow', false);
}
if (fromVersion === 19 && toVersion === 20) {
await setDefaultBooleanIfMissing(storage, 'clipboard.showToolbarForExternalImages', true);
await setDefaultBooleanIfMissing(storage, 'clipboard.showToolbarForExternalPaths', true);
}
if (fromVersion === 6 && toVersion === 7) {
const appData = await appDataDir();
const mediaDir = `${appData.replace(/\\/g, '/')}/user-data/media`.replace(/\/+/g, '/');
+4
View File
@@ -165,6 +165,10 @@ export const useUserSettingsStore = defineStore('userSettings', () => {
showSpaceIndicator: true,
spaceIndicatorStyle: 'linearVertical',
},
clipboard: {
showToolbarForExternalImages: true,
showToolbarForExternalPaths: true,
},
userDirectories: {},
infusion: {
enabled: true,
+6
View File
@@ -167,6 +167,11 @@ export type TextSettings = {
font: string;
};
export type ClipboardSettings = {
showToolbarForExternalImages: boolean;
showToolbarForExternalPaths: boolean;
};
export type UserSettings = {
language: LocalizationLanguage;
theme: Theme;
@@ -183,6 +188,7 @@ export type UserSettings = {
customBackgroundMedia: CustomBackgroundMedia;
homeBannerPositions: HomeBannerPositions;
driveCard: DriveCardSettings;
clipboard: ClipboardSettings;
userDirectories: UserDirectoriesCustomizations;
infusion: InfusionSettings;
visualFilters: VisualFiltersSettings;