1use egui_miniquad::EguiMq;
47use macroquad::prelude::*;
48use miniquad as mq;
49
50pub use egui;
51pub use macroquad;
52
53struct Egui(EguiMq, usize);
54
55static mut EGUI: Option<Egui> = None;
57
58fn get_egui() -> &'static mut Egui {
59 unsafe {
60 if let Some(egui) = &mut EGUI {
61 egui
62 } else {
63 EGUI = Some(Egui::new());
64 EGUI.as_mut().unwrap()
65 }
66 }
67}
68
69impl Egui {
70 fn new() -> Self {
71 Self(
72 EguiMq::new(unsafe { get_internal_gl() }.quad_context),
73 macroquad::input::utils::register_input_subscriber(),
74 )
75 }
76
77 fn ui<F: FnOnce(&mut mq::Context, &egui::Context)>(&mut self, f: F) {
78 let gl = unsafe { get_internal_gl() };
79 macroquad::input::utils::repeat_all_miniquad_input(self, self.1);
80
81 self.0.run(gl.quad_context, f);
82 }
83
84 fn draw(&mut self) {
85 let mut gl = unsafe { get_internal_gl() };
86 gl.flush();
88 self.0.draw(&mut gl.quad_context);
89 }
90}
91
92pub fn ui<F: FnOnce(&egui::Context)>(f: F) {
94 get_egui().ui(|_, ctx| f(ctx))
95}
96
97pub fn cfg<F: FnOnce(&egui::Context)>(f: F) {
99 f(get_egui().0.egui_ctx());
100}
101
102pub fn draw() {
104 get_egui().draw()
105}
106
107impl mq::EventHandler for Egui {
108 fn update(&mut self, _ctx: &mut mq::Context) {}
109
110 fn draw(&mut self, _ctx: &mut mq::Context) {}
111
112 fn mouse_motion_event(&mut self, _ctx: &mut mq::Context, x: f32, y: f32) {
113 self.0.mouse_motion_event(x, y);
114 }
115
116 fn mouse_wheel_event(&mut self, _ctx: &mut mq::Context, dx: f32, dy: f32) {
117 self.0.mouse_wheel_event(dx, dy);
118 }
119
120 fn mouse_button_down_event(
121 &mut self,
122 ctx: &mut mq::Context,
123 mb: mq::MouseButton,
124 x: f32,
125 y: f32,
126 ) {
127 self.0.mouse_button_down_event(ctx, mb, x, y);
128 }
129
130 fn mouse_button_up_event(
131 &mut self,
132 ctx: &mut mq::Context,
133 mb: mq::MouseButton,
134 x: f32,
135 y: f32,
136 ) {
137 self.0.mouse_button_up_event(ctx, mb, x, y);
138 }
139
140 fn char_event(
141 &mut self,
142 _ctx: &mut mq::Context,
143 character: char,
144 _keymods: mq::KeyMods,
145 _repeat: bool,
146 ) {
147 self.0.char_event(character);
148 }
149
150 fn key_down_event(
151 &mut self,
152 ctx: &mut mq::Context,
153 keycode: mq::KeyCode,
154 keymods: mq::KeyMods,
155 _repeat: bool,
156 ) {
157 self.0.key_down_event(ctx, keycode, keymods);
158 }
159
160 fn key_up_event(&mut self, _ctx: &mut mq::Context, keycode: mq::KeyCode, keymods: mq::KeyMods) {
161 self.0.key_up_event(keycode, keymods);
162 }
163}