Skip to content

Commit 4a7058c

Browse files
committed
code polishing
1 parent 8502216 commit 4a7058c

4 files changed

Lines changed: 60 additions & 8 deletions

File tree

src/app/points_state.rs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,17 @@ impl CurveFitApp {
199199
}
200200
}
201201

202+
fn finish_valid_points_change(&mut self) {
203+
self.clear_fit_outputs();
204+
self.refresh_status_after_points_edit();
205+
if !matches!(
206+
self.status.as_ref(),
207+
Some(StatusMessage::Error(message)) if message.starts_with(POINTS_PARSE_ERROR_PREFIX)
208+
) {
209+
self.status = Some(self.idle_status_after_points_edit());
210+
}
211+
}
212+
202213
fn first_visible_points_parse_error(&mut self) -> Option<String> {
203214
for layer in &mut self.point_layers.layers {
204215
if !layer.visible {
@@ -248,7 +259,7 @@ impl CurveFitApp {
248259
edit: F,
249260
) -> Result<(), String>
250261
where
251-
F: FnOnce(&mut Vec<Point>),
262+
F: FnOnce(&mut Vec<Point>) -> bool,
252263
{
253264
let parse_error = match &self.points_cache_with_policy(true).parsed_points {
254265
Ok(_) => None,
@@ -273,7 +284,9 @@ impl CurveFitApp {
273284
Ok(points) => points,
274285
Err(error) => return Err(error.clone()),
275286
};
276-
edit(points);
287+
if !edit(points) {
288+
return Ok(());
289+
}
277290
cache.parse_error_line = None;
278291
cache.plot_points = points
279292
.iter()
@@ -291,7 +304,7 @@ impl CurveFitApp {
291304
self.selected_points_editor_mut().text_sync_pending = true;
292305
}
293306

294-
self.refresh_status_after_points_edit();
307+
self.finish_valid_points_change();
295308

296309
Ok(())
297310
}
@@ -302,6 +315,7 @@ impl CurveFitApp {
302315
}
303316
self.selected_points_editor_mut().text = new_text;
304317
self.invalidate_points_cache();
318+
self.clear_fit_outputs();
305319
if !keep_redo {
306320
self.selected_points_editor_mut().redo_stack.clear();
307321
}
@@ -355,16 +369,20 @@ impl CurveFitApp {
355369
}
356370

357371
pub(super) fn create_point_layer_from_points(&mut self, points: &[Point]) -> PointLayerId {
358-
self.point_layers.create_layer_from_points(points)
372+
let id = self.point_layers.create_layer_from_points(points);
373+
self.finish_valid_points_change();
374+
id
359375
}
360376

361377
pub(super) fn duplicate_selected_point_layer(&mut self) -> PointLayerId {
362-
self.point_layers.duplicate_selected_layer()
378+
let id = self.point_layers.duplicate_selected_layer();
379+
self.finish_valid_points_change();
380+
id
363381
}
364382

365383
pub(super) fn delete_selected_point_layer(&mut self) {
366384
self.point_layers.delete_selected_layer();
367-
self.refresh_status_after_points_edit();
385+
self.finish_valid_points_change();
368386
}
369387

370388
pub(super) fn visible_point_layer_plot_data(&mut self) -> Vec<VisiblePointLayerPlotData> {
@@ -403,7 +421,7 @@ impl CurveFitApp {
403421
}
404422
self.selected_points_editor_mut().redo_stack.clear();
405423
self.set_points_cache_from_valid_points(&[]);
406-
self.refresh_status_after_points_edit();
424+
self.finish_valid_points_change();
407425
}
408426

409427
pub(super) fn write_points_text(&mut self, points: &[Point], record_undo: bool) {
@@ -419,7 +437,7 @@ impl CurveFitApp {
419437
points_state.text = new_text;
420438
points_state.redo_stack.clear();
421439
self.set_points_cache_from_valid_points(points);
422-
self.refresh_status_after_points_edit();
440+
self.finish_valid_points_change();
423441
}
424442

425443
pub(super) fn can_move_points_to_positive_xy(&mut self) -> bool {

src/app/tests/points_editing.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,34 @@ fn selected_layer_only_editing_preserves_other_layers() {
207207
);
208208
}
209209

210+
#[test]
211+
fn points_data_change_clears_stale_fit_outputs() {
212+
let mut app = CurveFitApp {
213+
fit_result: Some(FitResult {
214+
family: CurveFamily::Linear,
215+
params: CurveParams::Linear { a: 1.0, b: 0.0 },
216+
mse: 0.0,
217+
rmse: 0.0,
218+
iterations: 1,
219+
}),
220+
last_fit_duration: Some(std::time::Duration::from_millis(42)),
221+
status: Some(StatusMessage::FitCompleted),
222+
..Default::default()
223+
};
224+
225+
app.write_points_text(
226+
&[
227+
Point::try_new(10.0, 20.0).unwrap(),
228+
Point::try_new(30.0, 40.0).unwrap(),
229+
],
230+
false,
231+
);
232+
233+
assert!(app.fit_result.is_none());
234+
assert!(app.last_fit_duration.is_none());
235+
assert!(matches!(app.status, Some(StatusMessage::Ready)));
236+
}
237+
210238
#[test]
211239
fn duplicate_layer_copies_points_and_selects_copy() {
212240
let mut app = CurveFitApp::default();

src/app/ui/plot_panel.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub(super) fn add_point_from_plot(app: &mut CurveFitApp, x: f64, y: f64, record_
1313

1414
if let Err(error) = app.edit_valid_points_in_cache(record_undo, false, move |points| {
1515
points.push(point);
16+
true
1617
}) {
1718
app.status = Some(StatusMessage::Error(error));
1819
}
@@ -46,6 +47,7 @@ pub(super) fn spray_points_from_plot(
4647

4748
if let Err(error) = app.edit_valid_points_in_cache(false, false, |points| {
4849
points.extend(generated_points);
50+
true
4951
}) {
5052
app.status = Some(StatusMessage::Error(error));
5153
}
@@ -63,11 +65,13 @@ pub(super) fn erase_points_from_plot(
6365
}
6466

6567
if let Err(error) = app.edit_valid_points_in_cache(false, false, |points| {
68+
let previous_len = points.len();
6669
points.retain(|point| {
6770
let dx = (point.x() - center_x) / radius_x;
6871
let dy = (point.y() - center_y) / radius_y;
6972
dx * dx + dy * dy > 1.0
7073
});
74+
points.len() != previous_len
7175
}) {
7276
app.status = Some(StatusMessage::Error(error));
7377
}

src/app/ui/points_editor_panel.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,8 @@ pub(super) fn ui_points_editor(app: &mut CurveFitApp, ui: &mut egui::Ui) {
602602
app.push_points_undo_snapshot(before_edit);
603603
app.selected_points_editor_mut().redo_stack.clear();
604604
app.invalidate_points_cache();
605+
app.clear_fit_outputs();
606+
app.status = Some(StatusMessage::Ready);
605607
}
606608
});
607609

0 commit comments

Comments
 (0)