Skip to content

Commit

Permalink
using boolean is_mouse instead of 2 varient enum TouchOrMouse
Browse files Browse the repository at this point in the history
  • Loading branch information
clinuxrulz committed Jan 26, 2024
1 parent df90e44 commit 22ff52a
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 36 deletions.
75 changes: 48 additions & 27 deletions src/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,11 @@ use crate::{
VirtualJoystickType,
};

#[derive(Clone, Copy, Debug, Default, Reflect, PartialEq, Eq)]
pub enum TouchOrMouse {
#[default]
Touch,
Mouse,
}

#[derive(Event)]
pub enum InputEvent {
StartDrag { id: u64, pos: Vec2, touch_or_mouse: TouchOrMouse },
Dragging { id: u64, pos: Vec2, touch_or_mouse: TouchOrMouse },
EndDrag { id: u64, pos: Vec2, touch_or_mouse: TouchOrMouse },
StartDrag { id: u64, pos: Vec2, is_mouse: bool },
Dragging { id: u64, pos: Vec2, is_mouse: bool },
EndDrag { id: u64, pos: Vec2, is_mouse: bool },
}

fn is_some_and<T>(opt: Option<T>, cb: impl FnOnce(T) -> bool) -> bool {
Expand Down Expand Up @@ -52,9 +45,9 @@ pub fn update_input<S: VirtualJoystickID>(
}
for event in &input_events {
match event {
InputEvent::StartDrag { id, pos, touch_or_mouse } => {
if let Some(current_interaction_touch_or_mouse) = &knob.current_interaction_touch_or_mouse {
if *current_interaction_touch_or_mouse != *touch_or_mouse {
InputEvent::StartDrag { id, pos, is_mouse } => {
if let Some(current_iteraction_is_mouse) = &knob.current_iteraction_is_mouse {
if *current_iteraction_is_mouse != *is_mouse {
continue;
}
}
Expand All @@ -66,7 +59,7 @@ pub fn update_input<S: VirtualJoystickID>(
knob.start_pos = *pos;
knob.current_pos = *pos;
knob.delta = Vec2::ZERO;
knob.current_interaction_touch_or_mouse = Some(*touch_or_mouse);
knob.current_iteraction_is_mouse = Some(*is_mouse);
send_values.send(VirtualJoystickEvent {
id: node.id.clone(),
event: VirtualJoystickEventType::Press,
Expand All @@ -76,9 +69,9 @@ pub fn update_input<S: VirtualJoystickID>(
});
}
}
InputEvent::Dragging { id, pos, touch_or_mouse } => {
if let Some(current_interaction_touch_or_mouse) = &knob.current_interaction_touch_or_mouse {
if *current_interaction_touch_or_mouse != *touch_or_mouse {
InputEvent::Dragging { id, pos, is_mouse } => {
if let Some(current_iteraction_is_mouse) = &knob.current_iteraction_is_mouse {
if *current_iteraction_is_mouse != *is_mouse {
continue;
}
}
Expand All @@ -102,9 +95,13 @@ pub fn update_input<S: VirtualJoystickID>(
d.y.signum() * d.y.abs().min(1.),
);
}
InputEvent::EndDrag { id, pos: _, touch_or_mouse } => {
if let Some(current_interaction_touch_or_mouse) = &knob.current_interaction_touch_or_mouse {
if *current_interaction_touch_or_mouse != *touch_or_mouse {
InputEvent::EndDrag {
id,
pos: _,
is_mouse,
} => {
if let Some(current_iteraction_is_mouse) = &knob.current_iteraction_is_mouse {
if *current_iteraction_is_mouse != *is_mouse {
continue;
}
}
Expand All @@ -116,7 +113,7 @@ pub fn update_input<S: VirtualJoystickID>(
knob.start_pos = Vec2::ZERO;
knob.current_pos = Vec2::ZERO;
knob.delta = Vec2::ZERO;
knob.current_interaction_touch_or_mouse = None;
knob.current_iteraction_is_mouse = None;
send_values.send(VirtualJoystickEvent {
id: node.id.clone(),
event: VirtualJoystickEventType::Up,
Expand Down Expand Up @@ -156,15 +153,27 @@ pub fn update_joystick(
match phase {
// Start drag
TouchPhase::Started => {
send_values.send(InputEvent::StartDrag { id: *id, pos: *pos, touch_or_mouse: TouchOrMouse::Touch });
send_values.send(InputEvent::StartDrag {
id: *id,
pos: *pos,
is_mouse: false,
});
}
// Dragging
TouchPhase::Moved => {
send_values.send(InputEvent::Dragging { id: *id, pos: *pos, touch_or_mouse: TouchOrMouse::Touch });
send_values.send(InputEvent::Dragging {
id: *id,
pos: *pos,
is_mouse: false,
});
}
// End drag
TouchPhase::Ended | TouchPhase::Canceled => {
send_values.send(InputEvent::EndDrag { id: *id, pos: *pos, touch_or_mouse: TouchOrMouse::Touch });
send_values.send(InputEvent::EndDrag {
id: *id,
pos: *pos,
is_mouse: false,
});
}
}
}
Expand All @@ -182,17 +191,29 @@ pub fn update_joystick_by_mouse(
for mousebtn in mousebtn_evr.read() {
// End drag
if mousebtn.button == MouseButton::Left && mousebtn.state == ButtonState::Released {
send_values.send(InputEvent::EndDrag { id: 0, pos, touch_or_mouse: TouchOrMouse::Mouse });
send_values.send(InputEvent::EndDrag {
id: 0,
pos,
is_mouse: true,
});
}

// Start drag
if mousebtn.button == MouseButton::Left && mousebtn.state == ButtonState::Pressed {
send_values.send(InputEvent::StartDrag { id: 0, pos, touch_or_mouse: TouchOrMouse::Mouse });
send_values.send(InputEvent::StartDrag {
id: 0,
pos,
is_mouse: true,
});
}
}

// Dragging
if mouse_button_input.pressed(MouseButton::Left) {
send_values.send(InputEvent::Dragging { id: 0, pos, touch_or_mouse: TouchOrMouse::Mouse });
send_values.send(InputEvent::Dragging {
id: 0,
pos,
is_mouse: true,
});
}
}
9 changes: 2 additions & 7 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,10 @@ impl<S: VirtualJoystickID> Plugin for VirtualJoystickPlugin<S> {
.register_type::<VirtualJoystickEventType>()
.add_event::<VirtualJoystickEvent<S>>()
.add_event::<InputEvent>()
.add_systems(PreUpdate, update_joystick.before(update_input::<S>))
.add_systems(
PreUpdate,
update_joystick
.before(update_input::<S>),
)
.add_systems(
PreUpdate,
update_joystick_by_mouse
.before(update_input::<S>),
update_joystick_by_mouse.before(update_input::<S>),
)
.add_systems(PreUpdate, update_input::<S>)
.add_systems(
Expand Down
7 changes: 5 additions & 2 deletions src/ui/bundles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use bevy::{prelude::*, ui::RelativeCursorPosition};
#[cfg(feature = "inspect")]
use bevy_inspector_egui::prelude::*;

use crate::{input::TouchOrMouse, VirtualJoystickAxis, VirtualJoystickID, VirtualJoystickType};
use crate::{VirtualJoystickAxis, VirtualJoystickID, VirtualJoystickType};

#[derive(Component, Clone, Debug, Default, Reflect)]
#[reflect(Component, Default)]
Expand Down Expand Up @@ -70,7 +70,10 @@ pub struct VirtualJoystickData {
pub current_pos: Vec2,
pub delta: Vec2,
pub interactable_zone_rect: Rect,
pub current_interaction_touch_or_mouse: Option<TouchOrMouse>,
/// None means no current interaction<br/>
/// Some(false) means current interaction is touch<br/>
/// Some(true) means current interaction is mouse
pub current_iteraction_is_mouse: Option<bool>,
}

impl<S: VirtualJoystickID> VirtualJoystickBundle<S> {
Expand Down

0 comments on commit 22ff52a

Please sign in to comment.