mouse_pressure.rs

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