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">
|
<object class="GtkEntry" id="name_entry">
|
||||||
<property name="placeholder-text">Variable name</property>
|
<property name="placeholder-text">Variable name</property>
|
||||||
<property name="hexpand">True</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>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkToggleButton" id="sensitive_toggle">
|
<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>
|
<property name="tooltip-text">Mark as sensitive (store in keyring)</property>
|
||||||
<signal name="toggled" handler="on_sensitive_toggled"/>
|
<signal name="toggled" handler="on_sensitive_toggled"/>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@ -30,6 +30,9 @@ class VariableDataRow(Gtk.Box):
|
|||||||
|
|
||||||
variable_cell = Gtk.Template.Child()
|
variable_cell = Gtk.Template.Child()
|
||||||
name_entry = 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()
|
sensitive_toggle = Gtk.Template.Child()
|
||||||
delete_button = Gtk.Template.Child()
|
delete_button = Gtk.Template.Child()
|
||||||
values_box = 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):
|
def __init__(self, variable_name, environments, size_group, project, project_manager, update_timestamp=None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.variable_name = variable_name
|
self.variable_name = variable_name
|
||||||
|
self.original_name = variable_name # Store original name for cancel
|
||||||
self.environments = environments
|
self.environments = environments
|
||||||
self.size_group = size_group
|
self.size_group = size_group
|
||||||
self.project = project
|
self.project = project
|
||||||
@ -51,10 +55,20 @@ class VariableDataRow(Gtk.Box):
|
|||||||
self.value_entries = {}
|
self.value_entries = {}
|
||||||
self.update_timeout_id = None
|
self.update_timeout_id = None
|
||||||
self._updating_toggle = False # Flag to prevent recursion
|
self._updating_toggle = False # Flag to prevent recursion
|
||||||
|
self._is_editing = False # Track editing state
|
||||||
|
|
||||||
# Set variable name
|
# Set variable name
|
||||||
self.name_entry.set_text(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
|
# Set initial sensitivity state
|
||||||
is_sensitive = variable_name in self.project.sensitive_variables
|
is_sensitive = variable_name in self.project.sensitive_variables
|
||||||
self._updating_toggle = True
|
self._updating_toggle = True
|
||||||
@ -130,10 +144,45 @@ class VariableDataRow(Gtk.Box):
|
|||||||
)
|
)
|
||||||
self.emit('value-changed', env_id, value)
|
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()
|
@Gtk.Template.Callback()
|
||||||
def on_name_changed(self, entry):
|
def on_cancel_clicked(self, button):
|
||||||
"""Handle variable name changes."""
|
"""Cancel editing and restore original name."""
|
||||||
self.emit('variable-changed')
|
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()
|
@Gtk.Template.Callback()
|
||||||
def on_delete_clicked(self, button):
|
def on_delete_clicked(self, button):
|
||||||
@ -159,7 +208,7 @@ class VariableDataRow(Gtk.Box):
|
|||||||
self.sensitive_toggle.set_tooltip_text("Sensitive (stored in keyring)\nClick to make non-sensitive")
|
self.sensitive_toggle.set_tooltip_text("Sensitive (stored in keyring)\nClick to make non-sensitive")
|
||||||
self.name_entry.add_css_class("sensitive-variable-name")
|
self.name_entry.add_css_class("sensitive-variable-name")
|
||||||
else:
|
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.sensitive_toggle.set_tooltip_text("Not sensitive (stored in JSON)\nClick to mark as sensitive")
|
||||||
self.name_entry.remove_css_class("sensitive-variable-name")
|
self.name_entry.remove_css_class("sensitive-variable-name")
|
||||||
|
|
||||||
@ -172,6 +221,9 @@ class VariableDataRow(Gtk.Box):
|
|||||||
self.environments = environments
|
self.environments = environments
|
||||||
self.project = project
|
self.project = project
|
||||||
|
|
||||||
|
# Update original_name in case variable was renamed
|
||||||
|
self.original_name = self.variable_name
|
||||||
|
|
||||||
# Update sensitivity toggle state
|
# Update sensitivity toggle state
|
||||||
is_sensitive = self.variable_name in self.project.sensitive_variables
|
is_sensitive = self.variable_name in self.project.sensitive_variables
|
||||||
self._updating_toggle = True
|
self._updating_toggle = True
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user