Skip to content

Commit

Permalink
refactor: hover states in selector and typewriter (#1318)
Browse files Browse the repository at this point in the history
  • Loading branch information
flxzt authored Dec 14, 2024
1 parent 6630376 commit d3758fb
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 118 deletions.
113 changes: 64 additions & 49 deletions crates/rnote-engine/src/pens/selector/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ pub(super) enum ResizeCorner {

#[derive(Clone, Copy, Debug, PartialEq)]
pub(super) enum ModifyState {
Up,
Hover(na::Vector2<f64>),
Idle,
Translate {
start_pos: na::Vector2<f64>,
current_pos: na::Vector2<f64>,
Expand All @@ -58,7 +57,7 @@ pub(super) enum ModifyState {

impl Default for ModifyState {
fn default() -> Self {
Self::Up
Self::Idle
}
}

Expand All @@ -84,12 +83,14 @@ impl Default for SelectorState {
#[derive(Clone, Debug)]
pub struct Selector {
pub(super) state: SelectorState,
pos: Option<na::Vector2<f64>>,
}

impl Default for Selector {
fn default() -> Self {
Self {
state: SelectorState::default(),
state: Default::default(),
pos: None,
}
}
}
Expand Down Expand Up @@ -430,6 +431,7 @@ impl DrawableOnDoc for Selector {
cx,
*selection_bounds,
modify_state,
self.pos,
engine_view.camera,
)?;

Expand Down Expand Up @@ -540,90 +542,103 @@ impl Selector {
piet_cx: &mut impl RenderContext,
selection_bounds: Aabb,
modify_state: &ModifyState,
pos: Option<na::Vector2<f64>>,
camera: &Camera,
) -> anyhow::Result<()> {
piet_cx.save().map_err(|e| anyhow::anyhow!("{e:?}"))?;
let total_zoom = camera.total_zoom();

let rotate_node_sphere = Self::rotate_node_sphere(selection_bounds, camera);
let rotate_node_state = match modify_state {
ModifyState::Rotate { .. } => PenState::Down,
ModifyState::Hover(pos) => {
if rotate_node_sphere.contains_local_point(&(*pos).into()) {
PenState::Proximity
} else {
PenState::Up
}
let rotate_node_state = if matches!(modify_state, ModifyState::Rotate { .. }) {
PenState::Down
} else if let Some(pos) = pos {
if rotate_node_sphere.contains_local_point(&pos.into()) {
PenState::Proximity
} else {
PenState::Up
}
_ => PenState::Up,
} else {
PenState::Up
};

let resize_tl_node_bounds =
Self::resize_node_bounds(ResizeCorner::TopLeft, selection_bounds, camera);
let resize_tl_node_state = match modify_state {
let resize_tl_node_state = if matches!(
modify_state,
ModifyState::Resize {
from_corner: ResizeCorner::TopLeft,
..
} => PenState::Down,
ModifyState::Hover(pos) => {
if resize_tl_node_bounds.contains_local_point(&(*pos).into()) {
PenState::Proximity
} else {
PenState::Up
}
}
_ => PenState::Up,
) {
PenState::Down
} else if let Some(pos) = pos {
if resize_tl_node_bounds.contains_local_point(&pos.into()) {
PenState::Proximity
} else {
PenState::Up
}
} else {
PenState::Up
};

let resize_tr_node_bounds =
Self::resize_node_bounds(ResizeCorner::TopRight, selection_bounds, camera);
let resize_tr_node_state = match modify_state {
let resize_tr_node_state = if matches!(
modify_state,
ModifyState::Resize {
from_corner: ResizeCorner::TopRight,
..
} => PenState::Down,
ModifyState::Hover(pos) => {
if resize_tr_node_bounds.contains_local_point(&(*pos).into()) {
PenState::Proximity
} else {
PenState::Up
}
}
_ => PenState::Up,
) {
PenState::Down
} else if let Some(pos) = pos {
if resize_tr_node_bounds.contains_local_point(&pos.into()) {
PenState::Proximity
} else {
PenState::Up
}
} else {
PenState::Up
};

let resize_bl_node_bounds =
Self::resize_node_bounds(ResizeCorner::BottomLeft, selection_bounds, camera);
let resize_bl_node_state = match modify_state {
let resize_bl_node_state = if matches!(
modify_state,
ModifyState::Resize {
from_corner: ResizeCorner::BottomLeft,
..
} => PenState::Down,
ModifyState::Hover(pos) => {
if resize_bl_node_bounds.contains_local_point(&(*pos).into()) {
PenState::Proximity
} else {
PenState::Up
}
}
_ => PenState::Up,
) {
PenState::Down
} else if let Some(pos) = pos {
if resize_bl_node_bounds.contains_local_point(&pos.into()) {
PenState::Proximity
} else {
PenState::Up
}
} else {
PenState::Up
};

let resize_br_node_bounds =
Self::resize_node_bounds(ResizeCorner::BottomRight, selection_bounds, camera);
let resize_br_node_state = match modify_state {
let resize_br_node_state = if matches!(
modify_state,
ModifyState::Resize {
from_corner: ResizeCorner::BottomRight,
..
} => PenState::Down,
ModifyState::Hover(pos) => {
if resize_br_node_bounds.contains_local_point(&(*pos).into()) {
PenState::Proximity
} else {
PenState::Up
}
}
_ => PenState::Up,
) {
PenState::Down
} else if let Some(pos) = pos {
if resize_br_node_bounds.contains_local_point(&pos.into()) {
PenState::Proximity
} else {
PenState::Up
}
} else {
PenState::Up
};

// Selection rect
Expand Down
33 changes: 12 additions & 21 deletions crates/rnote-engine/src/pens/selector/penevents.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use crate::engine::EngineViewMut;
use crate::pens::pensconfig::selectorconfig::SelectorStyle;
use crate::snap::SnapCorner;
use crate::store::StrokeKey;
use crate::{DrawableOnDoc, WidgetFlags};
use crate::WidgetFlags;
use p2d::bounding_volume::Aabb;
use p2d::query::PointQuery;
use rnote_compose::eventresult::{EventPropagation, EventResult};
Expand All @@ -23,6 +23,7 @@ impl Selector {
engine_view: &mut EngineViewMut,
) -> (EventResult<PenProgress>, WidgetFlags) {
let mut widget_flags = WidgetFlags::default();
self.pos = Some(element.pos);

let event_result = match &mut self.state {
SelectorState::Idle => {
Expand Down Expand Up @@ -77,7 +78,7 @@ impl Selector {
let mut progress = PenProgress::InProgress;

match modify_state {
ModifyState::Up | ModifyState::Hover(_) => {
ModifyState::Idle => {
// If we click on another, not-already selected stroke while in separate style or
// while pressing Shift, we add it to the selection
let key_to_add = engine_view
Expand Down Expand Up @@ -414,7 +415,7 @@ impl Selector {
engine_view: &mut EngineViewMut,
) -> (EventResult<PenProgress>, WidgetFlags) {
let mut widget_flags = WidgetFlags::default();
let selector_bounds = self.bounds_on_doc(&engine_view.as_im());
self.pos = Some(element.pos);

let event_result = match &mut self.state {
SelectorState::Idle => EventResult {
Expand Down Expand Up @@ -529,14 +530,7 @@ impl Selector {
_ => {}
}

*modify_state = if selector_bounds
.map(|b| b.contains_local_point(&element.pos.into()))
.unwrap_or(false)
{
ModifyState::Hover(element.pos)
} else {
ModifyState::Up
};
*modify_state = ModifyState::Idle;

EventResult {
handled: true,
Expand All @@ -554,10 +548,10 @@ impl Selector {
element: Element,
_modifier_keys: HashSet<ModifierKey>,
_now: Instant,
engine_view: &mut EngineViewMut,
_engine_view: &mut EngineViewMut,
) -> (EventResult<PenProgress>, WidgetFlags) {
let widget_flags = WidgetFlags::default();
let selector_bounds = self.bounds_on_doc(&engine_view.as_im());
self.pos = Some(element.pos);

let event_result = match &mut self.state {
SelectorState::Idle => EventResult {
Expand All @@ -571,14 +565,8 @@ impl Selector {
progress: PenProgress::InProgress,
},
SelectorState::ModifySelection { modify_state, .. } => {
*modify_state = if selector_bounds
.map(|b| b.contains_local_point(&element.pos.into()))
.unwrap_or(false)
{
ModifyState::Hover(element.pos)
} else {
ModifyState::Up
};
*modify_state = ModifyState::Idle;

EventResult {
handled: true,
propagate: EventPropagation::Stop,
Expand All @@ -598,6 +586,7 @@ impl Selector {
engine_view: &mut EngineViewMut,
) -> (EventResult<PenProgress>, WidgetFlags) {
let mut widget_flags = WidgetFlags::default();
self.pos = None;

let event_result = match &mut self.state {
SelectorState::Idle => match keyboard_key {
Expand Down Expand Up @@ -700,6 +689,7 @@ impl Selector {
_engine_view: &mut EngineViewMut,
) -> (EventResult<PenProgress>, WidgetFlags) {
let widget_flags = WidgetFlags::default();
self.pos = None;

let event_result = match &mut self.state {
SelectorState::Idle => EventResult {
Expand Down Expand Up @@ -728,6 +718,7 @@ impl Selector {
engine_view: &mut EngineViewMut,
) -> (EventResult<PenProgress>, WidgetFlags) {
let mut widget_flags = WidgetFlags::default();
self.pos = None;

let event_result = match &mut self.state {
SelectorState::Idle => EventResult {
Expand Down
Loading

0 comments on commit d3758fb

Please sign in to comment.