44import time
55
66from PySide6 .QtCore import QThread , QTimer , Qt , Signal
7- from PySide6 .QtGui import QKeySequence , QShortcut
7+ from PySide6 .QtGui import QFont , QKeySequence , QShortcut
88from PySide6 .QtWidgets import (
9+ QInputDialog ,
910 QLabel ,
1011 QMainWindow ,
1112 QMessageBox ,
1819from bite_size_notes .audio .capture import AudioCaptureThread
1920from bite_size_notes .gui .themes import build_stylesheet , get_palette
2021from bite_size_notes .audio .devices import get_default_mic , get_loopback_device
21- from bite_size_notes .gui .export_dialog import export_transcript
22+ from bite_size_notes .gui .export_dialog import export_output , export_transcript
2223from bite_size_notes .gui .notes_panel import NotesPanel
2324from bite_size_notes .gui .output_panel import OutputPanel
2425from bite_size_notes .gui .settings_dialog import SettingsDialog
@@ -147,20 +148,22 @@ def _setup_ui(self):
147148
148149 layout .addWidget (self ._splitter , 1 )
149150
150- # Connect sidebar collapse to redistribute splitter space
151- self ._saved_splitter_sizes = self ._splitter .sizes ()
152151 self ._saved_output_sizes = self ._splitter .sizes ()
153- self .sidebar .collapse_toggled .connect (self ._on_sidebar_collapse_toggled )
154152
155153 # Connect transcript view control signals
156154 self .transcript_view .record_clicked .connect (self ._on_record_clicked )
157155 self .transcript_view .clear_clicked .connect (self ._on_clear_clicked )
156+ self .transcript_view .export_clicked .connect (self ._on_export_clicked )
158157
159158 # Connect output panel signals
160159 self .output_panel .notes_toggled .connect (self ._toggle_notes )
161- self .output_panel .export_clicked .connect (self ._on_export_clicked )
160+ self .output_panel .export_output_clicked .connect (self ._on_export_output_clicked )
162161 self .output_panel .collapse_toggled .connect (self ._on_output_collapse_toggled )
163162 self .output_panel .bite_size_clicked .connect (self ._on_bite_size_clicked )
163+ self ._splitter .splitterMoved .connect (self ._on_splitter_moved )
164+
165+ # Connect sidebar rename signal
166+ self .sidebar .rename_session_requested .connect (self ._on_rename_session )
164167
165168 self .setCentralWidget (central )
166169
@@ -197,6 +200,10 @@ def _setup_status_bar(self):
197200 self .loopback_level .setTextVisible (True )
198201 self .statusBar ().addPermanentWidget (self .loopback_level )
199202
203+ author_label = QLabel ("By Philip Chung" )
204+ author_label .setFont (QFont ("Segoe UI" , 8 ))
205+ self .statusBar ().addPermanentWidget (author_label )
206+
200207 def _setup_timers (self ):
201208 # Timer to update duration and audio levels
202209 self .ui_timer = QTimer (self )
@@ -374,6 +381,9 @@ def _on_error(self, message: str):
374381 def _on_export_clicked (self ):
375382 export_transcript (self .transcript_session , self )
376383
384+ def _on_export_output_clicked (self ):
385+ export_output (self .output_panel .text (), self )
386+
377387 def _on_clear_clicked (self ):
378388 self .transcript_session .clear ()
379389 self .transcript_view .clear_transcript ()
@@ -392,6 +402,9 @@ def _on_bite_size_clicked(self):
392402 return
393403
394404 text = self .transcript_session .to_text ()
405+ notes = self .notes_panel .get_text ().strip ()
406+ if notes :
407+ text += f"\n \n Notes:\n { notes } "
395408 if not text .strip ():
396409 QMessageBox .information (
397410 self , "No Transcript" , "There is no transcript to summarize."
@@ -410,6 +423,9 @@ def _on_bite_size_clicked(self):
410423 def _on_summarize_finished (self , result : str ):
411424 self ._summarize_thread = None
412425 self .output_panel .set_text (result )
426+ self .transcript_session .summary = result
427+ if self .transcript_session .segments :
428+ self .session_store .save_session (self .transcript_session )
413429
414430 def _on_summarize_error (self , message : str ):
415431 self ._summarize_thread = None
@@ -438,6 +454,10 @@ def _on_session_selected(self, session_id: str):
438454 for segment in session .segments :
439455 self .transcript_view .append_segment (segment )
440456 self .transcript_view .set_editable (True )
457+ if session .summary :
458+ self .output_panel .set_text (session .summary )
459+ else :
460+ self .output_panel .clear ()
441461 self .sidebar .set_active_session (session_id )
442462
443463 def _on_new_session (self ):
@@ -447,9 +467,31 @@ def _on_new_session(self):
447467 if self .transcript_session .segments :
448468 self .session_store .save_session (self .transcript_session )
449469 self .transcript_session = TranscriptSession ()
470+ self .session_store .save_session (self .transcript_session )
450471 self .transcript_view .clear_transcript ()
451472 self .transcript_view .set_editable (False )
452473 self .notes_panel .clear ()
474+ self .output_panel .clear ()
475+ self .sidebar .refresh_sessions (active_id = self .transcript_session .id )
476+
477+ def _on_rename_session (self , session_id : str ):
478+ """Prompt the user to rename a session."""
479+ try :
480+ session = self .session_store .load_session (session_id )
481+ except Exception :
482+ return
483+ new_name , ok = QInputDialog .getText (
484+ self ,
485+ "Rename Session" ,
486+ "New name:" ,
487+ text = session .title ,
488+ )
489+ if not ok or not new_name .strip ():
490+ return
491+ session .title = new_name .strip ()
492+ self .session_store .save_session (session )
493+ if session_id == self .transcript_session .id :
494+ self .transcript_session .title = session .title
453495 self .sidebar .refresh_sessions (active_id = self .transcript_session .id )
454496
455497 def _on_delete_session (self , session_id : str ):
@@ -478,16 +520,9 @@ def _toggle_notes(self):
478520 self .notes_panel .show ()
479521 self .notes_panel .raise_ ()
480522
481- def _on_sidebar_collapse_toggled (self , collapsed : bool ):
482- """Redistribute splitter space when the sidebar collapses/expands."""
483- sizes = self ._splitter .sizes ()
484- total = sum (sizes )
485- if collapsed :
486- self ._saved_splitter_sizes = sizes
487- self ._splitter .setSizes ([40 , total - 40 - sizes [2 ], sizes [2 ]])
488- else :
489- # Restore previous proportions
490- self ._splitter .setSizes (self ._saved_splitter_sizes )
523+ def _on_splitter_moved (self ):
524+ """Refresh bubble heights after the user drags the splitter."""
525+ QTimer .singleShot (0 , self .transcript_view ._refresh_bubble_heights )
491526
492527 def _on_output_collapse_toggled (self , collapsed : bool ):
493528 """Redistribute splitter space when the output panel collapses/expands."""
0 commit comments