mirror of
https://github.com/zed-industries/zed.git
synced 2024-11-10 14:06:11 +03:00
Checkpoint
This commit is contained in:
parent
180ed7da81
commit
673257bbbc
@ -1,8 +1,9 @@
|
||||
use crate::{
|
||||
BorrowWindow, Bounds, ElementId, FocusHandle, FocusListeners, LayoutId, Pixels, Point,
|
||||
StyleRefinement, ViewContext,
|
||||
BorrowWindow, Bounds, DispatchPhase, ElementId, FocusHandle, FocusListeners, LayoutId,
|
||||
MouseDownEvent, Pixels, Point, Style, StyleRefinement, ViewContext, WindowContext,
|
||||
};
|
||||
use derive_more::{Deref, DerefMut};
|
||||
use refineable::Refineable;
|
||||
pub(crate) use smallvec::SmallVec;
|
||||
use std::mem;
|
||||
|
||||
@ -75,6 +76,36 @@ pub trait ElementFocusability<V: 'static + Send + Sync>: 'static + Send + Sync {
|
||||
f(cx)
|
||||
}
|
||||
}
|
||||
|
||||
fn refine_style(&self, style: &mut Style, cx: &WindowContext) {
|
||||
if let Some(focusable) = self.as_focusable() {
|
||||
if focusable.focus_handle.contains_focused(cx) {
|
||||
style.refine(&focusable.focus_in_style);
|
||||
}
|
||||
|
||||
if focusable.focus_handle.within_focused(cx) {
|
||||
style.refine(&focusable.in_focus_style);
|
||||
}
|
||||
|
||||
if focusable.focus_handle.is_focused(cx) {
|
||||
style.refine(&focusable.focus_style);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn paint(&self, bounds: Bounds<Pixels>, cx: &mut WindowContext) {
|
||||
if let Some(focusable) = self.as_focusable() {
|
||||
let focus_handle = focusable.focus_handle.clone();
|
||||
cx.on_mouse_event(move |event: &MouseDownEvent, phase, cx| {
|
||||
if phase == DispatchPhase::Bubble && bounds.contains_point(&event.position) {
|
||||
if !cx.default_prevented() {
|
||||
cx.focus(&focus_handle);
|
||||
cx.prevent_default();
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Focusable<V: 'static + Send + Sync> {
|
||||
|
@ -197,19 +197,7 @@ where
|
||||
let mut computed_style = Style::default();
|
||||
computed_style.refine(&self.base_style);
|
||||
|
||||
if let Some(focusable) = self.focusability.as_focusable() {
|
||||
if focusable.focus_handle.contains_focused(cx) {
|
||||
computed_style.refine(&focusable.focus_in_style);
|
||||
}
|
||||
|
||||
if focusable.focus_handle.within_focused(cx) {
|
||||
computed_style.refine(&focusable.in_focus_style);
|
||||
}
|
||||
|
||||
if focusable.focus_handle.is_focused(cx) {
|
||||
computed_style.refine(&focusable.focus_style);
|
||||
}
|
||||
}
|
||||
self.focusability.refine_style(&mut computed_style, cx);
|
||||
|
||||
let mouse_position = cx.mouse_position();
|
||||
|
||||
@ -312,18 +300,6 @@ where
|
||||
});
|
||||
}
|
||||
|
||||
if let Some(focusable) = self.focusability.as_focusable() {
|
||||
let focus_handle = focusable.focus_handle.clone();
|
||||
cx.on_mouse_event(move |_, event: &MouseDownEvent, phase, cx| {
|
||||
if phase == DispatchPhase::Bubble && bounds.contains_point(&event.position) {
|
||||
if !cx.default_prevented() {
|
||||
cx.focus(&focus_handle);
|
||||
cx.prevent_default();
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
for listener in mem::take(&mut self.interactive_state.mouse_down) {
|
||||
cx.on_mouse_event(move |state, event: &MouseDownEvent, phase, cx| {
|
||||
listener(state, event, &bounds, phase, cx);
|
||||
@ -508,6 +484,7 @@ where
|
||||
element_state.active_state.clone(),
|
||||
cx,
|
||||
);
|
||||
this.focusability.paint(bounds, cx);
|
||||
this.paint_event_listeners(bounds, element_state.pending_click.clone(), cx);
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user