Refactor GoToLine to use cx.observe_new_views()
This commit is contained in:
parent
cbdd4aca89
commit
1b9f76c01d
11 changed files with 136 additions and 65 deletions
|
@ -407,6 +407,14 @@ impl Dock {
|
|||
// }
|
||||
}
|
||||
|
||||
impl Render for Dock {
|
||||
type Element = Div<Self>;
|
||||
|
||||
fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
// todo!()
|
||||
// impl View for Dock {
|
||||
// fn ui_name() -> &'static str {
|
||||
|
|
|
@ -1,25 +1,15 @@
|
|||
use crate::Workspace;
|
||||
use gpui::{
|
||||
div, px, AnyView, AppContext, Component, Div, EventEmitter, ParentElement, Render,
|
||||
StatelessInteractive, Styled, Subscription, View, ViewContext, WeakView,
|
||||
div, px, AnyView, Component, Div, EventEmitter, ParentElement, Render, StatelessInteractive,
|
||||
Styled, Subscription, View, ViewContext,
|
||||
};
|
||||
use std::{any::TypeId, sync::Arc};
|
||||
use ui::v_stack;
|
||||
|
||||
pub struct ModalRegistry {
|
||||
registered_modals: Vec<(TypeId, Box<dyn Fn(Div<Workspace>) -> Div<Workspace>>)>,
|
||||
}
|
||||
|
||||
pub struct ModalLayer {
|
||||
workspace: WeakView<Workspace>,
|
||||
open_modal: Option<AnyView>,
|
||||
subscription: Option<Subscription>,
|
||||
}
|
||||
|
||||
pub fn init_modal_registry(cx: &mut AppContext) {
|
||||
cx.set_global(ModalRegistry {
|
||||
registered_modals: Vec::new(),
|
||||
});
|
||||
registered_modals: Vec<(TypeId, Box<dyn Fn(Div<Workspace>) -> Div<Workspace>>)>,
|
||||
}
|
||||
|
||||
pub enum ModalEvent {
|
||||
|
@ -30,7 +20,15 @@ pub trait Modal: EventEmitter + Render {
|
|||
fn to_modal_event(&self, _: &Self::Event) -> Option<ModalEvent>;
|
||||
}
|
||||
|
||||
impl ModalRegistry {
|
||||
impl ModalLayer {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
open_modal: None,
|
||||
subscription: None,
|
||||
registered_modals: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn register_modal<A: 'static, V, B>(&mut self, action: A, build_view: B)
|
||||
where
|
||||
V: Modal,
|
||||
|
@ -44,32 +42,19 @@ impl ModalRegistry {
|
|||
let build_view = build_view.clone();
|
||||
|
||||
div.on_action(move |workspace, event: &A, cx| {
|
||||
let Some(new_modal) =
|
||||
(build_view)(workspace, cx) else {
|
||||
return
|
||||
};
|
||||
workspace.modal_layer.update(cx, |modal_layer, cx| {
|
||||
modal_layer.show_modal(new_modal, cx);
|
||||
})
|
||||
let Some(new_modal) = (build_view)(workspace, cx) else {
|
||||
return;
|
||||
};
|
||||
workspace.modal_layer().show_modal(new_modal, cx);
|
||||
})
|
||||
}),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
impl ModalLayer {
|
||||
pub fn new(workspace: WeakView<Workspace>) -> Self {
|
||||
Self {
|
||||
workspace,
|
||||
open_modal: None,
|
||||
subscription: None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn show_modal<V: Modal>(&mut self, new_modal: View<V>, cx: &mut ViewContext<Self>) {
|
||||
pub fn show_modal<V: Modal>(&mut self, new_modal: View<V>, cx: &mut ViewContext<Workspace>) {
|
||||
self.subscription = Some(cx.subscribe(&new_modal, |this, modal, e, cx| {
|
||||
match modal.read(cx).to_modal_event(e) {
|
||||
Some(ModalEvent::Dismissed) => this.hide_modal(cx),
|
||||
Some(ModalEvent::Dismissed) => this.modal_layer().hide_modal(cx),
|
||||
None => {}
|
||||
}
|
||||
}));
|
||||
|
@ -77,16 +62,16 @@ impl ModalLayer {
|
|||
cx.notify();
|
||||
}
|
||||
|
||||
pub fn hide_modal(&mut self, cx: &mut ViewContext<Self>) {
|
||||
pub fn hide_modal(&mut self, cx: &mut ViewContext<Workspace>) {
|
||||
self.open_modal.take();
|
||||
self.subscription.take();
|
||||
cx.notify();
|
||||
}
|
||||
|
||||
pub fn render(&self, cx: &ViewContext<Workspace>) -> Div<Workspace> {
|
||||
pub fn wrapper_element(&self, cx: &ViewContext<Workspace>) -> Div<Workspace> {
|
||||
let mut parent = div().relative().size_full();
|
||||
|
||||
for (_, action) in cx.global::<ModalRegistry>().registered_modals.iter() {
|
||||
for (_, action) in self.registered_modals.iter() {
|
||||
parent = (action)(parent);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use crate::ItemHandle;
|
||||
use gpui::{
|
||||
AnyView, AppContext, Entity, EntityId, EventEmitter, Render, View, ViewContext, WindowContext,
|
||||
AnyView, AppContext, Div, Entity, EntityId, EventEmitter, Render, View, ViewContext,
|
||||
WindowContext,
|
||||
};
|
||||
|
||||
pub trait ToolbarItemView: Render + EventEmitter {
|
||||
|
@ -56,6 +57,14 @@ pub struct Toolbar {
|
|||
items: Vec<(Box<dyn ToolbarItemViewHandle>, ToolbarItemLocation)>,
|
||||
}
|
||||
|
||||
impl Render for Toolbar {
|
||||
type Element = Div<Self>;
|
||||
|
||||
fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
// todo!()
|
||||
// impl View for Toolbar {
|
||||
// fn ui_name() -> &'static str {
|
||||
|
|
|
@ -37,10 +37,10 @@ use futures::{
|
|||
};
|
||||
use gpui::{
|
||||
div, point, size, AnyModel, AnyView, AnyWeakView, AppContext, AsyncAppContext,
|
||||
AsyncWindowContext, Bounds, Component, Div, Entity, EntityId, EventEmitter, FocusHandle,
|
||||
GlobalPixels, Model, ModelContext, ParentElement, Point, Render, Size, StatefulInteractive,
|
||||
Styled, Subscription, Task, View, ViewContext, VisualContext, WeakView, WindowBounds,
|
||||
WindowContext, WindowHandle, WindowOptions,
|
||||
AsyncWindowContext, Bounds, Component, Context, Div, Entity, EntityId, EventEmitter,
|
||||
FocusHandle, GlobalPixels, Model, ModelContext, ParentElement, Point, Render, Size,
|
||||
StatefulInteractive, Styled, Subscription, Task, View, ViewContext, VisualContext, WeakView,
|
||||
WindowBounds, WindowContext, WindowHandle, WindowOptions,
|
||||
};
|
||||
use item::{FollowableItem, FollowableItemHandle, Item, ItemHandle, ItemSettings, ProjectItem};
|
||||
use itertools::Itertools;
|
||||
|
@ -225,7 +225,6 @@ pub fn init_settings(cx: &mut AppContext) {
|
|||
|
||||
pub fn init(app_state: Arc<AppState>, cx: &mut AppContext) {
|
||||
init_settings(cx);
|
||||
init_modal_registry(cx);
|
||||
pane::init(cx);
|
||||
notifications::init(cx);
|
||||
|
||||
|
@ -545,7 +544,7 @@ pub struct Workspace {
|
|||
last_active_center_pane: Option<WeakView<Pane>>,
|
||||
last_active_view_id: Option<proto::ViewId>,
|
||||
status_bar: View<StatusBar>,
|
||||
modal_layer: View<ModalLayer>,
|
||||
modal_layer: ModalLayer,
|
||||
// titlebar_item: Option<AnyViewHandle>,
|
||||
notifications: Vec<(TypeId, usize, Box<dyn NotificationHandle>)>,
|
||||
project: Model<Project>,
|
||||
|
@ -697,7 +696,7 @@ impl Workspace {
|
|||
});
|
||||
|
||||
let workspace_handle = cx.view().downgrade();
|
||||
let modal_layer = cx.build_view(|cx| ModalLayer::new(workspace_handle));
|
||||
let modal_layer = ModalLayer::new();
|
||||
|
||||
// todo!()
|
||||
// cx.update_default_global::<DragAndDrop<Workspace>, _, _>(|drag_and_drop, _| {
|
||||
|
@ -781,6 +780,10 @@ impl Workspace {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn modal_layer(&mut self) -> &mut ModalLayer {
|
||||
&mut self.modal_layer
|
||||
}
|
||||
|
||||
fn new_local(
|
||||
abs_paths: Vec<PathBuf>,
|
||||
app_state: Arc<AppState>,
|
||||
|
@ -3707,9 +3710,9 @@ impl Render for Workspace {
|
|||
.bg(cx.theme().colors().background)
|
||||
.child(self.render_titlebar(cx))
|
||||
.child(
|
||||
// todo! should this be a component a view?
|
||||
self.modal_layer
|
||||
.read(cx)
|
||||
.render(cx)
|
||||
.wrapper_element(cx)
|
||||
.relative()
|
||||
.flex_1()
|
||||
.w_full()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue