Skip to content

Commit 40cacd8

Browse files
authored
Merge pull request #58 from rmusser01/refactor
Refactor app.py
2 parents 4c6d872 + 5315590 commit 40cacd8

17 files changed

+362
-921
lines changed

Docs/FAQs.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ Refer to the official [Windows Terminal Interaction Settings Documentation](http
8282

8383

8484

85+
### MLX on Mac
86+
https://github.com/google/sentencepiece/issues/1083
87+
8588

8689
### Samplers
8790
https://rentry.org/samplers

tldw_chatbook/Event_Handlers/Chat_Events/chat_events.py

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
from textual.containers import VerticalScroll
1919
from textual.css.query import QueryError
2020

21+
from tldw_chatbook.Event_Handlers.Chat_Events.chat_events_sidebar import (
22+
handle_chat_media_load_selected_button_pressed, handle_chat_media_copy_title_button_pressed,
23+
handle_chat_media_copy_content_button_pressed, handle_chat_media_copy_author_button_pressed,
24+
handle_chat_media_copy_url_button_pressed)
2125
from tldw_chatbook.Utils.Utils import safe_float, safe_int
2226
#
2327
# Local Imports
@@ -41,9 +45,10 @@
4145
#
4246
# Functions:
4347

44-
async def handle_chat_tab_sidebar_toggle(app: 'TldwCli', button_id: str) -> None:
48+
async def handle_chat_tab_sidebar_toggle(app: 'TldwCli', event: Button.Pressed) -> None:
4549
"""Handles sidebar toggles specific to the Chat tab."""
4650
logger = getattr(app, 'loguru_logger', logging)
51+
button_id = event.button.id
4752
if button_id == "toggle-chat-left-sidebar":
4853
app.chat_sidebar_collapsed = not app.chat_sidebar_collapsed
4954
logger.debug("Chat tab settings sidebar (left) now %s", "collapsed" if app.chat_sidebar_collapsed else "expanded")
@@ -53,8 +58,9 @@ async def handle_chat_tab_sidebar_toggle(app: 'TldwCli', button_id: str) -> None
5358
else:
5459
logger.warning(f"Unhandled sidebar toggle button ID '{button_id}' in Chat tab handler.")
5560

56-
async def handle_chat_send_button_pressed(app: 'TldwCli', prefix: str) -> None:
61+
async def handle_chat_send_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
5762
"""Handles the send button press for the main chat tab."""
63+
prefix = "chat" # This handler is specific to the main chat tab's send button
5864
loguru_logger.info(f"Send button pressed for '{prefix}' (main chat)") # Use loguru_logger consistently
5965

6066
# --- 1. Query UI Widgets ---
@@ -766,7 +772,7 @@ async def handle_chat_action_button_pressed(app: 'TldwCli', button: Button, acti
766772
description=f"Regenerating for {selected_provider_regen}")
767773

768774

769-
async def handle_chat_new_conversation_button_pressed(app: 'TldwCli') -> None:
775+
async def handle_chat_new_conversation_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
770776
loguru_logger.info("New Chat button pressed.")
771777
try:
772778
chat_log_widget = app.query_one("#chat-log", VerticalScroll)
@@ -808,7 +814,7 @@ async def handle_chat_new_conversation_button_pressed(app: 'TldwCli') -> None:
808814
loguru_logger.error(f"UI component not found during new chat setup: {e}")
809815

810816

811-
async def handle_chat_save_current_chat_button_pressed(app: 'TldwCli') -> None:
817+
async def handle_chat_save_current_chat_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
812818
loguru_logger.info("Save Current Chat button pressed.")
813819
if not (app.current_chat_is_ephemeral and app.current_chat_conversation_id is None):
814820
loguru_logger.warning("Chat not eligible for saving (not ephemeral or already has ID).")
@@ -905,7 +911,7 @@ async def handle_chat_save_current_chat_button_pressed(app: 'TldwCli') -> None:
905911
app.notify(f"Error saving chat: {str(e_save_chat)[:100]}", severity="error")
906912

907913

908-
async def handle_chat_save_details_button_pressed(app: 'TldwCli') -> None:
914+
async def handle_chat_save_details_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
909915
loguru_logger.info("Save conversation details button pressed.")
910916
if app.current_chat_is_ephemeral or not app.current_chat_conversation_id:
911917
loguru_logger.warning("Cannot save details for an ephemeral or non-existent chat.")
@@ -1009,7 +1015,7 @@ async def handle_chat_save_details_button_pressed(app: 'TldwCli') -> None:
10091015
app.notify("Unexpected error saving details.", severity="error", timeout=3)
10101016

10111017

1012-
async def handle_chat_load_selected_button_pressed(app: 'TldwCli') -> None:
1018+
async def handle_chat_load_selected_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
10131019
loguru_logger.info("Load selected chat button pressed.")
10141020
try:
10151021
results_list_view = app.query_one("#chat-conversation-search-results-list", ListView)
@@ -1048,7 +1054,7 @@ async def handle_chat_load_selected_button_pressed(app: 'TldwCli') -> None:
10481054
app.notify("Unexpected error loading chat.", severity="error")
10491055

10501056

1051-
async def perform_chat_conversation_search(app: 'TldwCli') -> None:
1057+
async def perform_chat_conversation_search(app: 'TldwCli', event: Button.Pressed) -> None:
10521058
loguru_logger.debug("Performing chat conversation search...")
10531059
try:
10541060
search_bar = app.query_one("#chat-conversation-search-bar", Input)
@@ -1294,7 +1300,7 @@ async def display_conversation_in_chat_tab_ui(app: 'TldwCli', conversation_id: s
12941300
loguru_logger.info(f"Displayed conversation '{conv_metadata.get('title', 'Untitled')}' (ID: {conversation_id}) in chat tab.")
12951301

12961302

1297-
async def load_branched_conversation_history_ui(app: 'TldwCli', target_conversation_id: str, chat_log_widget: VerticalScroll):
1303+
async def load_branched_conversation_history_ui(app: 'TldwCli', target_conversation_id: str, chat_log_widget: VerticalScroll) -> None:
12981304
"""
12991305
Loads the complete message history for a given conversation_id,
13001306
tracing back through parent branches to the root if necessary.
@@ -1605,7 +1611,7 @@ async def handle_chat_character_attribute_changed(app: 'TldwCli', event: Union[I
16051611
loguru_logger.warning(f"Attribute change event from unmapped control_id: {control_id}")
16061612

16071613

1608-
async def handle_chat_clear_active_character_button_pressed(app: 'TldwCli') -> None:
1614+
async def handle_chat_clear_active_character_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
16091615
"""Clears the currently active character data and resets related UI fields."""
16101616
loguru_logger.info("Clear Active Character button pressed.")
16111617

@@ -1732,7 +1738,7 @@ async def perform_chat_prompt_search(app: 'TldwCli') -> None:
17321738
logger.error(f"Chat Tab: Error performing prompt search via perform_chat_prompt_search: {e}", exc_info=True)
17331739

17341740

1735-
async def handle_chat_view_selected_prompt_button_pressed(app: 'TldwCli') -> None:
1741+
async def handle_chat_view_selected_prompt_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
17361742
logger = getattr(app, 'loguru_logger', logging)
17371743
logger.debug("Chat Tab: View Selected Prompt button pressed.")
17381744

@@ -1977,7 +1983,7 @@ async def handle_chat_sidebar_prompt_search_changed(
19771983
logger.info(f"[Prompts] Search '{search_term}' → {len(prompts)} results.")
19781984

19791985

1980-
async def handle_continue_response_button_pressed(app: 'TldwCli', button: Button, message_widget: ChatMessage) -> None:
1986+
async def handle_continue_response_button_pressed(app: 'TldwCli', event: Button.Pressed, message_widget: ChatMessage) -> None:
19811987
"""Handles the 'Continue Response' button press on an AI chat message."""
19821988
loguru_logger.info(f"Continue Response button pressed for message_id: {message_widget.message_id_internal}, current text: '{message_widget.message_text[:50]}...'")
19831989
db = app.chachanotes_db
@@ -1989,9 +1995,8 @@ async def handle_continue_response_button_pressed(app: 'TldwCli', button: Button
19891995
original_display_text_obj: Optional[Union[str, Text]] = None # renderable can be str or Text
19901996

19911997
try:
1992-
# Ensure we are targeting the correct button on the specific message_widget instance
1993-
# The 'button' argument is the button that was pressed.
1994-
continue_button_widget = button # This IS the button that was pressed.
1998+
button = event.button
1999+
continue_button_widget = button
19952000
original_button_label = continue_button_widget.label
19962001
continue_button_widget.disabled = True
19972002
continue_button_widget.label = get_char(EMOJI_THINKING, FALLBACK_THINKING) # "⏳" or similar
@@ -2307,7 +2312,7 @@ async def handle_continue_response_button_pressed(app: 'TldwCli', button: Button
23072312
loguru_logger.info(f"Continuation process completed for message_id: {message_widget.message_id_internal}. Final text length: {len(current_full_text)}")
23082313

23092314

2310-
async def handle_respond_for_me_button_pressed(app: 'TldwCli') -> None:
2315+
async def handle_respond_for_me_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
23112316
"""Handles the 'Respond for Me' (Suggest) button press in the chat input area."""
23122317
loguru_logger.info("Enter: handle_respond_for_me_button_pressed")
23132318
loguru_logger.info("Respond for Me button pressed.")
@@ -2541,7 +2546,7 @@ class ApiKeyMissingError(Exception): # Custom exception for cleaner handling in
25412546
pass
25422547

25432548

2544-
async def handle_stop_chat_generation_pressed(app: 'TldwCli') -> None:
2549+
async def handle_stop_chat_generation_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
25452550
"""Handles the 'Stop Chat Generation' button press."""
25462551
loguru_logger.info("Stop Chat Generation button pressed.")
25472552

@@ -2637,11 +2642,10 @@ async def populate_chat_conversation_character_filter_select(app: 'TldwCli') ->
26372642
# --- Button Handler Map ---
26382643
# This maps button IDs to their async handler functions.
26392644
CHAT_BUTTON_HANDLERS = {
2640-
"send-chat": lambda app: handle_chat_send_button_pressed(app, "chat"),
2645+
"send-chat": handle_chat_send_button_pressed,
26412646
"respond-for-me-button": handle_respond_for_me_button_pressed,
26422647
"stop-chat-generation": handle_stop_chat_generation_pressed,
26432648
"chat-new-conversation-button": handle_chat_new_conversation_button_pressed,
2644-
"chat-new-temp-chat-button": handle_chat_new_conversation_button_pressed, # Reuses handler
26452649
"chat-save-current-chat-button": handle_chat_save_current_chat_button_pressed,
26462650
"chat-save-conversation-details-button": handle_chat_save_details_button_pressed,
26472651
"chat-conversation-load-selected-button": handle_chat_load_selected_button_pressed,
@@ -2650,19 +2654,13 @@ async def populate_chat_conversation_character_filter_select(app: 'TldwCli') ->
26502654
"chat-prompt-copy-user-button": handle_chat_copy_user_prompt_button_pressed,
26512655
"chat-load-character-button": handle_chat_load_character_button_pressed,
26522656
"chat-clear-active-character-button": handle_chat_clear_active_character_button_pressed,
2653-
2654-
# --- Sidebar Toggles ---
2655-
"toggle-chat-left-sidebar": lambda app: handle_chat_tab_sidebar_toggle(app, "toggle-chat-left-sidebar"),
2656-
"toggle-chat-right-sidebar": lambda app: handle_chat_tab_sidebar_toggle(app, "toggle-chat-right-sidebar"),
2657-
2658-
# --- Sidebar Media Buttons (from chat_events_sidebar.py) ---
2659-
"chat-media-load-selected-button": 'chat_events_sidebar.handle_chat_media_load_selected_button_pressed',
2660-
"chat-media-copy-title-button": 'chat_events_sidebar.handle_chat_media_copy_title_button_pressed',
2661-
"chat-media-copy-content-button": 'chat_events_sidebar.handle_chat_media_copy_content_button_pressed',
2662-
"chat-media-copy-author-button": 'chat_events_sidebar.handle_chat_media_copy_author_button_pressed',
2663-
"chat-media-copy-url-button": 'chat_events_sidebar.handle_chat_media_copy_url_button_pressed',
2664-
2665-
# --- Note: ChatMessage action buttons (like edit, copy, delete) are handled separately by _get_chat_message_widget_from_button ---
2657+
"toggle-chat-left-sidebar": handle_chat_tab_sidebar_toggle,
2658+
"toggle-chat-right-sidebar": handle_chat_tab_sidebar_toggle,
2659+
"chat-media-load-selected-button": handle_chat_media_load_selected_button_pressed,
2660+
"chat-media-copy-title-button": handle_chat_media_copy_title_button_pressed,
2661+
"chat-media-copy-content-button": handle_chat_media_copy_content_button_pressed,
2662+
"chat-media-copy-author-button": handle_chat_media_copy_author_button_pressed,
2663+
"chat-media-copy-url-button": handle_chat_media_copy_url_button_pressed,
26662664
}
26672665

26682666
#

tldw_chatbook/Event_Handlers/Chat_Events/chat_events_sidebar.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ async def handle_chat_media_search_input_changed(app: 'TldwCli', input_widget: I
132132
logger.debug(f"Set new media search timer for term: '{search_term}'")
133133

134134

135-
async def handle_chat_media_load_selected_button_pressed(app: 'TldwCli'):
135+
async def handle_chat_media_load_selected_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
136136
"""
137137
Loads the selected media item's details into the review display.
138138
"""
@@ -177,7 +177,7 @@ async def handle_chat_media_load_selected_button_pressed(app: 'TldwCli'):
177177
logger.debug("Media copy buttons state updated.")
178178

179179

180-
async def handle_chat_media_copy_title_button_pressed(app: 'TldwCli'):
180+
async def handle_chat_media_copy_title_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
181181
"""Copies the title of the currently loaded sidebar media to clipboard."""
182182
logger.debug("Copy Title button pressed.")
183183
if app.current_sidebar_media_item and 'title' in app.current_sidebar_media_item:
@@ -190,7 +190,7 @@ async def handle_chat_media_copy_title_button_pressed(app: 'TldwCli'):
190190
logger.warning("No media title available to copy.")
191191

192192

193-
async def handle_chat_media_copy_content_button_pressed(app: 'TldwCli'):
193+
async def handle_chat_media_copy_content_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
194194
"""Copies the content of the currently loaded sidebar media to clipboard."""
195195
logger.debug("Copy Content button pressed.")
196196
if app.current_sidebar_media_item and 'content' in app.current_sidebar_media_item:
@@ -203,7 +203,7 @@ async def handle_chat_media_copy_content_button_pressed(app: 'TldwCli'):
203203
logger.warning("No media content available to copy.")
204204

205205

206-
async def handle_chat_media_copy_author_button_pressed(app: 'TldwCli'):
206+
async def handle_chat_media_copy_author_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
207207
"""Copies the author of the currently loaded sidebar media to clipboard."""
208208
logger.debug("Copy Author button pressed.")
209209
if app.current_sidebar_media_item and 'author' in app.current_sidebar_media_item:
@@ -216,7 +216,7 @@ async def handle_chat_media_copy_author_button_pressed(app: 'TldwCli'):
216216
logger.warning("No media author available to copy.")
217217

218218

219-
async def handle_chat_media_copy_url_button_pressed(app: 'TldwCli'):
219+
async def handle_chat_media_copy_url_button_pressed(app: 'TldwCli', event: Button.Pressed) -> None:
220220
"""Copies the URL of the currently loaded sidebar media to clipboard."""
221221
logger.debug("Copy URL button pressed.")
222222
if app.current_sidebar_media_item and 'url' in app.current_sidebar_media_item and app.current_sidebar_media_item['url']:

tldw_chatbook/Event_Handlers/LLM_Management_Events/llm_management_events.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ async def _callback(selected_path: Optional[Path]) -> None:
7070
###############################################################################
7171

7272

73-
async def handle_llamafile_browse_exec_button_pressed(app: "TldwCli") -> None:
73+
async def handle_llamafile_browse_exec_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
7474
logger = getattr(app, "loguru_logger", logging.getLogger(__name__))
7575
logger.debug("Llamafile browse executable button pressed.")
7676

@@ -85,7 +85,7 @@ async def handle_llamafile_browse_exec_button_pressed(app: "TldwCli") -> None:
8585
)
8686

8787

88-
async def handle_llamafile_browse_model_button_pressed(app: "TldwCli") -> None:
88+
async def handle_llamafile_browse_model_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
8989
logger = getattr(app, "loguru_logger", logging.getLogger(__name__))
9090
logger.debug("Llamafile browse model button pressed.")
9191

@@ -527,7 +527,7 @@ async def stream_worker_output_to_log(app: "TldwCli", worker: Worker, log_widget
527527
###############################################################################
528528

529529

530-
async def handle_start_llamafile_server_button_pressed(app: "TldwCli") -> None:
530+
async def handle_start_llamafile_server_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
531531
logger = getattr(app, "loguru_logger", logging.getLogger(__name__))
532532
logger.info("User requested to start Llamafile server.")
533533

@@ -597,7 +597,7 @@ async def handle_start_llamafile_server_button_pressed(app: "TldwCli") -> None:
597597
app.notify("Error setting up Llamafile server start.", severity="error")
598598

599599

600-
async def handle_stop_llamafile_server_button_pressed(app: "TldwCli") -> None:
600+
async def handle_stop_llamafile_server_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
601601
logger = getattr(app, "loguru_logger", logging.getLogger(__name__))
602602
logger.info("User requested to stop Llamafile server.")
603603

@@ -668,7 +668,7 @@ async def handle_stop_llamafile_server_button_pressed(app: "TldwCli") -> None:
668668
###############################################################################
669669

670670

671-
async def handle_llamacpp_browse_exec_button_pressed(app: "TldwCli") -> None:
671+
async def handle_llamacpp_browse_exec_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
672672
logger = getattr(app, "loguru_logger", logging.getLogger(__name__))
673673
logger.debug("Llama.cpp browse executable button pressed.")
674674

@@ -683,7 +683,7 @@ async def handle_llamacpp_browse_exec_button_pressed(app: "TldwCli") -> None:
683683
)
684684

685685

686-
async def handle_llamacpp_browse_model_button_pressed(app: "TldwCli") -> None:
686+
async def handle_llamacpp_browse_model_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
687687
gguf_filters = Filters(
688688
("GGUF Models (*.gguf)", lambda p: p.suffix.lower() == ".gguf"),
689689
("All files (*.*)", lambda p: True),
@@ -698,7 +698,7 @@ async def handle_llamacpp_browse_model_button_pressed(app: "TldwCli") -> None:
698698
)
699699

700700

701-
async def handle_start_llamacpp_server_button_pressed(app: "TldwCli") -> None:
701+
async def handle_start_llamacpp_server_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
702702
logger = getattr(app, "loguru_logger", logging.getLogger(__name__))
703703
logger.info("User requested to start Llama.cpp server.")
704704

@@ -769,7 +769,7 @@ async def handle_start_llamacpp_server_button_pressed(app: "TldwCli") -> None:
769769
app.notify("Error setting up Llama.cpp server start.", severity="error")
770770

771771

772-
async def handle_stop_llamacpp_server_button_pressed(app: "TldwCli") -> None:
772+
async def handle_stop_llamacpp_server_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
773773
"""Stops the Llama.cpp server process if it is running."""
774774
logger = getattr(app, "loguru_logger", logging.getLogger(__name__))
775775
logger.info("User requested to stop Llama.cpp server.")
@@ -880,7 +880,7 @@ async def handle_stop_llamacpp_server_button_pressed(app: "TldwCli") -> None:
880880
###############################################################################
881881

882882

883-
async def handle_browse_models_dir_button_pressed(app: "TldwCli") -> None:
883+
async def handle_browse_models_dir_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
884884
"""Open a directory picker so the user can choose the *models* directory."""
885885
await app.push_screen(
886886
FileOpen(
@@ -891,7 +891,7 @@ async def handle_browse_models_dir_button_pressed(app: "TldwCli") -> None:
891891
)
892892

893893

894-
async def handle_start_model_download_button_pressed(app: "TldwCli") -> None:
894+
async def handle_start_model_download_button_pressed(app: "TldwCli", event: Button.Pressed) -> None:
895895
"""Validate inputs and launch *run_model_download_worker*."""
896896

897897
logger = getattr(app, "loguru_logger", logging.getLogger(__name__))

0 commit comments

Comments
 (0)