Merge PR #7167: fix(ui): right-click an Adaptive Wide Angle constraint for its orientation menu, as in the reference app

This commit is contained in:
aiongg committed 2026-10-22 02:22:09 +00:00
commit cce5208c2a
22 files changed
+136 -34

No files matched your search

+1 -1
View File
@@ -1105,7 +1105,7 @@
Done Hotovo
Dots Tečky
Drag a rectangle around the object Táhněte obdélník kolem objektu
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Tažením v obraze přidáte omezení; Shift pro vodorovné/svislé; pravým kliknutím odstraníte.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Tažením v obraze přidáte omezení; Shift pro vodorovné/svislé; pravým kliknutím na omezení ho změníte nebo odstraníte.
Drag to move the active shape's path or the Work Path Tažením přesunete cestu aktivního tvaru nebo pracovní cestu
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Klik: vybrat bod · Tažení: přesunout bod, úchyt nebo segment · {shift}+klik: přidat · {alt}+klik: celá podcesta
Draw with the Pen tool (P) or make a work path from a selection. Kreslete nástrojem pero (P) nebo vytvořte pracovní cestu z výběru.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1088,7 +1088,7 @@
Done Fertig
Dots Punkte
Drag a rectangle around the object Ziehe ein Rechteck um das Objekt
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Ziehe auf dem Bild, um eine Zwangsbedingung hinzuzufügen; Shift für horizontal/vertikal; Rechtsklick löscht.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Ziehe auf dem Bild, um eine Zwangsbedingung hinzuzufügen; Shift für horizontal/vertikal; Rechtsklick auf eine Zwangsbedingung ändert oder löscht sie.
Drag to move the active shape's path or the Work Path Ziehen, um den Pfad der aktiven Form oder den Arbeitspfad zu verschieben
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Klick: Ankerpunkt auswählen · Ziehen: Ankerpunkt, Griff oder Segment verschieben · {shift}-Klick: hinzufügen · {alt}-Klick: ganzer Teilpfad
Draw with the Pen tool (P) or make a work path from a selection. Zeichne mit dem Stift-Werkzeug (P) oder erzeuge einen Arbeitspfad aus einer Auswahl.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -2347,7 +2347,7 @@
Drag (lasso) or click points (polygonal) · {add} add · {sub} subtract Σύρετε για λάσο ή κάντε κλικ για πολυγωνική επιλογή · {add} προσθήκη · {sub} αφαίρεση
Drag a crop box · drag inside to move · edges resize ({ratio} ratio, {centre} centre) · Space moves while drawing · arrows nudge · X swaps orientation · {commit} commits · Esc cancels Σύρετε για περιοχή περικοπής · σύρετε στο εσωτερικό για μετακίνηση · από τα άκρα αλλάζει μέγεθος ({ratio} αναλογία, {centre} κέντρο) · Space για μετακίνηση κατά τη σχεδίαση · βέλη για μετακίνηση · X εναλλαγή προσανατολισμού · {commit} εφαρμογή · Esc ακύρωση
Drag around the centre to rotate the view · Shift constrains to 15° Σύρετε γύρω από το κέντρο για να περιστρέψετε την προβολή · Shift περιορίζει στις 15°
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Σύρετε πάνω στην εικόνα για προσθήκη περιορισμού· Shift για οριζόντιο/κατακόρυφο· δεξί κλικ για διαγραφή.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Σύρετε πάνω στην εικόνα για προσθήκη περιορισμού· Shift για οριζόντιο/κατακόρυφο· δεξί κλικ σε έναν περιορισμό για αλλαγή ή διαγραφή.
Drag or click polygon points · hold Alt during lasso for straight segments · {add} add · {sub} before drawing subtracts Σύρετε ή κάντε κλικ για πολυγωνικά σημεία · κρατήστε Alt κατά το λάσο για ευθείες · {add} προσθήκη · {sub} αφαίρεση πριν από τη σχεδίαση
Drag to draw a gradient Σύρετε για να σχεδιάσετε διαβάθμιση
Drag to move the active layer Σύρετε για μετακίνηση του ενεργού επιπέδου
Can't render this file because it contains an unexpected character in line 1030 and column 18.
+1 -1
View File
@@ -1095,7 +1095,7 @@
Done Hecho
Dots Puntos
Drag a rectangle around the object Arrastre un rectángulo alrededor del objeto
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Arrastre sobre la imagen para añadir una restricción; Mayús para horizontal/vertical; clic derecho para eliminar.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Arrastre sobre la imagen para añadir una restricción; Mayús para horizontal/vertical; clic derecho en una restricción para cambiarla o eliminarla.
Drag to move the active shape's path or the Work Path Arrastre para mover el trazado de la forma activa o el trazado de trabajo
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Clic: seleccionar punto · Arrastrar: mover punto, manejador o segmento · {shift}-clic: añadir · {alt}-clic: subtrazado completo
Draw with the Pen tool (P) or make a work path from a selection. Dibuje con la herramienta Pluma (P) o cree un trazado de trabajo a partir de una selección.
Can't render this file because it contains an unexpected character in line 4 and column 47.
+1 -1
View File
@@ -1080,7 +1080,7 @@
Done Terminé
Dots Points
Drag a rectangle around the object Tracez un rectangle autour de l'objet
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Faites glisser sur l'image pour ajouter une contrainte ; Maj pour horizontal/vertical ; clic droit pour supprimer.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Faites glisser sur l'image pour ajouter une contrainte ; Maj pour horizontal/vertical ; clic droit sur une contrainte pour la modifier ou la supprimer.
Drag to move the active shape's path or the Work Path Faites glisser pour déplacer le tracé de la forme active ou le tracé de travail
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Clic : sélectionner le point · Glisser : déplacer point, poignée ou segment · {shift}-clic : ajouter · {alt}-clic : sous-tracé entier
Draw with the Pen tool (P) or make a work path from a selection. Dessinez avec l'outil Plume (P) ou créez un tracé de travail à partir d'une sélection.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -2077,7 +2077,7 @@ navigator Zoom Nagyítás mértéke
Distortion Torzítás
Dither Árnyalatkeverés
Double Line Kettős vonal
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Húzással kényszert adhatsz a képhez; Shift: vízszintes/függőleges; jobb kattintás: törlés.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Húzással kényszert adhatsz a képhez; Shift: vízszintes/függőleges; jobb kattintás egy kényszeren: módosítás vagy törlés.
Dry Brush Száraz ecset
Dust & Scratches Por és karcolások
Dynamic color sliders Dinamikus színcsúszkák
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1074,7 +1074,7 @@
Done Selesai
Dots Titik
Drag a rectangle around the object Seret persegi panjang di sekeliling objek
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Seret pada gambar untuk menambah batasan; Shift untuk horizontal/vertikal; klik kanan untuk menghapus.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Seret pada gambar untuk menambah batasan; Shift untuk horizontal/vertikal; klik kanan pada batasan untuk mengubah atau menghapusnya.
Drag to move the active shape's path or the Work Path Seret untuk memindah path bentuk aktif atau Work Path
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Klik: pilih titik jangkar · Seret: pindahkan titik, gagang, atau segmen · {shift}-klik: tambah · {alt}-klik: seluruh subpath
Draw with the Pen tool (P) or make a work path from a selection. Gambar dengan alat Pen (P) atau buat work path dari seleksi.
Can't render this file because it contains an unexpected character in line 4 and column 47.
+1 -1
View File
@@ -1090,7 +1090,7 @@
Done Fatto
Dots Punti
Drag a rectangle around the object Trascina un rettangolo attorno all'oggetto
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Trascina sull'immagine per aggiungere un vincolo; Maiusc per orizz/vert; clic destro per eliminare.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Trascina sull'immagine per aggiungere un vincolo; Maiusc per orizz/vert; clic destro su un vincolo per modificarlo o eliminarlo.
Drag to move the active shape's path or the Work Path Trascina per spostare il tracciato forma attiva o il Tracciato di lavoro
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Clic: seleziona punto · Trascina: sposta punto, maniglia o segmento · {shift}-clic: aggiungi · {alt}-clic: intero sottotracciato
Draw with the Pen tool (P) or make a work path from a selection. Disegna con Penna (P) o crea un tracciato di lavoro da una selezione.
1 # Italian (it) catalog. Columns, separated by a TAB: context <TAB> source <TAB> translation
1090
1091
1092
1093
1094
1095
1096
+1 -1
View File
@@ -1093,7 +1093,7 @@
Done 完了
Dots ドット
Drag a rectangle around the object オブジェクトを囲む矩形をドラッグ
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. 画像上をドラッグして制約を追加。Shift で水平/垂直、右クリックで削除。
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. 画像上をドラッグして制約を追加。Shift で水平/垂直、制約を右クリックで変更・削除。
Drag to move the active shape's path or the Work Path ドラッグして、アクティブなシェイプのパスまたは作業用パスを移動
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath クリック: アンカーポイントを選択 · ドラッグ: ポイント、ハンドル、セグメントを移動 · {shift}+クリック: 追加 · {alt}+クリック: サブパス全体
Draw with the Pen tool (P) or make a work path from a selection. ペンツール(P)で描くか、選択範囲から作業用パスを作成します。
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1071,7 +1071,7 @@
Done 완료
Dots 점
Drag a rectangle around the object 오브젝트를 둘러싸는 사각형을 드래그하세요
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. 이미지 위에서 드래그하여 제약 조건 추가; Shift 키로 수평/수직 유지; 오른쪽 클릭하여 삭제.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. 이미지 위에서 드래그하여 제약 조건 추가; Shift 키로 수평/수직 유지; 제약 조건을 오른쪽 클릭하여 변경 또는 삭제.
Drag to move the active shape's path or the Work Path 드래그하여 활성 모양의 패스 또는 작업 패스 이동
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath 클릭: 기준점 선택 · 드래그: 기준점, 핸들 또는 세그먼트 이동 · {shift}-클릭: 추가 · {alt}-클릭: 하위 패스 전체
Draw with the Pen tool (P) or make a work path from a selection. 펜 도구(P)로 그리거나 선택 영역에서 작업 패스를 만드세요.
1 # Korean (ko) catalog. UTF-8: context<TAB>English source<TAB>translation.
1071
1072
1073
1074
1075
1076
1077
+1 -1
View File
@@ -1074,7 +1074,7 @@
Done Gereed
Dots Stippen
Drag a rectangle around the object Sleep een rechthoek rond het object
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Sleep over de afbeelding om een beperking toe te voegen; Shift voor horizontaal/verticaal; rechtsklik om te verwijderen.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Sleep over de afbeelding om een beperking toe te voegen; Shift voor horizontaal/verticaal; rechtsklik op een beperking om deze te wijzigen of te verwijderen.
Drag to move the active shape's path or the Work Path Sleep om het pad van de actieve vorm of het werkpad te verplaatsen
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Klik: ankerpunt selecteren · Slepen: ankerpunt, greep of segment verplaatsen · {shift}-klik: toevoegen · {alt}-klik: heel subpad
Draw with the Pen tool (P) or make a work path from a selection. Teken met het pengereedschap (P) of maak een werkpad van een selectie.
Can't render this file because it contains an unexpected character in line 8 and column 34.
+1 -1
View File
@@ -1093,7 +1093,7 @@
Done Gotowe
Dots Kropki
Drag a rectangle around the object Przeciągnij prostokąt wokół obiektu
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Przeciągnij po obrazie, aby dodać ograniczenie; Shift — poziomo/pionowo; prawy przycisk usuwa.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Przeciągnij po obrazie, aby dodać ograniczenie; Shift — poziomo/pionowo; prawy przycisk na ograniczeniu — zmiana lub usunięcie.
Drag to move the active shape's path or the Work Path Przeciągnij, aby przesunąć ścieżkę aktywnego kształtu lub ścieżkę roboczą
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Klik: zaznacz punkt kontrolny · Przeciągnięcie: przesuń punkt, uchwyt lub segment · {shift}-klik: dodaj · {alt}-klik: cała podścieżka
Draw with the Pen tool (P) or make a work path from a selection. Rysuj narzędziem Pióro (P) lub utwórz ścieżkę roboczą z zaznaczenia.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1075,7 +1075,7 @@
Done Concluído
Dots Pontos
Drag a rectangle around the object Arraste um retângulo ao redor do objeto
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Arraste sobre a imagem para adicionar uma restrição; Shift para horizontal/vertical; clique direito para excluir.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Arraste sobre a imagem para adicionar uma restrição; Shift para horizontal/vertical; clique direito em uma restrição para alterá-la ou excluí-la.
Drag to move the active shape's path or the Work Path Arraste para mover o demarcador da forma ativa ou o demarcador de trabalho
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Clique: selecionar ponto · Arrastar: mover ponto, alça ou segmento · {shift}-clique: adicionar · {alt}-clique: subdemarcador inteiro
Draw with the Pen tool (P) or make a work path from a selection. Desenhe com a ferramenta Caneta (P) ou crie um demarcador de trabalho a partir de uma seleção.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1584,7 +1584,7 @@
Click to restore the current colour Щёлкните, чтобы восстановить текущий цвет
Click with the Note tool to add a note. Щёлкните инструментом «Заметки», чтобы добавить заметку.
Drag a rectangle around the object Обведите объект прямоугольником
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Перетащите по изображению, чтобы добавить ограничение; Shift — горизонталь/вертикаль; правый клик — удалить.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Перетащите по изображению, чтобы добавить ограничение; Shift — горизонталь/вертикаль; щелчок правой кнопкой по ограничению — изменить или удалить.
Drag the arrow to set the angle, the dots to set the roundness Перетащите стрелку, чтобы задать угол, и точки — круглость
Create new pattern from the selection Создать новый паттерн из выделения
Create new gradient Создать новый градиент
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1061,7 +1061,7 @@
Done Gotovo
Dots Tačke
Drag a rectangle around the object Prevucite pravougaonik oko objekta
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Prevucite po slici da dodate ograničenje; Shift za horizontalno/vertikalno; desni klik za brisanje.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Prevucite po slici da dodate ograničenje; Shift za horizontalno/vertikalno; desni klik na ograničenje za izmenu ili brisanje.
Drag to move the active shape's path or the Work Path Prevucite da pomerite putanju aktivnog oblika ili radnu putanju
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Klik: izaberi sidrišnu tačku · Prevlačenje: pomeri tačku, ručicu ili segment · {shift}-klik: dodaj · {alt}-klik: cela podputanja
Draw with the Pen tool (P) or make a work path from a selection. Crtajte alatkom pero (P) ili napravite radnu putanju od selekcije.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1053,7 +1053,7 @@
Done Bitti
Dots Noktalar
Drag a rectangle around the object Nesnenin çevresine bir dikdörtgen sürükleyin
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Kısıtlama eklemek için resmin üzerine sürükleyin; Yatay/dikey için kaydırma; silmek için sağ tıklayın.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Kısıtlama eklemek için resmin üzerine sürükleyin; Yatay/dikey için kaydırma; değiştirmek veya silmek için bir kısıtlamaya sağ tıklayın.
Drag to move the active shape's path or the Work Path Etkin şeklin yolunu veya Çalışma Yolunu taşımak için sürükleyin
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath Tıklayın: çapayı seçin · Sürükleyin: çapayı, tutamacı veya parçayı taşıyın · {shift}-tıklayın: ekleyin · {alt}-tıklayın: alt yolun tamamı
Draw with the Pen tool (P) or make a work path from a selection. Kalem aracıyla (P) çizim yapın veya seçimden bir çalışma yolu oluşturun.
Can't render this file because it contains an unexpected character in line 8 and column 34.
+1 -1
View File
@@ -1562,7 +1562,7 @@
Click to restore the current colour Клацніть, щоб відновити поточний колір
Click with the Note tool to add a note. Клацніть інструментом «Нотатка», щоб додати нотатку.
Drag a rectangle around the object Намалюйте прямокутник навколо об'єкта
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Перетягніть на зображенні, щоб додати обмеження; Shift для горизонталі/вертикалі; праве клацання для видалення.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Перетягніть на зображенні, щоб додати обмеження; Shift для горизонталі/вертикалі; клацніть правою кнопкою на обмеженні, щоб змінити або видалити його.
Drag the arrow to set the angle, the dots to set the roundness Перетягніть стрілку, щоб установити кут, а точки — округлість
Create new pattern from the selection Створити новий візерунок із виділення
Create new gradient Створити новий градієнт
Can't render this file because it contains an unexpected character in line 1394 and column 18.
+1 -1
View File
@@ -2256,7 +2256,7 @@ layers Fill: Độ tô:
Delete Timeline Xóa dòng thời gian
Deselect All Bỏ chọn tất cả
Display Text Hiển thị văn bản
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. Kéo trên ảnh để thêm ràng buộc; Shift cho ngang/dọc; nhấp chuột phải để xóa.
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. Kéo trên ảnh để thêm ràng buộc; Shift cho ngang/dọc; nhấp chuột phải vào ràng buộc để thay đổi hoặc xóa.
Export selected measurements (CSV) Xuất các phép đo đã chọn (CSV)
Focal Length Tiêu cự
Font Size: Cỡ chữ:
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -1
View File
@@ -1099,7 +1099,7 @@
Done 完成
Dots 点
Drag a rectangle around the object 围绕对象拖出矩形
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. 在图像上拖动以添加约束;按 Shift 保持水平或垂直;右键单击删除。
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. 在图像上拖动以添加约束;按 Shift 保持水平或垂直;右键单击约束可更改或删除。
Drag to move the active shape's path or the Work Path 拖动以移动当前形状的路径或工作路径
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath 单击:选择锚点 · 拖动:移动锚点、手柄或线段 · {shift}-单击:添加 · {alt}-单击:整个子路径
Draw with the Pen tool (P) or make a work path from a selection. 使用钢笔工具(P)绘制,或从选区创建工作路径。
1 # Simplified Chinese (zh-hans) catalog. UTF-8, TAB-separated columns:
1099
1100
1101
1102
1103
1104
1105
+1 -1
View File
@@ -1102,7 +1102,7 @@
Done 完成
Dots 點
Drag a rectangle around the object 在物件周圍拖曳出矩形
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete. 在影像上拖曳以新增限制線;按住 Shift 可限制水平/垂直;按右鍵可刪除。
Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it. 在影像上拖曳以新增限制線;按住 Shift 可限制水平/垂直;在限制線上按右鍵可變更或刪除。
Drag to move the active shape's path or the Work Path 拖曳以移動作用中形狀的路徑或工作路徑
Click: select anchor · Drag: move anchor, handle or segment · {shift}-click: add · {alt}-click: whole subpath 按一下:選取錨點 · 拖曳:移動錨點、把手或線段 · {shift}-按一下:增加 · {alt}-按一下:整個子路徑
Draw with the Pen tool (P) or make a work path from a selection. 使用筆型工具 (P) 繪製,或從選取範圍建立工作路徑。
Can't render this file because it contains an unexpected character in line 6 and column 47.
+115 -13
View File
@@ -1,12 +1,13 @@
//! Filter › Adaptive Wide Angle…: a full-window dialog like Photoshop's. Drag on the image to
//! draw a constraint (the scene line between the two points, curved by the lens model); hold
//! Shift when releasing to make it horizontal or vertical; right-click a constraint to delete
//! it. The right panel holds the correction model, focal length, crop factor, scale and the
//! Shift when releasing to make it horizontal or vertical; right-click a constraint for its menu
//! (Free, Horizontal, Vertical, Delete), as in Photoshop. The right panel holds the correction model, focal length, crop factor, scale and the
//! constraint list. The preview solves the mesh warp on a CPU proxy (≤ 800 px); OK runs
//! `filter.adaptiveWideAngle` with the constraints in document pixels.
//!
//! Control channel: `ui.menu.invoke {"id":"filter.adaptiveWideAngle","params":{"ui":{"set":{…},
//! "add":{"a":[x,y],"b":[x,y],"orientation":"…"}, "remove":i, "commit":true | "cancel":true}}}`.
//! "add":{"a":[x,y],"b":[x,y],"orientation":"…"}, "orient":{"index":i,"orientation":"…"}, "remove":i,
//! "commit":true | "cancel":true}}}`.
use egui::{Align2, Color32, FontId, Pos2, Rect as ERect, Sense, Stroke, TextureHandle, pos2, vec2};
use photocraft_algo::transform::Interp;
@@ -40,6 +41,8 @@ pub struct WideAngleDialog {
dirty: bool,
pub preview: bool,
drag: Option<([f64; 2], [f64; 2])>,
/// The constraint a right-click opened the constraint menu on.
menu_for: Option<usize>,
pub residual: f64,
pub render_ms: f64,
history: EditHistory<WideAngle>,
@@ -143,6 +146,7 @@ pub fn open(app: &mut PhotocraftApp, ctx: &egui::Context) -> Result<(), String>
dirty: true,
preview: true,
drag: None,
menu_for: None,
residual: 0.0,
render_ms: 0.0,
};
@@ -192,6 +196,12 @@ pub fn menu(app: &mut PhotocraftApp, ctx: &egui::Context, id: &str, params: &Val
d.params.constraints.push(Constraint { a: pa, b: pb, orientation: parse_orientation(a.get("orientation").and_then(Value::as_str).unwrap_or("free")) });
d.dirty = true;
}
if let Some(o) = ui.get("orient") {
let i = o.get("index").and_then(Value::as_u64).and_then(|i| usize::try_from(i).ok());
let Some(c) = i.and_then(|i| d.params.constraints.get_mut(i)) else { return Some(Err("`orient` needs the index of a constraint".into())) };
c.orientation = parse_orientation(o.get("orientation").and_then(Value::as_str).unwrap_or("free"));
d.dirty = true;
}
if let Some(i) = ui.get("remove").and_then(Value::as_u64)
&& (i as usize) < d.params.constraints.len()
{
@@ -217,6 +227,32 @@ fn commit(app: &mut PhotocraftApp) -> Result<Value, String> {
app.run("filter.adaptiveWideAngle", d.command_params())
}
/// Photoshop's right-click menu on a constraint: its orientation (the current one checked) and
/// Delete. A right-click away from every constraint opens nothing.
fn constraint_menu(ui: &mut egui::Ui, d: &mut WideAngleDialog) {
let Some(i) = d.menu_for.filter(|i| *i < d.params.constraints.len()) else {
ui.close();
return;
};
for (o, label) in [(Orientation::Free, tl!("Free")), (Orientation::Horizontal, tl!("Horizontal")), (Orientation::Vertical, tl!("Vertical"))] {
let current = d.params.constraints.get(i).is_some_and(|c| c.orientation == o);
if ui.radio(current, label).clicked() {
if let Some(c) = d.params.constraints.get_mut(i) {
c.orientation = o;
d.dirty = true;
}
ui.close();
}
}
ui.separator();
if ui.button(tl!("Delete")).clicked() {
d.params.constraints.remove(i);
d.menu_for = None;
d.dirty = true;
ui.close();
}
}
pub fn show(app: &mut PhotocraftApp, ctx: &egui::Context) {
if app.wide_angle.is_none() {
return;
@@ -274,7 +310,7 @@ pub fn show(app: &mut PhotocraftApp, ctx: &egui::Context) {
if resp.secondary_clicked()
&& let Some(p) = resp.interact_pointer_pos()
{
// Delete the constraint whose curve passes nearest the click.
// The constraint whose curve passes nearest the click gets the menu.
let near = d
.params
.constraints
@@ -282,13 +318,9 @@ pub fn show(app: &mut PhotocraftApp, ctx: &egui::Context) {
.enumerate()
.map(|(i, c)| (i, cam.arc(c.a, c.b, 24).iter().map(|q| (to_screen(*q) - p).length()).fold(f32::MAX, f32::min)))
.min_by(|a, b| a.1.total_cmp(&b.1));
if let Some((i, dist)) = near
&& dist < 10.0
{
d.params.constraints.remove(i);
d.dirty = true;
}
d.menu_for = near.filter(|(_, dist)| *dist < 10.0).map(|(i, _)| i);
}
resp.context_menu(|ui| constraint_menu(ui, d));
let show_src = !d.preview || d.drag.is_some();
let tex = if show_src { d.src_tex.as_ref() } else { d.out_tex.as_ref() };
widgets::checker(&painter, img_r, 8.0);
@@ -393,9 +425,11 @@ pub fn show(app: &mut PhotocraftApp, ctx: &egui::Context) {
widgets::hairline(ui);
widgets::checkbox(ui, &mut d.preview, tl!("Preview"));
ui.label(
egui::RichText::new(tl!("Drag on the image to add a constraint; Shift for horizontal/vertical; right-click to delete."))
.color(t.text_faint)
.size(11.0),
egui::RichText::new(tl!(
"Drag on the image to add a constraint; Shift for horizontal/vertical; right-click a constraint to change or delete it."
))
.color(t.text_faint)
.size(11.0),
);
});
let foot = ERect::from_min_max(pos2(full.left(), full.bottom() - footer_h), full.max);
@@ -458,6 +492,74 @@ mod tests {
assert!(app.wide_angle.is_none());
}
/// A 160 × 100 grey layer to open the dialog on.
fn grey_layer() -> PhotocraftApp {
let mut app = PhotocraftApp::new(photocraft_engine::Session::new(), Default::default());
app.run("file.new", json!({"width": 160, "height": 100})).unwrap();
app.run("layer.new.layer", json!({})).unwrap();
app.run("edit.fill", json!({"color": "#808080"})).unwrap();
app
}
/// Open the dialog with one free constraint across the middle of the layer.
fn open_with_a_constraint(app: &mut PhotocraftApp, ctx: &egui::Context) {
menu(app, ctx, "filter.adaptiveWideAngle", &json!({"ui": {"add": {"a": [20, 50], "b": [140, 50]}}})).unwrap().unwrap();
}
/// `orient` sets a constraint's orientation, as the right-click menu does; a bad index is
/// an error that changes nothing.
#[test]
fn orient_sets_a_constraint_orientation() {
let mut app = grey_layer();
let ctx = egui::Context::default();
open_with_a_constraint(&mut app, &ctx);
let r = menu(&mut app, &ctx, "filter.adaptiveWideAngle", &json!({"ui": {"orient": {"index": 0, "orientation": "vertical"}}})).unwrap().unwrap();
assert_eq!(r["params"]["constraints"][0]["orientation"], "vertical");
for bad in [json!({"index": 1, "orientation": "horizontal"}), json!({"orientation": "horizontal"}), json!({"index": -1})] {
assert!(menu(&mut app, &ctx, "filter.adaptiveWideAngle", &json!({"ui": {"orient": bad}})).unwrap().is_err(), "{bad}");
}
assert_eq!(app.wide_angle.as_ref().unwrap().params.constraints[0].orientation, Orientation::Vertical);
}
/// Right-clicking a constraint opens Photoshop's constraint menu: an orientation (the
/// current one checked) or Delete. A right-click away from every constraint deletes nothing
/// and opens no menu (it used to delete the nearest constraint outright).
#[test]
fn right_click_on_a_constraint_opens_its_menu() {
use egui_kittest::kittest::Queryable;
let size = vec2(1000.0, 600.0);
let mut h = egui_kittest::Harness::builder().with_size(size).build_ui_state(|ui, app: &mut PhotocraftApp| show(app, ui.ctx()), grey_layer());
PhotocraftApp::setup_context(&h.ctx, crate::theme::ThemeKind::ALL[0]);
let ctx = h.ctx.clone();
open_with_a_constraint(h.state_mut(), &ctx);
h.run_steps(2);
// The image view (see `show`): the window less the title, footer and panel, inset 16 pt.
let view = ERect::from_min_max(pos2(16.0, 30.0 + 16.0), pos2(size.x - PANEL_W - 16.0, size.y - 48.0 - 16.0));
let right_click = |h: &mut egui_kittest::Harness<'_, PhotocraftApp>, p: Pos2| {
let button = |pressed| egui::Event::PointerButton { pos: p, button: egui::PointerButton::Secondary, pressed, modifiers: egui::Modifiers::NONE };
h.input_mut().events.extend([egui::Event::PointerMoved(p), button(true)]);
h.run_steps(1);
h.input_mut().events.push(button(false));
h.run_steps(2);
};
let constraints = |h: &egui_kittest::Harness<'_, PhotocraftApp>| h.state().wide_angle.as_ref().unwrap().params.constraints.clone();
// The constraint runs through the document's centre, which the view centres.
right_click(&mut h, view.center());
h.get_by_label("Horizontal").click();
h.run_steps(2);
assert_eq!(constraints(&h).len(), 1, "choosing an orientation keeps the constraint");
assert_eq!(constraints(&h)[0].orientation, Orientation::Horizontal);
// Away from it: no menu, nothing deleted.
right_click(&mut h, view.left_top() + vec2(4.0, 4.0));
assert!(h.query_by_label("Horizontal").is_none(), "no menu away from a constraint");
assert_eq!(constraints(&h).len(), 1);
// Delete from the menu (the panel's list has its own Delete button too).
right_click(&mut h, view.center());
h.get_all_by_label("Delete").last().expect("the menu's Delete").click();
h.run_steps(2);
assert!(constraints(&h).is_empty());
}
#[test]
fn command_z_steps_the_dialog_not_the_document() {
let mut app = PhotocraftApp::new(photocraft_engine::Session::new(), Default::default());
+1 -1
View File
@@ -85,7 +85,7 @@ Photoshop's Generative Fill and Delete and Fill Selection rows are left out: Pho
| Empty pasteboard / workspace | Gray, Black, Custom canvas color choices; verify any additional entries in a current Photoshop capture | Implemented (canvas_tool_menu.rs `PASTEBOARD_MENU`, #2462): Default, Black, Dark Gray, Medium Gray, Light Gray, Custom, Select Custom Color… | Adobe [documents right-clicking outside the image for canvas color](https://helpx.adobe.com/ph_en/photoshop/using/filling-stroking-selections-layers-paths.html); exact current layout still needs a capture |
| Text field / selected text | Native edit menu and spelling suggestions without routing to active image tool | Edit menu implemented in text_field_menu.rs for every text field (Undo, Cut, Copy, Paste, Delete, Select All; a right-click inside the selection keeps it; never reaches the canvas or tool menu). Spelling suggestions live in the Type tool's edit menu (canvas_tool_menu.rs), not in generic fields, which hold no type layer text (UI-217-8) | P1; **inferred** exact spelling list |
| Tool icon in Options bar | Reset Tool, Reset All Tools | Audit | Explicitly documented in [Adobe Photoshop reference](https://helpx.adobe.com/archive/en/photoshop/cc/2015/photoshop_reference.pdf); historical source, verify modern label |
| Adaptive Wide Angle constraint line | Auto, Horizontal, Vertical orientation | Current right-click deletes constraint | P1 behavior mismatch: [Adobe documents orientation choice](https://helpx.adobe.com/photoshop/using/adaptive-wide-angle-filter.html) |
| Adaptive Wide Angle constraint line | Auto, Horizontal, Vertical orientation | Right-click a constraint (wide_angle_ui.rs `constraint_menu`): Free, Horizontal, Vertical (current checked), Delete; a right-click away from every constraint opens nothing. Photoshop's Arbitrary angle is not modelled by the solver | Done except Arbitrary: [Adobe documents orientation choice](https://helpx.adobe.com/photoshop/using/adaptive-wide-angle-filter.html) |
## Delivery slices and acceptance