forked from 1b-agent/opencadstudio-upstream
Merge pull request #1785 from ramox81/codex/selection-found-messages
Selection: report what each pick found while a command gathers objects Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # src/locale_catalog.rs
This commit is contained in:
commit
b5fb42e9f8
28 files changed
+171
-16
No files matched your search
@@ -6556,3 +6556,7 @@ keytips =
|
|||||||
.hint-tabs = اكتب حرف علامة التبويب · Esc للإغلاق
|
.hint-tabs = اكتب حرف علامة التبويب · Esc للإغلاق
|
||||||
.hint-tab = علامة التبويب { $tab } · Esc للرجوع مستوى واحدًا
|
.hint-tab = علامة التبويب { $tab } · Esc للرجوع مستوى واحدًا
|
||||||
.hint-items = اكتب حرف العنصر · Esc للرجوع مستوى واحدًا
|
.hint-items = اكتب حرف العنصر · Esc للرجوع مستوى واحدًا
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6544,3 +6544,7 @@ keytips =
|
|||||||
.hint-tabs = Въведете буква на раздел · Esc затваря
|
.hint-tabs = Въведете буква на раздел · Esc затваря
|
||||||
.hint-tab = Раздел { $tab } · Esc връща едно ниво назад
|
.hint-tab = Раздел { $tab } · Esc връща едно ниво назад
|
||||||
.hint-items = Въведете буква на елемент · Esc връща едно ниво назад
|
.hint-items = Въведете буква на елемент · Esc връща едно ниво назад
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6541,3 +6541,7 @@ keytips =
|
|||||||
.hint-tabs = Zadejte písmeno karty · Esc zavře
|
.hint-tabs = Zadejte písmeno karty · Esc zavře
|
||||||
.hint-tab = Karta { $tab } · Esc o úroveň zpět
|
.hint-tab = Karta { $tab } · Esc o úroveň zpět
|
||||||
.hint-items = Zadejte písmeno položky · Esc o úroveň zpět
|
.hint-items = Zadejte písmeno položky · Esc o úroveň zpět
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6542,3 +6542,7 @@ keytips =
|
|||||||
.hint-tabs = Buchstaben einer Registerkarte eingeben · Esc schließt
|
.hint-tabs = Buchstaben einer Registerkarte eingeben · Esc schließt
|
||||||
.hint-tab = Registerkarte { $tab } · Esc geht eine Ebene zurück
|
.hint-tab = Registerkarte { $tab } · Esc geht eine Ebene zurück
|
||||||
.hint-items = Buchstaben eines Elements eingeben · Esc geht eine Ebene zurück
|
.hint-items = Buchstaben eines Elements eingeben · Esc geht eine Ebene zurück
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6544,3 +6544,7 @@ keytips =
|
|||||||
.hint-tabs = Πληκτρολογήστε γράμμα καρτέλας · Το Esc κλείνει
|
.hint-tabs = Πληκτρολογήστε γράμμα καρτέλας · Το Esc κλείνει
|
||||||
.hint-tab = Καρτέλα { $tab } · Το Esc επιστρέφει ένα επίπεδο
|
.hint-tab = Καρτέλα { $tab } · Το Esc επιστρέφει ένα επίπεδο
|
||||||
.hint-items = Πληκτρολογήστε γράμμα στοιχείου · Το Esc επιστρέφει ένα επίπεδο
|
.hint-items = Πληκτρολογήστε γράμμα στοιχείου · Το Esc επιστρέφει ένα επίπεδο
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6543,3 +6543,7 @@ keytips =
|
|||||||
.hint-tabs = Type a tab letter · Esc closes
|
.hint-tabs = Type a tab letter · Esc closes
|
||||||
.hint-tab = { $tab } tab · Esc goes back one level
|
.hint-tab = { $tab } tab · Esc goes back one level
|
||||||
.hint-items = Type an item letter · Esc goes back one level
|
.hint-items = Type an item letter · Esc goes back one level
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6544,3 +6544,7 @@ keytips =
|
|||||||
.hint-tabs = Escriba la letra de una ficha · Esc cierra
|
.hint-tabs = Escriba la letra de una ficha · Esc cierra
|
||||||
.hint-tab = Ficha { $tab } · Esc retrocede un nivel
|
.hint-tab = Ficha { $tab } · Esc retrocede un nivel
|
||||||
.hint-items = Escriba la letra de un elemento · Esc retrocede un nivel
|
.hint-items = Escriba la letra de un elemento · Esc retrocede un nivel
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6541,3 +6541,7 @@ keytips =
|
|||||||
.hint-tabs = Kirjoita välilehden kirjain · Esc sulkee
|
.hint-tabs = Kirjoita välilehden kirjain · Esc sulkee
|
||||||
.hint-tab = Välilehti { $tab } · Esc palaa tason taaksepäin
|
.hint-tab = Välilehti { $tab } · Esc palaa tason taaksepäin
|
||||||
.hint-items = Kirjoita kohteen kirjain · Esc palaa tason taaksepäin
|
.hint-items = Kirjoita kohteen kirjain · Esc palaa tason taaksepäin
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6544,3 +6544,7 @@ keytips =
|
|||||||
.hint-tabs = Tapez la lettre d'un onglet · Échap ferme
|
.hint-tabs = Tapez la lettre d'un onglet · Échap ferme
|
||||||
.hint-tab = Onglet { $tab } · Échap remonte d'un niveau
|
.hint-tab = Onglet { $tab } · Échap remonte d'un niveau
|
||||||
.hint-items = Tapez la lettre d'un élément · Échap remonte d'un niveau
|
.hint-items = Tapez la lettre d'un élément · Échap remonte d'un niveau
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6532,3 +6532,7 @@ keytips =
|
|||||||
.hint-tabs = टैब का अक्षर टाइप करें · Esc बंद करता है
|
.hint-tabs = टैब का अक्षर टाइप करें · Esc बंद करता है
|
||||||
.hint-tab = { $tab } टैब · Esc एक स्तर पीछे जाता है
|
.hint-tab = { $tab } टैब · Esc एक स्तर पीछे जाता है
|
||||||
.hint-items = आइटम का अक्षर टाइप करें · Esc एक स्तर पीछे जाता है
|
.hint-items = आइटम का अक्षर टाइप करें · Esc एक स्तर पीछे जाता है
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6528,3 +6528,7 @@ keytips =
|
|||||||
.hint-tabs = Írja be a lap betűjét · Az Esc bezár
|
.hint-tabs = Írja be a lap betűjét · Az Esc bezár
|
||||||
.hint-tab = { $tab } lap · Az Esc egy szinttel visszalép
|
.hint-tab = { $tab } lap · Az Esc egy szinttel visszalép
|
||||||
.hint-items = Írja be az elem betűjét · Az Esc egy szinttel visszalép
|
.hint-items = Írja be az elem betűjét · Az Esc egy szinttel visszalép
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6543,3 +6543,7 @@ keytips =
|
|||||||
.hint-tabs = Digitare la lettera di una scheda · Esc chiude
|
.hint-tabs = Digitare la lettera di una scheda · Esc chiude
|
||||||
.hint-tab = Scheda { $tab } · Esc torna indietro di un livello
|
.hint-tab = Scheda { $tab } · Esc torna indietro di un livello
|
||||||
.hint-items = Digitare la lettera di un elemento · Esc torna indietro di un livello
|
.hint-items = Digitare la lettera di un elemento · Esc torna indietro di un livello
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6532,3 +6532,7 @@ keytips =
|
|||||||
.hint-tabs = タブの文字を入力 · Esc で閉じる
|
.hint-tabs = タブの文字を入力 · Esc で閉じる
|
||||||
.hint-tab = { $tab } タブ · Esc で 1 つ上に戻る
|
.hint-tab = { $tab } タブ · Esc で 1 つ上に戻る
|
||||||
.hint-items = 項目の文字を入力 · Esc で 1 つ上に戻る
|
.hint-items = 項目の文字を入力 · Esc で 1 つ上に戻る
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6543,3 +6543,7 @@ keytips =
|
|||||||
.hint-tabs = 탭 문자를 입력하십시오 · Esc로 닫기
|
.hint-tabs = 탭 문자를 입력하십시오 · Esc로 닫기
|
||||||
.hint-tab = { $tab } 탭 · Esc로 한 단계 뒤로
|
.hint-tab = { $tab } 탭 · Esc로 한 단계 뒤로
|
||||||
.hint-items = 항목 문자를 입력하십시오 · Esc로 한 단계 뒤로
|
.hint-items = 항목 문자를 입력하십시오 · Esc로 한 단계 뒤로
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6544,3 +6544,7 @@ keytips =
|
|||||||
.hint-tabs = ພິມຕົວອັກສອນແຖບ · Esc ປິດ
|
.hint-tabs = ພິມຕົວອັກສອນແຖບ · Esc ປິດ
|
||||||
.hint-tab = ແຖບ { $tab } · Esc ກັບຄືນໜຶ່ງລະດັບ
|
.hint-tab = ແຖບ { $tab } · Esc ກັບຄືນໜຶ່ງລະດັບ
|
||||||
.hint-items = ພິມຕົວອັກສອນລາຍການ · Esc ກັບຄືນໜຶ່ງລະດັບ
|
.hint-items = ພິມຕົວອັກສອນລາຍການ · Esc ກັບຄືນໜຶ່ງລະດັບ
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6542,3 +6542,7 @@ keytips =
|
|||||||
.hint-tabs = Typ de letter van een tabblad · Esc sluit
|
.hint-tabs = Typ de letter van een tabblad · Esc sluit
|
||||||
.hint-tab = Tabblad { $tab } · Esc gaat één niveau terug
|
.hint-tab = Tabblad { $tab } · Esc gaat één niveau terug
|
||||||
.hint-items = Typ de letter van een item · Esc gaat één niveau terug
|
.hint-items = Typ de letter van een item · Esc gaat één niveau terug
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6543,3 +6543,7 @@ keytips =
|
|||||||
.hint-tabs = Wpisz literę karty · Esc zamyka
|
.hint-tabs = Wpisz literę karty · Esc zamyka
|
||||||
.hint-tab = Karta { $tab } · Esc cofa o jeden poziom
|
.hint-tab = Karta { $tab } · Esc cofa o jeden poziom
|
||||||
.hint-items = Wpisz literę elementu · Esc cofa o jeden poziom
|
.hint-items = Wpisz literę elementu · Esc cofa o jeden poziom
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6544,3 +6544,7 @@ keytips =
|
|||||||
.hint-tabs = Digite a letra de uma guia · Esc fecha
|
.hint-tabs = Digite a letra de uma guia · Esc fecha
|
||||||
.hint-tab = Guia { $tab } · Esc volta um nível
|
.hint-tab = Guia { $tab } · Esc volta um nível
|
||||||
.hint-items = Digite a letra de um item · Esc volta um nível
|
.hint-items = Digite a letra de um item · Esc volta um nível
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6545,3 +6545,7 @@ keytips =
|
|||||||
.hint-tabs = Введите букву вкладки · Esc закрывает
|
.hint-tabs = Введите букву вкладки · Esc закрывает
|
||||||
.hint-tab = Вкладка { $tab } · Esc — на уровень назад
|
.hint-tab = Вкладка { $tab } · Esc — на уровень назад
|
||||||
.hint-items = Введите букву элемента · Esc — на уровень назад
|
.hint-items = Введите букву элемента · Esc — на уровень назад
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6465,3 +6465,7 @@ keytips =
|
|||||||
.hint-tabs = Sekme harfini yazın · Esc kapatır
|
.hint-tabs = Sekme harfini yazın · Esc kapatır
|
||||||
.hint-tab = { $tab } sekmesi · Esc bir düzey geri
|
.hint-tab = { $tab } sekmesi · Esc bir düzey geri
|
||||||
.hint-items = Öğe harfini yazın · Esc bir düzey geri
|
.hint-items = Öğe harfini yazın · Esc bir düzey geri
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ bulundu (__ocs_fmt_1__ yinelenen), toplam __ocs_fmt_2__
|
||||||
|
.found-removed-total = __ocs_fmt_0__ bulundu, __ocs_fmt_1__ çıkarıldı, toplam __ocs_fmt_2__
|
||||||
@@ -6527,3 +6527,7 @@ keytips =
|
|||||||
.hint-tabs = 键入选项卡字母 · Esc 关闭
|
.hint-tabs = 键入选项卡字母 · Esc 关闭
|
||||||
.hint-tab = { $tab } 选项卡 · Esc 返回上一级
|
.hint-tab = { $tab } 选项卡 · Esc 返回上一级
|
||||||
.hint-items = 键入项目字母 · Esc 返回上一级
|
.hint-items = 键入项目字母 · Esc 返回上一级
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -6539,3 +6539,7 @@ keytips =
|
|||||||
.hint-tabs = 輸入索引標籤字母 · Esc 關閉
|
.hint-tabs = 輸入索引標籤字母 · Esc 關閉
|
||||||
.hint-tab = { $tab } 索引標籤 · Esc 返回上一層
|
.hint-tab = { $tab } 索引標籤 · Esc 返回上一層
|
||||||
.hint-items = 輸入項目字母 · Esc 返回上一層
|
.hint-items = 輸入項目字母 · Esc 返回上一層
|
||||||
|
|
||||||
|
selection-report =
|
||||||
|
.found-duplicate-total = __ocs_fmt_0__ found (__ocs_fmt_1__ duplicate), __ocs_fmt_2__ total
|
||||||
|
.found-removed-total = __ocs_fmt_0__ found, __ocs_fmt_1__ removed, __ocs_fmt_2__ total
|
||||||
@@ -1244,6 +1244,7 @@ impl OpenCADStudio {
|
|||||||
bounds,
|
bounds,
|
||||||
|point| self.cursor_model_point(i, &edit_cam, point, bounds),
|
|point| self.cursor_model_point(i, &edit_cam, point, bounds),
|
||||||
);
|
);
|
||||||
|
self.last_pick = Some((handles.clone(), self.select_remove_mode));
|
||||||
if self.select_remove_mode {
|
if self.select_remove_mode {
|
||||||
for h in &handles {
|
for h in &handles {
|
||||||
self.tabs[i].scene.deselect_entity(*h);
|
self.tabs[i].scene.deselect_entity(*h);
|
||||||
@@ -1261,9 +1262,6 @@ impl OpenCADStudio {
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(h, _)| h)
|
.map(|(h, _)| h)
|
||||||
.collect();
|
.collect();
|
||||||
let count = handles.len();
|
|
||||||
self.command_line
|
|
||||||
.push_info(crate::tf!("{count} object(s) found.").as_ref());
|
|
||||||
self.feed_command(StepInput::SelectionComplete(selected))
|
self.feed_command(StepInput::SelectionComplete(selected))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -574,6 +574,56 @@ impl OpenCADStudio {
|
|||||||
StepInput::SelectionComplete(kept)
|
StepInput::SelectionComplete(kept)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// What one selection step picked, as the reference words it: `N found`
|
||||||
|
/// for the first step, `N found, M total`, `N found (D duplicate), M
|
||||||
|
/// total` when some were chosen already, `N found, R removed, M total` in
|
||||||
|
/// remove mode. Returns the command's key while it gathers.
|
||||||
|
fn report_selection_found(&mut self, input: &StepInput) -> Option<usize> {
|
||||||
|
let StepInput::SelectionComplete(handles) = input else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
// A pick belongs to this step only; never to a later one.
|
||||||
|
let last_pick = self.last_pick.take();
|
||||||
|
let command = self.tabs[self.active_tab].active_cmd.as_ref()?;
|
||||||
|
if !command.is_selection_gathering() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let key = &**command as *const dyn crate::command::CadCommand as *const () as usize;
|
||||||
|
let previous: rustc_hash::FxHashSet<Handle> = match &self.selection_report {
|
||||||
|
Some((k, previous)) if *k == key => previous.iter().copied().collect(),
|
||||||
|
_ => Default::default(),
|
||||||
|
};
|
||||||
|
let now: rustc_hash::FxHashSet<Handle> = handles.iter().copied().collect();
|
||||||
|
let total = now.len();
|
||||||
|
// What the step picked: its own objects when the pick says so, else
|
||||||
|
// what the selection gained or lost.
|
||||||
|
let (picked, remove) = match last_pick {
|
||||||
|
Some((picked, remove)) => (picked.into_iter().collect(), remove),
|
||||||
|
None => {
|
||||||
|
let lost: rustc_hash::FxHashSet<Handle> =
|
||||||
|
previous.difference(&now).copied().collect();
|
||||||
|
if lost.is_empty() {
|
||||||
|
(now.difference(&previous).copied().collect(), false)
|
||||||
|
} else {
|
||||||
|
(lost, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let found = picked.len();
|
||||||
|
let known = picked.intersection(&previous).count();
|
||||||
|
let line = if found == 0 || previous.is_empty() && !remove {
|
||||||
|
crate::tf!("{found} found")
|
||||||
|
} else if remove && known > 0 {
|
||||||
|
crate::tf!("{found} found, {known} removed, {total} total")
|
||||||
|
} else if !remove && known > 0 {
|
||||||
|
crate::tf!("{found} found ({known} duplicate), {total} total")
|
||||||
|
} else {
|
||||||
|
crate::tf!("{found} found, {total} total")
|
||||||
|
};
|
||||||
|
self.command_line.push_info(line.as_ref());
|
||||||
|
Some(key)
|
||||||
|
}
|
||||||
|
|
||||||
/// `feed_command`, also reporting whether the step actually took the input.
|
/// `feed_command`, also reporting whether the step actually took the input.
|
||||||
/// Only a `Text` token can come back unclaimed (`on_text_input` returning
|
/// Only a `Text` token can come back unclaimed (`on_text_input` returning
|
||||||
/// `None`), which is what lets the caller read it as something else — a
|
/// `None`), which is what lets the caller read it as something else — a
|
||||||
@@ -582,6 +632,7 @@ impl OpenCADStudio {
|
|||||||
&mut self,
|
&mut self,
|
||||||
input: StepInput,
|
input: StepInput,
|
||||||
) -> (Task<Message>, bool) {
|
) -> (Task<Message>, bool) {
|
||||||
|
let gathering = self.report_selection_found(&input);
|
||||||
// A command that takes associative dimensions only keeps just those:
|
// A command that takes associative dimensions only keeps just those:
|
||||||
// the rest leave the selection and the count of what went is reported,
|
// the rest leave the selection and the count of what went is reported,
|
||||||
// as the reference does while gathering.
|
// as the reference does while gathering.
|
||||||
@@ -589,6 +640,9 @@ impl OpenCADStudio {
|
|||||||
let input = self.filter_block_reference_selection(input);
|
let input = self.filter_block_reference_selection(input);
|
||||||
let input = self.filter_locked_point_cloud_selection(input);
|
let input = self.filter_locked_point_cloud_selection(input);
|
||||||
let input = self.filter_command_entity_selection(input);
|
let input = self.filter_command_entity_selection(input);
|
||||||
|
if let (Some(key), StepInput::SelectionComplete(kept)) = (gathering, &input) {
|
||||||
|
self.selection_report = Some((key, kept.clone()));
|
||||||
|
}
|
||||||
// XCLIP / CLIP learn which chosen references carry a clip already.
|
// XCLIP / CLIP learn which chosen references carry a clip already.
|
||||||
{
|
{
|
||||||
let i = self.active_tab;
|
let i = self.active_tab;
|
||||||
@@ -1045,12 +1099,10 @@ impl OpenCADStudio {
|
|||||||
);
|
);
|
||||||
return Some(Task::none());
|
return Some(Task::none());
|
||||||
}
|
}
|
||||||
let count = add.len();
|
self.last_pick = Some((add.clone(), false));
|
||||||
for h in add {
|
for h in add {
|
||||||
self.tabs[i].scene.select_entity(h, false);
|
self.tabs[i].scene.select_entity(h, false);
|
||||||
}
|
}
|
||||||
self.command_line
|
|
||||||
.push_info(crate::tf!("{count} object(s) added to selection.").as_ref());
|
|
||||||
self.refresh_properties();
|
self.refresh_properties();
|
||||||
let handles: Vec<Handle> = self.tabs[i]
|
let handles: Vec<Handle> = self.tabs[i]
|
||||||
.scene
|
.scene
|
||||||
|
|||||||
@@ -800,6 +800,12 @@ pub(super) struct OpenCADStudio {
|
|||||||
block_freq: std::collections::HashMap<String, u32>,
|
block_freq: std::collections::HashMap<String, u32>,
|
||||||
/// BLOCKMRULIST: how many recent blocks the palette keeps (0–100).
|
/// BLOCKMRULIST: how many recent blocks the palette keeps (0–100).
|
||||||
pub(crate) block_mru_list: u8,
|
pub(crate) block_mru_list: u8,
|
||||||
|
/// The selection the gathering command had after the last pick (keyed by
|
||||||
|
/// the command), for the `N found, M total` line.
|
||||||
|
pub(crate) selection_report: Option<(usize, Vec<codec::Handle>)>,
|
||||||
|
/// The objects the last selection step picked (a click, a window, a
|
||||||
|
/// fence, Last / Previous / All) and whether it removed them.
|
||||||
|
pub(crate) last_pick: Option<(Vec<codec::Handle>, bool)>,
|
||||||
/// The Edit Reference dialog's remembered settings.
|
/// The Edit Reference dialog's remembered settings.
|
||||||
pub(crate) refedit_options: crate::app::settings::RefEditOptions,
|
pub(crate) refedit_options: crate::app::settings::RefEditOptions,
|
||||||
/// BLOCKREDEFINEMODE (0–2).
|
/// BLOCKREDEFINEMODE (0–2).
|
||||||
@@ -4696,6 +4702,8 @@ impl OpenCADStudio {
|
|||||||
block_mru: Vec::new(),
|
block_mru: Vec::new(),
|
||||||
block_freq: std::collections::HashMap::new(),
|
block_freq: std::collections::HashMap::new(),
|
||||||
block_mru_list: 50,
|
block_mru_list: 50,
|
||||||
|
selection_report: None,
|
||||||
|
last_pick: None,
|
||||||
refedit_options: Default::default(),
|
refedit_options: Default::default(),
|
||||||
block_redefine_mode: 1,
|
block_redefine_mode: 1,
|
||||||
block_navigate: ".".to_string(),
|
block_navigate: ".".to_string(),
|
||||||
|
|||||||
@@ -5230,6 +5230,10 @@ properties={:.1}ms picked={}",
|
|||||||
// lasso adds, Shift+lasso removes. An empty lasso
|
// lasso adds, Shift+lasso removes. An empty lasso
|
||||||
// leaves the current selection untouched so a stray
|
// leaves the current selection untouched so a stray
|
||||||
// drag never discards hard-won picks.
|
// drag never discards hard-won picks.
|
||||||
|
if is_gathering {
|
||||||
|
self.last_pick =
|
||||||
|
Some((handles.clone(), self.shift_down || self.select_remove_mode));
|
||||||
|
}
|
||||||
if self.shift_down || self.select_remove_mode {
|
if self.shift_down || self.select_remove_mode {
|
||||||
self.tabs[i].scene.deselect_entities(&handles);
|
self.tabs[i].scene.deselect_entities(&handles);
|
||||||
} else {
|
} else {
|
||||||
@@ -5372,6 +5376,12 @@ properties={:.1}ms picked={}",
|
|||||||
let hit =
|
let hit =
|
||||||
hit.filter(|&h| self.tabs[i].scene.passes_selection_filter(h));
|
hit.filter(|&h| self.tabs[i].scene.passes_selection_filter(h));
|
||||||
if let Some(handle) = hit {
|
if let Some(handle) = hit {
|
||||||
|
if is_gathering {
|
||||||
|
self.last_pick = Some((
|
||||||
|
vec![handle],
|
||||||
|
self.shift_down || self.select_remove_mode,
|
||||||
|
));
|
||||||
|
}
|
||||||
// Individual picks accumulate (issue #47):
|
// Individual picks accumulate (issue #47):
|
||||||
// each plain click adds to the selection,
|
// each plain click adds to the selection,
|
||||||
// Shift+click removes the picked entity.
|
// Shift+click removes the picked entity.
|
||||||
@@ -5504,6 +5514,10 @@ was_selected={}",
|
|||||||
// entities. An empty box leaves the selection alone
|
// entities. An empty box leaves the selection alone
|
||||||
// so an accidental empty drag never discards it.
|
// so an accidental empty drag never discards it.
|
||||||
// PICKADD 0 (#226): a plain box REPLACES instead.
|
// PICKADD 0 (#226): a plain box REPLACES instead.
|
||||||
|
if is_gathering {
|
||||||
|
self.last_pick =
|
||||||
|
Some((handles.clone(), self.shift_down || self.select_remove_mode));
|
||||||
|
}
|
||||||
if self.shift_down || self.select_remove_mode {
|
if self.shift_down || self.select_remove_mode {
|
||||||
self.tabs[i].scene.deselect_entities(&handles);
|
self.tabs[i].scene.deselect_entities(&handles);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static
|
|||||||
"{} entities added" => Some(("ref-edit", "entities-added")),
|
"{} entities added" => Some(("ref-edit", "entities-added")),
|
||||||
"Use REFCLOSE or the Refedit toolbar to end reference editing session." => Some(("ref-edit", "use-refclose")),
|
"Use REFCLOSE or the Refedit toolbar to end reference editing session." => Some(("ref-edit", "use-refclose")),
|
||||||
"Specify opposite corner:" => Some(("ref-edit", "opposite-corner")),
|
"Specify opposite corner:" => Some(("ref-edit", "opposite-corner")),
|
||||||
|
"{found} found, {known} removed, {total} total" => Some(("selection-report", "found-removed-total")),
|
||||||
|
"{found} found ({known} duplicate), {total} total" => Some(("selection-report", "found-duplicate-total")),
|
||||||
"Add to Working Set" => Some(("ref-edit", "add-to-working-set")),
|
"Add to Working Set" => Some(("ref-edit", "add-to-working-set")),
|
||||||
"Remove from Working Set" => Some(("ref-edit", "remove-from-working-set")),
|
"Remove from Working Set" => Some(("ref-edit", "remove-from-working-set")),
|
||||||
"Select reference:" => Some(("ref-edit", "select-reference")),
|
"Select reference:" => Some(("ref-edit", "select-reference")),
|
||||||
|
|||||||
@@ -158,17 +158,10 @@ impl CadCommand for CountCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn on_selection_complete(&mut self, handles: Vec<Handle>) -> CmdResult {
|
fn on_selection_complete(&mut self, handles: Vec<Handle>) -> CmdResult {
|
||||||
// The selection arrives whole after every pick: `1 found`, then
|
// The selection arrives whole after every pick; the driver reports
|
||||||
// `1 found, 2 total`.
|
// what each pick found.
|
||||||
let found = handles.iter().filter(|h| !self.targets.contains(h)).count();
|
|
||||||
let first = self.targets.is_empty();
|
|
||||||
self.targets = handles;
|
self.targets = handles;
|
||||||
let total = self.targets.len();
|
CmdResult::NeedPoint
|
||||||
CmdResult::ReportMeasurement(if first {
|
|
||||||
crate::tf!("{found} found").into_owned()
|
|
||||||
} else {
|
|
||||||
crate::tf!("{found} found, {total} total").into_owned()
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn needs_entity_pick(&self) -> bool {
|
fn needs_entity_pick(&self) -> bool {
|
||||||
|
|||||||
Reference in new issue
Block a user