@@ -5,15 +5,17 @@ use eframe::egui::{
55 self , Align , Area , Button , CollapsingHeader , DragValue , Grid , Id , RichText , ScrollArea , SidePanel , Slider , Stroke , TextEdit , TextStyle , Window
66} ;
77use eframe:: epaint:: Color32 ;
8- use egui_plot:: { HLine , Legend , Plot , PlotBounds , PlotImage , PlotPoint , PlotTransform , PlotUi , VLine } ;
8+ use egui_plot:: {
9+ HLine , Legend , Plot , PlotBounds , PlotImage , PlotItem , PlotPoint , PlotTransform , PlotUi , VLine
10+ } ;
911use evalexpr:: { EvalexprFloat , Stack , istr} ;
1012use serde:: { Deserialize , Serialize } ;
1113
1214use crate :: builtins:: { init_builtins, show_builtin_information} ;
1315use crate :: draw_buffer:: { DrawMeshType , PointInteraction , PointInteractionType , process_draw_buffers} ;
1416use crate :: drawing:: { duplicate_entry_btn, popup_label, remove_entry_btn} ;
1517use crate :: entry:: {
16- self , Entry , EntrySymbol , EntryType , point_dragging, prepare_entries, schedule_create_plot_elements
18+ self , Entry , EntrySymbol , EntryType , point_dragging, point_radius_outer , prepare_entries, schedule_create_plot_elements
1719} ;
1820use crate :: { AppConfig , IdGenerator , State , UiState , persistence, scope} ;
1921
@@ -489,10 +491,9 @@ pub fn graph_panel<T: EvalexprFloat>(
489491
490492 let plot_id = ui. make_persistent_id ( "Plot" ) ;
491493 let mut plot = Plot :: new ( plot_id) . id ( plot_id) ;
492- if state. graph_state . current_graph_config . show_legend {
493- plot = plot. legend ( Legend :: default ( ) . text_style ( TextStyle :: Body ) ) ;
494- }
495-
494+ if state. graph_state . current_graph_config . show_legend {
495+ plot = plot. legend ( Legend :: default ( ) . text_style ( TextStyle :: Body ) ) ;
496+ }
496497
497498 if ui_state. reset_graph {
498499 force_create_elements = true ;
@@ -540,7 +541,7 @@ pub fn graph_panel<T: EvalexprFloat>(
540541 }
541542
542543 // plot.center_y_axis
543- let mut hovered_point: Option < ( bool , PointInteraction ) > = None ;
544+ let mut hovered_point: Option < ( bool , PointInteraction , f32 ) > = None ;
544545
545546 if let ( Some ( custom_renderer) , Some ( prev_plot_transform) ) =
546547 ( & mut ui_state. fan_fill_renderer , state. graph_state . prev_plot_transform )
@@ -610,28 +611,54 @@ pub fn graph_panel<T: EvalexprFloat>(
610611 for line in ui_state. processed_shapes . lines . iter ( ) {
611612 plot_ui. add ( line. clone ( ) ) ;
612613 }
613- for draw_point in p_draw_buffer
614- . draw_points
615- . into_iter ( )
616- . chain ( ui_state. processed_shapes . draw_points . iter ( ) . cloned ( ) )
614+ for draw_point in
615+ p_draw_buffer. draw_points . iter ( ) . chain ( ui_state. processed_shapes . draw_points . iter ( ) )
617616 {
618617 if let Some ( mouse_pos) = ui_state. plot_mouese_pos {
619618 let transform = state. graph_state . prev_plot_transform . as_ref ( ) . unwrap ( ) ;
620619 let sel = & draw_point. interaction ;
621620 let is_draggable = matches ! ( sel. ty, PointInteractionType :: Draggable { .. } ) ;
622621 let sel_p = transform. position_from_point ( & PlotPoint :: new ( sel. x , sel. y ) ) ;
623- let dist_sq = ( sel_p. x - mouse_pos. x ) . powf ( 2.0 ) + ( sel_p. y - mouse_pos. y ) . powf ( 2.0 ) ;
622+ let dist_sq = ( sel_p. x - mouse_pos. x ) . powf ( 2.0 ) + ( sel_p. y - mouse_pos. y ) . powi ( 2 ) ;
624623
625- if dist_sq < sel. radius * sel. radius {
624+ let hover_radius = if is_draggable { point_radius_outer ( false ) } else { sel. radius } ;
625+ if dist_sq < hover_radius. powi ( 2 ) {
626626 if let Some ( current_hovered) = & hovered_point {
627- if !current_hovered. 0 {
628- hovered_point = Some ( ( is_draggable, sel. clone ( ) ) ) ;
627+ let replace_current = match ( current_hovered. 0 , is_draggable) {
628+ ( false , true ) => true ,
629+ ( true , false ) => false ,
630+ ( false , false ) | ( true , true ) => current_hovered. 2 > dist_sq,
631+ } ;
632+ if replace_current {
633+ hovered_point = Some ( ( is_draggable, sel. clone ( ) , dist_sq) ) ;
629634 }
630635 } else {
631- hovered_point = Some ( ( is_draggable, sel. clone ( ) ) ) ;
636+ hovered_point = Some ( ( is_draggable, sel. clone ( ) , dist_sq ) ) ;
632637 }
633638 }
634639 }
640+ }
641+ let dragging_or_hovered_id =
642+ ui_state. dragging_point_i . as_ref ( ) . or ( hovered_point. as_ref ( ) . map ( |h| & h. 1 ) ) . and_then ( |dp| {
643+ if let PointInteractionType :: Draggable { i, .. } = dp. ty {
644+ Some ( i. 0 . with ( i. 1 ) )
645+ } else {
646+ None
647+ }
648+ } ) ;
649+
650+ for mut draw_point in p_draw_buffer
651+ . draw_points
652+ . into_iter ( )
653+ . chain ( ui_state. processed_shapes . draw_points . iter ( ) . cloned ( ) )
654+ {
655+ if let Some ( id) = dragging_or_hovered_id {
656+ if ( & draw_point. points as & dyn PlotItem ) . id ( ) == id {
657+ let is_selected = Some ( id) == ui_state. selected_plot_line . map ( |i| i. 0 ) ;
658+ let radius = point_radius_outer ( is_selected) ;
659+ draw_point. points = draw_point. points . radius ( radius) ;
660+ }
661+ }
635662 plot_ui. points ( draw_point. points ) ;
636663 }
637664 for draw_text in ui_state. processed_shapes . draw_texts . iter ( ) {
@@ -660,14 +687,13 @@ pub fn graph_panel<T: EvalexprFloat>(
660687 ui_state. plot_mouese_pos = plot_res. response . hover_pos ( ) ;
661688 state. graph_state . prev_plot_transform = Some ( plot_res. transform ) ;
662689
663- // println!("new frame");
690+ // println!("new frame");
664691 if force_create_elements || changed {
665692 // println!("Scheduling element creation because force {force_create_elements} changed {changed}");
666693 if !ui_state. debug_info . pause_redraw {
667694 ui_state. debug_info . plot_bounds = Some ( * plot_res. transform . bounds ( ) ) ;
668695 scope ! ( "schedule_entry_create_plot_elements" ) ;
669696
670-
671697 ui_state. eval_errors . clear ( ) ;
672698 let plot_params = entry:: PlotParams :: new :: < T > ( ui_state, & state. graph_state ) ;
673699 let main_context = Arc :: new ( state. ctx . clone ( ) ) ;
@@ -742,7 +768,7 @@ pub fn graph_panel<T: EvalexprFloat>(
742768 }
743769
744770 if !ui_state. showing_custom_label
745- && let Some ( ( _, hovered_point) ) = & hovered_point
771+ && let Some ( ( _, hovered_point, _ ) ) = & hovered_point
746772 {
747773 let screen_x = plot_res. transform . position_from_point_x ( hovered_point. x ) ;
748774 let screen_y = plot_res. transform . position_from_point_y ( hovered_point. y ) ;
0 commit comments