Skip to content

Commit 93cfbb1

Browse files
committed
fixes #93, add touch input and mouse wheel input support (both quite simple)
1 parent 2c213a0 commit 93cfbb1

File tree

4 files changed

+64
-23
lines changed

4 files changed

+64
-23
lines changed

crates/notation_bevy/src/app/app.rs

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use bevy::window::WindowResized;
77

88
use bevy_asset_loader::AssetLoader;
99

10-
use crate::prelude::*;
10+
use crate::{prelude::*, settings::layout_settings::LayoutMode};
1111
use crate::ui::viewer::TabViewerPlugin;
1212
use crate::viewer::control::ControlView;
1313

@@ -108,7 +108,9 @@ impl NotationApp {
108108
app.add_system_set(
109109
SystemSet::on_update(NotationAssetsStates::Loaded)
110110
.with_system(on_window_resized.system())
111-
.with_system(handle_inputs.system())
111+
.with_system(handle_keyboard_inputs.system())
112+
.with_system(handle_mouse_inputs.system())
113+
.with_system(handle_touch_inputs.system())
112114
.with_system(load_tab.system())
113115
);
114116

@@ -151,26 +153,17 @@ fn load_tab(
151153
}
152154
}
153155

154-
fn handle_inputs(
156+
fn handle_keyboard_inputs(
155157
mut commands: Commands,
156-
windows: Res<Windows>,
157158
keyboard_input: Res<Input<KeyCode>>,
158-
mouse_input: Res<Input<MouseButton>>,
159-
mut mouse_motion_events: EventReader<MouseMotion>,
160159
mut state: ResMut<NotationAppState>,
161160
mut settings: ResMut<NotationSettings>,
162161
mut midi_state: ResMut<MidiState>,
163162
mut play_control_evts: EventWriter<PlayControlEvent>,
164-
mut mouse_clicked: EventWriter<MouseClickedEvent>,
165-
mut mouse_dragged: EventWriter<MouseDraggedEvent>,
166163
mut window_resized_evts: EventWriter<WindowResizedEvent>,
167164
viewer_query: Query<(Entity, &Arc<NotationViewer>), With<Arc<NotationViewer>>>,
168165
) {
169-
if keyboard_input.pressed(KeyCode::LControl) {
170-
settings.mouse_dragged_panning = true;
171-
} else if keyboard_input.just_released(KeyCode::LControl) {
172-
settings.mouse_dragged_panning = false;
173-
} else if keyboard_input.just_released(KeyCode::Tab) {
166+
if keyboard_input.just_released(KeyCode::Tab) {
174167
state.hide_control = !state.hide_control;
175168
if !ControlView::HUD_MODE {
176169
window_resized_evts.send(WindowResizedEvent());
@@ -181,19 +174,65 @@ fn handle_inputs(
181174
crate::viewer::control::ControlView::play_or_stop(&mut midi_state, &mut play_control_evts);
182175
} else if keyboard_input.just_released(KeyCode::Backslash) {
183176
crate::viewer::control::ControlView::toggle_layout_mode(&mut commands, &mut state, &mut settings, &viewer_query);
184-
} else if mouse_input.just_released(MouseButton::Left) {
177+
}
178+
}
179+
180+
fn handle_mouse_inputs(
181+
windows: Res<Windows>,
182+
mouse_input: Res<Input<MouseButton>>,
183+
mut settings: ResMut<NotationSettings>,
184+
mut mouse_motion_events: EventReader<MouseMotion>,
185+
mut mouse_wheel_input: EventReader<bevy::input::mouse::MouseWheel>,
186+
mut mouse_clicked: EventWriter<MouseClickedEvent>,
187+
mut mouse_dragged: EventWriter<MouseDraggedEvent>,
188+
) {
189+
if mouse_input.just_released(MouseButton::Left) {
185190
windows
186191
.get_primary()
187192
.and_then(|x| x.cursor_position())
188193
.map(|cursor_position| {
189194
//println!("handle_inputs() -> MouseClickedEvent({:?})", cursor_position);
190195
mouse_clicked.send(MouseClickedEvent { cursor_position });
191196
});
197+
} else if mouse_input.just_pressed(MouseButton::Right) {
198+
} else if mouse_input.just_released(MouseButton::Right) {
199+
} else if mouse_input.pressed(MouseButton::Right) {
200+
for event in mouse_motion_events.iter() {
201+
//println!("handle_inputs() -> MouseDraggedEvent({:?})", event.delta);
202+
mouse_dragged.send(MouseDraggedEvent { delta: event.delta });
203+
}
192204
} else {
193-
if mouse_input.pressed(MouseButton::Left) {
194-
for event in mouse_motion_events.iter() {
195-
//println!("handle_inputs() -> MouseDraggedEvent({:?})", event.delta);
196-
mouse_dragged.send(MouseDraggedEvent { delta: event.delta });
205+
for event in mouse_wheel_input.iter() {
206+
let mut delta = match event.unit {
207+
bevy::input::mouse::MouseScrollUnit::Line =>
208+
Vec2::new(event.x * settings.panning_line_size, event.y * settings.panning_line_size),
209+
bevy::input::mouse::MouseScrollUnit::Pixel =>
210+
Vec2::new(event.x, event.y),
211+
};
212+
if settings.layout.mode == LayoutMode::Line {
213+
delta = Vec2::new(delta.y, delta.x);
214+
}
215+
mouse_dragged.send(MouseDraggedEvent { delta: delta });
216+
}
217+
}
218+
}
219+
220+
fn handle_touch_inputs(
221+
touch_input: Res<Touches>,
222+
mut mouse_clicked: EventWriter<MouseClickedEvent>,
223+
mut mouse_dragged: EventWriter<MouseDraggedEvent>,
224+
) {
225+
for (index, finger) in touch_input.iter().enumerate() {
226+
if index == 0 {
227+
if touch_input.just_pressed(finger.id()) {
228+
mouse_clicked.send(MouseClickedEvent { cursor_position: finger.position() });
229+
}
230+
} else if index == 1 {
231+
if touch_input.just_pressed(finger.id()) {
232+
} else if touch_input.just_released(finger.id()) {
233+
} else {
234+
let delta = finger.position() - finger.previous_position();
235+
mouse_dragged.send(MouseDraggedEvent { delta: delta });
197236
}
198237
}
199238
}

crates/notation_bevy/src/settings/notation_settings.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ pub struct NotationSettings {
1414
pub hide_bar_number: bool,
1515
pub always_show_fret: bool,
1616
pub melody_piano_mode: bool,
17-
pub mouse_dragged_panning: bool,
17+
pub allow_panning: bool,
18+
pub panning_line_size: f32,
1819
}
1920

2021
impl Default for NotationSettings {
@@ -26,7 +27,8 @@ impl Default for NotationSettings {
2627
hide_bar_number: false,
2728
always_show_fret: false,
2829
melody_piano_mode: false,
29-
mouse_dragged_panning: false,
30+
allow_panning: true,
31+
panning_line_size: 32.0,
3032
}
3133
}
3234
}

crates/notation_bevy/src/tab/tab_plugin.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ fn on_mouse_clicked(
9191
if app_state.window_width / 2.0 - pos.x > ControlView::WIDTH {
9292
app_state.hide_control = true;
9393
}
94-
} else if !settings.mouse_dragged_panning {
94+
} else {
9595
println!("tab_plugin::on_mouse_clicked() -> {:?}", pos);
9696
for (mini_bar, layout, global_transform) in mini_bar_query.iter() {
9797
if layout.is_pos_inside(pos, global_transform) {
@@ -154,7 +154,7 @@ fn on_mouse_dragged(
154154
mut tab_bars_query: Query<(Entity, &mut Transform, &Arc<TabBars>)>,
155155
) {
156156
for evt in evts.iter() {
157-
if settings.mouse_dragged_panning {
157+
if settings.allow_panning {
158158
settings
159159
.layout
160160
.pan_tab_bars(&mut tab_bars_query, -evt.delta.x, -evt.delta.y);

crates/notation_bevy/src/viewer/control.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ impl ControlView {
243243
state.hide_control = true;
244244
window_resized_evts.send(WindowResizedEvent());
245245
}
246-
ui.checkbox(&mut settings.mouse_dragged_panning, "Panning");
246+
ui.checkbox(&mut settings.allow_panning, "Allow Panning");
247247
let play_title = if midi_state.play_control.play_state.is_playing() {
248248
"Pause"
249249
} else {

0 commit comments

Comments
 (0)