Fix cursor jumping when editing variable names
This commit is contained in:
parent
de83ecfbb4
commit
32fda61894
@ -19,13 +19,46 @@
|
||||
<object class="GtkEntry" id="name_entry">
|
||||
<property name="placeholder-text">Variable name</property>
|
||||
<property name="hexpand">True</property>
|
||||
<signal name="changed" handler="on_name_changed"/>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<!-- Inline edit buttons (shown only when editing) -->
|
||||
<child>
|
||||
<object class="GtkRevealer" id="edit_buttons_revealer">
|
||||
<property name="transition-type">slide-left</property>
|
||||
<property name="reveal-child">False</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="spacing">3</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="cancel_button">
|
||||
<property name="icon-name">process-stop-symbolic</property>
|
||||
<property name="tooltip-text">Cancel editing</property>
|
||||
<signal name="clicked" handler="on_cancel_clicked"/>
|
||||
<style>
|
||||
<class name="flat"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="save_button">
|
||||
<property name="icon-name">object-select-symbolic</property>
|
||||
<property name="tooltip-text">Save changes</property>
|
||||
<signal name="clicked" handler="on_save_clicked"/>
|
||||
<style>
|
||||
<class name="flat"/>
|
||||
<class name="suggested-action"/>
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkToggleButton" id="sensitive_toggle">
|
||||
<property name="icon-name">channel-insecure-symbolic</property>
|
||||
<property name="icon-name">changes-allow-symbolic</property>
|
||||
<property name="tooltip-text">Mark as sensitive (store in keyring)</property>
|
||||
<signal name="toggled" handler="on_sensitive_toggled"/>
|
||||
<style>
|
||||
|
||||
@ -30,6 +30,9 @@ class VariableDataRow(Gtk.Box):
|
||||
|
||||
variable_cell = Gtk.Template.Child()
|
||||
name_entry = Gtk.Template.Child()
|
||||
edit_buttons_revealer = Gtk.Template.Child()
|
||||
cancel_button = Gtk.Template.Child()
|
||||
save_button = Gtk.Template.Child()
|
||||
sensitive_toggle = Gtk.Template.Child()
|
||||
delete_button = Gtk.Template.Child()
|
||||
values_box = Gtk.Template.Child()
|
||||
@ -44,6 +47,7 @@ class VariableDataRow(Gtk.Box):
|
||||
def __init__(self, variable_name, environments, size_group, project, project_manager, update_timestamp=None):
|
||||
super().__init__()
|
||||
self.variable_name = variable_name
|
||||
self.original_name = variable_name # Store original name for cancel
|
||||
self.environments = environments
|
||||
self.size_group = size_group
|
||||
self.project = project
|
||||
@ -51,10 +55,20 @@ class VariableDataRow(Gtk.Box):
|
||||
self.value_entries = {}
|
||||
self.update_timeout_id = None
|
||||
self._updating_toggle = False # Flag to prevent recursion
|
||||
self._is_editing = False # Track editing state
|
||||
|
||||
# Set variable name
|
||||
self.name_entry.set_text(variable_name)
|
||||
|
||||
# Connect focus events for inline editing
|
||||
focus_controller = Gtk.EventControllerFocus()
|
||||
focus_controller.connect('enter', self._on_name_entry_focus_in)
|
||||
focus_controller.connect('leave', self._on_name_entry_focus_out)
|
||||
self.name_entry.add_controller(focus_controller)
|
||||
|
||||
# Connect activate signal (Enter key)
|
||||
self.name_entry.connect('activate', self._on_name_entry_activate)
|
||||
|
||||
# Set initial sensitivity state
|
||||
is_sensitive = variable_name in self.project.sensitive_variables
|
||||
self._updating_toggle = True
|
||||
@ -130,11 +144,46 @@ class VariableDataRow(Gtk.Box):
|
||||
)
|
||||
self.emit('value-changed', env_id, value)
|
||||
|
||||
def _on_name_entry_focus_in(self, controller):
|
||||
"""Show edit buttons when entry gains focus."""
|
||||
self._is_editing = True
|
||||
self.original_name = self.name_entry.get_text().strip()
|
||||
self.edit_buttons_revealer.set_reveal_child(True)
|
||||
|
||||
def _on_name_entry_focus_out(self, controller):
|
||||
"""Handle focus leaving the entry without explicit save/cancel."""
|
||||
# Only auto-hide if user didn't click cancel/save
|
||||
# The buttons will handle hiding themselves
|
||||
pass
|
||||
|
||||
def _on_name_entry_activate(self, entry):
|
||||
"""Handle Enter key press - same as clicking Save."""
|
||||
self._save_changes()
|
||||
|
||||
@Gtk.Template.Callback()
|
||||
def on_name_changed(self, entry):
|
||||
"""Handle variable name changes."""
|
||||
def on_cancel_clicked(self, button):
|
||||
"""Cancel editing and restore original name."""
|
||||
self.name_entry.set_text(self.original_name)
|
||||
self._is_editing = False
|
||||
self.edit_buttons_revealer.set_reveal_child(False)
|
||||
|
||||
@Gtk.Template.Callback()
|
||||
def on_save_clicked(self, button):
|
||||
"""Save variable name changes."""
|
||||
self._save_changes()
|
||||
|
||||
def _save_changes(self):
|
||||
"""Save the variable name change."""
|
||||
new_name = self.name_entry.get_text().strip()
|
||||
|
||||
# Only emit if name actually changed
|
||||
if new_name != self.original_name:
|
||||
self.emit('variable-changed')
|
||||
|
||||
self._is_editing = False
|
||||
self.edit_buttons_revealer.set_reveal_child(False)
|
||||
self.original_name = new_name
|
||||
|
||||
@Gtk.Template.Callback()
|
||||
def on_delete_clicked(self, button):
|
||||
"""Handle delete button click."""
|
||||
@ -159,7 +208,7 @@ class VariableDataRow(Gtk.Box):
|
||||
self.sensitive_toggle.set_tooltip_text("Sensitive (stored in keyring)\nClick to make non-sensitive")
|
||||
self.name_entry.add_css_class("sensitive-variable-name")
|
||||
else:
|
||||
self.sensitive_toggle.set_icon_name("channel-insecure-symbolic")
|
||||
self.sensitive_toggle.set_icon_name("changes-allow-symbolic")
|
||||
self.sensitive_toggle.set_tooltip_text("Not sensitive (stored in JSON)\nClick to mark as sensitive")
|
||||
self.name_entry.remove_css_class("sensitive-variable-name")
|
||||
|
||||
@ -172,6 +221,9 @@ class VariableDataRow(Gtk.Box):
|
||||
self.environments = environments
|
||||
self.project = project
|
||||
|
||||
# Update original_name in case variable was renamed
|
||||
self.original_name = self.variable_name
|
||||
|
||||
# Update sensitivity toggle state
|
||||
is_sensitive = self.variable_name in self.project.sensitive_variables
|
||||
self._updating_toggle = True
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user