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}