diff --git a/src/lib.rs b/src/lib.rs index 4af7f04136e8a725d4d2a0ea7e8df8976a8ea430..684bb9f87f1f445a2034ecd41d279eb543d0d3e7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -359,20 +359,108 @@ pub fn cosmic_edit_bevy_events( if active_editor.entity == Some(entity) { if let Some(font_system) = font_system_assets.get_mut(&cosmic_edit.font_system) { let now_ms = get_timestamp(); + + #[cfg(target_os = "macos")] let command = keys.any_pressed([KeyCode::SuperLeft, KeyCode::SuperRight]); + + #[cfg(not(target_os = "macos"))] + let command = keys.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight]); + let shift = keys.any_pressed([KeyCode::ShiftLeft, KeyCode::ShiftRight]); + + #[cfg(target_os = "macos")] let option = keys.any_pressed([KeyCode::AltLeft, KeyCode::AltRight]); + + // if shift key is pressed + let already_has_selection = cosmic_edit.editor.select_opt().is_some(); + if shift && !already_has_selection { + let cursor = cosmic_edit.editor.cursor(); + cosmic_edit.editor.set_select_opt(Some(cursor)); + } + + #[cfg(target_os = "macos")] + let should_jump = command && option; + #[cfg(not(target_os = "macos"))] + let should_jump = command; + + if should_jump && keys.just_pressed(KeyCode::Left) { + cosmic_edit + .editor + .action(&mut font_system.0, Action::PreviousWord); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; + } + if should_jump && keys.just_pressed(KeyCode::Right) { + cosmic_edit + .editor + .action(&mut font_system.0, Action::NextWord); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; + } + if should_jump && keys.just_pressed(KeyCode::Home) { + cosmic_edit + .editor + .action(&mut font_system.0, Action::BufferStart); + // there's a bug with cosmic text where it doesn't update the visual cursor for this action + // TODO: fix upstream + cosmic_edit.editor.buffer_mut().set_redraw(true); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; + } + if should_jump && keys.just_pressed(KeyCode::End) { + cosmic_edit + .editor + .action(&mut font_system.0, Action::BufferEnd); + // there's a bug with cosmic text where it doesn't update the visual cursor for this action + // TODO: fix upstream + cosmic_edit.editor.buffer_mut().set_redraw(true); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; + } + if keys.just_pressed(KeyCode::Left) { cosmic_edit.editor.action(&mut font_system.0, Action::Left); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; } if keys.just_pressed(KeyCode::Right) { cosmic_edit.editor.action(&mut font_system.0, Action::Right); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; } if keys.just_pressed(KeyCode::Up) { cosmic_edit.editor.action(&mut font_system.0, Action::Up); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; } if keys.just_pressed(KeyCode::Down) { cosmic_edit.editor.action(&mut font_system.0, Action::Down); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; } if !cosmic_edit.readonly && keys.just_pressed(KeyCode::Back) { #[cfg(target_arch = "wasm32")] @@ -408,23 +496,50 @@ pub fn cosmic_edit_bevy_events( // RETURN return; } - if command && option && keys.just_pressed(KeyCode::Left) { + if keys.just_pressed(KeyCode::Home) { + cosmic_edit.editor.action(&mut font_system.0, Action::Home); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; + } + if keys.just_pressed(KeyCode::End) { + cosmic_edit.editor.action(&mut font_system.0, Action::End); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } + // RETURN + return; + } + if keys.just_pressed(KeyCode::PageUp) { cosmic_edit .editor - .action(&mut font_system.0, Action::PreviousWord); + .action(&mut font_system.0, Action::PageUp); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } // RETURN return; } - if command && option && keys.just_pressed(KeyCode::Right) { + if keys.just_pressed(KeyCode::PageDown) { cosmic_edit .editor - .action(&mut font_system.0, Action::NextWord); + .action(&mut font_system.0, Action::PageDown); + if !shift { + cosmic_edit.editor.set_select_opt(None); + } // RETURN return; } // redo - if !cosmic_edit.readonly && command && shift && keys.just_pressed(KeyCode::Z) { + #[cfg(target_os = "macos")] + let requested_redo = command && shift && keys.just_pressed(KeyCode::Z); + #[cfg(not(target_os = "macos"))] + let requested_redo = command && keys.just_pressed(KeyCode::Y); + + if !cosmic_edit.readonly && requested_redo { let edits = &edit_history.edits; if edits.is_empty() { // RETURN @@ -461,7 +576,9 @@ pub fn cosmic_edit_bevy_events( return; } // undo - if !cosmic_edit.readonly && command && keys.just_pressed(KeyCode::Z) { + let requested_undo = command && keys.just_pressed(KeyCode::Z); + + if !cosmic_edit.readonly && requested_undo { let edits = &edit_history.edits; if edits.is_empty() { // RETURN @@ -535,6 +652,12 @@ pub fn cosmic_edit_bevy_events( ), CosmicTextPos::TopLeft => (0, 0), }; + let point = |node_cursor_pos: (f32, f32)| { + ( + (node_cursor_pos.0 * scale_factor) as i32 - offset_x, + (node_cursor_pos.1 * scale_factor) as i32 - offset_y, + ) + }; if buttons.just_pressed(MouseButton::Left) { if let Some(node_cursor_pos) = get_node_cursor_pos( primary_window, @@ -544,13 +667,16 @@ pub fn cosmic_edit_bevy_events( camera, camera_transform, ) { - cosmic_edit.editor.action( - &mut font_system.0, - Action::Click { - x: (node_cursor_pos.0 * scale_factor) as i32 - offset_x, - y: (node_cursor_pos.1 * scale_factor) as i32 - offset_y, - }, - ); + let (x, y) = point(node_cursor_pos); + if shift { + cosmic_edit + .editor + .action(&mut font_system.0, Action::Drag { x, y }); + } else { + cosmic_edit + .editor + .action(&mut font_system.0, Action::Click { x, y }); + } } // RETURN return; @@ -564,13 +690,10 @@ pub fn cosmic_edit_bevy_events( camera, camera_transform, ) { - cosmic_edit.editor.action( - &mut font_system.0, - Action::Drag { - x: (node_cursor_pos.0 * scale_factor) as i32 - offset_x, - y: (node_cursor_pos.1 * scale_factor) as i32 - offset_y, - }, - ); + let (x, y) = point(node_cursor_pos); + cosmic_edit + .editor + .action(&mut font_system.0, Action::Drag { x, y }); } // RETURN return;