@@ -401,7 +401,7 @@ def edit_color_stop(
401401 new_color : QG .QColor | int | None = None ,
402402 ):
403403 """Edit an existing color stop in the current colormap. Mutates the colormap
404- object.
404+ object. Also edits the slider handle position.
405405
406406 Args:
407407 index: color stop index to mutate
@@ -416,6 +416,7 @@ def edit_color_stop(
416416 new_color = QG .QColor (self .colortable [new_color ])
417417
418418 self ._colormap .move_color_stop (index , new_pos , new_color )
419+ self .set_handles_values (self ._colormap .colorStops ())
419420 self .COLORMAP_CHANGED .emit ()
420421
421422 def _edit_color_map_on_slider_change (self , raw_values : tuple [float , ...]):
@@ -460,7 +461,7 @@ def _get_neighbour_positions(self, pos: float) -> tuple[float, float]:
460461 """
461462 values = self .get_handles_tuple ()
462463 previous_pos = max (
463- filter (lambda val : val < pos , values [::- 1 ]), default = self .min
464+ filter (lambda val : val <= pos , values [::- 1 ]), default = self .min
464465 )
465466 next_pos = min (filter (lambda val : val > pos , values ), default = self .max )
466467
@@ -558,7 +559,9 @@ def add_handle_at_relative_pos(
558559 self , relative_pos : float , new_color : QG .QColor | int | None = None
559560 ):
560561 """insert a handle in the widget at the relative position (between 0. and 1.).
561- Mutates the colormap object.
562+ Mutates the colormap object. If the relative position is already occupied by a
563+ handle, the new handle will be inserted at the closest available position then
564+ will be moved back to the requested position.
562565
563566 Args:
564567 relative_pos: insertion position
@@ -567,15 +570,16 @@ def add_handle_at_relative_pos(
567570 if new_color is None :
568571 new_color = self ._colormap .color (self .qwt_color_interval , relative_pos )
569572
570- self ._colormap .addColorStop (relative_pos , new_color )
573+ new_relative_pos = self ._new_available_pos (relative_pos )
574+ self ._colormap .addColorStop (new_relative_pos , new_color )
571575
572576 values = self .get_handles_list ()
573- values .append (relative_pos )
577+ values .append (new_relative_pos )
574578 values .sort ()
575- self . set_handles_values ( values )
579+ new_value_index = values . index ( new_relative_pos )
576580
577- self .COLORMAP_CHANGED . emit ( )
578- self .HANDLE_ADDED .emit (values . index ( relative_pos ) , relative_pos )
581+ self .edit_color_stop ( new_value_index , relative_pos , None )
582+ self .HANDLE_ADDED .emit (new_value_index , relative_pos )
579583
580584 def get_handles_count (self ) -> int :
581585 """Number of slider handles.
0 commit comments