Skip to content

Commit 6b81f07

Browse files
authored
wgui: Swipe kinetic scrolling support (#504)
* wgui: use DeviceBitmask instead of usize * wgui: Swipe logic works (wip) * wgui: Kinetic scrolling, rubberband effect
1 parent 9734955 commit 6b81f07

13 files changed

Lines changed: 326 additions & 102 deletions

File tree

dash-frontend/src/util/networking/skymap_catalog.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
1-
#![allow(dead_code)]
2-
use std::path::PathBuf;
3-
4-
// TODO: Remove later
1+
use crate::util::networking::{self, WAYVR_SKYMAPS_ROOT, http_client};
52
use serde::{Deserialize, Serialize};
3+
use std::path::PathBuf;
64
use wlx_common::{async_executor::AsyncExecutor, config_io};
7-
8-
use crate::util::networking::{self, WAYVR_SKYMAPS_ROOT, http_client};
9-
105
pub type SkymapUuid = uuid::Uuid;
116

127
#[derive(Copy, Clone, Serialize, Deserialize, Debug)]

dash-frontend/src/util/wgui_simple.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ pub fn create_button(par: CreateButtonParams) -> anyhow::Result<()> {
4545
Ok(())
4646
}
4747

48+
#[allow(dead_code)]
4849
pub fn create_label(layout: &mut Layout, id_parent: WidgetID, content: Translation) -> anyhow::Result<()> {
4950
let label = WidgetLabel::create(
5051
&mut layout.state,

uidev/src/main.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
143143
&wgui::event::Event::MouseWheel(MouseWheelEvent {
144144
delta: Vec2::new(x, y),
145145
pos: mouse / scale,
146-
device: 0,
146+
device: wgui::event::DeviceBitmask(0),
147147
}),
148148
&mut (),
149149
&mut (),
@@ -157,7 +157,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
157157
&wgui::event::Event::MouseWheel(MouseWheelEvent {
158158
delta: Vec2::new(pos.x as f32 / 5.0, pos.y as f32 / 5.0),
159159
pos: mouse / scale,
160-
device: 0,
160+
device: wgui::event::DeviceBitmask(0),
161161
}),
162162
&mut (),
163163
&mut (),
@@ -177,7 +177,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
177177
&wgui::event::Event::MouseDown(MouseButtonEvent {
178178
pos: mouse / scale,
179179
index: MouseButtonIndex::Left,
180-
device: 0,
180+
device: wgui::event::DeviceBitmask(0),
181181
}),
182182
&mut (),
183183
&mut (),
@@ -190,7 +190,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
190190
&wgui::event::Event::MouseUp(MouseButtonEvent {
191191
pos: mouse / scale,
192192
index: MouseButtonIndex::Left,
193-
device: 0,
193+
device: wgui::event::DeviceBitmask(0),
194194
}),
195195
&mut (),
196196
&mut (),
@@ -209,7 +209,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
209209
.push_event(
210210
&wgui::event::Event::MouseMotion(MouseMotionEvent {
211211
pos: mouse / scale,
212-
device: 0,
212+
device: wgui::event::DeviceBitmask(0),
213213
}),
214214
&mut (),
215215
&mut (),

wayvr/src/gui/panel/mod.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use wgui::{
2222
slider::ComponentSlider,
2323
},
2424
event::{
25-
Event as WguiEvent, EventCallback, EventListenerID, EventListenerKind,
25+
DeviceBitmask, Event as WguiEvent, EventCallback, EventListenerID, EventListenerKind,
2626
InternalStateChangeEvent, MouseButtonEvent, MouseButtonIndex, MouseLeaveEvent,
2727
MouseMotionEvent, MouseWheelEvent,
2828
},
@@ -368,15 +368,15 @@ impl<S: 'static> OverlayBackend for GuiPanel<S> {
368368
let e = WguiEvent::MouseWheel(MouseWheelEvent {
369369
delta: vec2(delta.x, delta.y) / 8.0,
370370
pos: hit.uv * self.layout.content_size,
371-
device: hit.pointer,
371+
device: DeviceBitmask::from_usize(hit.pointer),
372372
});
373373
self.push_event(app, &e);
374374
}
375375

376376
fn on_hover(&mut self, app: &mut AppState, hit: &PointerHit) -> HoverResult {
377377
let e = &WguiEvent::MouseMotion(MouseMotionEvent {
378378
pos: hit.uv * self.layout.content_size,
379-
device: hit.pointer,
379+
device: DeviceBitmask::from_usize(hit.pointer),
380380
});
381381

382382
self.has_focus[hit.pointer] = true;
@@ -397,7 +397,9 @@ impl<S: 'static> OverlayBackend for GuiPanel<S> {
397397
}
398398

399399
fn on_left(&mut self, app: &mut AppState, pointer: usize) {
400-
let e = WguiEvent::MouseLeave(MouseLeaveEvent { device: pointer });
400+
let e = WguiEvent::MouseLeave(MouseLeaveEvent {
401+
device: DeviceBitmask::from_usize(pointer),
402+
});
401403
self.has_focus[pointer] = false;
402404
self.push_event(app, &e);
403405
}
@@ -414,13 +416,13 @@ impl<S: 'static> OverlayBackend for GuiPanel<S> {
414416
WguiEvent::MouseDown(MouseButtonEvent {
415417
pos: hit.uv * self.layout.content_size,
416418
index,
417-
device: hit.pointer,
419+
device: DeviceBitmask::from_usize(hit.pointer),
418420
})
419421
} else {
420422
WguiEvent::MouseUp(MouseButtonEvent {
421423
pos: hit.uv * self.layout.content_size,
422424
index,
423-
device: hit.pointer,
425+
device: DeviceBitmask::from_usize(hit.pointer),
424426
})
425427
};
426428
self.push_event(app, &e);
@@ -429,11 +431,11 @@ impl<S: 'static> OverlayBackend for GuiPanel<S> {
429431
if !pressed && !self.has_focus[hit.pointer] {
430432
let e = WguiEvent::MouseMotion(MouseMotionEvent {
431433
pos: vec2(-1., -1.),
432-
device: hit.pointer,
434+
device: DeviceBitmask::from_usize(hit.pointer),
433435
});
434436
self.push_event(app, &e);
435437
let e = WguiEvent::MouseLeave(MouseLeaveEvent {
436-
device: hit.pointer,
438+
device: DeviceBitmask::from_usize(hit.pointer),
437439
});
438440
self.push_event(app, &e);
439441
}

wayvr/src/ipc/event_queue.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![allow(dead_code)]
2-
31
use std::{cell::RefCell, collections::VecDeque, rc::Rc};
42

53
#[derive(Debug)]

wayvr/src/overlays/dashboard.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use wayvr_ipc::{
88
};
99
use wgui::{
1010
event::{
11-
Event as WguiEvent, MouseButtonEvent, MouseButtonIndex, MouseLeaveEvent, MouseMotionEvent,
12-
MouseWheelEvent,
11+
DeviceBitmask, Event as WguiEvent, MouseButtonEvent, MouseButtonIndex, MouseLeaveEvent,
12+
MouseMotionEvent, MouseWheelEvent,
1313
},
1414
gfx::cmd::WGfxClearMode,
1515
renderer_vk::context::Context as WguiContext,
@@ -205,15 +205,15 @@ impl OverlayBackend for DashFrontend {
205205
let e = WguiEvent::MouseWheel(MouseWheelEvent {
206206
delta: vec2(delta.x, delta.y) / 8.0,
207207
pos: hit.uv * self.inner.layout.content_size,
208-
device: hit.pointer,
208+
device: DeviceBitmask::from_usize(hit.pointer),
209209
});
210210
self.push_event(&e);
211211
}
212212

213213
fn on_hover(&mut self, _app: &mut AppState, hit: &PointerHit) -> HoverResult {
214214
let e = &WguiEvent::MouseMotion(MouseMotionEvent {
215215
pos: hit.uv * self.inner.layout.content_size,
216-
device: hit.pointer,
216+
device: DeviceBitmask::from_usize(hit.pointer),
217217
});
218218

219219
self.has_focus[hit.pointer] = true;
@@ -235,7 +235,9 @@ impl OverlayBackend for DashFrontend {
235235
}
236236

237237
fn on_left(&mut self, _app: &mut AppState, pointer: usize) {
238-
let e = WguiEvent::MouseLeave(MouseLeaveEvent { device: pointer });
238+
let e = WguiEvent::MouseLeave(MouseLeaveEvent {
239+
device: DeviceBitmask::from_usize(pointer),
240+
});
239241
self.has_focus[pointer] = false;
240242
self.push_event(&e);
241243
}
@@ -252,13 +254,13 @@ impl OverlayBackend for DashFrontend {
252254
WguiEvent::MouseDown(MouseButtonEvent {
253255
pos: hit.uv * self.inner.layout.content_size,
254256
index,
255-
device: hit.pointer,
257+
device: DeviceBitmask::from_usize(hit.pointer),
256258
})
257259
} else {
258260
WguiEvent::MouseUp(MouseButtonEvent {
259261
pos: hit.uv * self.inner.layout.content_size,
260262
index,
261-
device: hit.pointer,
263+
device: DeviceBitmask::from_usize(hit.pointer),
262264
})
263265
};
264266
self.push_event(&e);
@@ -267,11 +269,11 @@ impl OverlayBackend for DashFrontend {
267269
if !pressed && !self.has_focus[hit.pointer] {
268270
let e = WguiEvent::MouseMotion(MouseMotionEvent {
269271
pos: vec2(-1., -1.),
270-
device: hit.pointer,
272+
device: DeviceBitmask::from_usize(hit.pointer),
271273
});
272274
self.push_event(&e);
273275
let e = WguiEvent::MouseLeave(MouseLeaveEvent {
274-
device: hit.pointer,
276+
device: DeviceBitmask::from_usize(hit.pointer),
275277
});
276278
self.push_event(&e);
277279
}

wgui/src/components/button.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,18 @@ fn register_event_mouse_leave(
334334
)
335335
}
336336

337+
fn register_event_mouse_cancel(state: Rc<RefCell<State>>, listeners: &mut EventListenerCollection) -> EventListenerID {
338+
listeners.register(
339+
EventListenerKind::MouseCancel,
340+
Box::new(move |_common, _event_data, (), ()| {
341+
let mut state = state.borrow_mut();
342+
state.down = false;
343+
state.hovered = false;
344+
Ok(EventResult::Pass)
345+
}),
346+
)
347+
}
348+
337349
fn register_event_mouse_press(state: Rc<RefCell<State>>, listeners: &mut EventListenerCollection) -> EventListenerID {
338350
listeners.register(
339351
EventListenerKind::MousePress,
@@ -552,6 +564,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
552564
let listeners = &mut root.widget.state().event_listeners;
553565
let anim_mult = ess.layout.state.theme.animation_mult;
554566
vec![
567+
register_event_mouse_cancel(state.clone(), listeners),
555568
register_event_mouse_enter(data.clone(), state.clone(), listeners, params.tooltip, anim_mult),
556569
register_event_mouse_leave(state.clone(), listeners, anim_mult),
557570
register_event_mouse_press(state.clone(), listeners),

wgui/src/components/checkbox.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,17 @@ fn register_event_mouse_leave(
240240
)
241241
}
242242

243+
fn register_event_mouse_cancel(state: Rc<RefCell<State>>, listeners: &mut EventListenerCollection) -> EventListenerID {
244+
listeners.register(
245+
EventListenerKind::MouseCancel,
246+
Box::new(move |_common, _event_data, (), ()| {
247+
let mut state = state.borrow_mut();
248+
state.down = false;
249+
Ok(EventResult::Pass)
250+
}),
251+
)
252+
}
253+
243254
fn register_event_mouse_press(state: Rc<RefCell<State>>, listeners: &mut EventListenerCollection) -> EventListenerID {
244255
listeners.register(
245256
EventListenerKind::MousePress,
@@ -439,6 +450,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
439450
vec![
440451
register_event_mouse_enter(state.clone(), listeners, params.tooltip, anim_mult),
441452
register_event_mouse_leave(state.clone(), listeners, anim_mult),
453+
register_event_mouse_cancel(state.clone(), listeners),
442454
register_event_mouse_press(state.clone(), listeners),
443455
register_event_mouse_release(data.clone(), state.clone(), listeners),
444456
]

wgui/src/components/slider.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use crate::{
1111
},
1212
drawing::{self},
1313
event::{
14-
self, CallbackDataCommon, CallbackMetadata, EventAlterables, EventListenerCollection, EventListenerKind,
15-
StyleSetRequest,
14+
self, CallbackDataCommon, CallbackMetadata, DeviceBitmask, EventAlterables, EventListenerCollection,
15+
EventListenerKind, StyleSetRequest,
1616
},
1717
i18n::Translation,
1818
layout::{WidgetID, WidgetPair},
@@ -77,7 +77,7 @@ pub struct Params {
7777
}
7878

7979
struct State {
80-
dragged_by: Option<usize>,
80+
dragged_by: Option<DeviceBitmask>,
8181
hovered: bool,
8282
values: ValuesMinMax,
8383
on_value_changed: Option<SliderValueChangedCallback>,

wgui/src/components/tabs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::{
99
layout::WidgetPair,
1010
widget::{ConstructEssentials, div::WidgetDiv},
1111
};
12-
use std::{cell::RefCell, fmt::Pointer, rc::Rc};
12+
use std::{cell::RefCell, rc::Rc};
1313
use taffy::{
1414
AlignItems,
1515
prelude::{length, percent},

0 commit comments

Comments
 (0)