Compare commits

..

3 Commits

4 changed files with 109 additions and 24 deletions

View File

@ -1,5 +1,5 @@
project('roster',
version: '0.6.0',
version: '0.6.1',
meson_version: '>= 1.0.0',
default_options: [ 'warning_level=2', 'werror=false', ],
)

View File

@ -5,7 +5,7 @@
<template class="EnvironmentsDialog" parent="AdwDialog">
<property name="title">Manage Environments</property>
<property name="content-width">900</property>
<property name="content-width">1100</property>
<property name="content-height">600</property>
<property name="follows-content-size">false</property>

View File

@ -19,13 +19,48 @@
<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>
</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>
@ -44,8 +79,6 @@
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="values_box">

View File

@ -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