basic/
basic.rs

1use std::time::Duration;
2
3use portlight::{
4    Bitmap, Context, Event, EventLoop, Key, Response, Size, Task, Timer, Window, WindowEvent,
5    WindowOptions,
6};
7
8const WIDTH: usize = 512;
9const HEIGHT: usize = 512;
10
11struct State {
12    window: Option<Window>,
13    framebuffer: Vec<u32>,
14    width: usize,
15    height: usize,
16    timer: Option<Timer>,
17}
18
19impl Drop for State {
20    fn drop(&mut self) {
21        println!("drop");
22    }
23}
24
25impl Task for State {
26    fn event(&mut self, cx: &Context, _key: Key, event: Event) -> Response {
27        if let Event::Window(event) = event {
28            match event {
29                WindowEvent::Expose(rects) => {
30                    println!("expose: {:?}", rects);
31                }
32                WindowEvent::Frame => {
33                    println!("frame");
34
35                    let window = self.window.as_ref().unwrap();
36
37                    let scale = window.scale();
38                    self.width = (WIDTH as f64 * scale) as usize;
39                    self.height = (HEIGHT as f64 * scale) as usize;
40                    self.framebuffer.resize(self.width * self.height, 0xFFFF00FF);
41
42                    window.present(Bitmap::new(&self.framebuffer, self.width, self.height));
43                }
44                WindowEvent::GainFocus => {
45                    println!("gain focus");
46                }
47                WindowEvent::LoseFocus => {
48                    println!("lose focus");
49                }
50                WindowEvent::MouseEnter => {
51                    println!("mouse enter");
52                }
53                WindowEvent::MouseExit => {
54                    println!("mouse exit");
55                }
56                WindowEvent::MouseMove(pos) => {
57                    println!("mouse move: {:?}", pos);
58                }
59                WindowEvent::MouseDown(btn) => {
60                    println!("mouse down: {:?}", btn);
61                    return Response::Capture;
62                }
63                WindowEvent::MouseUp(btn) => {
64                    println!("mouse up: {:?}", btn);
65                    return Response::Capture;
66                }
67                WindowEvent::Scroll(delta) => {
68                    println!("scroll: {:?}", delta);
69                    return Response::Capture;
70                }
71                WindowEvent::Close => {
72                    cx.event_loop().exit();
73                }
74            }
75        } else if let Event::Timer = event {
76            println!("timer");
77        }
78
79        Response::Ignore
80    }
81}
82
83fn main() {
84    let event_loop = EventLoop::new().unwrap();
85
86    let state = event_loop.spawn(State {
87        window: None,
88        framebuffer: Vec::new(),
89        width: 0,
90        height: 0,
91        timer: None,
92    });
93
94    state.with(|state, cx| {
95        let window = WindowOptions::new()
96            .title("window")
97            .size(Size::new(512.0, 512.0))
98            .open(cx, Key(0))
99            .unwrap();
100
101        window.show();
102        state.window = Some(window);
103
104        state.timer = Some(Timer::repeat(Duration::from_millis(1000), cx, Key(0)).unwrap());
105    });
106
107    event_loop.run().unwrap();
108}