Skip to main content

basic/
basic.rs

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