
This is the core change: https://github.com/zed-industries/zed/pull/26758/files#diff-044302c0d57147af17e68a0009fee3e8dcdfb4f32c27a915e70cfa80e987f765R1052 TODO: - [x] Use AsyncFn instead of Fn() -> Future in GPUI spawn methods - [x] Implement it in the whole app - [x] Implement it in the debugger - [x] Glance at the RPC crate, and see if those box future methods can be switched over. Answer: It can't directly, as you can't make an AsyncFn* into a trait object. There's ways around that, but they're all more complex than just keeping the code as is. - [ ] Fix platform specific code Release Notes: - N/A
80 lines
2.1 KiB
Rust
80 lines
2.1 KiB
Rust
use std::time::Duration;
|
|
|
|
use anyhow::Result;
|
|
|
|
use dap::client::SessionId;
|
|
use gpui::{
|
|
percentage, Animation, AnimationExt, Entity, EventEmitter, FocusHandle, Focusable, Task,
|
|
Transformation,
|
|
};
|
|
use project::debugger::session::Session;
|
|
use ui::{v_flex, Color, Context, Icon, IconName, IntoElement, ParentElement, Render, Styled};
|
|
|
|
pub(crate) struct StartingState {
|
|
focus_handle: FocusHandle,
|
|
pub(super) session_id: SessionId,
|
|
_notify_parent: Task<()>,
|
|
}
|
|
|
|
pub(crate) enum StartingEvent {
|
|
Failed,
|
|
Finished(Entity<Session>),
|
|
}
|
|
|
|
impl EventEmitter<StartingEvent> for StartingState {}
|
|
|
|
impl StartingState {
|
|
pub(crate) fn new(
|
|
session_id: SessionId,
|
|
task: Task<Result<Entity<Session>>>,
|
|
cx: &mut Context<Self>,
|
|
) -> Self {
|
|
let _notify_parent = cx.spawn(async move |this, cx| {
|
|
let entity = task.await;
|
|
|
|
this.update(cx, |_, cx| {
|
|
if let Ok(entity) = entity {
|
|
cx.emit(StartingEvent::Finished(entity))
|
|
} else {
|
|
cx.emit(StartingEvent::Failed)
|
|
}
|
|
})
|
|
.ok();
|
|
});
|
|
Self {
|
|
session_id,
|
|
focus_handle: cx.focus_handle(),
|
|
_notify_parent,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Focusable for StartingState {
|
|
fn focus_handle(&self, _: &ui::App) -> FocusHandle {
|
|
self.focus_handle.clone()
|
|
}
|
|
}
|
|
|
|
impl Render for StartingState {
|
|
fn render(
|
|
&mut self,
|
|
_window: &mut ui::Window,
|
|
_cx: &mut ui::Context<'_, Self>,
|
|
) -> impl ui::IntoElement {
|
|
v_flex()
|
|
.size_full()
|
|
.gap_1()
|
|
.items_center()
|
|
.child("Starting a debug adapter")
|
|
.child(
|
|
Icon::new(IconName::ArrowCircle)
|
|
.color(Color::Info)
|
|
.with_animation(
|
|
"arrow-circle",
|
|
Animation::new(Duration::from_secs(2)).repeat(),
|
|
|icon, delta| icon.transform(Transformation::rotate(percentage(delta))),
|
|
)
|
|
.into_any_element(),
|
|
)
|
|
}
|
|
}
|