Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::{
event_source_modal::{EventSourceModalAction, EventSourceModalWidgetRefExt}, home_screen::{MainViewVariantChangedAction, ScreenRestoredAction}, invite_modal::{InviteModalAction, InviteModalWidgetRefExt}, main_desktop_ui::MainDesktopUiAction, nav_history::{GoForwardAction, NavHistory, can_navigate_history}, nav_history_buttons::enable_nav_history_buttons, nav_history_menu::{ShowNavHistoryMenuAction, show_nav_history_menu}, navigation_tab_bar::{NavigationBarAction, SelectedTab}, new_message_context_menu::NewMessageContextMenuWidgetRefExt, room_context_menu::RoomContextMenuWidgetRefExt, room_screen::{DropDecodedImagesAction, InviteAction, MessageAction, clear_timeline_states, invalidate_single_timeline_state, drop_docked_pane_data}, rooms_list::{RoomsListAction, RoomsListRef, RoomsListUpdate, clear_all_invited_rooms, enqueue_rooms_list_update}
}, join_leave_room_modal::{
JoinLeaveModalKind, JoinLeaveRoomModalAction, JoinLeaveRoomModalWidgetRefExt
}, login::login_screen::LoginAction, logout::logout_confirm_modal::{LogoutAction, LogoutConfirmModalAction, LogoutConfirmModalWidgetRefExt}, persistence::{self, WindowGeomTracker}, profile::user_profile_cache::{clear_user_profile_cache, process_user_profile_updates}, room::{BasicRoomDetails, room_pane::{self, PaneLayout, RoomPaneKind}}, settings::{app_preferences::{AppPreferences, Appearance, AppearanceGlobal, UiZoom}, encryption_settings::{EncryptionModalAction, EncryptionModalWidgetRefExt}}, shared::{confirmation_modal::{ConfirmationModalContent, ConfirmationModalWidgetRefExt}, context_menu::{ContextMenuClosed, close_context_menus, is_context_menu_shown, menu_position_margin}, image_viewer::{ImageViewerAction, LoadState}, popup_list::{PopupKind, enqueue_popup_notification}, speech_text_input::cancel_all_dictation}, sliding_sync::{DirectMessageRoomAction, MatrixRequest, RecoveryAction, TimelineKind, current_user_id, submit_async_request}, utils::RoomNameId, verification::VerificationAction, verification_modal::{
}, login::login_screen::LoginAction, logout::logout_confirm_modal::{LogoutAction, LogoutConfirmModalAction, LogoutConfirmModalWidgetRefExt}, persistence::{self, WindowGeomTracker}, profile::user_profile_cache::{clear_user_profile_cache, process_user_profile_updates}, room::{BasicRoomDetails, room_pane::{self, PaneLayout, RoomPaneKind}}, settings::{app_preferences::{AppPreferences, AppPreferencesGlobal, Appearance, AppearanceGlobal, UiZoom, set_img_msg_fit_max_height}, encryption_settings::{EncryptionModalAction, EncryptionModalWidgetRefExt}}, shared::{confirmation_modal::{ConfirmationModalContent, ConfirmationModalWidgetRefExt}, context_menu::{ContextMenuClosed, close_context_menus, is_context_menu_shown, menu_position_margin}, image_viewer::{ImageViewerAction, LoadState}, popup_list::{PopupKind, enqueue_popup_notification}, speech_text_input::cancel_all_dictation}, sliding_sync::{DirectMessageRoomAction, MatrixRequest, RecoveryAction, TimelineKind, current_user_id, submit_async_request}, utils::RoomNameId, verification::VerificationAction, verification_modal::{
VerificationModalAction,
VerificationModalWidgetRefExt,
}
Expand Down Expand Up @@ -838,6 +838,9 @@ impl AppMain for App {
crate::verification_modal::script_mod(vm);
crate::profile::script_mod(vm);
crate::home::script_mod(vm);
// Re-running this script recreates `IMG_MSG_FIT` at its default size.
let thumbnail_max_height = vm.cx_mut().global::<AppPreferencesGlobal>().0.thumbnail_max_height;
set_img_msg_fit_max_height(vm, thumbnail_max_height);
crate::login::script_mod(vm);
crate::logout::script_mod(vm);

Expand Down
26 changes: 20 additions & 6 deletions src/home/invite_modal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ enum InviteModalState {
}


#[derive(Script, ScriptHook, Widget)]
#[derive(Script, Widget)]
pub struct InviteModal {
#[deref] view: View,

Expand All @@ -119,6 +119,12 @@ pub struct InviteModal {
#[rust] room_name_id: Option<RoomNameId>,
}

impl ScriptHook for InviteModal {
fn on_after_reload(&mut self, vm: &mut ScriptVm) {
vm.with_cx_mut(|cx| self.update_status_color(cx));
}
}

impl Widget for InviteModal {
fn handle_event(&mut self, cx: &mut Cx, event: &Event, scope: &mut Scope) {
self.view.handle_event(cx, event, scope);
Expand Down Expand Up @@ -168,7 +174,7 @@ impl WidgetMatchEvent for InviteModal {
// Validate the user ID
if user_id_str.is_empty() {
status_label.set_text(cx, "Please enter a user ID.");
status_label.set_text_color(cx, self.status_color_error);
self.update_status_color(cx);
status_view.set_visible(cx, true);
self.view.redraw(cx);
return;
Expand All @@ -184,15 +190,15 @@ impl WidgetMatchEvent for InviteModal {
});
self.state = InviteModalState::WaitingForInvite(user_id);
status_label.set_text(cx, "Sending invite...");
status_label.set_text_color(cx, self.status_color_pending);
self.update_status_color(cx);
status_view.set_visible(cx, true);
confirm_button.set_enabled(cx, false);
user_id_input.set_is_read_only(cx, true);
}
}
Err(_) => {
status_label.set_text(cx, "Invalid User ID. Expected format: @user:server.xyz");
status_label.set_text_color(cx, self.status_color_error);
self.update_status_color(cx);
status_view.set_visible(cx, true);
user_id_input.set_key_focus(cx);
}
Expand All @@ -210,7 +216,6 @@ impl WidgetMatchEvent for InviteModal {
=> {
let status = format!("Successfully invited {user_id}!");
status_label.set_text(cx, &status);
status_label.set_text_color(cx, self.status_color_success);
status_view.set_visible(cx, true);
confirm_button.set_visible(cx, false);
cancel_button.set_visible(cx, false);
Expand All @@ -223,7 +228,6 @@ impl WidgetMatchEvent for InviteModal {
=> {
let status = format!("Failed to send invite: {error}");
status_label.set_text(cx, &status);
status_label.set_text_color(cx, self.status_color_error);
status_view.set_visible(cx, true);
confirm_button.set_enabled(cx, true);
user_id_input.set_is_read_only(cx, false);
Expand All @@ -234,6 +238,7 @@ impl WidgetMatchEvent for InviteModal {
};
if let Some(new_state) = new_state {
self.state = new_state;
self.update_status_color(cx);
self.view.redraw(cx);
break;
}
Expand All @@ -243,6 +248,15 @@ impl WidgetMatchEvent for InviteModal {
}

impl InviteModal {
fn update_status_color(&self, cx: &mut Cx) {
let color = match self.state {
InviteModalState::WaitingForInvite(_) => self.status_color_pending,
InviteModalState::InviteSuccess => self.status_color_success,
InviteModalState::WaitingForUserInput | InviteModalState::InviteError => self.status_color_error,
};
self.view.label(cx, ids!(status_label_view.status_label)).set_text_color(cx, color);
}

pub fn show(&mut self, cx: &mut Cx, room_name_id: RoomNameId) {
self.view.label(cx, ids!(title)).set_text(
cx,
Expand Down
16 changes: 12 additions & 4 deletions src/home/room_screen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -927,10 +927,7 @@ impl ScriptHook for RoomScreen {
// A script reload changes the RoomScreen's children; invalidate the ones we cached.
self.cached_refs = None;
vm.with_cx_mut(|cx| {
if let Some(tl_state) = &mut self.tl_state.as_mut() {
// Clear the timeline's drawn items caches and redraw it.
tl_state.content_drawn_since_last_update.clear();
tl_state.profile_drawn_since_last_update.clear();
if let Some(tl_state) = self.tl_state.as_ref() {
// The reapply also resets the RoomInputBar, so we need to re-update its state.
let room_input_bar = self.view.room_input_bar(cx, ids!(room_input_bar));
room_input_bar.update_room_state(
Expand Down Expand Up @@ -1539,6 +1536,13 @@ impl Widget for RoomScreen {
let Some(tl_state) = self.tl_state.as_mut() else {
return DrawStep::done();
};
// Re-populate all items after a reload, since it resets their widgets,
// even if it happened while this timeline state was parked.
if tl_state.drawn_reload_generation != cx.reload_generation {
tl_state.drawn_reload_generation = cx.reload_generation;
tl_state.content_drawn_since_last_update.clear();
tl_state.profile_drawn_since_last_update.clear();
}

// Set the portal list's range based on the number of timeline items.
let tl_items = &tl_state.items;
Expand Down Expand Up @@ -3185,6 +3189,7 @@ impl RoomScreen {
index_of_first_own_failed: None,
content_drawn_since_last_update: RangeSet::new(),
profile_drawn_since_last_update: RangeSet::new(),
drawn_reload_generation: cx.reload_generation,
update_receiver,
request_sender,
media_cache: MediaCache::new(Some(update_sender.clone())),
Expand Down Expand Up @@ -4331,6 +4336,9 @@ struct TimelineUiState {
/// Same as `content_drawn_since_last_update`, but for the event **profiles** (avatar, username).
profile_drawn_since_last_update: RangeSet<usize>,

/// The `cx.reload_generation` that the above drawn-item caches were filled in.
drawn_reload_generation: u64,

/// The channel receiver for timeline updates for this room.
///
/// Here we use a synchronous (non-async) channel because the receiver runs
Expand Down
Loading
Loading