Skip to content

Commit 059e9de

Browse files
committed
Make sure models and agent list selector is refresh when models are deleted
1 parent f1951d2 commit 059e9de

File tree

4 files changed

+58
-35
lines changed

4 files changed

+58
-35
lines changed

src/app.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::chat::chat_panel::ChatPanelAction;
2+
use crate::chat::model_selector_list::ModelSelectorListAction;
23
use crate::data::downloads::DownloadPendingNotification;
34
use crate::data::store::*;
45
use crate::landing::model_files_item::ModelFileItemAction;
@@ -271,6 +272,7 @@ impl App {
271272
match notification {
272273
DownloadPendingNotification::DownloadedFile(file) => {
273274
popup.set_data(&file, DownloadResult::Success);
275+
cx.action(ModelSelectorListAction::AddedOrDeletedModel);
274276
}
275277
DownloadPendingNotification::DownloadErrored(file) => {
276278
popup.set_data(&file, DownloadResult::Failure);

src/chat/chat_panel.rs

+34-31
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
use makepad_widgets::*;
2-
use moly_protocol::data::FileID;
32
use std::cell::{Ref, RefCell, RefMut};
43

54
use crate::{
65
chat::{
76
chat_line::{ChatLineAction, ChatLineWidgetRefExt},
8-
model_selector::ModelSelectorWidgetExt,
97
model_selector_item::ModelSelectorAction,
108
},
119
data::{
@@ -16,8 +14,8 @@ use crate::{
1614
};
1715

1816
use super::{
19-
chat_history_card::ChatHistoryCardAction, prompt_input::PromptInputWidgetExt,
20-
shared::ChatAgentAvatarWidgetRefExt,
17+
chat_history_card::ChatHistoryCardAction, model_selector_list::ModelSelectorListAction,
18+
prompt_input::PromptInputWidgetExt, shared::ChatAgentAvatarWidgetRefExt,
2119
};
2220

2321
live_design! {
@@ -491,6 +489,10 @@ impl WidgetMatchEvent for ChatPanel {
491489
self.redraw(cx);
492490
}
493491

492+
if let ModelSelectorListAction::AddedOrDeletedModel = action.cast() {
493+
self.redraw(cx);
494+
}
495+
494496
match action.cast() {
495497
ChatAction::Start(handler) => match handler {
496498
ChatHandler::Model(file_id) => {
@@ -568,32 +570,29 @@ impl ChatPanel {
568570
.get_current_chat()
569571
.and_then(|c| c.borrow().associated_entity.clone());
570572

571-
self.state = match chat_entity {
572-
Some(_) => {
573-
// Model or Agent is selected
574-
let is_loading = store.chats.model_loader.is_loading();
575-
576-
store.chats.get_current_chat().map_or(
577-
State::ModelSelectedWithEmptyChat { is_loading },
578-
|chat| {
579-
if chat.borrow().messages.is_empty() {
580-
State::ModelSelectedWithEmptyChat { is_loading }
581-
} else {
582-
State::ModelSelectedWithChat {
583-
is_loading,
584-
sticked_to_bottom: self.portal_list_end_reached
585-
|| !matches!(self.state, State::ModelSelectedWithChat { .. }),
586-
receiving_response: chat.borrow().is_receiving(),
587-
was_cancelled: chat.borrow().was_cancelled(),
588-
}
573+
self.state = if chat_entity.is_none() && store.chats.loaded_model.is_none() {
574+
State::NoModelSelected
575+
} else {
576+
// Model or Agent is selected
577+
let is_loading = store.chats.model_loader.is_loading();
578+
579+
store.chats.get_current_chat().map_or(
580+
State::ModelSelectedWithEmptyChat { is_loading },
581+
|chat| {
582+
if chat.borrow().messages.is_empty() {
583+
State::ModelSelectedWithEmptyChat { is_loading }
584+
} else {
585+
State::ModelSelectedWithChat {
586+
is_loading,
587+
sticked_to_bottom: self.portal_list_end_reached
588+
|| !matches!(self.state, State::ModelSelectedWithChat { .. }),
589+
receiving_response: chat.borrow().is_receiving(),
590+
was_cancelled: chat.borrow().was_cancelled(),
589591
}
590-
},
591-
)
592-
}
593-
None => {
594-
State::NoModelSelected
595-
}
596-
};
592+
}
593+
},
594+
)
595+
}
597596
}
598597

599598
fn update_prompt_input(&mut self, cx: &mut Cx) {
@@ -666,8 +665,12 @@ impl ChatPanel {
666665
},
667666
);
668667

669-
let send_button = self.prompt_input(id!(main_prompt_input)).button(id!(prompt_send_button));
670-
let stop_button = self.prompt_input(id!(main_prompt_input)).button(id!(prompt_stop_button));
668+
let send_button = self
669+
.prompt_input(id!(main_prompt_input))
670+
.button(id!(prompt_send_button));
671+
let stop_button = self
672+
.prompt_input(id!(main_prompt_input))
673+
.button(id!(prompt_stop_button));
671674
match button {
672675
PromptInputButton::Send => {
673676
// The send button is enabled or not based on the prompt input

src/chat/model_selector_list.rs

+19
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ live_design! {
2727
}
2828
}
2929

30+
#[derive(Clone, DefaultNone, Debug)]
31+
pub enum ModelSelectorListAction {
32+
AddedOrDeletedModel,
33+
None,
34+
}
35+
3036
#[derive(Live, LiveHook, Widget)]
3137
pub struct ModelSelectorList {
3238
#[redraw]
@@ -64,6 +70,7 @@ impl Widget for ModelSelectorList {
6470
for (_, item) in self.items.iter_mut() {
6571
item.handle_event(cx, event, scope)
6672
}
73+
self.widget_match_event(cx, event, scope);
6774
}
6875

6976
fn draw_walk(&mut self, cx: &mut Cx2d, scope: &mut Scope, walk: Walk) -> DrawStep {
@@ -80,6 +87,18 @@ impl Widget for ModelSelectorList {
8087
}
8188
}
8289

90+
impl WidgetMatchEvent for ModelSelectorList {
91+
fn handle_actions(&mut self, cx: &mut Cx, actions: &Actions, _scope: &mut Scope) {
92+
for action in actions.iter() {
93+
if let ModelSelectorListAction::AddedOrDeletedModel = action.cast() {
94+
self.items.clear();
95+
self.total_height = None;
96+
self.redraw(cx);
97+
}
98+
}
99+
}
100+
}
101+
83102
impl ModelSelectorList {
84103
fn draw_items(&mut self, cx: &mut Cx2d, store: &Store) {
85104
let mut models = store.downloads.downloaded_files.clone();

src/my_models/delete_model_modal.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use makepad_widgets::*;
22

3-
use crate::{chat::chat_panel::ChatPanelAction, data::store::Store};
3+
use crate::{chat::model_selector_list::ModelSelectorListAction, data::store::Store};
44

55
use super::downloaded_files_row::DownloadedFilesRowProps;
66

@@ -173,8 +173,6 @@ impl Widget for DeleteModelModal {
173173

174174
impl WidgetMatchEvent for DeleteModelModal {
175175
fn handle_actions(&mut self, cx: &mut Cx, actions: &Actions, scope: &mut Scope) {
176-
let widget_uid = self.widget_uid();
177-
178176
if self.button(id!(close_button)).clicked(actions) {
179177
cx.action(DeleteModelModalAction::ModalDismissed);
180178
}
@@ -184,11 +182,12 @@ impl WidgetMatchEvent for DeleteModelModal {
184182
.clicked(actions)
185183
{
186184
let store = scope.data.get_mut::<Store>().unwrap();
187-
188185
store
189186
.delete_file(self.file_id.clone())
190187
.expect("Failed to delete file");
188+
191189
cx.action(DeleteModelModalAction::ModalDismissed);
190+
cx.action(ModelSelectorListAction::AddedOrDeletedModel);
192191
}
193192

194193
if self

0 commit comments

Comments
 (0)