Put input/output data types into mod egui::data
This commit is contained in:
parent
d11b02d45e
commit
7b318887ee
8 changed files with 311 additions and 302 deletions
|
@ -7,6 +7,7 @@ use std::sync::{
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
animation_manager::AnimationManager,
|
animation_manager::AnimationManager,
|
||||||
|
data::output::Output,
|
||||||
mutex::{Mutex, MutexGuard},
|
mutex::{Mutex, MutexGuard},
|
||||||
paint::{stats::*, text::Fonts, *},
|
paint::{stats::*, text::Fonts, *},
|
||||||
*,
|
*,
|
||||||
|
|
243
egui/src/data/input.rs
Normal file
243
egui/src/data/input.rs
Normal file
|
@ -0,0 +1,243 @@
|
||||||
|
//! The input needed by Egui.
|
||||||
|
|
||||||
|
use crate::math::*;
|
||||||
|
|
||||||
|
/// What the integrations provides to Egui at the start of each frame.
|
||||||
|
///
|
||||||
|
/// Set the values that make sense, leave the rest at their `Default::default()`.
|
||||||
|
///
|
||||||
|
/// All coordinates are in points (logical pixels) with origin (0, 0) in the top left corner.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct RawInput {
|
||||||
|
/// Is the button currently down?
|
||||||
|
/// NOTE: Egui currently only supports the primary mouse button.
|
||||||
|
pub mouse_down: bool,
|
||||||
|
|
||||||
|
/// Current position of the mouse in points.
|
||||||
|
pub mouse_pos: Option<Pos2>,
|
||||||
|
|
||||||
|
/// How many points (logical pixels) the user scrolled
|
||||||
|
pub scroll_delta: Vec2,
|
||||||
|
|
||||||
|
#[deprecated = "Use screen_rect instead: `Some(Rect::from_pos_size(Default::default(), vec2(window_width, window_height)))`"]
|
||||||
|
pub screen_size: Vec2,
|
||||||
|
|
||||||
|
/// Position and size of the area that Egui should use.
|
||||||
|
/// Usually you would set this to
|
||||||
|
///
|
||||||
|
/// `Some(Rect::from_pos_size(Default::default(), vec2(window_width, window_height)))`.
|
||||||
|
///
|
||||||
|
/// but you could also constrain Egui to some smaller portion of your window if you like.
|
||||||
|
///
|
||||||
|
/// `None` will be treated as "same as last frame", with the default being a very big area.
|
||||||
|
pub screen_rect: Option<Rect>,
|
||||||
|
|
||||||
|
/// Also known as device pixel ratio, > 1 for HDPI screens.
|
||||||
|
/// If text looks blurry on high resolution screens, you probably forgot to set this.
|
||||||
|
pub pixels_per_point: Option<f32>,
|
||||||
|
|
||||||
|
/// Monotonically increasing time, in seconds. Relative to whatever. Used for animations.
|
||||||
|
/// If `None` is provided, Egui will assume a time delta of `predicted_dt` (default 1/60 seconds).
|
||||||
|
pub time: Option<f64>,
|
||||||
|
|
||||||
|
/// Should be set to the expected time between frames when painting at vsync speeds.
|
||||||
|
/// The default for this is 1/60.
|
||||||
|
/// Can safely be left at its default value.
|
||||||
|
pub predicted_dt: f32,
|
||||||
|
|
||||||
|
/// Which modifier keys are down at the start of the frame?
|
||||||
|
pub modifiers: Modifiers,
|
||||||
|
|
||||||
|
/// In-order events received this frame
|
||||||
|
pub events: Vec<Event>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for RawInput {
|
||||||
|
fn default() -> Self {
|
||||||
|
#![allow(deprecated)] // for screen_size
|
||||||
|
Self {
|
||||||
|
mouse_down: false,
|
||||||
|
mouse_pos: None,
|
||||||
|
scroll_delta: Vec2::zero(),
|
||||||
|
screen_size: Default::default(),
|
||||||
|
screen_rect: None,
|
||||||
|
pixels_per_point: None,
|
||||||
|
time: None,
|
||||||
|
predicted_dt: 1.0 / 60.0,
|
||||||
|
modifiers: Modifiers::default(),
|
||||||
|
events: vec![],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RawInput {
|
||||||
|
/// Helper: move volatile (deltas and events), clone the rest
|
||||||
|
pub fn take(&mut self) -> RawInput {
|
||||||
|
#![allow(deprecated)] // for screen_size
|
||||||
|
RawInput {
|
||||||
|
mouse_down: self.mouse_down,
|
||||||
|
mouse_pos: self.mouse_pos,
|
||||||
|
scroll_delta: std::mem::take(&mut self.scroll_delta),
|
||||||
|
screen_size: self.screen_size,
|
||||||
|
screen_rect: self.screen_rect,
|
||||||
|
pixels_per_point: self.pixels_per_point,
|
||||||
|
time: self.time,
|
||||||
|
predicted_dt: self.predicted_dt,
|
||||||
|
modifiers: self.modifiers,
|
||||||
|
events: std::mem::take(&mut self.events),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// An input event generated by the integration.
|
||||||
|
///
|
||||||
|
/// This only covers events that Egui cares about.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub enum Event {
|
||||||
|
/// The integration detected a "copy" event (e.g. Cmd+C).
|
||||||
|
Copy,
|
||||||
|
/// The integration detected a "cut" event (e.g. Cmd+X).
|
||||||
|
Cut,
|
||||||
|
/// Text input, e.g. via keyboard or paste action.
|
||||||
|
///
|
||||||
|
/// When the user presses enter/return, do not send a `Text` (just [`Key::Enter`]).
|
||||||
|
Text(String),
|
||||||
|
Key {
|
||||||
|
key: Key,
|
||||||
|
pressed: bool,
|
||||||
|
modifiers: Modifiers,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
/// State of the modifier keys. These must be fed to Egui.
|
||||||
|
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
||||||
|
pub struct Modifiers {
|
||||||
|
/// Either of the alt keys are down (option ⌥ on Mac).
|
||||||
|
pub alt: bool,
|
||||||
|
/// Either of the control keys are down.
|
||||||
|
/// When checking for keyboard shortcuts, consider using [`Self::command`] instead.
|
||||||
|
pub ctrl: bool,
|
||||||
|
/// Either of the shift keys are down.
|
||||||
|
pub shift: bool,
|
||||||
|
/// The Mac ⌘ Command key. Should always be set to `false` on other platforms.
|
||||||
|
pub mac_cmd: bool,
|
||||||
|
/// On Windows and Linux, set this to the same value as `ctrl`.
|
||||||
|
/// On Mac, this should be set whenever one of the ⌘ Command keys are down (same as `mac_cmd`).
|
||||||
|
/// This is so that Egui can, for instance, select all text by checking for `command + A`
|
||||||
|
/// and it will work on both Mac and Windows.
|
||||||
|
pub command: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Keyboard keys.
|
||||||
|
///
|
||||||
|
/// Includes all keys Egui is interested in (such as `Home` and `End`)
|
||||||
|
/// plus a few that are useful for detecting keyboard shortcuts.
|
||||||
|
///
|
||||||
|
/// Many keys are omitted because they are not always physical keys (depending on keyboard language), e.g. `;` and `§`,
|
||||||
|
/// and are therefor unsuitable as keyboard shortcuts if you want your app to be portable.
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)]
|
||||||
|
pub enum Key {
|
||||||
|
ArrowDown,
|
||||||
|
ArrowLeft,
|
||||||
|
ArrowRight,
|
||||||
|
ArrowUp,
|
||||||
|
|
||||||
|
Escape,
|
||||||
|
Tab,
|
||||||
|
Backspace,
|
||||||
|
Enter,
|
||||||
|
Space,
|
||||||
|
|
||||||
|
Insert,
|
||||||
|
Delete,
|
||||||
|
Home,
|
||||||
|
End,
|
||||||
|
PageUp,
|
||||||
|
PageDown,
|
||||||
|
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num0,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num1,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num2,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num3,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num4,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num5,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num6,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num7,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num8,
|
||||||
|
/// Either from the main row or from the numpad.
|
||||||
|
Num9,
|
||||||
|
|
||||||
|
A, // Used for cmd+A (select All)
|
||||||
|
B,
|
||||||
|
C,
|
||||||
|
D,
|
||||||
|
E,
|
||||||
|
F,
|
||||||
|
G,
|
||||||
|
H,
|
||||||
|
I,
|
||||||
|
J,
|
||||||
|
K, // Used for ctrl+K (delete text after cursor)
|
||||||
|
L,
|
||||||
|
M,
|
||||||
|
N,
|
||||||
|
O,
|
||||||
|
P,
|
||||||
|
Q,
|
||||||
|
R,
|
||||||
|
S,
|
||||||
|
T,
|
||||||
|
U, // Used for ctrl+U (delete text before cursor)
|
||||||
|
V,
|
||||||
|
W, // Used for ctrl+W (delete previous word)
|
||||||
|
X,
|
||||||
|
Y,
|
||||||
|
Z, // Used for cmd+Z (undo)
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RawInput {
|
||||||
|
pub fn ui(&self, ui: &mut crate::Ui) {
|
||||||
|
#![allow(deprecated)] // for screen_size
|
||||||
|
let Self {
|
||||||
|
mouse_down,
|
||||||
|
mouse_pos,
|
||||||
|
scroll_delta,
|
||||||
|
screen_size: _,
|
||||||
|
screen_rect,
|
||||||
|
pixels_per_point,
|
||||||
|
time,
|
||||||
|
predicted_dt,
|
||||||
|
modifiers,
|
||||||
|
events,
|
||||||
|
} = self;
|
||||||
|
|
||||||
|
// TODO: simpler way to show values, e.g. `ui.value("Mouse Pos:", self.mouse_pos);
|
||||||
|
// TODO: `ui.style_mut().text_style = TextStyle::Monospace`;
|
||||||
|
ui.label(format!("mouse_down: {}", mouse_down));
|
||||||
|
ui.label(format!("mouse_pos: {:.1?}", mouse_pos));
|
||||||
|
ui.label(format!("scroll_delta: {:?} points", scroll_delta));
|
||||||
|
ui.label(format!("screen_rect: {:?} points", screen_rect));
|
||||||
|
ui.label(format!("pixels_per_point: {:?}", pixels_per_point))
|
||||||
|
.on_hover_text(
|
||||||
|
"Also called HDPI factor.\nNumber of physical pixels per each logical pixel.",
|
||||||
|
);
|
||||||
|
if let Some(time) = time {
|
||||||
|
ui.label(format!("time: {:.3} s", time));
|
||||||
|
} else {
|
||||||
|
ui.label("time: None");
|
||||||
|
}
|
||||||
|
ui.label(format!("predicted_dt: {:.1} ms", 1e3 * predicted_dt));
|
||||||
|
ui.label(format!("modifiers: {:#?}", modifiers));
|
||||||
|
ui.label(format!("events: {:?}", events))
|
||||||
|
.on_hover_text("key presses etc");
|
||||||
|
}
|
||||||
|
}
|
4
egui/src/data/mod.rs
Normal file
4
egui/src/data/mod.rs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
//! All the data sent between egui and the backend
|
||||||
|
|
||||||
|
pub mod input;
|
||||||
|
pub mod output;
|
47
egui/src/data/output.rs
Normal file
47
egui/src/data/output.rs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
//! All the data egui returns to the backend at the end of each frame.
|
||||||
|
|
||||||
|
/// What Egui emits each frame.
|
||||||
|
/// The backend should use this.
|
||||||
|
#[derive(Clone, Default)]
|
||||||
|
pub struct Output {
|
||||||
|
/// Set the cursor to this icon.
|
||||||
|
pub cursor_icon: CursorIcon,
|
||||||
|
|
||||||
|
/// If set, open this url.
|
||||||
|
pub open_url: Option<String>,
|
||||||
|
|
||||||
|
/// Response to [`Event::Copy`] or [`Event::Cut`]. Ignore if empty.
|
||||||
|
pub copied_text: String,
|
||||||
|
|
||||||
|
/// If `true`, Egui is requesting immediate repaint (i.e. on the next frame).
|
||||||
|
///
|
||||||
|
/// This happens for instance when there is an animation, or if a user has called `Context::request_repaint()`.
|
||||||
|
///
|
||||||
|
/// As an Egui user: don't set this value directly.
|
||||||
|
/// Call `Context::request_repaint()` instead and it will do so for you.
|
||||||
|
pub needs_repaint: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A mouse cursor icon.
|
||||||
|
///
|
||||||
|
/// Egui emits a [`CursorIcon`] in [`Output`] each frame as a request to the integration.
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub enum CursorIcon {
|
||||||
|
Default,
|
||||||
|
/// Pointing hand, used for e.g. web links
|
||||||
|
PointingHand,
|
||||||
|
ResizeHorizontal,
|
||||||
|
ResizeNeSw,
|
||||||
|
ResizeNwSe,
|
||||||
|
ResizeVertical,
|
||||||
|
Text,
|
||||||
|
/// Used when moving
|
||||||
|
Grab,
|
||||||
|
Grabbing,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for CursorIcon {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::Default
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,100 +1,14 @@
|
||||||
//! The input needed by Egui.
|
use crate::{math::*, util::History};
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use crate::{math::*, util::History};
|
use crate::data::input::*;
|
||||||
|
|
||||||
|
pub use crate::data::input::Key;
|
||||||
|
|
||||||
/// If mouse moves more than this, it is no longer a click (but maybe a drag)
|
/// If mouse moves more than this, it is no longer a click (but maybe a drag)
|
||||||
const MAX_CLICK_DIST: f32 = 6.0;
|
const MAX_CLICK_DIST: f32 = 6.0; // TODO: move to settings
|
||||||
/// The new mouse press must come within this many seconds from previous mouse release
|
/// The new mouse press must come within this many seconds from previous mouse release
|
||||||
const MAX_CLICK_DELAY: f64 = 0.3;
|
const MAX_CLICK_DELAY: f64 = 0.3; // TODO: move to settings
|
||||||
|
|
||||||
/// What the integrations provides to Egui at the start of each frame.
|
|
||||||
///
|
|
||||||
/// Set the values that make sense, leave the rest at their `Default::default()`.
|
|
||||||
///
|
|
||||||
/// All coordinates are in points (logical pixels) with origin (0, 0) in the top left corner.
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub struct RawInput {
|
|
||||||
/// Is the button currently down?
|
|
||||||
/// NOTE: Egui currently only supports the primary mouse button.
|
|
||||||
pub mouse_down: bool,
|
|
||||||
|
|
||||||
/// Current position of the mouse in points.
|
|
||||||
pub mouse_pos: Option<Pos2>,
|
|
||||||
|
|
||||||
/// How many points (logical pixels) the user scrolled
|
|
||||||
pub scroll_delta: Vec2,
|
|
||||||
|
|
||||||
#[deprecated = "Use screen_rect instead: `Some(Rect::from_pos_size(Default::default(), vec2(window_width, window_height)))`"]
|
|
||||||
pub screen_size: Vec2,
|
|
||||||
|
|
||||||
/// Position and size of the area that Egui should use.
|
|
||||||
/// Usually you would set this to
|
|
||||||
///
|
|
||||||
/// `Some(Rect::from_pos_size(Default::default(), vec2(window_width, window_height)))`.
|
|
||||||
///
|
|
||||||
/// but you could also constrain Egui to some smaller portion of your window if you like.
|
|
||||||
///
|
|
||||||
/// `None` will be treated as "same as last frame", with the default being a very big area.
|
|
||||||
pub screen_rect: Option<Rect>,
|
|
||||||
|
|
||||||
/// Also known as device pixel ratio, > 1 for HDPI screens.
|
|
||||||
/// If text looks blurry on high resolution screens, you probably forgot to set this.
|
|
||||||
pub pixels_per_point: Option<f32>,
|
|
||||||
|
|
||||||
/// Monotonically increasing time, in seconds. Relative to whatever. Used for animations.
|
|
||||||
/// If `None` is provided, Egui will assume a time delta of `predicted_dt` (default 1/60 seconds).
|
|
||||||
pub time: Option<f64>,
|
|
||||||
|
|
||||||
/// Should be set to the expected time between frames when painting at vsync speeds.
|
|
||||||
/// The default for this is 1/60.
|
|
||||||
/// Can safely be left at its default value.
|
|
||||||
pub predicted_dt: f32,
|
|
||||||
|
|
||||||
/// Which modifier keys are down at the start of the frame?
|
|
||||||
pub modifiers: Modifiers,
|
|
||||||
|
|
||||||
/// In-order events received this frame
|
|
||||||
pub events: Vec<Event>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for RawInput {
|
|
||||||
fn default() -> Self {
|
|
||||||
#![allow(deprecated)] // for screen_size
|
|
||||||
Self {
|
|
||||||
mouse_down: false,
|
|
||||||
mouse_pos: None,
|
|
||||||
scroll_delta: Vec2::zero(),
|
|
||||||
screen_size: Default::default(),
|
|
||||||
screen_rect: None,
|
|
||||||
pixels_per_point: None,
|
|
||||||
time: None,
|
|
||||||
predicted_dt: 1.0 / 60.0,
|
|
||||||
modifiers: Modifiers::default(),
|
|
||||||
events: vec![],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl RawInput {
|
|
||||||
/// Helper: move volatile (deltas and events), clone the rest
|
|
||||||
pub fn take(&mut self) -> RawInput {
|
|
||||||
#![allow(deprecated)] // for screen_size
|
|
||||||
RawInput {
|
|
||||||
mouse_down: self.mouse_down,
|
|
||||||
mouse_pos: self.mouse_pos,
|
|
||||||
scroll_delta: std::mem::take(&mut self.scroll_delta),
|
|
||||||
screen_size: self.screen_size,
|
|
||||||
screen_rect: self.screen_rect,
|
|
||||||
pixels_per_point: self.pixels_per_point,
|
|
||||||
time: self.time,
|
|
||||||
predicted_dt: self.predicted_dt,
|
|
||||||
modifiers: self.modifiers,
|
|
||||||
events: std::mem::take(&mut self.events),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Input state that Egui updates each frame.
|
/// Input state that Egui updates each frame.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
@ -217,122 +131,6 @@ impl Default for MouseInput {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An input event generated by the integration.
|
|
||||||
///
|
|
||||||
/// This only covers events that Egui cares about.
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
||||||
pub enum Event {
|
|
||||||
/// The integration detected a "copy" event (e.g. Cmd+C).
|
|
||||||
Copy,
|
|
||||||
/// The integration detected a "cut" event (e.g. Cmd+X).
|
|
||||||
Cut,
|
|
||||||
/// Text input, e.g. via keyboard or paste action.
|
|
||||||
///
|
|
||||||
/// When the user presses enter/return, do not send a `Text` (just [`Key::Enter`]).
|
|
||||||
Text(String),
|
|
||||||
Key {
|
|
||||||
key: Key,
|
|
||||||
pressed: bool,
|
|
||||||
modifiers: Modifiers,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
/// State of the modifier keys. These must be fed to Egui.
|
|
||||||
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
|
||||||
pub struct Modifiers {
|
|
||||||
/// Either of the alt keys are down (option ⌥ on Mac).
|
|
||||||
pub alt: bool,
|
|
||||||
/// Either of the control keys are down.
|
|
||||||
/// When checking for keyboard shortcuts, consider using [`Self::command`] instead.
|
|
||||||
pub ctrl: bool,
|
|
||||||
/// Either of the shift keys are down.
|
|
||||||
pub shift: bool,
|
|
||||||
/// The Mac ⌘ Command key. Should always be set to `false` on other platforms.
|
|
||||||
pub mac_cmd: bool,
|
|
||||||
/// On Windows and Linux, set this to the same value as `ctrl`.
|
|
||||||
/// On Mac, this should be set whenever one of the ⌘ Command keys are down (same as `mac_cmd`).
|
|
||||||
/// This is so that Egui can, for instance, select all text by checking for `command + A`
|
|
||||||
/// and it will work on both Mac and Windows.
|
|
||||||
pub command: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Keyboard keys.
|
|
||||||
///
|
|
||||||
/// Includes all keys Egui is interested in (such as `Home` and `End`)
|
|
||||||
/// plus a few that are useful for detecting keyboard shortcuts.
|
|
||||||
///
|
|
||||||
/// Many keys are omitted because they are not always physical keys (depending on keyboard language), e.g. `;` and `§`,
|
|
||||||
/// and are therefor unsuitable as keyboard shortcuts if you want your app to be portable.
|
|
||||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)]
|
|
||||||
pub enum Key {
|
|
||||||
ArrowDown,
|
|
||||||
ArrowLeft,
|
|
||||||
ArrowRight,
|
|
||||||
ArrowUp,
|
|
||||||
|
|
||||||
Escape,
|
|
||||||
Tab,
|
|
||||||
Backspace,
|
|
||||||
Enter,
|
|
||||||
Space,
|
|
||||||
|
|
||||||
Insert,
|
|
||||||
Delete,
|
|
||||||
Home,
|
|
||||||
End,
|
|
||||||
PageUp,
|
|
||||||
PageDown,
|
|
||||||
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num0,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num1,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num2,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num3,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num4,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num5,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num6,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num7,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num8,
|
|
||||||
/// Either from the main row or from the numpad.
|
|
||||||
Num9,
|
|
||||||
|
|
||||||
A, // Used for cmd+A (select All)
|
|
||||||
B,
|
|
||||||
C,
|
|
||||||
D,
|
|
||||||
E,
|
|
||||||
F,
|
|
||||||
G,
|
|
||||||
H,
|
|
||||||
I,
|
|
||||||
J,
|
|
||||||
K, // Used for ctrl+K (delete text after cursor)
|
|
||||||
L,
|
|
||||||
M,
|
|
||||||
N,
|
|
||||||
O,
|
|
||||||
P,
|
|
||||||
Q,
|
|
||||||
R,
|
|
||||||
S,
|
|
||||||
T,
|
|
||||||
U, // Used for ctrl+U (delete text before cursor)
|
|
||||||
V,
|
|
||||||
W, // Used for ctrl+W (delete previous word)
|
|
||||||
X,
|
|
||||||
Y,
|
|
||||||
Z, // Used for cmd+Z (undo)
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InputState {
|
impl InputState {
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn begin_frame(self, new: RawInput) -> InputState {
|
pub fn begin_frame(self, new: RawInput) -> InputState {
|
||||||
|
@ -512,44 +310,6 @@ impl MouseInput {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RawInput {
|
|
||||||
pub fn ui(&self, ui: &mut crate::Ui) {
|
|
||||||
#![allow(deprecated)] // for screen_size
|
|
||||||
let Self {
|
|
||||||
mouse_down,
|
|
||||||
mouse_pos,
|
|
||||||
scroll_delta,
|
|
||||||
screen_size: _,
|
|
||||||
screen_rect,
|
|
||||||
pixels_per_point,
|
|
||||||
time,
|
|
||||||
predicted_dt,
|
|
||||||
modifiers,
|
|
||||||
events,
|
|
||||||
} = self;
|
|
||||||
|
|
||||||
// TODO: simpler way to show values, e.g. `ui.value("Mouse Pos:", self.mouse_pos);
|
|
||||||
// TODO: `ui.style_mut().text_style = TextStyle::Monospace`;
|
|
||||||
ui.label(format!("mouse_down: {}", mouse_down));
|
|
||||||
ui.label(format!("mouse_pos: {:.1?}", mouse_pos));
|
|
||||||
ui.label(format!("scroll_delta: {:?} points", scroll_delta));
|
|
||||||
ui.label(format!("screen_rect: {:?} points", screen_rect));
|
|
||||||
ui.label(format!("pixels_per_point: {:?}", pixels_per_point))
|
|
||||||
.on_hover_text(
|
|
||||||
"Also called HDPI factor.\nNumber of physical pixels per each logical pixel.",
|
|
||||||
);
|
|
||||||
if let Some(time) = time {
|
|
||||||
ui.label(format!("time: {:.3} s", time));
|
|
||||||
} else {
|
|
||||||
ui.label("time: None");
|
|
||||||
}
|
|
||||||
ui.label(format!("predicted_dt: {:.1} ms", 1e3 * predicted_dt));
|
|
||||||
ui.label(format!("modifiers: {:#?}", modifiers));
|
|
||||||
ui.label(format!("events: {:?}", events))
|
|
||||||
.on_hover_text("key presses etc");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InputState {
|
impl InputState {
|
||||||
pub fn ui(&self, ui: &mut crate::Ui) {
|
pub fn ui(&self, ui: &mut crate::Ui) {
|
||||||
let Self {
|
let Self {
|
|
@ -81,9 +81,10 @@
|
||||||
mod animation_manager;
|
mod animation_manager;
|
||||||
pub mod containers;
|
pub mod containers;
|
||||||
mod context;
|
mod context;
|
||||||
|
mod data;
|
||||||
pub(crate) mod grid;
|
pub(crate) mod grid;
|
||||||
mod id;
|
mod id;
|
||||||
mod input;
|
mod input_state;
|
||||||
mod introspection;
|
mod introspection;
|
||||||
mod layers;
|
mod layers;
|
||||||
mod layout;
|
mod layout;
|
||||||
|
@ -113,9 +114,10 @@ pub use epaint::{
|
||||||
pub use {
|
pub use {
|
||||||
containers::*,
|
containers::*,
|
||||||
context::{Context, CtxRef},
|
context::{Context, CtxRef},
|
||||||
|
data::{input::*, output::*},
|
||||||
grid::Grid,
|
grid::Grid,
|
||||||
id::Id,
|
id::Id,
|
||||||
input::*,
|
input_state::*,
|
||||||
layers::*,
|
layers::*,
|
||||||
layout::*,
|
layout::*,
|
||||||
memory::Memory,
|
memory::Memory,
|
||||||
|
|
|
@ -130,8 +130,8 @@ impl Interaction {
|
||||||
|
|
||||||
fn begin_frame(
|
fn begin_frame(
|
||||||
&mut self,
|
&mut self,
|
||||||
prev_input: &crate::input::InputState,
|
prev_input: &crate::input_state::InputState,
|
||||||
new_input: &crate::input::RawInput,
|
new_input: &crate::data::input::RawInput,
|
||||||
) {
|
) {
|
||||||
self.kb_focus_id_previous_frame = self.kb_focus_id;
|
self.kb_focus_id_previous_frame = self.kb_focus_id;
|
||||||
self.click_interest = false;
|
self.click_interest = false;
|
||||||
|
@ -150,8 +150,8 @@ impl Interaction {
|
||||||
self.pressed_tab = false;
|
self.pressed_tab = false;
|
||||||
self.pressed_shift_tab = false;
|
self.pressed_shift_tab = false;
|
||||||
for event in &new_input.events {
|
for event in &new_input.events {
|
||||||
if let crate::input::Event::Key {
|
if let crate::Event::Key {
|
||||||
key: crate::input::Key::Tab,
|
key: crate::Key::Tab,
|
||||||
pressed: true,
|
pressed: true,
|
||||||
modifiers,
|
modifiers,
|
||||||
} = event
|
} = event
|
||||||
|
@ -169,8 +169,8 @@ impl Interaction {
|
||||||
impl Memory {
|
impl Memory {
|
||||||
pub(crate) fn begin_frame(
|
pub(crate) fn begin_frame(
|
||||||
&mut self,
|
&mut self,
|
||||||
prev_input: &crate::input::InputState,
|
prev_input: &crate::input_state::InputState,
|
||||||
new_input: &crate::input::RawInput,
|
new_input: &crate::data::input::RawInput,
|
||||||
) {
|
) {
|
||||||
self.interaction.begin_frame(prev_input, new_input);
|
self.interaction.begin_frame(prev_input, new_input);
|
||||||
|
|
||||||
|
|
|
@ -2,54 +2,6 @@ use crate::{lerp, math::Rect, Align, CtxRef, Id, LayerId, Ui};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
/// What Egui emits each frame.
|
|
||||||
/// The backend should use this.
|
|
||||||
#[derive(Clone, Default)]
|
|
||||||
// #[cfg_attr(feature = "persistence", derive(serde::Serialize))]
|
|
||||||
pub struct Output {
|
|
||||||
/// Set the cursor to this icon.
|
|
||||||
pub cursor_icon: CursorIcon,
|
|
||||||
|
|
||||||
/// If set, open this url.
|
|
||||||
pub open_url: Option<String>,
|
|
||||||
|
|
||||||
/// Response to Event::Copy or Event::Cut. Ignore if empty.
|
|
||||||
pub copied_text: String,
|
|
||||||
|
|
||||||
/// If `true`, Egui or a user is indicating that the UI needs immediate repaint (e.g. on the next frame).
|
|
||||||
/// This happens for instance when there is an animation, or if a user has called `Context::request_repaint()`.
|
|
||||||
/// Don't set this manually, but call `Context::request_repaint()` instead.
|
|
||||||
pub needs_repaint: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A mouse cursor icon.
|
|
||||||
///
|
|
||||||
/// Egui emits a `CursorIcond` in [`Output`] each frame as a request to the integration.
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
// #[cfg_attr(feature = "persistence", derive(serde::Serialize))]
|
|
||||||
// #[cfg_attr(feature = "persistence", serde(rename_all = "snake_case"))]
|
|
||||||
pub enum CursorIcon {
|
|
||||||
Default,
|
|
||||||
/// Pointing hand, used for e.g. web links
|
|
||||||
PointingHand,
|
|
||||||
ResizeHorizontal,
|
|
||||||
ResizeNeSw,
|
|
||||||
ResizeNwSe,
|
|
||||||
ResizeVertical,
|
|
||||||
Text,
|
|
||||||
/// Used when moving
|
|
||||||
Grab,
|
|
||||||
Grabbing,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for CursorIcon {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self::Default
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/// The result of adding a widget to a [`Ui`].
|
/// The result of adding a widget to a [`Ui`].
|
||||||
///
|
///
|
||||||
/// This lets you know whether or not a widget has been clicked this frame.
|
/// This lets you know whether or not a widget has been clicked this frame.
|
||||||
|
|
Loading…
Reference in a new issue