Checkpoint
This commit is contained in:
@@ -4,11 +4,31 @@ use collections::{HashMap, HashSet};
|
||||
use std::any::Any;
|
||||
|
||||
pub trait Action: Any + Send + Sync {
|
||||
fn eq(&self, action: &dyn Action) -> bool;
|
||||
fn partial_eq(&self, action: &dyn Action) -> bool;
|
||||
fn boxed_clone(&self) -> Box<dyn Action>;
|
||||
fn as_any(&self) -> &dyn Any;
|
||||
}
|
||||
|
||||
impl<T> Action for T
|
||||
where
|
||||
T: Any + PartialEq + Clone + Send + Sync,
|
||||
{
|
||||
fn partial_eq(&self, action: &dyn Action) -> bool {
|
||||
action
|
||||
.as_any()
|
||||
.downcast_ref::<Self>()
|
||||
.map_or(false, |a| self == a)
|
||||
}
|
||||
|
||||
fn boxed_clone(&self) -> Box<dyn Action> {
|
||||
Box::new(self.clone())
|
||||
}
|
||||
|
||||
fn as_any(&self) -> &dyn Any {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default, Eq, PartialEq)]
|
||||
pub struct DispatchContext {
|
||||
set: HashSet<SharedString>,
|
||||
|
||||
@@ -63,7 +63,7 @@ impl KeyBinding {
|
||||
action: &dyn Action,
|
||||
contexts: &[&DispatchContext],
|
||||
) -> Option<SmallVec<[Keystroke; 2]>> {
|
||||
if self.action.eq(action) && self.matches_context(contexts) {
|
||||
if self.action.partial_eq(action) && self.matches_context(contexts) {
|
||||
Some(self.keystrokes.clone())
|
||||
} else {
|
||||
None
|
||||
|
||||
@@ -1,61 +1,18 @@
|
||||
use crate::themes::rose_pine;
|
||||
use gpui3::{
|
||||
div, view, Action, Context, Focusable, KeyBinding, ParentElement, StatelessInteractive, Styled,
|
||||
View, WindowContext,
|
||||
div, view, Context, Focusable, KeyBinding, ParentElement, StatelessInteractive, Styled, View,
|
||||
WindowContext,
|
||||
};
|
||||
use std::any::Any;
|
||||
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, PartialEq)]
|
||||
struct ActionA;
|
||||
|
||||
impl Action for ActionA {
|
||||
fn eq(&self, action: &dyn Action) -> bool {
|
||||
action.as_any().downcast_ref::<Self>().is_some()
|
||||
}
|
||||
|
||||
fn boxed_clone(&self) -> Box<dyn Action> {
|
||||
Box::new(self.clone())
|
||||
}
|
||||
|
||||
fn as_any(&self) -> &dyn Any {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, PartialEq)]
|
||||
struct ActionB;
|
||||
|
||||
impl Action for ActionB {
|
||||
fn eq(&self, action: &dyn Action) -> bool {
|
||||
action.as_any().downcast_ref::<Self>().is_some()
|
||||
}
|
||||
|
||||
fn boxed_clone(&self) -> Box<dyn Action> {
|
||||
Box::new(self.clone())
|
||||
}
|
||||
|
||||
fn as_any(&self) -> &dyn Any {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, PartialEq)]
|
||||
struct ActionC;
|
||||
|
||||
impl Action for ActionC {
|
||||
fn eq(&self, action: &dyn Action) -> bool {
|
||||
action.as_any().downcast_ref::<Self>().is_some()
|
||||
}
|
||||
|
||||
fn boxed_clone(&self) -> Box<dyn Action> {
|
||||
Box::new(self.clone())
|
||||
}
|
||||
|
||||
fn as_any(&self) -> &dyn Any {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub struct FocusStory {
|
||||
text: View<()>,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user