diff --git a/src/app.rs b/src/app.rs index bf759ca..861dfe2 100644 --- a/src/app.rs +++ b/src/app.rs @@ -16,15 +16,12 @@ const FFT_SIZE: usize = 1024; pub struct TemplateApp { plots: DebugPlots, - // Example stuff: - label: String, - value: f32, /// Behind an `Arc>` so we can pass it to [`egui::PaintCallback`] and paint later. waterfall: Arc>, - _fft: Fft, - _backends: backend::Backends, - _selected_backend: usize, - _open_device: Option>, + fft: Fft, + backends: backend::Backends, + selected_backend: usize, + open_device: Option>, device_window_open: bool, } @@ -49,15 +46,11 @@ impl TemplateApp { Self { plots, - // Example stuff: - label: "Hello World!".to_owned(), - value: 2.7, waterfall: Arc::new(Mutex::new(Waterfall::new(gl, wf_size, wf_size, rx))), - //_stream: stream, - _fft: fft, - _backends: Backends::default(), - _selected_backend: 0, - _open_device: None, + fft, + backends: Backends::default(), + selected_backend: 0, + open_device: None, device_window_open: true, } } @@ -77,15 +70,11 @@ impl eframe::App for TemplateApp { /// Called each time the UI needs repainting, which may be many times per second. fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - // Put your widgets into a `SidePanel`, `TopBottomPanel`, `CentralPanel`, `Window` or `Area`. - // For inspiration and more examples, go to https://emilk.github.io/egui - ctx.request_repaint(); self.plots.update_plots(); + // Menu bar egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { - // The top panel is often a good place for a menu bar: - egui::menu::bar(ui, |ui| { // NOTE: no File->Quit on web pages! let is_web = cfg!(target_arch = "wasm32"); @@ -106,111 +95,99 @@ impl eframe::App for TemplateApp { }); }); + egui::CentralPanel::default().show(ctx, |ui| { + egui::TopBottomPanel::top("Plot") + .resizable(true) + .show_inside(ui, |_ui| { + // TODO: Add plot + }); + + egui::CentralPanel::default().show_inside(ui, |ui| { + ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| { + powered_by_egui_and_eframe(ui); + egui::warn_if_debug_build(ui); + egui::Frame::canvas(ui.style()).show(ui, |ui| { + let available_space = ui.available_size(); + let (rect, response) = + ui.allocate_exact_size(available_space, egui::Sense::drag()); + + let _angle = response.drag_motion().x * 0.01; + + // Clone locals so we can move them into the paint callback: + let waterfall = self.waterfall.clone(); + + let callback = egui::PaintCallback { + rect, + callback: std::sync::Arc::new(egui_glow::CallbackFn::new( + move |_info, painter| { + waterfall.lock().paint(painter.gl(), _angle); + }, + )), + }; + ui.painter().add(callback); + }); + }); + }); + }); + + // Update debug plot windows self.plots.render_plot_windows(ctx); - if self._open_device.is_none() { - self.device_window_open = true; - } - let mut close_device_window = false; - egui::Window::new("Select Device") - .open(&mut self.device_window_open) + // Update device selection window + let mut device_window = egui::Window::new("Select Device") .default_width(600.0) .default_height(400.0) .vscroll(false) .resizable(true) - .show(ctx, |ui| { - egui::SidePanel::left("Select Driver") - .resizable(true) - .default_width(150.0) - .width_range(80.0..=200.0) - .show_inside(ui, |ui| { - ScrollArea::vertical().show(ui, |ui| { - ui.with_layout( - egui::Layout::top_down_justified(egui::Align::LEFT), - |ui| { - for (i, b) in self._backends.0.iter().enumerate() { - ui.selectable_value( - &mut self._selected_backend, - i, - b.display_text(), - ); - } - }, - ); + .collapsible(false); + if self.open_device.is_some() { + device_window = device_window.open(&mut self.device_window_open); + } else { + device_window = device_window.anchor(egui::Align2::CENTER_CENTER, [0., 0.]); + } + let mut close_device_window = false; + device_window.show(ctx, |ui| { + egui::SidePanel::left("Select Driver") + .resizable(true) + .default_width(150.0) + .width_range(80.0..=200.0) + .show_inside(ui, |ui| { + ScrollArea::vertical().show(ui, |ui| { + ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { + for (i, b) in self.backends.0.iter().enumerate() { + ui.selectable_value( + &mut self.selected_backend, + i, + b.display_text(), + ); + } }); }); - ui.vertical_centered(|ui| { - egui::ScrollArea::vertical().show(ui, |ui| { - //if self._selected_backend < self._backends.0.len() { - if let Some(b) = self._backends.0.get_mut(self._selected_backend) { - //let mut b = &self._backends.0[self._selected_backend]; - b.show_device_selection(ui); - if ui.add(egui::Button::new("Apply")).clicked() { - drop(self._open_device.take()); - if let Ok(device) = - b.build_device(self._fft.tx.clone(), self.plots.get_sender()) - { - self._open_device = Some(device); - close_device_window = true; - } - } - } else { - ui.add(egui::Label::new("Select a Device Driver")); - } - }); }); - }); - if close_device_window { - self.device_window_open = false; - } - - egui::CentralPanel::default().show(ctx, |ui| { - // The central panel the region left after adding TopPanel's and SidePanel's - ui.heading("eframe template"); - - ui.horizontal(|ui| { - ui.label("Write something: "); - ui.text_edit_singleline(&mut self.label); - }); - - ui.add(egui::Slider::new(&mut self.value, 0.0..=10.0).text("value")); - if ui.button("Increment").clicked() { - self.value += 1.0; - } - - ui.separator(); - ui.horizontal(|ui| { - ui.spacing_mut().item_spacing.x = 0.0; - ui.label("The texture is being painted using "); - ui.hyperlink_to("glow", "https://github.com/grovesNL/glow"); - ui.label(" (OpenGL)."); - }); - - ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| { - powered_by_egui_and_eframe(ui); - egui::warn_if_debug_build(ui); - egui::Frame::canvas(ui.style()).show(ui, |ui| { - let available_space = ui.available_size(); - let (rect, response) = - ui.allocate_exact_size(available_space, egui::Sense::drag()); - - let _angle = response.drag_motion().x * 0.01; - - // Clone locals so we can move them into the paint callback: - let waterfall = self.waterfall.clone(); - - let callback = egui::PaintCallback { - rect, - callback: std::sync::Arc::new(egui_glow::CallbackFn::new( - move |_info, painter| { - waterfall.lock().paint(painter.gl(), _angle); - }, - )), - }; - ui.painter().add(callback); + ui.vertical_centered(|ui| { + egui::ScrollArea::vertical().show(ui, |ui| { + //if self._selected_backend < self._backends.0.len() { + if let Some(b) = self.backends.0.get_mut(self.selected_backend) { + //let mut b = &self._backends.0[self._selected_backend]; + b.show_device_selection(ui); + if ui.add(egui::Button::new("Apply")).clicked() { + drop(self.open_device.take()); + if let Ok(device) = + b.build_device(self.fft.tx.clone(), self.plots.get_sender()) + { + self.open_device = Some(device); + close_device_window = true; + } + } + } else { + ui.add(egui::Label::new("Select a Device Driver")); + } }); }); }); + if close_device_window { + self.device_window_open = false; + } } } @@ -219,11 +196,13 @@ fn powered_by_egui_and_eframe(ui: &mut egui::Ui) { ui.spacing_mut().item_spacing.x = 0.0; ui.label("Powered by "); ui.hyperlink_to("egui", "https://github.com/emilk/egui"); - ui.label(" and "); + ui.label(", "); ui.hyperlink_to( "eframe", "https://github.com/emilk/egui/tree/master/crates/eframe", ); + ui.label(" and "); + ui.hyperlink_to("glow", "https://github.com/grovesNL/glow"); ui.label("."); }); }