@@ -38,7 +38,8 @@ class FormConfig(Gtk.Box):
3838 open_csv_btn : Gtk .Button = Gtk .Template .Child ()
3939 create_form_btn : Gtk .Button = Gtk .Template .Child ()
4040 new_csv_btn : Gtk .Button = Gtk .Template .Child ()
41- build_form_btn : Gtk .Button = Gtk .Template .Child () # NEW
41+ build_form_btn : Gtk .Button = Gtk .Template .Child ()
42+ edit_in_builder_btn : Gtk .Button = Gtk .Template .Child ()
4243
4344 def __init__ (self , ** kwargs ):
4445 super ().__init__ (** kwargs )
@@ -52,6 +53,7 @@ def __init__(self, **kwargs):
5253 self .open_csv_btn .connect ("clicked" , self ._open_csv )
5354 self .new_csv_btn .connect ("clicked" , self ._create_new_csv )
5455 self .build_form_btn .connect ("clicked" , self ._open_builder )
56+ self .edit_in_builder_btn .connect ("clicked" , self ._edit_in_builder )
5557
5658 def set_page (self , page ):
5759 """
@@ -108,6 +110,7 @@ def _on_json_selected(self, dialog, result):
108110 self .page .config_file = file
109111 self .page .form_config = self ._load_config (file )
110112 self .open_form_config_btn .set_label (file .get_basename ())
113+ self .edit_in_builder_btn .set_sensitive (True )
111114 self ._try_form_open ()
112115 except GLib .Error :
113116 pass # cancelled
@@ -150,11 +153,61 @@ def _open_form_window(self, _button, __):
150153 form_page .set_page (self .page )
151154 self .page .append (form_page )
152155
156+ def preselect_config (self , file : Gio .File ):
157+ """
158+ Called by BuilderPage after saving to pre-fill the JSON config
159+ field, so the user only needs to pick a CSV and click Open Form.
160+ Mirrors what _on_json_selected does but without the file dialog.
161+ """
162+ self .page .config_file = file
163+ self .page .form_config = self ._load_config (file )
164+ self .open_form_config_btn .set_label (file .get_basename ())
165+ self .edit_in_builder_btn .set_sensitive (True )
166+ self ._try_form_open ()
167+
153168 def _open_builder (self , * _ ):
154- self .page .tab_page .set_title ("✏ New Form" )
169+ self .page .tab_page .set_title ("New Form" )
170+
171+ self .page .remove (self )
172+
173+ builder = BuilderPage ()
174+ builder .set_page (self .page )
175+ self .page .append (builder )
176+
177+ def _edit_in_builder (self , * _ ):
178+ """
179+ Open the already-selected JSON config in the builder for editing.
180+ Parses it into a FormModel, populates the BuilderPage, then swaps
181+ in the builder exactly like _open_builder does.
182+ On save the user can overwrite the original file or choose a new path.
183+ """
184+ from .form_model import FormModel
185+
186+ config_file = self .page .config_file
187+ if not config_file :
188+ return
189+
190+ path = config_file .get_path ()
191+ if not path :
192+ return
193+
194+ try :
195+ model = FormModel .from_file (path )
196+ except Exception as e :
197+ # Malformed JSON — surface the error via the existing toast pattern
198+ # by falling back gracefully; the file was already validated by
199+ # _load_config so this should only happen on disk race conditions.
200+ print (f"Could not parse config for editing: { e } " )
201+ return
202+
203+ self .page .tab_page .set_title (f"✏ { model .form_name or config_file .get_basename ()} " )
155204
156205 self .page .remove (self )
157206
158207 builder = BuilderPage ()
159208 builder .set_page (self .page )
209+ builder .load_from_model (model )
210+ # Pre-set the save dialog's suggested path to the original file
211+ # so the user can hit Save and overwrite in one click.
212+ builder .set_save_path (path )
160213 self .page .append (builder )
0 commit comments