Reopen the last project with a focused draft chat
This commit is contained in:
43
src/app.rs
43
src/app.rs
@@ -24,7 +24,7 @@ use crate::settings::{
|
||||
RuntimePreferences, SpeculativePreferences, SsdPreferences, SteeringPreferences,
|
||||
StreamingCacheBudget,
|
||||
};
|
||||
use iced::widget::{markdown, scrollable};
|
||||
use iced::widget::{markdown, scrollable, text_input};
|
||||
use iced::{Size, Subscription, Task, keyboard, window};
|
||||
use rfd::AsyncFileDialog;
|
||||
use std::collections::{HashMap, HashSet, VecDeque};
|
||||
@@ -208,6 +208,14 @@ impl App {
|
||||
Err(error) => return Self::failed(error, main_window),
|
||||
};
|
||||
let context_limit = preferences.context_tokens.max(0) as u32;
|
||||
// Reopen on the project we left, with a fresh draft chat.
|
||||
let last_project = preferences
|
||||
.last_project_id
|
||||
.filter(|id| projects.iter().any(|item| item.project.id == *id));
|
||||
let drafts = last_project
|
||||
.map(|id| (id, projects::draft_title(&projects, id)))
|
||||
.into_iter()
|
||||
.collect();
|
||||
let metrics =
|
||||
Arc::new(Metrics::new(&application_support_path().join("kv-cache")));
|
||||
let metrics_snapshot = metrics.snapshot();
|
||||
@@ -228,9 +236,9 @@ impl App {
|
||||
preference_draft,
|
||||
preferences_open: false,
|
||||
preference_error: None,
|
||||
selected_project: None,
|
||||
selected_project: last_project,
|
||||
selected_session: None,
|
||||
drafts: HashMap::new(),
|
||||
drafts,
|
||||
session_menu: None,
|
||||
session_rename: None,
|
||||
expanded_archives: HashSet::new(),
|
||||
@@ -367,8 +375,7 @@ impl App {
|
||||
return window::gain_focus(id);
|
||||
}
|
||||
}
|
||||
Message::WindowOpened(id) =>
|
||||
{
|
||||
Message::WindowOpened(id) => {
|
||||
#[cfg(target_os = "macos")]
|
||||
if id == self.main_window && self._native_menu.is_none() {
|
||||
match crate::native_menu::install() {
|
||||
@@ -379,6 +386,9 @@ impl App {
|
||||
}
|
||||
}
|
||||
}
|
||||
if id == self.main_window && self.selected_project.is_some() {
|
||||
return focus_composer();
|
||||
}
|
||||
}
|
||||
Message::WindowClosed(id) => {
|
||||
if id == self.main_window {
|
||||
@@ -714,7 +724,7 @@ impl App {
|
||||
Some("Stop the active generation before changing sessions.".into());
|
||||
return Task::none();
|
||||
}
|
||||
self.selected_project = Some(project_id);
|
||||
self.remember_project(project_id);
|
||||
self.selected_session = None;
|
||||
self.conversation.clear();
|
||||
self.composer.clear();
|
||||
@@ -747,6 +757,10 @@ impl App {
|
||||
let _ = fs::remove_file(session_checkpoint_path(session_id));
|
||||
}
|
||||
self.drafts.remove(&project_id);
|
||||
if self.preferences.last_project_id == Some(project_id) {
|
||||
self.preferences.last_project_id = None;
|
||||
let _ = database.set_last_project(None);
|
||||
}
|
||||
if self.selected_project == Some(project_id) {
|
||||
self.selected_project = None;
|
||||
self.selected_session = None;
|
||||
@@ -761,7 +775,12 @@ impl App {
|
||||
}
|
||||
}
|
||||
}
|
||||
Message::CreateSession(project_id) => self.create_session(project_id),
|
||||
Message::CreateSession(project_id) => {
|
||||
self.create_session(project_id);
|
||||
if self.draft_selected(project_id) {
|
||||
return focus_composer();
|
||||
}
|
||||
}
|
||||
Message::DiscardSession(project_id) => self.discard_session(project_id),
|
||||
Message::OpenSessionMenu(session_id) => {
|
||||
self.session_rename = None;
|
||||
@@ -858,7 +877,7 @@ impl App {
|
||||
Ok(messages) => {
|
||||
self.conversation = messages.into_iter().map(ChatMessage::from).collect();
|
||||
self.composer.clear();
|
||||
self.selected_project = Some(project_id);
|
||||
self.remember_project(project_id);
|
||||
self.selected_session = Some(session_id);
|
||||
let (used, limit, tokens_per_second) = saved_context.unwrap_or_default();
|
||||
self.context_used = used.max(0) as u32;
|
||||
@@ -1067,6 +1086,14 @@ pub(super) fn chat_scroll_id() -> scrollable::Id {
|
||||
scrollable::Id::new("chat-transcript")
|
||||
}
|
||||
|
||||
pub(super) fn composer_id() -> text_input::Id {
|
||||
text_input::Id::new("chat-composer")
|
||||
}
|
||||
|
||||
fn focus_composer() -> Task<Message> {
|
||||
text_input::focus(composer_id())
|
||||
}
|
||||
|
||||
fn scroll_chat_to_end() -> Task<Message> {
|
||||
scrollable::snap_to(chat_scroll_id(), scrollable::RelativeOffset::END)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user