|
1 | 1 | use super::*; |
2 | 2 |
|
| 3 | +const COLLAPSED_MODEL_SELECTOR_WIDTH: f32 = 170.0; |
| 4 | +const COLLAPSED_MODEL_SELECTOR_MENU_MIN_WIDTH: f32 = 260.0; |
| 5 | + |
| 6 | +#[derive(Debug, Clone, Copy, PartialEq, Eq)] |
| 7 | +enum ModelSelectorMode { |
| 8 | + Full, |
| 9 | + Compact, |
| 10 | +} |
| 11 | + |
3 | 12 | pub(super) fn ui_family_and_params(app: &mut CurveFitApp, ui: &mut egui::Ui) { |
4 | 13 | let language = app.ui_language; |
5 | 14 | let can_edit_params = !app.fit_in_progress; |
6 | 15 | let icon_tint = ui.visuals().text_color(); |
7 | 16 |
|
8 | | - let previous_model = app.selected_model; |
9 | | - ui.add_enabled_ui(can_edit_params, |ui| { |
10 | | - egui::ComboBox::from_label(tr(language, "Model type", "Тип модели")) |
11 | | - .selected_text(model_choice_label(language, app.selected_model)) |
12 | | - .show_ui(ui, |ui| { |
13 | | - ui.set_min_width(280.0); |
14 | | - let mut is_first_group = true; |
15 | | - for group in ModelGroup::ALL { |
16 | | - if !is_first_group { |
17 | | - ui.separator(); |
18 | | - } |
19 | | - is_first_group = false; |
20 | | - ui.label(egui::RichText::new(model_group_label(language, group)).strong()); |
21 | | - for model in ModelChoice::ALL { |
22 | | - if model_group(model) != group { |
23 | | - continue; |
24 | | - } |
25 | | - let model_label = model_choice_label(language, model); |
26 | | - let response = |
27 | | - ui.selectable_label(app.selected_model == model, model_label); |
28 | | - if response.clicked() { |
29 | | - app.selected_model = model; |
30 | | - } |
31 | | - } |
32 | | - } |
33 | | - }); |
34 | | - }); |
35 | | - |
36 | | - let mut params_need_sync = false; |
37 | | - if previous_model != app.selected_model { |
38 | | - params_need_sync = true; |
39 | | - } |
| 17 | + let mut params_need_sync = ui_model_selector(app, ui, can_edit_params, ModelSelectorMode::Full); |
40 | 18 |
|
41 | 19 | if app.selected_model.is_polynomial() { |
42 | 20 | let previous_degree = app.polynomial_degree; |
@@ -312,6 +290,68 @@ pub(super) fn ui_family_and_params(app: &mut CurveFitApp, ui: &mut egui::Ui) { |
312 | 290 | } |
313 | 291 | } |
314 | 292 |
|
| 293 | +pub(super) fn ui_model_selector_compact(app: &mut CurveFitApp, ui: &mut egui::Ui) { |
| 294 | + let can_edit_params = !app.fit_in_progress; |
| 295 | + if ui_model_selector(app, ui, can_edit_params, ModelSelectorMode::Compact) { |
| 296 | + app.sync_parameter_inputs(); |
| 297 | + app.clear_fit_outputs(); |
| 298 | + } |
| 299 | +} |
| 300 | + |
| 301 | +fn ui_model_selector( |
| 302 | + app: &mut CurveFitApp, |
| 303 | + ui: &mut egui::Ui, |
| 304 | + can_edit_params: bool, |
| 305 | + mode: ModelSelectorMode, |
| 306 | +) -> bool { |
| 307 | + let language = app.ui_language; |
| 308 | + let previous_model = app.selected_model; |
| 309 | + ui.add_enabled_ui(can_edit_params, |ui| { |
| 310 | + let selected_text = model_choice_label(language, app.selected_model); |
| 311 | + match mode { |
| 312 | + ModelSelectorMode::Full => { |
| 313 | + egui::ComboBox::from_label(tr(language, "Model type", "Тип модели")) |
| 314 | + .selected_text(selected_text) |
| 315 | + .show_ui(ui, |ui| { |
| 316 | + ui.set_min_width(280.0); |
| 317 | + ui_model_selector_menu(app, ui, language); |
| 318 | + }); |
| 319 | + } |
| 320 | + ModelSelectorMode::Compact => { |
| 321 | + egui::ComboBox::from_id_salt("collapsed_header_model_selector") |
| 322 | + .selected_text(selected_text) |
| 323 | + .width(COLLAPSED_MODEL_SELECTOR_WIDTH) |
| 324 | + .show_ui(ui, |ui| { |
| 325 | + ui.set_min_width(COLLAPSED_MODEL_SELECTOR_MENU_MIN_WIDTH); |
| 326 | + ui_model_selector_menu(app, ui, language); |
| 327 | + }); |
| 328 | + } |
| 329 | + } |
| 330 | + }); |
| 331 | + app.selected_model != previous_model |
| 332 | +} |
| 333 | + |
| 334 | +fn ui_model_selector_menu(app: &mut CurveFitApp, ui: &mut egui::Ui, language: UiLanguage) { |
| 335 | + let mut is_first_group = true; |
| 336 | + for group in ModelGroup::ALL { |
| 337 | + if !is_first_group { |
| 338 | + ui.separator(); |
| 339 | + } |
| 340 | + is_first_group = false; |
| 341 | + ui.label(egui::RichText::new(model_group_label(language, group)).strong()); |
| 342 | + for model in ModelChoice::ALL { |
| 343 | + if model_group(model) != group { |
| 344 | + continue; |
| 345 | + } |
| 346 | + let model_label = model_choice_label(language, model); |
| 347 | + let response = ui.selectable_label(app.selected_model == model, model_label); |
| 348 | + if response.clicked() { |
| 349 | + app.selected_model = model; |
| 350 | + } |
| 351 | + } |
| 352 | + } |
| 353 | +} |
| 354 | + |
315 | 355 | fn parametric_init_hint(language: UiLanguage) -> &'static str { |
316 | 356 | tr( |
317 | 357 | language, |
|
0 commit comments