From 0920348b288b4903cba3bb44f834764516b7196c Mon Sep 17 00:00:00 2001 From: "Dr.-Ing. Amilcar do Carmo Lucas" Date: Fri, 17 Jan 2025 19:45:58 +0100 Subject: [PATCH] FEATURE: allow editing bitmask values numerically It now requires a double-click to open the bitmask editing window --- ...frontend_tkinter_parameter_editor_table.py | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/ardupilot_methodic_configurator/frontend_tkinter_parameter_editor_table.py b/ardupilot_methodic_configurator/frontend_tkinter_parameter_editor_table.py index f27db81a..b9183be5 100644 --- a/ardupilot_methodic_configurator/frontend_tkinter_parameter_editor_table.py +++ b/ardupilot_methodic_configurator/frontend_tkinter_parameter_editor_table.py @@ -380,8 +380,17 @@ def __create_new_value_entry( # pylint: disable=too-many-arguments, too-many-po new_value_entry.config(state="disabled", background="light grey") elif bitmask_dict: new_value_entry.bind( - "", lambda event: self.__open_bitmask_selection_window(event, param_name, bitmask_dict, old_value) + "", + lambda event: self.__open_bitmask_selection_window(event, param_name, bitmask_dict, old_value), ) + # pylint: disable=line-too-long + new_value_entry.bind( + "", + lambda event, current_file=self.current_file, param_name=param_name: self.__on_parameter_value_change( # type: ignore[misc] + event, current_file, param_name + ), + ) + # pylint: enable=line-too-long else: # pylint: disable=line-too-long new_value_entry.bind( @@ -414,9 +423,14 @@ def on_close() -> None: self.root.update_idletasks() # Re-bind the FocusIn event to new_value_entry event.widget.bind( - "", lambda event: self.__open_bitmask_selection_window(event, param_name, bitmask_dict, old_value) + "", + lambda event: self.__open_bitmask_selection_window(event, param_name, bitmask_dict, old_value), ) + def focus_out_handler(event: tk.Event) -> None: + if not window.focus_get() or not window.focus_get().winfo_ismapped(): + on_close() + def get_param_value_msg(_param_name: str, checked_keys: set) -> str: _new_decimal_value = sum(1 << key for key in checked_keys) text = _("{_param_name} Value: {_new_decimal_value}") @@ -427,7 +441,7 @@ def update_label() -> None: close_label.config(text=get_param_value_msg(param_name, checked_keys)) # Temporarily unbind the FocusIn event to prevent triggering the window again - event.widget.unbind("") + event.widget.unbind("") window = tk.Toplevel(self.root) title = _("Select {param_name} Bitmask Options") window.title(title.format(**locals())) @@ -452,6 +466,9 @@ def update_label() -> None: # Bind the on_close function to the window's WM_DELETE_WINDOW protocol window.protocol("WM_DELETE_WINDOW", on_close) + window.bind("", focus_out_handler) + for child in window.winfo_children(): + child.bind("", focus_out_handler) # Make sure the window is visible before disabling the parent window window.deiconify()