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}