Skip to content
Snippets Groups Projects
Commit fd599bdd authored by StarArawn's avatar StarArawn
Browse files

Added proper mouse in and mouse out events.

parent b38b4f0f
No related branches found
No related tags found
No related merge requests found
...@@ -46,7 +46,6 @@ pub fn extract_nine_patch( ...@@ -46,7 +46,6 @@ pub fn extract_nine_patch(
let image = images.get(image_handle.as_ref().unwrap()); let image = images.get(image_handle.as_ref().unwrap());
if image.is_none() { if image.is_none() {
dbg!("Uh oh no image! :(");
continue; continue;
} }
......
...@@ -43,7 +43,6 @@ fn BlueButton(context: KayakContext, children: Children, styles: Option<Style>) ...@@ -43,7 +43,6 @@ fn BlueButton(context: KayakContext, children: Children, styles: Option<Style>)
}; };
let current_button_handle = *context.create_state::<u16>(blue_button_handle).unwrap(); let current_button_handle = *context.create_state::<u16>(blue_button_handle).unwrap();
dbg!(current_button_handle);
let button_styles = Style { let button_styles = Style {
width: StyleProp::Value(Units::Pixels(200.0)), width: StyleProp::Value(Units::Pixels(200.0)),
...@@ -57,14 +56,15 @@ fn BlueButton(context: KayakContext, children: Children, styles: Option<Style>) ...@@ -57,14 +56,15 @@ fn BlueButton(context: KayakContext, children: Children, styles: Option<Style>)
let button_id = self.get_id(); let button_id = self.get_id();
let on_event = OnEvent::new(move |context, event| match event.event_type { let on_event = OnEvent::new(move |context, event| match event.event_type {
EventType::Click => { EventType::MouseIn => {
dbg!("Clicked!");
context.set_current_id(button_id); context.set_current_id(button_id);
context.set_state::<u16>(blue_button_hover_handle); context.set_state::<u16>(blue_button_hover_handle);
} }
_ => { EventType::MouseOut => {
context.set_current_id(button_id);
context.set_state::<u16>(blue_button_handle); context.set_state::<u16>(blue_button_handle);
} }
_ => (),
}); });
rsx! { rsx! {
......
...@@ -5,10 +5,11 @@ use crate::{node::NodeIndex, widget_manager::WidgetManager, Event, EventType, In ...@@ -5,10 +5,11 @@ use crate::{node::NodeIndex, widget_manager::WidgetManager, Event, EventType, In
pub struct KayakContext { pub struct KayakContext {
component_states: HashMap<crate::Index, resources::Resources>, component_states: HashMap<crate::Index, resources::Resources>,
current_id: crate::Index, current_id: Index,
pub widget_manager: WidgetManager, pub widget_manager: WidgetManager,
last_mouse_position: (f32, f32), last_mouse_position: (f32, f32),
pub global_state: resources::Resources, pub global_state: resources::Resources,
previous_events: HashMap<Index, Option<EventType>>,
} }
impl std::fmt::Debug for KayakContext { impl std::fmt::Debug for KayakContext {
...@@ -27,6 +28,7 @@ impl KayakContext { ...@@ -27,6 +28,7 @@ impl KayakContext {
widget_manager: WidgetManager::new(), widget_manager: WidgetManager::new(),
last_mouse_position: (0.0, 0.0), last_mouse_position: (0.0, 0.0),
global_state: resources::Resources::default(), global_state: resources::Resources::default(),
previous_events: HashMap::new(),
} }
} }
...@@ -38,7 +40,6 @@ impl KayakContext { ...@@ -38,7 +40,6 @@ impl KayakContext {
&mut self, &mut self,
initial_state: T, initial_state: T,
) -> Option<Ref<T>> { ) -> Option<Ref<T>> {
dbg!(self.current_id);
if self.component_states.contains_key(&self.current_id) { if self.component_states.contains_key(&self.current_id) {
let states = self.component_states.get_mut(&self.current_id).unwrap(); let states = self.component_states.get_mut(&self.current_id).unwrap();
if !states.contains::<T>() { if !states.contains::<T>() {
...@@ -63,12 +64,10 @@ impl KayakContext { ...@@ -63,12 +64,10 @@ impl KayakContext {
} }
pub fn set_state<T: resources::Resource + Clone>(&mut self, state: T) { pub fn set_state<T: resources::Resource + Clone>(&mut self, state: T) {
dbg!(self.current_id);
if self.component_states.contains_key(&self.current_id) { if self.component_states.contains_key(&self.current_id) {
let states = self.component_states.get(&self.current_id).unwrap(); let states = self.component_states.get(&self.current_id).unwrap();
if states.contains::<T>() { if states.contains::<T>() {
let mut mutate_t = states.get_mut::<T>().unwrap(); let mut mutate_t = states.get_mut::<T>().unwrap();
dbg!("Mutating state!");
self.widget_manager.dirty_nodes.push(self.current_id); self.widget_manager.dirty_nodes.push(self.current_id);
*mutate_t = state; *mutate_t = state;
} else { } else {
...@@ -126,12 +125,51 @@ impl KayakContext { ...@@ -126,12 +125,51 @@ impl KayakContext {
InputEvent::MouseMoved(point) => { InputEvent::MouseMoved(point) => {
// Hover event. // Hover event.
if layout.contains(point) { if layout.contains(point) {
if Self::get_last_event(&self.previous_events, &index).is_none() {
let mouse_in_event = Event {
target: index,
event_type: EventType::MouseIn,
..Event::default()
};
events_stream.push(mouse_in_event);
Self::set_last_event(
&mut self.previous_events,
&index,
Some(EventType::MouseIn),
);
}
let hover_event = Event { let hover_event = Event {
target: index, target: index,
event_type: EventType::Hover, event_type: EventType::Hover,
..Event::default() ..Event::default()
}; };
events_stream.push(hover_event); events_stream.push(hover_event);
Self::set_last_event(
&mut self.previous_events,
&index,
Some(EventType::Hover),
);
} else {
if let Some(event) =
Self::get_last_event(&self.previous_events, &index)
{
if matches!(event, EventType::Hover)
| matches!(event, EventType::MouseIn)
{
let mouse_out_event = Event {
target: index,
event_type: EventType::MouseOut,
..Event::default()
};
events_stream.push(mouse_out_event);
Self::set_last_event(
&mut self.previous_events,
&index,
Some(EventType::MouseOut),
);
}
}
Self::set_last_event(&mut self.previous_events, &index, None);
} }
self.last_mouse_position = *point; self.last_mouse_position = *point;
} }
...@@ -170,6 +208,25 @@ impl KayakContext { ...@@ -170,6 +208,25 @@ impl KayakContext {
} }
} }
fn get_last_event(
previous_events: &HashMap<Index, Option<EventType>>,
widget_id: &Index,
) -> Option<EventType> {
if previous_events.contains_key(widget_id) {
previous_events.get(widget_id).and_then(|e| *e)
} else {
None
}
}
fn set_last_event(
previous_events: &mut HashMap<Index, Option<EventType>>,
widget_id: &Index,
event_type: Option<EventType>,
) {
previous_events.insert(*widget_id, event_type);
}
fn get_all_parents(&self, current: Index, parents: &mut Vec<Index>) { fn get_all_parents(&self, current: Index, parents: &mut Vec<Index>) {
if let Some(parent) = self.widget_manager.tree.parents.get(&current) { if let Some(parent) = self.widget_manager.tree.parents.get(&current) {
parents.push(*parent); parents.push(*parent);
......
...@@ -21,4 +21,6 @@ impl Default for Event { ...@@ -21,4 +21,6 @@ impl Default for Event {
pub enum EventType { pub enum EventType {
Click, Click,
Hover, Hover,
MouseIn,
MouseOut,
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment