forked from 1b-agent/opencadstudio-upstream
Merge PR #1216: expose MTP in snap menus
This commit is contained in:
commit
754cc89fab
29 files changed
+138
-12
No files matched your search
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#B4B6B9" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 8.26 16.05 15.74H7.95Z"/><circle cx="4.5" cy="19.5" r="1.5" fill="#B4B6B9" stroke="none"/><circle cx="19.5" cy="4.5" r="1.5" fill="#B4B6B9" stroke="none"/></svg>
|
||||||
|
After Width: | Height: | Size: 330 B |
@@ -632,7 +632,9 @@ common =
|
|||||||
.middle-right-sentence-case = وسط اليمين
|
.middle-right-sentence-case = وسط اليمين
|
||||||
.middleleft = وسط اليسار
|
.middleleft = وسط اليسار
|
||||||
.middleright = وسط اليمين
|
.middleright = وسط اليمين
|
||||||
|
.mid-between-2-points-m2p = نقطة المنتصف بين نقطتين (M2P)
|
||||||
.midpoint = نقطة المنتصف
|
.midpoint = نقطة المنتصف
|
||||||
|
.mtp-needs-an-active-point-prompt = يتطلب MTP مطالبة نقطة نشطة.
|
||||||
.miles = أميال
|
.miles = أميال
|
||||||
.millimeters = مليمترات
|
.millimeters = مليمترات
|
||||||
.model-title-case = النموذج
|
.model-title-case = النموذج
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = Средата вдясно
|
.middle-right-sentence-case = Средата вдясно
|
||||||
.middleleft = Средата вляво
|
.middleleft = Средата вляво
|
||||||
.middleright = Средата вдясно
|
.middleright = Средата вдясно
|
||||||
|
.mid-between-2-points-m2p = Среда между 2 точки (M2P)
|
||||||
.midpoint = Средна точка
|
.midpoint = Средна точка
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP изисква активна подкана за точка.
|
||||||
.miles = Мили
|
.miles = Мили
|
||||||
.millimeters = Милиметри
|
.millimeters = Милиметри
|
||||||
.model-title-case = Модел
|
.model-title-case = Модел
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = Uprostřed vpravo
|
.middle-right-sentence-case = Uprostřed vpravo
|
||||||
.middleleft = Uprostřed vlevo
|
.middleleft = Uprostřed vlevo
|
||||||
.middleright =Uprostřed vpravo
|
.middleright =Uprostřed vpravo
|
||||||
|
.mid-between-2-points-m2p = Střed mezi 2 body (M2P)
|
||||||
.midpoint = Střed
|
.midpoint = Střed
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP vyžaduje aktivní výzvu k zadání bodu.
|
||||||
.miles = Míle
|
.miles = Míle
|
||||||
.millimeters = milimetry
|
.millimeters = milimetry
|
||||||
.model-title-case = Model
|
.model-title-case = Model
|
||||||
|
|||||||
@@ -620,7 +620,9 @@ common =
|
|||||||
.middle-right-sentence-case = Mitte rechts
|
.middle-right-sentence-case = Mitte rechts
|
||||||
.middleleft = Mitte links
|
.middleleft = Mitte links
|
||||||
.middleright = Mitte rechts
|
.middleright = Mitte rechts
|
||||||
|
.mid-between-2-points-m2p = Mitte zwischen 2 Punkten (M2P)
|
||||||
.midpoint = Mittelpunkt
|
.midpoint = Mittelpunkt
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP erfordert eine aktive Punkteingabe.
|
||||||
.miles = Meilen
|
.miles = Meilen
|
||||||
.millimeters = Millimeter
|
.millimeters = Millimeter
|
||||||
.model-title-case = Modell
|
.model-title-case = Modell
|
||||||
|
|||||||
@@ -621,7 +621,9 @@ common =
|
|||||||
.middle-right-sentence-case = Μέση δεξιά
|
.middle-right-sentence-case = Μέση δεξιά
|
||||||
.middleleft = Μέση αριστερά
|
.middleleft = Μέση αριστερά
|
||||||
.middleright = Μέση δεξιά
|
.middleright = Μέση δεξιά
|
||||||
|
.mid-between-2-points-m2p = Μέσο μεταξύ 2 σημείων (M2P)
|
||||||
.midpoint = Μέσο
|
.midpoint = Μέσο
|
||||||
|
.mtp-needs-an-active-point-prompt = Το MTP απαιτεί ενεργή προτροπή σημείου.
|
||||||
.miles = Μίλια
|
.miles = Μίλια
|
||||||
.millimeters = Χιλιοστά
|
.millimeters = Χιλιοστά
|
||||||
.model-title-case = Μοντέλο
|
.model-title-case = Μοντέλο
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = Middle right
|
.middle-right-sentence-case = Middle right
|
||||||
.middleleft = Middle left
|
.middleleft = Middle left
|
||||||
.middleright = Middle right
|
.middleright = Middle right
|
||||||
|
.mid-between-2-points-m2p = Mid Between 2 Points (M2P)
|
||||||
.midpoint = Midpoint
|
.midpoint = Midpoint
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP needs an active point prompt.
|
||||||
.miles = Miles
|
.miles = Miles
|
||||||
.millimeters = Millimeters
|
.millimeters = Millimeters
|
||||||
.model-title-case = Model
|
.model-title-case = Model
|
||||||
|
|||||||
@@ -620,7 +620,9 @@ common =
|
|||||||
.middle-right-sentence-case = Medio derecha
|
.middle-right-sentence-case = Medio derecha
|
||||||
.middleleft = Medio izquierda
|
.middleleft = Medio izquierda
|
||||||
.middleright = Medio derecha
|
.middleright = Medio derecha
|
||||||
|
.mid-between-2-points-m2p = Punto medio entre 2 puntos (M2P)
|
||||||
.midpoint = Punto medio
|
.midpoint = Punto medio
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP requiere una solicitud de punto activa.
|
||||||
.miles = Millas
|
.miles = Millas
|
||||||
.millimeters = Milímetros
|
.millimeters = Milímetros
|
||||||
.model-title-case = Modelo
|
.model-title-case = Modelo
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = Keski oikealla
|
.middle-right-sentence-case = Keski oikealla
|
||||||
.middleleft = Keski vasen
|
.middleleft = Keski vasen
|
||||||
.middleright =Keski oikealla
|
.middleright =Keski oikealla
|
||||||
|
.mid-between-2-points-m2p = Kahden pisteen puoliväli (M2P)
|
||||||
.midpoint = Keskipiste
|
.midpoint = Keskipiste
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP vaatii aktiivisen pistekehotteen.
|
||||||
.miles = Mailia
|
.miles = Mailia
|
||||||
.millimeters = millimetriä
|
.millimeters = millimetriä
|
||||||
.model-title-case = Malli
|
.model-title-case = Malli
|
||||||
|
|||||||
@@ -620,7 +620,9 @@ common =
|
|||||||
.middle-right-sentence-case = Moyen droit
|
.middle-right-sentence-case = Moyen droit
|
||||||
.middleleft = Moyen gauche
|
.middleleft = Moyen gauche
|
||||||
.middleright = Moyen droit
|
.middleright = Moyen droit
|
||||||
|
.mid-between-2-points-m2p = Milieu entre 2 points (M2P)
|
||||||
.midpoint = Moyenne
|
.midpoint = Moyenne
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP nécessite une invite de point active.
|
||||||
.miles = Milles
|
.miles = Milles
|
||||||
.millimeters = Millimètres
|
.millimeters = Millimètres
|
||||||
.model-title-case = Modèle
|
.model-title-case = Modèle
|
||||||
|
|||||||
@@ -608,7 +608,9 @@ common =
|
|||||||
.middle-right-sentence-case = मध्य दाएं
|
.middle-right-sentence-case = मध्य दाएं
|
||||||
.middleleft = मध्य बाएं
|
.middleleft = मध्य बाएं
|
||||||
.middleright = मध्य दाएँ
|
.middleright = मध्य दाएँ
|
||||||
|
.mid-between-2-points-m2p = 2 बिंदुओं के बीच का मध्यबिंदु (M2P)
|
||||||
.midpoint = मिडपॉइंट
|
.midpoint = मिडपॉइंट
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP के लिए सक्रिय बिंदु प्रॉम्प्ट आवश्यक है।
|
||||||
.miles = माइल्स
|
.miles = माइल्स
|
||||||
.millimeters = मिलीमीटर
|
.millimeters = मिलीमीटर
|
||||||
.model-title-case = मॉडल
|
.model-title-case = मॉडल
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = Jobb középső
|
.middle-right-sentence-case = Jobb középső
|
||||||
.middleleft = bal középső
|
.middleleft = bal középső
|
||||||
.middleright =Jobb középső
|
.middleright =Jobb középső
|
||||||
|
.mid-between-2-points-m2p = Két pont közötti felezőpont (M2P)
|
||||||
.midpoint = Középpont
|
.midpoint = Középpont
|
||||||
|
.mtp-needs-an-active-point-prompt = Az MTP aktív pontbekérést igényel.
|
||||||
.miles = Mérföld
|
.miles = Mérföld
|
||||||
.millimeters = Milliméter
|
.millimeters = Milliméter
|
||||||
.model-title-case = Modell
|
.model-title-case = Modell
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = Centro a destra
|
.middle-right-sentence-case = Centro a destra
|
||||||
.middleleft = Centro a sinistra
|
.middleleft = Centro a sinistra
|
||||||
.middleright =Centro a destra
|
.middleright =Centro a destra
|
||||||
|
.mid-between-2-points-m2p = Punto medio tra 2 punti (M2P)
|
||||||
.midpoint = Punto medio
|
.midpoint = Punto medio
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP richiede una richiesta di punto attiva.
|
||||||
.miles = Miglia
|
.miles = Miglia
|
||||||
.millimeters = Millimetri
|
.millimeters = Millimetri
|
||||||
.model-title-case = Modello
|
.model-title-case = Modello
|
||||||
|
|||||||
@@ -610,7 +610,9 @@ common =
|
|||||||
.middle-right-sentence-case = 中央右
|
.middle-right-sentence-case = 中央右
|
||||||
.middleleft = 中央左
|
.middleleft = 中央左
|
||||||
.middleright = 中央右
|
.middleright = 中央右
|
||||||
|
.mid-between-2-points-m2p = 2点間の中点 (M2P)
|
||||||
.midpoint = 中点
|
.midpoint = 中点
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP にはアクティブな点入力プロンプトが必要です。
|
||||||
.miles = マイル
|
.miles = マイル
|
||||||
.millimeters = ミリメートル
|
.millimeters = ミリメートル
|
||||||
.model-title-case = モデル
|
.model-title-case = モデル
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = 가운데 오른쪽
|
.middle-right-sentence-case = 가운데 오른쪽
|
||||||
.middleleft = 가운데 왼쪽
|
.middleleft = 가운데 왼쪽
|
||||||
.middleright = 가운데 오른쪽
|
.middleright = 가운데 오른쪽
|
||||||
|
.mid-between-2-points-m2p = 두 점 사이의 중점 (M2P)
|
||||||
.midpoint = 중간점
|
.midpoint = 중간점
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP에는 활성 점 입력 프롬프트가 필요합니다.
|
||||||
.miles =마일리지
|
.miles =마일리지
|
||||||
.millimeters = 밀리미터
|
.millimeters = 밀리미터
|
||||||
.model-title-case = 모델
|
.model-title-case = 모델
|
||||||
|
|||||||
@@ -618,7 +618,9 @@ common =
|
|||||||
.middle-right-sentence-case = Middenrechts
|
.middle-right-sentence-case = Middenrechts
|
||||||
.middleleft = Midden links
|
.middleleft = Midden links
|
||||||
.middleright = Middenrechts
|
.middleright = Middenrechts
|
||||||
|
.mid-between-2-points-m2p = Midden tussen 2 punten (M2P)
|
||||||
.midpoint = Middenpunt
|
.midpoint = Middenpunt
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP vereist een actieve puntinvoer.
|
||||||
.miles = Mijlen
|
.miles = Mijlen
|
||||||
.millimeters = Millimeter
|
.millimeters = Millimeter
|
||||||
.model-title-case = Model
|
.model-title-case = Model
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = Środkowy prawy
|
.middle-right-sentence-case = Środkowy prawy
|
||||||
.middleleft = Środkowy lewy
|
.middleleft = Środkowy lewy
|
||||||
.middleright =Środkowy prawy
|
.middleright =Środkowy prawy
|
||||||
|
.mid-between-2-points-m2p = Środek między 2 punktami (M2P)
|
||||||
.midpoint = Punkt środkowy
|
.midpoint = Punkt środkowy
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP wymaga aktywnego monitu o punkt.
|
||||||
.miles = Mile
|
.miles = Mile
|
||||||
.millimeters = Milimetry
|
.millimeters = Milimetry
|
||||||
.model-title-case = Modelka
|
.model-title-case = Modelka
|
||||||
|
|||||||
@@ -620,7 +620,9 @@ common =
|
|||||||
.middle-right-sentence-case = Meio direito
|
.middle-right-sentence-case = Meio direito
|
||||||
.middleleft = Meio esquerdo
|
.middleleft = Meio esquerdo
|
||||||
.middleright = Meio direito
|
.middleright = Meio direito
|
||||||
|
.mid-between-2-points-m2p = Ponto médio entre 2 pontos (M2P)
|
||||||
.midpoint = Ponto médio
|
.midpoint = Ponto médio
|
||||||
|
.mtp-needs-an-active-point-prompt = O MTP requer uma solicitação de ponto ativa.
|
||||||
.miles = Milhas
|
.miles = Milhas
|
||||||
.millimeters = Milímetros
|
.millimeters = Milímetros
|
||||||
.model-title-case = Modelo
|
.model-title-case = Modelo
|
||||||
|
|||||||
@@ -623,7 +623,9 @@ common =
|
|||||||
.middle-right-sentence-case = Средний правый
|
.middle-right-sentence-case = Средний правый
|
||||||
.middleleft = Средний слева
|
.middleleft = Средний слева
|
||||||
.middleright = Средний правый
|
.middleright = Средний правый
|
||||||
|
.mid-between-2-points-m2p = Середина между 2 точками (M2P)
|
||||||
.midpoint = Средняя точка
|
.midpoint = Средняя точка
|
||||||
|
.mtp-needs-an-active-point-prompt = Для MTP требуется активный запрос точки.
|
||||||
.miles = Майлз
|
.miles = Майлз
|
||||||
.millimeters = Миллиметры
|
.millimeters = Миллиметры
|
||||||
.model-title-case = Модель
|
.model-title-case = Модель
|
||||||
|
|||||||
@@ -606,7 +606,9 @@ common =
|
|||||||
.middle-right-sentence-case = Orta sağ
|
.middle-right-sentence-case = Orta sağ
|
||||||
.middleleft = Orta sol
|
.middleleft = Orta sol
|
||||||
.middleright = Orta sağ
|
.middleright = Orta sağ
|
||||||
|
.mid-between-2-points-m2p = 2 Nokta Arasındaki Orta Nokta (M2P)
|
||||||
.midpoint = Orta Nokta
|
.midpoint = Orta Nokta
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP için etkin bir nokta istemi gerekir.
|
||||||
.miles = Mil
|
.miles = Mil
|
||||||
.millimeters = Milimetre
|
.millimeters = Milimetre
|
||||||
.model-title-case = Model
|
.model-title-case = Model
|
||||||
|
|||||||
@@ -607,7 +607,9 @@ common =
|
|||||||
.middle-right-sentence-case = 右边
|
.middle-right-sentence-case = 右边
|
||||||
.middleleft = 左边
|
.middleleft = 左边
|
||||||
.middleright = 右中边
|
.middleright = 右中边
|
||||||
|
.mid-between-2-points-m2p = 两点之间的中点 (M2P)
|
||||||
.midpoint = 中点
|
.midpoint = 中点
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP 需要活动的点提示。
|
||||||
.miles = 迈尔斯
|
.miles = 迈尔斯
|
||||||
.millimeters = 毫米数
|
.millimeters = 毫米数
|
||||||
.model-title-case = 模型
|
.model-title-case = 模型
|
||||||
|
|||||||
@@ -619,7 +619,9 @@ common =
|
|||||||
.middle-right-sentence-case = 右邊
|
.middle-right-sentence-case = 右邊
|
||||||
.middleleft = 左邊
|
.middleleft = 左邊
|
||||||
.middleright = 右中邊
|
.middleright = 右中邊
|
||||||
|
.mid-between-2-points-m2p = 兩點之間的中點 (M2P)
|
||||||
.midpoint = 中點
|
.midpoint = 中點
|
||||||
|
.mtp-needs-an-active-point-prompt = MTP 需要作用中的點提示。
|
||||||
.miles = 邁爾斯
|
.miles = 邁爾斯
|
||||||
.millimeters = 毫米數
|
.millimeters = 毫米數
|
||||||
.model-title-case = 模型
|
.model-title-case = 模型
|
||||||
|
|||||||
@@ -1551,6 +1551,23 @@ mod tests {
|
|||||||
assert!(app.tabs[0].active_cmd.is_none());
|
assert!(app.tabs[0].active_cmd.is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mtp_snap_override_starts_the_existing_modifier() {
|
||||||
|
use crate::app::Message;
|
||||||
|
let mut app = OpenCADStudio::new_for_test();
|
||||||
|
app.automation_op(r#"{"op":"new"}"#);
|
||||||
|
|
||||||
|
let _ = app.update(Message::CommandInput("LINE".to_string()));
|
||||||
|
let _ = app.update(Message::CommandSubmit);
|
||||||
|
let _ = app.update(Message::SnapOverrideMtp);
|
||||||
|
|
||||||
|
assert_eq!(app.tabs[0].active_cmd.as_ref().map(|c| c.name()), Some("MTP"));
|
||||||
|
assert_eq!(
|
||||||
|
app.tabs[0].suspended_cmd.as_ref().map(|c| c.name()),
|
||||||
|
Some("LINE")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mtp_escape_restores_parent() {
|
fn test_mtp_escape_restores_parent() {
|
||||||
use crate::app::Message;
|
use crate::app::Message;
|
||||||
|
|||||||
+5
-2
@@ -1910,9 +1910,12 @@ pub enum Message {
|
|||||||
WebFieldCopy,
|
WebFieldCopy,
|
||||||
/// Web only: the focused field's text — write it to the clipboard.
|
/// Web only: the focused field's text — write it to the clipboard.
|
||||||
WebFieldCopyText(Option<String>),
|
WebFieldCopyText(Option<String>),
|
||||||
/// Pick from the one-shot snap override menu (Shift+RMB): only this snap
|
/// Pick from the one-shot snap override menu (Shift+RMB): only this
|
||||||
/// applies to the next point pick, then the configuration restores (#337).
|
/// snap applies to the next point pick, then the configuration restores (#337).
|
||||||
SnapOverridePick(crate::snap::SnapType),
|
SnapOverridePick(crate::snap::SnapType),
|
||||||
|
/// Mid Between 2 Points from the snap menu: modal 2-pick modifier over
|
||||||
|
/// the active point prompt.
|
||||||
|
SnapOverrideMtp,
|
||||||
/// Close the one-shot snap override menu without picking.
|
/// Close the one-shot snap override menu without picking.
|
||||||
SnapOverrideClose,
|
SnapOverrideClose,
|
||||||
/// Open a path from the Start tab's recent-documents list (skips the
|
/// Open a path from the Start tab's recent-documents list (skips the
|
||||||
|
|||||||
@@ -680,6 +680,29 @@ impl OpenCADStudio {
|
|||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Message::SnapOverrideMtp => {
|
||||||
|
self.snap_override_popup = None;
|
||||||
|
self.tabs[self.active_tab]
|
||||||
|
.scene
|
||||||
|
.selection
|
||||||
|
.borrow_mut()
|
||||||
|
.context_menu = None;
|
||||||
|
// Same guard as typed MTP/M2P: point step, not entity pick.
|
||||||
|
let i = self.active_tab;
|
||||||
|
let allowed = self.tabs[i].active_cmd.as_ref().is_some_and(|c| {
|
||||||
|
(!c.input_kind().wants_text() || c.point_step_accepts_keywords())
|
||||||
|
&& !c.needs_entity_pick()
|
||||||
|
});
|
||||||
|
if allowed {
|
||||||
|
self.start_mtp_modifier(i);
|
||||||
|
} else {
|
||||||
|
self.command_line.push_info(
|
||||||
|
crate::t!("MTP needs an active point prompt.").as_ref(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Task::none()
|
||||||
|
}
|
||||||
|
|
||||||
Message::SnapOverrideClose => {
|
Message::SnapOverrideClose => {
|
||||||
self.snap_override_popup = None;
|
self.snap_override_popup = None;
|
||||||
Task::none()
|
Task::none()
|
||||||
|
|||||||
@@ -1753,6 +1753,11 @@ bg={bg_ms:.1}ms n={view_count}"
|
|||||||
};
|
};
|
||||||
if let Some(p) = ctx_pos {
|
if let Some(p) = ctx_pos {
|
||||||
let has_cmd = tab.active_cmd.is_some();
|
let has_cmd = tab.active_cmd.is_some();
|
||||||
|
// Same guard as typed MTP/M2P and SnapOverrideMtp.
|
||||||
|
let has_point_step = tab.active_cmd.as_ref().is_some_and(|c| {
|
||||||
|
(!c.input_kind().wants_text() || c.point_step_accepts_keywords())
|
||||||
|
&& !c.needs_entity_pick()
|
||||||
|
});
|
||||||
let has_selection = !tab.scene.selected.is_empty();
|
let has_selection = !tab.scene.selected.is_empty();
|
||||||
let isolation_active = tab.scene.is_isolation_active();
|
let isolation_active = tab.scene.is_isolation_active();
|
||||||
let last_cmds: Vec<String> = self
|
let last_cmds: Vec<String> = self
|
||||||
@@ -1771,6 +1776,7 @@ bg={bg_ms:.1}ms n={view_count}"
|
|||||||
isolation_active,
|
isolation_active,
|
||||||
last_cmds,
|
last_cmds,
|
||||||
draworder_open,
|
draworder_open,
|
||||||
|
has_point_step,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-10
@@ -1117,6 +1117,7 @@ pub(super) fn viewport_context_menu_overlay(
|
|||||||
isolation_active: bool,
|
isolation_active: bool,
|
||||||
last_cmds: Vec<String>,
|
last_cmds: Vec<String>,
|
||||||
draworder_open: bool,
|
draworder_open: bool,
|
||||||
|
has_point_step: bool,
|
||||||
) -> Element<'static, Message> {
|
) -> Element<'static, Message> {
|
||||||
let item = |label: String, msg: Message| -> Element<'static, Message> {
|
let item = |label: String, msg: Message| -> Element<'static, Message> {
|
||||||
button(text(label).size(12))
|
button(text(label).size(12))
|
||||||
@@ -1161,6 +1162,15 @@ pub(super) fn viewport_context_menu_overlay(
|
|||||||
if has_cmd {
|
if has_cmd {
|
||||||
items.push(item(t!("Cancel").into_owned(), Message::CommandEscape));
|
items.push(item(t!("Cancel").into_owned(), Message::CommandEscape));
|
||||||
items.push(item(t!("Enter").into_owned(), Message::CommandFinalize));
|
items.push(item(t!("Enter").into_owned(), Message::CommandFinalize));
|
||||||
|
// MTP (`_M2P`) goes last, after Parallel: two picks, so not a
|
||||||
|
// `SnapType`, but same icon-only cell with hover tooltip.
|
||||||
|
if has_point_step {
|
||||||
|
items.push(sep());
|
||||||
|
items.push(item(
|
||||||
|
t!("Mid Between 2 Points (M2P)").into_owned(),
|
||||||
|
Message::SnapOverrideMtp,
|
||||||
|
));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if !last_cmds.is_empty() {
|
if !last_cmds.is_empty() {
|
||||||
let last = last_cmds[0].clone();
|
let last = last_cmds[0].clone();
|
||||||
@@ -1277,21 +1287,19 @@ pub(super) fn viewport_context_menu_overlay(
|
|||||||
|
|
||||||
/// One-shot snap override menu (Shift+RMB, #337): a cursor-anchored grid of
|
/// One-shot snap override menu (Shift+RMB, #337): a cursor-anchored grid of
|
||||||
/// snap ICONS only — the names show as hover tooltips. Picking one applies
|
/// snap ICONS only — the names show as hover tooltips. Picking one applies
|
||||||
/// that snap to just the next point pick.
|
/// that snap to just the next point pick; the trailing MTP cell instead
|
||||||
|
/// suspends the prompt for two picks and returns their midpoint.
|
||||||
pub(super) fn snap_override_overlay(pos: iced::Point) -> Element<'static, Message> {
|
pub(super) fn snap_override_overlay(pos: iced::Point) -> Element<'static, Message> {
|
||||||
const COLS: usize = 4;
|
const COLS: usize = 4;
|
||||||
|
|
||||||
let cell = |snap_type: crate::snap::SnapType, label: &'static str| -> Element<'static, Message> {
|
let cell_icon = |icon: &'static [u8], label: String, msg: Message| -> Element<'static, Message> {
|
||||||
let icon = container(crate::ui::icons::themed::<Message>(
|
let icon = container(crate::ui::icons::themed::<Message>(icon, 16.0))
|
||||||
crate::ui::icons::osnap(snap_type),
|
|
||||||
16.0,
|
|
||||||
))
|
|
||||||
.width(26)
|
.width(26)
|
||||||
.height(26)
|
.height(26)
|
||||||
.align_x(iced::Center)
|
.align_x(iced::Center)
|
||||||
.align_y(iced::Center);
|
.align_y(iced::Center);
|
||||||
let btn = button(icon)
|
let btn = button(icon)
|
||||||
.on_press(Message::SnapOverridePick(snap_type))
|
.on_press(msg)
|
||||||
.style(|theme: &Theme, status| button::Style {
|
.style(|theme: &Theme, status| button::Style {
|
||||||
background: matches!(
|
background: matches!(
|
||||||
status,
|
status,
|
||||||
@@ -1327,11 +1335,29 @@ pub(super) fn snap_override_overlay(pos: iced::Point) -> Element<'static, Messag
|
|||||||
.into()
|
.into()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// MTP (`_M2P`) goes last, after Parallel: two picks, so not a
|
||||||
|
// `SnapType`, but same icon-only cell with hover tooltip.
|
||||||
|
let mut cells: Vec<Element<'static, Message>> = Vec::with_capacity(
|
||||||
|
crate::snap::ALL_SNAP_MODES.len() + 1,
|
||||||
|
);
|
||||||
|
for &(snap_type, _glyph, label) in crate::snap::ALL_SNAP_MODES {
|
||||||
|
cells.push(cell_icon(
|
||||||
|
crate::ui::icons::osnap(snap_type),
|
||||||
|
label.to_string(),
|
||||||
|
Message::SnapOverridePick(snap_type),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
cells.push(cell_icon(
|
||||||
|
crate::ui::icons::mtp_icon(),
|
||||||
|
t!("Mid Between 2 Points (M2P)").into_owned(),
|
||||||
|
Message::SnapOverrideMtp,
|
||||||
|
));
|
||||||
let mut grid = column![].spacing(2);
|
let mut grid = column![].spacing(2);
|
||||||
for chunk in crate::snap::ALL_SNAP_MODES.chunks(COLS) {
|
while !cells.is_empty() {
|
||||||
|
let n = cells.len().min(COLS);
|
||||||
let mut r = row![].spacing(2);
|
let mut r = row![].spacing(2);
|
||||||
for &(snap_type, _glyph, label) in chunk {
|
for c in cells.drain(..n) {
|
||||||
r = r.push(cell(snap_type, label));
|
r = r.push(c);
|
||||||
}
|
}
|
||||||
grid = grid.push(r);
|
grid = grid.push(r);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1677,6 +1677,7 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static
|
|||||||
"MiddleOfText" => Some(("styles", "middleoftext")),
|
"MiddleOfText" => Some(("styles", "middleoftext")),
|
||||||
"MiddleOfTopLine" => Some(("styles", "middleoftopline")),
|
"MiddleOfTopLine" => Some(("styles", "middleoftopline")),
|
||||||
"MiddleRight" => Some(("common", "middleright")),
|
"MiddleRight" => Some(("common", "middleright")),
|
||||||
|
"Mid Between 2 Points (M2P)" => Some(("common", "mid-between-2-points-m2p")),
|
||||||
"Midpoint" => Some(("common", "midpoint")),
|
"Midpoint" => Some(("common", "midpoint")),
|
||||||
"Miles" => Some(("common", "miles")),
|
"Miles" => Some(("common", "miles")),
|
||||||
"Millimeters" => Some(("common", "millimeters")),
|
"Millimeters" => Some(("common", "millimeters")),
|
||||||
@@ -1707,6 +1708,7 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static
|
|||||||
"Move Right" => Some(("layout", "move-right")),
|
"Move Right" => Some(("layout", "move-right")),
|
||||||
"Move freely" => Some(("modify", "move-freely")),
|
"Move freely" => Some(("modify", "move-freely")),
|
||||||
"Move text & arrows out" => Some(("modify", "move-text-arrows-out")),
|
"Move text & arrows out" => Some(("modify", "move-text-arrows-out")),
|
||||||
|
"MTP needs an active point prompt." => Some(("common", "mtp-needs-an-active-point-prompt")),
|
||||||
"Multi-View\nBlock" => Some(("insert", "multi-view-block")),
|
"Multi-View\nBlock" => Some(("insert", "multi-view-block")),
|
||||||
"MultiLeader" => Some(("properties", "multileader")),
|
"MultiLeader" => Some(("properties", "multileader")),
|
||||||
"MultiLine" => Some(("properties", "multiline")),
|
"MultiLine" => Some(("properties", "multiline")),
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ static OSNAP_NEAREST: &[u8] = include_bytes!("../../assets/icons/osnap/nearest.s
|
|||||||
static OSNAP_APPARENT: &[u8] = include_bytes!("../../assets/icons/osnap/apparent.svg");
|
static OSNAP_APPARENT: &[u8] = include_bytes!("../../assets/icons/osnap/apparent.svg");
|
||||||
static OSNAP_PARALLEL: &[u8] = include_bytes!("../../assets/icons/osnap/parallel.svg");
|
static OSNAP_PARALLEL: &[u8] = include_bytes!("../../assets/icons/osnap/parallel.svg");
|
||||||
static OSNAP_GRID: &[u8] = include_bytes!("../../assets/icons/osnap/grid.svg");
|
static OSNAP_GRID: &[u8] = include_bytes!("../../assets/icons/osnap/grid.svg");
|
||||||
|
static OSNAP_MTP: &[u8] = include_bytes!("../../assets/icons/osnap/mtp.svg");
|
||||||
|
|
||||||
static LAY_ON: &[u8] = include_bytes!("../../assets/icons/layers/layon.svg");
|
static LAY_ON: &[u8] = include_bytes!("../../assets/icons/layers/layon.svg");
|
||||||
static LAY_OFF: &[u8] = include_bytes!("../../assets/icons/layers/layoff.svg");
|
static LAY_OFF: &[u8] = include_bytes!("../../assets/icons/layers/layoff.svg");
|
||||||
@@ -595,6 +596,11 @@ pub fn osnap(snap: crate::snap::SnapType) -> &'static [u8] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// MTP menu icon: modal 2-pick modifier, not a persistent `SnapType` mode.
|
||||||
|
pub fn mtp_icon() -> &'static [u8] {
|
||||||
|
OSNAP_MTP
|
||||||
|
}
|
||||||
|
|
||||||
/// Layer visibility icon bytes (on / off).
|
/// Layer visibility icon bytes (on / off).
|
||||||
pub fn layer_visible(visible: bool) -> &'static [u8] {
|
pub fn layer_visible(visible: bool) -> &'static [u8] {
|
||||||
if visible {
|
if visible {
|
||||||
|
|||||||
Reference in new issue
Block a user