From 308070e88541f64ad9b393a9bc022c0ad66aad20 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sat, 21 Feb 2026 15:28:03 -0500 Subject: [PATCH] layout persistence --- MainContext.md | 15 ++++++++-- config.toml | 10 +++++-- dpg_layout.ini | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ gui.py | 3 +- 4 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 dpg_layout.ini diff --git a/MainContext.md b/MainContext.md index 770a63f..8a5c340 100644 --- a/MainContext.md +++ b/MainContext.md @@ -1,4 +1,6 @@ -**manual_slop** is a local GUI tool for manually curating and sending context to AI APIs. It aggregates files, screenshots, and discussion history into a structured markdown file and sends it to a chosen AI provider with a user-written message. The AI can also execute PowerShell scripts within the project directory, with user confirmation required before each execution. +Make sure to update this file every time. + +**manual_slop** is a local GUI tool for manually curating and sending context to AI APIs. It aggregates files, screenshots, and discussion history into a structured markdown file and sends it to a chosen AI provider with a user-written message. The AI can also execute PowerShell scripts within the project directory, with user confirmation required before each execution. **Stack:** - `dearpygui` - GUI with docking/floating/resizable panels @@ -8,12 +10,13 @@ - `uv` - package/env management **Files:** -- `gui.py` - main GUI, `App` class, all panels, all callbacks, confirmation dialog +- `gui.py` - main GUI, `App` class, all panels, all callbacks, confirmation dialog, layout persistence - `ai_client.py` - unified provider wrapper, model listing, session management, send, tool/function-call loop - `aggregate.py` - reads config, collects files/screenshots/discussion, writes numbered `.md` files to `output_dir` - `shell_runner.py` - subprocess wrapper that runs PowerShell scripts sandboxed to `base_dir`, returns stdout/stderr/exit code as a string - `config.toml` - namespace, output_dir, files paths+base_dir, screenshots paths+base_dir, discussion history array, ai provider+model - `credentials.toml` - gemini api_key, anthropic api_key +- `dpg_layout.ini` - Dear PyGui window layout file (auto-saved on exit, auto-loaded on startup); gitignore this per-user **GUI Panels:** - **Config** - namespace, output dir, save @@ -25,6 +28,13 @@ - **Response** - readonly multiline displaying last AI response - **Tool Calls** - scrollable log of every PowerShell tool call the AI made, showing script and result; Clear button +**Layout persistence:** +- `dpg.configure_app(..., init_file="dpg_layout.ini")` loads the ini at startup if it exists; DPG silently ignores a missing file +- `dpg.save_init_file("dpg_layout.ini")` is called immediately before `dpg.destroy_context()` on clean exit +- The ini records window positions, sizes, and dock node assignments in DPG's native format +- First run (no ini) uses the hardcoded `pos=` defaults in `_build_ui()`; after that the ini takes over +- Delete `dpg_layout.ini` to reset to defaults + **AI Tool Use (PowerShell):** - Both Gemini and Anthropic are configured with a `run_powershell` tool/function declaration - When the AI wants to edit or create files it emits a tool call with a `script` string @@ -62,4 +72,3 @@ - System prompt support could be added as a field in `config.toml` and passed in `ai_client.send()` - Discussion history excerpts could be individually toggleable for inclusion in the generated md - `MAX_TOOL_ROUNDS` in `ai_client.py` caps agentic loops at 5 rounds; adjustable - diff --git a/config.toml b/config.toml index 70c151a..6c80f3c 100644 --- a/config.toml +++ b/config.toml @@ -17,10 +17,16 @@ paths = [ [screenshots] base_dir = "C:/Users/Ed/scoop/apps/sharex/current/ShareX/Screenshots/2026-02" -paths = [] +paths = [ + "C:/Users/Ed/scoop/apps/sharex/current/ShareX/Screenshots/2026-02/python_2026-02-21_15-24-31.png", +] [discussion] -history = [] +history = [ + "Update the MainContext.md with latest state of codebase. Add support for preserving layout in imgui.", + "[NO response from claude-sonnet-4-6]", + "No code changed but you ran several scripts, whats going on...", +] [ai] provider = "anthropic" diff --git a/dpg_layout.ini b/dpg_layout.ini new file mode 100644 index 0000000..7158502 --- /dev/null +++ b/dpg_layout.ini @@ -0,0 +1,75 @@ +[Window][WindowOverViewport_11111111] +Pos=0,0 +Size=3840,2137 +Collapsed=0 + +[Window][Debug##Default] +Pos=60,60 +Size=400,400 +Collapsed=0 + +[Window][###22] +Pos=0,0 +Size=376,652 +Collapsed=0 +DockId=0x00000005,0 + +[Window][###30] +Pos=0,654 +Size=376,835 +Collapsed=0 +DockId=0x00000009,0 + +[Window][###66] +Pos=0,1491 +Size=376,646 +Collapsed=0 +DockId=0x0000000A,0 + +[Window][###79] +Pos=1209,0 +Size=968,2137 +Collapsed=0 +DockId=0x0000000B,0 + +[Window][###96] +Pos=2179,0 +Size=1661,630 +Collapsed=0 +DockId=0x0000000D,0 + +[Window][###105] +Pos=378,494 +Size=829,1643 +Collapsed=0 +DockId=0x00000008,0 + +[Window][###103] +Pos=2179,632 +Size=1661,1505 +Collapsed=0 +DockId=0x0000000E,0 + +[Window][###86] +Pos=378,0 +Size=829,492 +Collapsed=0 +DockId=0x00000007,0 + +[Docking][Data] +DockSpace ID=0x7C6B3D9B Window=0xA87D555D Pos=0,0 Size=3840,2137 Split=X Selected=0x40484D8F + DockNode ID=0x00000003 Parent=0x7C6B3D9B SizeRef=376,1161 Split=Y Selected=0xEE087978 + DockNode ID=0x00000005 Parent=0x00000003 SizeRef=235,354 Selected=0xEE087978 + DockNode ID=0x00000006 Parent=0x00000003 SizeRef=235,805 Split=Y Selected=0x5F94F9BD + DockNode ID=0x00000009 Parent=0x00000006 SizeRef=235,453 Selected=0x5F94F9BD + DockNode ID=0x0000000A Parent=0x00000006 SizeRef=235,350 Selected=0x80199DAE + DockNode ID=0x00000004 Parent=0x7C6B3D9B SizeRef=1286,1161 Split=X + DockNode ID=0x00000001 Parent=0x00000004 SizeRef=829,1161 Split=Y Selected=0x40484D8F + DockNode ID=0x00000007 Parent=0x00000001 SizeRef=595,492 Selected=0xBA13FCDE + DockNode ID=0x00000008 Parent=0x00000001 SizeRef=595,1643 CentralNode=1 Selected=0x40484D8F + DockNode ID=0x00000002 Parent=0x00000004 SizeRef=2631,1161 Split=X Selected=0x714F2F7B + DockNode ID=0x0000000B Parent=0x00000002 SizeRef=968,1161 Selected=0xC915D9DA + DockNode ID=0x0000000C Parent=0x00000002 SizeRef=1661,1161 Split=Y Selected=0x714F2F7B + DockNode ID=0x0000000D Parent=0x0000000C SizeRef=396,342 Selected=0x714F2F7B + DockNode ID=0x0000000E Parent=0x0000000C SizeRef=396,817 Selected=0xCF08B82F + diff --git a/gui.py b/gui.py index 4a9f0b0..e2cf178 100644 --- a/gui.py +++ b/gui.py @@ -598,7 +598,7 @@ class App: def run(self): dpg.create_context() - dpg.configure_app(docking=True, docking_space=True) + dpg.configure_app(docking=True, docking_space=True, init_file="dpg_layout.ini") dpg.create_viewport(title="manual slop", width=1680, height=1200) dpg.setup_dearpygui() dpg.show_viewport() @@ -616,6 +616,7 @@ class App: dpg.render_dearpygui_frame() + dpg.save_init_file("dpg_layout.ini") dpg.destroy_context()