feat: better session creation handling

This commit is contained in:
Georg Bauer
2026-07-25 12:02:04 +02:00
parent 4292e0d3f9
commit 51c1b2a7dc
5 changed files with 182 additions and 58 deletions

View File

@@ -27,7 +27,7 @@ use crate::settings::{
use iced::widget::{markdown, scrollable};
use iced::{Size, Subscription, Task, keyboard, window};
use rfd::AsyncFileDialog;
use std::collections::VecDeque;
use std::collections::{HashMap, VecDeque};
use std::fs;
use std::path::PathBuf;
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
@@ -55,6 +55,9 @@ pub(crate) struct App {
preference_error: Option<String>,
selected_project: Option<i32>,
selected_session: Option<i32>,
/// Unsaved sessions, keyed by project. A draft only becomes a `sessions` row
/// when its first chat turn is stored, so empty ones vanish on restart.
drafts: HashMap<i32, String>,
choosing_folder: bool,
pending_project_path: Option<PathBuf>,
project_name_input: String,
@@ -163,7 +166,8 @@ pub(crate) enum Message {
CancelProject,
SelectProject(i32),
DeleteProject(i32),
CreateSession,
CreateSession(i32),
DiscardSession(i32),
SelectSession(i32, i32),
DeleteSession(i32),
ShowChat,
@@ -204,6 +208,7 @@ impl App {
preference_error: None,
selected_project: None,
selected_session: None,
drafts: HashMap::new(),
choosing_folder: false,
pending_project_path: None,
project_name_input: String::new(),
@@ -275,6 +280,7 @@ impl App {
preference_error: None,
selected_project: None,
selected_session: None,
drafts: HashMap::new(),
choosing_folder: false,
pending_project_path: None,
project_name_input: String::new(),
@@ -675,6 +681,7 @@ impl App {
for session_id in checkpoint_ids {
let _ = fs::remove_file(session_checkpoint_path(session_id));
}
self.drafts.remove(&project_id);
if self.selected_project == Some(project_id) {
self.selected_project = None;
self.selected_session = None;
@@ -689,7 +696,8 @@ impl App {
}
}
}
Message::CreateSession => self.create_session(),
Message::CreateSession(project_id) => self.create_session(project_id),
Message::DiscardSession(project_id) => self.discard_session(project_id),
Message::SelectSession(project_id, session_id) => {
if self.generating && self.selected_session != Some(session_id) {
self.error =