@@ -972,15 +972,15 @@ def _on_entry_escape(self, _event: tk.Event) -> str:
972972 def _on_entry_key_release (self , event : tk .Event ) -> None :
973973 if event .keysym in self ._FILTER_IGNORED_KEYSYMS :
974974 return
975+ # When a row is selected (explicit edit mode or implicit edit-via-
976+ # selection), the entry contents are the task's title being edited,
977+ # not a filter query — don't filter or clear the selection.
978+ if self ._editing_index is not None or self ._selected :
979+ return
975980 new_text = self ._entry .get ()
976- if new_text == self ._filter_text and self . _editing_index is None :
981+ if new_text == self ._filter_text :
977982 return
978983 self ._filter_text = new_text
979- if self ._editing_index is None and self ._selected :
980- self ._selected = set ()
981- self ._anchor = None
982- self ._cursor = None
983- self ._last_selected = frozenset ()
984984 self ._redraw ()
985985
986986 # When Shift is held, numpad navigation keys report as KP_Up/KP_Down/etc.
@@ -1011,9 +1011,8 @@ def _on_key(self, event: tk.Event) -> None:
10111011
10121012 if event .keysym in ("Return" , "KP_Enter" ):
10131013 if len (self ._selected ) == 1 :
1014- self ._entry .focus_set ()
1015- self ._entry .select_range (0 , tk .END )
1016- self ._entry .icursor (tk .END )
1014+ (sole ,) = self ._selected
1015+ self ._begin_edit (sole )
10171016 return
10181017
10191018 # Digit keys select a row. Try keycode first (immune to Shift on main row),
@@ -1051,19 +1050,29 @@ def _on_key(self, event: tk.Event) -> None:
10511050 self ._show_help ()
10521051 return
10531052
1054- # Printable character: redirect to entry and let the user type
1053+ # Printable character: redirect to entry and let the user type.
1054+ # If a row is selected, treat this as the start of an edit: the entry
1055+ # already holds the task title pre-selected, so replace it with the
1056+ # typed char and enter edit mode. Otherwise start a fresh filter.
10551057 if event .char and event .char .isprintable ():
1056- self ._cancel_edit ()
1057- self ._entry .delete (0 , tk .END )
1058- self ._entry .focus_set ()
1059- self ._entry .insert (tk .END , event .char )
1060- self ._filter_text = self ._entry .get ()
1061- if self ._selected :
1062- self ._selected = set ()
1063- self ._anchor = None
1064- self ._cursor = None
1065- self ._last_selected = frozenset ()
1066- self ._redraw ()
1058+ if len (self ._selected ) == 1 :
1059+ (sole ,) = self ._selected
1060+ self ._begin_edit (sole )
1061+ self ._entry .delete (0 , tk .END )
1062+ self ._entry .insert (tk .END , event .char )
1063+ self ._entry .icursor (tk .END )
1064+ else :
1065+ self ._cancel_edit ()
1066+ self ._entry .delete (0 , tk .END )
1067+ self ._entry .focus_set ()
1068+ self ._entry .insert (tk .END , event .char )
1069+ self ._filter_text = self ._entry .get ()
1070+ if self ._selected :
1071+ self ._selected = set ()
1072+ self ._anchor = None
1073+ self ._cursor = None
1074+ self ._last_selected = frozenset ()
1075+ self ._redraw ()
10671076 return
10681077
10691078 if event .keysym in ("Up" , "Down" ):
0 commit comments