mouse_pressure.rs

 1use gpui::{
 2    App, Application, Bounds, Context, MousePressureEvent, PressureStage, Window, WindowBounds,
 3    WindowOptions, div, prelude::*, px, rgb, size,
 4};
 5
 6struct MousePressureExample {
 7    pressure_stage: PressureStage,
 8    pressure_amount: f32,
 9}
10
11impl Render for MousePressureExample {
12    fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
13        div()
14            .flex()
15            .flex_col()
16            .gap_3()
17            .bg(rgb(0x505050))
18            .size(px(500.0))
19            .justify_center()
20            .items_center()
21            .shadow_lg()
22            .border_1()
23            .border_color(rgb(0x0000ff))
24            .text_xl()
25            .text_color(rgb(0xffffff))
26            .child(format!("Pressure stage: {:?}", &self.pressure_stage))
27            .child(format!("Pressure amount: {:.2}", &self.pressure_amount))
28            .on_mouse_pressure(cx.listener(Self::on_mouse_pressure))
29    }
30}
31
32impl MousePressureExample {
33    fn on_mouse_pressure(
34        &mut self,
35        pressure_event: &MousePressureEvent,
36        _window: &mut Window,
37        cx: &mut Context<Self>,
38    ) {
39        self.pressure_amount = pressure_event.pressure;
40        self.pressure_stage = pressure_event.stage;
41
42        cx.notify();
43    }
44}
45
46fn main() {
47    Application::new().run(|cx: &mut App| {
48        let bounds = Bounds::centered(None, size(px(500.), px(500.0)), cx);
49
50        cx.open_window(
51            WindowOptions {
52                window_bounds: Some(WindowBounds::Windowed(bounds)),
53                ..Default::default()
54            },
55            |_, cx| {
56                cx.new(|_| MousePressureExample {
57                    pressure_stage: PressureStage::Zero,
58                    pressure_amount: 0.0,
59                })
60            },
61        )
62        .unwrap();
63
64        cx.activate(true);
65    });
66}