Set window's edited = true
when there are unsaved changes
This commit is contained in:
parent
a6262b97ff
commit
ca8ddcdeec
5 changed files with 38 additions and 0 deletions
|
@ -3339,6 +3339,13 @@ impl<'a, T: View> ViewContext<'a, T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_window_edited(&mut self, edited: bool) {
|
||||||
|
let window_id = self.window_id();
|
||||||
|
if let Some((_, window)) = self.presenters_and_platform_windows.get_mut(&window_id) {
|
||||||
|
window.set_edited(edited);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_model<S, F>(&mut self, build_model: F) -> ModelHandle<S>
|
pub fn add_model<S, F>(&mut self, build_model: F) -> ModelHandle<S>
|
||||||
where
|
where
|
||||||
S: Entity,
|
S: Entity,
|
||||||
|
|
|
@ -97,6 +97,7 @@ pub trait Window: WindowContext {
|
||||||
fn prompt(&self, level: PromptLevel, msg: &str, answers: &[&str]) -> oneshot::Receiver<usize>;
|
fn prompt(&self, level: PromptLevel, msg: &str, answers: &[&str]) -> oneshot::Receiver<usize>;
|
||||||
fn activate(&self);
|
fn activate(&self);
|
||||||
fn set_title(&mut self, title: &str);
|
fn set_title(&mut self, title: &str);
|
||||||
|
fn set_edited(&mut self, edited: bool);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait WindowContext {
|
pub trait WindowContext {
|
||||||
|
|
|
@ -397,6 +397,17 @@ impl platform::Window for Window {
|
||||||
msg_send![app, changeWindowsItem:window title:title filename:false]
|
msg_send![app, changeWindowsItem:window title:title filename:false]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_edited(&mut self, edited: bool) {
|
||||||
|
unsafe {
|
||||||
|
let window = self.0.borrow().native_window;
|
||||||
|
msg_send![window, setDocumentEdited: edited as BOOL]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Changing the document edited state resets the traffic light position,
|
||||||
|
// so we have to move it again.
|
||||||
|
self.0.borrow().move_traffic_light();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl platform::WindowContext for Window {
|
impl platform::WindowContext for Window {
|
||||||
|
|
|
@ -38,6 +38,7 @@ pub struct Window {
|
||||||
resize_handlers: Vec<Box<dyn FnMut()>>,
|
resize_handlers: Vec<Box<dyn FnMut()>>,
|
||||||
close_handlers: Vec<Box<dyn FnOnce()>>,
|
close_handlers: Vec<Box<dyn FnOnce()>>,
|
||||||
pub(crate) title: Option<String>,
|
pub(crate) title: Option<String>,
|
||||||
|
pub(crate) edited: bool,
|
||||||
pub(crate) pending_prompts: RefCell<VecDeque<oneshot::Sender<usize>>>,
|
pub(crate) pending_prompts: RefCell<VecDeque<oneshot::Sender<usize>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,6 +192,7 @@ impl Window {
|
||||||
scale_factor: 1.0,
|
scale_factor: 1.0,
|
||||||
current_scene: None,
|
current_scene: None,
|
||||||
title: None,
|
title: None,
|
||||||
|
edited: false,
|
||||||
pending_prompts: Default::default(),
|
pending_prompts: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -258,6 +260,10 @@ impl super::Window for Window {
|
||||||
fn set_title(&mut self, title: &str) {
|
fn set_title(&mut self, title: &str) {
|
||||||
self.title = Some(title.to_string())
|
self.title = Some(title.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_edited(&mut self, edited: bool) {
|
||||||
|
self.edited = edited;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn platform() -> Platform {
|
pub fn platform() -> Platform {
|
||||||
|
|
|
@ -731,6 +731,7 @@ pub struct Workspace {
|
||||||
leader_state: LeaderState,
|
leader_state: LeaderState,
|
||||||
follower_states_by_leader: FollowerStatesByLeader,
|
follower_states_by_leader: FollowerStatesByLeader,
|
||||||
last_leaders_by_pane: HashMap<WeakViewHandle<Pane>, PeerId>,
|
last_leaders_by_pane: HashMap<WeakViewHandle<Pane>, PeerId>,
|
||||||
|
window_edited: bool,
|
||||||
_observe_current_user: Task<()>,
|
_observe_current_user: Task<()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -846,6 +847,7 @@ impl Workspace {
|
||||||
leader_state: Default::default(),
|
leader_state: Default::default(),
|
||||||
follower_states_by_leader: Default::default(),
|
follower_states_by_leader: Default::default(),
|
||||||
last_leaders_by_pane: Default::default(),
|
last_leaders_by_pane: Default::default(),
|
||||||
|
window_edited: false,
|
||||||
_observe_current_user,
|
_observe_current_user,
|
||||||
};
|
};
|
||||||
this.project_remote_id_changed(this.project.read(cx).remote_id(), cx);
|
this.project_remote_id_changed(this.project.read(cx).remote_id(), cx);
|
||||||
|
@ -1474,6 +1476,7 @@ impl Workspace {
|
||||||
if pane == self.active_pane {
|
if pane == self.active_pane {
|
||||||
self.active_item_path_changed(cx);
|
self.active_item_path_changed(cx);
|
||||||
}
|
}
|
||||||
|
self.update_window_edited(cx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1778,6 +1781,16 @@ impl Workspace {
|
||||||
cx.set_window_title(&title);
|
cx.set_window_title(&title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn update_window_edited(&mut self, cx: &mut ViewContext<Self>) {
|
||||||
|
let is_edited = self
|
||||||
|
.items(cx)
|
||||||
|
.any(|item| item.has_conflict(cx) || item.is_dirty(cx));
|
||||||
|
if is_edited != self.window_edited {
|
||||||
|
self.window_edited = is_edited;
|
||||||
|
cx.set_window_edited(self.window_edited)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn render_collaborators(&self, theme: &Theme, cx: &mut RenderContext<Self>) -> Vec<ElementBox> {
|
fn render_collaborators(&self, theme: &Theme, cx: &mut RenderContext<Self>) -> Vec<ElementBox> {
|
||||||
let mut collaborators = self
|
let mut collaborators = self
|
||||||
.project
|
.project
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue