wip better word wrap ux
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
[ai]
|
[ai]
|
||||||
provider = "gemini"
|
provider = "gemini"
|
||||||
model = "gemini-2.5-pro"
|
model = "gemini-3-flash-preview"
|
||||||
system_prompt = "DO NOT EVER make a shell script unless told to. DO NOT EVER make a readme or a file describing your changes unless your are told to. If you have commands I should be entering into the command line or if you have something to explain to me, please just use code blocks or normal text output. DO NOT DO ANYTHING OTHER THAN WHAT YOU WERE TOLD TODO. DO NOT EVER, EVER DO ANYTHING OTHER THAN WHAT YOU WERE TOLD TO DO. IF YOU WANT TO DO OTHER THINGS, SIMPLY SUGGEST THEM, AND THEN I WILL REVIEW YOUR CHANGES, AND MAKE THE DECISION ON HOW TO PROCEED. WHEN WRITING SCRIPTS USE A 120-160 character limit per line. I don't want to see scrunched code.\n"
|
system_prompt = "DO NOT EVER make a shell script unless told to. DO NOT EVER make a readme or a file describing your changes unless your are told to. If you have commands I should be entering into the command line or if you have something to explain to me, please just use code blocks or normal text output. DO NOT DO ANYTHING OTHER THAN WHAT YOU WERE TOLD TODO. DO NOT EVER, EVER DO ANYTHING OTHER THAN WHAT YOU WERE TOLD TO DO. IF YOU WANT TO DO OTHER THINGS, SIMPLY SUGGEST THEM, AND THEN I WILL REVIEW YOUR CHANGES, AND MAKE THE DECISION ON HOW TO PROCEED. WHEN WRITING SCRIPTS USE A 120-160 character limit per line. I don't want to see scrunched code.\n"
|
||||||
|
|
||||||
[theme]
|
[theme]
|
||||||
|
|||||||
39
gui.py
39
gui.py
@@ -67,9 +67,9 @@ _SUBHDR_COLOR = (220, 200, 120) # sub-section header
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _show_text_viewer(title: str, text: str, app_instance=None):
|
def _show_text_viewer(title: str, text: str):
|
||||||
if dpg.does_item_exist("win_text_viewer"):
|
if dpg.does_item_exist("win_text_viewer"):
|
||||||
wrap = app_instance.project.get("project", {}).get("word_wrap", False) if app_instance else False
|
wrap = dpg.get_value("project_word_wrap") if dpg.does_item_exist("project_word_wrap") else False
|
||||||
dpg.configure_item("win_text_viewer", label=f"Text Viewer - {title}", show=True)
|
dpg.configure_item("win_text_viewer", label=f"Text Viewer - {title}", show=True)
|
||||||
if dpg.does_item_exist("text_viewer_content"):
|
if dpg.does_item_exist("text_viewer_content"):
|
||||||
dpg.set_value("text_viewer_content", text if text is not None else "")
|
dpg.set_value("text_viewer_content", text if text is not None else "")
|
||||||
@@ -86,7 +86,7 @@ def _add_text_field(parent: str, label: str, value: str):
|
|||||||
with dpg.group(horizontal=False, parent=parent):
|
with dpg.group(horizontal=False, parent=parent):
|
||||||
with dpg.group(horizontal=True):
|
with dpg.group(horizontal=True):
|
||||||
dpg.add_text(f"{label}:", color=_LABEL_COLOR)
|
dpg.add_text(f"{label}:", color=_LABEL_COLOR)
|
||||||
dpg.add_button(label="[+]", callback=lambda s, a, u: _show_text_viewer(label, u, app_instance=self), user_data=value)
|
dpg.add_button(label="[+]", callback=lambda s, a, u: _show_text_viewer(label, u), user_data=value)
|
||||||
if len(value) > COMMS_CLAMP_CHARS:
|
if len(value) > COMMS_CLAMP_CHARS:
|
||||||
if wrap:
|
if wrap:
|
||||||
with dpg.child_window(height=80, border=True):
|
with dpg.child_window(height=80, border=True):
|
||||||
@@ -294,7 +294,7 @@ class ConfirmDialog:
|
|||||||
dpg.add_button(
|
dpg.add_button(
|
||||||
label="[+ Maximize]",
|
label="[+ Maximize]",
|
||||||
user_data=f"{self._tag}_script",
|
user_data=f"{self._tag}_script",
|
||||||
callback=lambda s, a, u: _show_text_viewer("Confirm Script", dpg.get_value(u, app_instance=self))
|
callback=lambda s, a, u: _show_text_viewer("Confirm Script", dpg.get_value(u))
|
||||||
)
|
)
|
||||||
dpg.add_input_text(
|
dpg.add_input_text(
|
||||||
tag=f"{self._tag}_script",
|
tag=f"{self._tag}_script",
|
||||||
@@ -745,12 +745,12 @@ class App:
|
|||||||
dpg.add_button(
|
dpg.add_button(
|
||||||
label="[+ Script]",
|
label="[+ Script]",
|
||||||
user_data=script,
|
user_data=script,
|
||||||
callback=lambda s, a, u: _show_text_viewer(f"Call Script", u, app_instance=self)
|
callback=lambda s, a, u: _show_text_viewer("Call Script", u)
|
||||||
)
|
)
|
||||||
dpg.add_button(
|
dpg.add_button(
|
||||||
label="[+ Output]",
|
label="[+ Output]",
|
||||||
user_data=result,
|
user_data=result,
|
||||||
callback=lambda s, a, u: _show_text_viewer(f"Call Output", u, app_instance=self)
|
callback=lambda s, a, u: _show_text_viewer("Call Output", u)
|
||||||
)
|
)
|
||||||
if wrap:
|
if wrap:
|
||||||
with dpg.child_window(height=72, border=True):
|
with dpg.child_window(height=72, border=True):
|
||||||
@@ -988,7 +988,7 @@ class App:
|
|||||||
|
|
||||||
# ---------------------------------------------------------------- callbacks
|
# ---------------------------------------------------------------- callbacks
|
||||||
|
|
||||||
def cb_word_wrap_toggled(self, sender=None, app_data=None):
|
def cb_word_wrap_toggled(self, sender=None, app_data=None):
|
||||||
# This function is now also called by _refresh_project_widgets to set initial state
|
# This function is now also called by _refresh_project_widgets to set initial state
|
||||||
if app_data is None:
|
if app_data is None:
|
||||||
wrap = dpg.get_value("project_word_wrap") if dpg.does_item_exist("project_word_wrap") else False
|
wrap = dpg.get_value("project_word_wrap") if dpg.does_item_exist("project_word_wrap") else False
|
||||||
@@ -1352,9 +1352,6 @@ class App:
|
|||||||
dpg.delete_item("disc_scroll", children_only=True)
|
dpg.delete_item("disc_scroll", children_only=True)
|
||||||
for i, entry in enumerate(self.disc_entries):
|
for i, entry in enumerate(self.disc_entries):
|
||||||
collapsed = entry.get("collapsed", False)
|
collapsed = entry.get("collapsed", False)
|
||||||
preview = entry["content"].replace("\n", " ")[:60]
|
|
||||||
if len(entry["content"]) > 60:
|
|
||||||
preview += "..."
|
|
||||||
ts_str = entry.get("ts", "")
|
ts_str = entry.get("ts", "")
|
||||||
|
|
||||||
with dpg.group(parent="disc_scroll"):
|
with dpg.group(parent="disc_scroll"):
|
||||||
@@ -1382,21 +1379,20 @@ class App:
|
|||||||
)
|
)
|
||||||
dpg.add_button(
|
dpg.add_button(
|
||||||
label="[+ Max]",
|
label="[+ Max]",
|
||||||
user_data=f"disc_content_{{i}}",
|
user_data=f"disc_content_{i}",
|
||||||
callback=lambda s, a, u, idx=i: _show_text_viewer(f"Entry #{{idx+1}}", dpg.get_value(u, app_instance=self) if dpg.does_item_exist(u) else "", app_instance=self)
|
callback=lambda s, a, u, idx=i: _show_text_viewer(f"Entry #{idx+1}", dpg.get_value(u) if dpg.does_item_exist(u) else "")
|
||||||
)
|
|
||||||
dpg.add_button(
|
|
||||||
label="Del",
|
|
||||||
width=36,
|
|
||||||
callback=self._make_disc_insert_cb(i),
|
|
||||||
)
|
)
|
||||||
dpg.add_button(
|
dpg.add_button(
|
||||||
label="Del",
|
label="Del",
|
||||||
width=36,
|
width=36,
|
||||||
callback=self._make_disc_remove_cb(i),
|
callback=self._make_disc_remove_cb(i),
|
||||||
)
|
)
|
||||||
dpg.add_text(preview, color=(160, 160, 150))
|
|
||||||
else:
|
if collapsed:
|
||||||
|
with dpg.group(horizontal=True):
|
||||||
|
dpg.add_spacer(width=28) # Indent text past the expand/collapse button
|
||||||
|
dpg.add_text(entry["content"], wrap=0, color=(200, 200, 200))
|
||||||
|
|
||||||
with dpg.group(tag=f"disc_body_{i}", show=not collapsed):
|
with dpg.group(tag=f"disc_body_{i}", show=not collapsed):
|
||||||
dpg.add_input_text(
|
dpg.add_input_text(
|
||||||
tag=f"disc_content_{i}",
|
tag=f"disc_content_{i}",
|
||||||
@@ -1850,7 +1846,7 @@ class App:
|
|||||||
dpg.add_button(
|
dpg.add_button(
|
||||||
label="[+ Maximize]",
|
label="[+ Maximize]",
|
||||||
user_data="last_script_text",
|
user_data="last_script_text",
|
||||||
callback=lambda s, a, u: _show_text_viewer("Last Script", dpg.get_value(u, app_instance=self))
|
callback=lambda s, a, u: _show_text_viewer("Last Script", dpg.get_value(u))
|
||||||
)
|
)
|
||||||
dpg.add_input_text(
|
dpg.add_input_text(
|
||||||
tag="last_script_text",
|
tag="last_script_text",
|
||||||
@@ -1867,7 +1863,7 @@ class App:
|
|||||||
dpg.add_button(
|
dpg.add_button(
|
||||||
label="[+ Maximize]",
|
label="[+ Maximize]",
|
||||||
user_data="last_script_output",
|
user_data="last_script_output",
|
||||||
callback=lambda s, a, u: _show_text_viewer("Last Output", dpg.get_value(u, app_instance=self))
|
callback=lambda s, a, u: _show_text_viewer("Last Output", dpg.get_value(u))
|
||||||
)
|
)
|
||||||
dpg.add_input_text(
|
dpg.add_input_text(
|
||||||
tag="last_script_output",
|
tag="last_script_output",
|
||||||
@@ -2051,4 +2047,3 @@ def main():
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ name = "manual_slop"
|
|||||||
git_dir = "C:/projects/manual_slop"
|
git_dir = "C:/projects/manual_slop"
|
||||||
system_prompt = "Make sure to update MainContext.md every time.\nMake destructive modifications to the project, ITS OK, I HAVE GIT HISTORY TO MANAGE THE PROJECTS."
|
system_prompt = "Make sure to update MainContext.md every time.\nMake destructive modifications to the project, ITS OK, I HAVE GIT HISTORY TO MANAGE THE PROJECTS."
|
||||||
main_context = "C:/projects/manual_slop/MainContext.md"
|
main_context = "C:/projects/manual_slop/MainContext.md"
|
||||||
|
word_wrap = true
|
||||||
|
|
||||||
[output]
|
[output]
|
||||||
namespace = "manual_slop"
|
namespace = "manual_slop"
|
||||||
@@ -112,7 +113,7 @@ history = [
|
|||||||
|
|
||||||
[discussion.discussions."Misc UX improvements"]
|
[discussion.discussions."Misc UX improvements"]
|
||||||
git_commit = "5f9b270841fa1b3e34af1c56cbc75041c95b265a"
|
git_commit = "5f9b270841fa1b3e34af1c56cbc75041c95b265a"
|
||||||
last_updated = "2026-02-21T23:38:30"
|
last_updated = "2026-02-21T23:46:45"
|
||||||
history = [
|
history = [
|
||||||
"@2026-02-21T23:03:51\nUser:\nMake the namespace for the generated markdown file the projet name instead of that specific namespace in the config panel.\nThe ouptut dir can be in the project panel spec (that way we can just remove config panel entirely).",
|
"@2026-02-21T23:03:51\nUser:\nMake the namespace for the generated markdown file the projet name instead of that specific namespace in the config panel.\nThe ouptut dir can be in the project panel spec (that way we can just remove config panel entirely).",
|
||||||
"@2026-02-21T23:04:55\nAI:\nI have applied the changes to streamline the project settings and remove the old Config panel completely:\n\n1. **GUI Layout Changes (`gui.py`)**:\n - The `Config` panel has been completely removed.\n - The **Output Dir** field has been moved into the **Projects** panel (right above the Project Files list).\n - The **Auto-add history** checkbox has been moved to the top of the **Discussion History** panel (directly under the entry toolbar buttons).\n - The **Files** panel was shifted upward to reclaim the space left behind by the old Config panel.\n\n2. **Namespace Management (`aggregate.py` & `project_manager.py`)**:\n - The explicitly defined `namespace` field is gone.\n - Instead, `aggregate.py` now directly infers the output markdown file namespace from the active project's `name` property. (e.g., saving under the `manual_slop` project will just prefix the markdown with `manual_slop_001.md`).\n - `project_manager.py` was updated to no longer scaffold out `namespace` strings into new `.toml` files, and `flat_config` now injects the core `project` dictionary segment so the generators can access the internal name.\n\n3. **`MainContext.md` Updated**:\n - I have updated the markdown file with the latest layout structures and explained that `namespace` is no longer a configurable setting but dynamically determined by the project profile.\n\nYou'll need to restart the application for the GUI layout and DearPyGUI state changes to take effect! Let me know how it looks.",
|
"@2026-02-21T23:04:55\nAI:\nI have applied the changes to streamline the project settings and remove the old Config panel completely:\n\n1. **GUI Layout Changes (`gui.py`)**:\n - The `Config` panel has been completely removed.\n - The **Output Dir** field has been moved into the **Projects** panel (right above the Project Files list).\n - The **Auto-add history** checkbox has been moved to the top of the **Discussion History** panel (directly under the entry toolbar buttons).\n - The **Files** panel was shifted upward to reclaim the space left behind by the old Config panel.\n\n2. **Namespace Management (`aggregate.py` & `project_manager.py`)**:\n - The explicitly defined `namespace` field is gone.\n - Instead, `aggregate.py` now directly infers the output markdown file namespace from the active project's `name` property. (e.g., saving under the `manual_slop` project will just prefix the markdown with `manual_slop_001.md`).\n - `project_manager.py` was updated to no longer scaffold out `namespace` strings into new `.toml` files, and `flat_config` now injects the core `project` dictionary segment so the generators can access the internal name.\n\n3. **`MainContext.md` Updated**:\n - I have updated the markdown file with the latest layout structures and explained that `namespace` is no longer a configurable setting but dynamically determined by the project profile.\n\nYou'll need to restart the application for the GUI layout and DearPyGUI state changes to take effect! Let me know how it looks.",
|
||||||
|
|||||||
Reference in New Issue
Block a user