1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-31 05:40:03 -04:00

Add possibility of panels inside UI (i.e. windows) (#624)

* Adding possibility to have panels inside UI

* Adding window with panels demo
This commit is contained in:
gents83
2021-08-16 21:32:44 +02:00
committed by GitHub
parent d6299bcd91
commit ff8c4c0d38
4 changed files with 193 additions and 62 deletions

View File

@@ -28,6 +28,7 @@ impl Default for Demos {
Box::new(super::widget_gallery::WidgetGallery::default()),
Box::new(super::window_options::WindowOptions::default()),
Box::new(super::tests::WindowResizeTest::default()),
Box::new(super::window_with_panels::WindowWithPanels::default()),
])
}
}

View File

@@ -21,6 +21,7 @@ pub mod tests;
pub mod toggle_switch;
pub mod widget_gallery;
pub mod window_options;
pub mod window_with_panels;
pub use {
app::DemoApp, demo_app_windows::DemoWindows, misc_demo_window::MiscDemoWindow,

View File

@@ -0,0 +1,89 @@
use egui::{menu, Align, CentralPanel, Layout, ScrollArea, SidePanel, TopBottomPanel};
#[derive(Clone, PartialEq, Default)]
#[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))]
pub struct WindowWithPanels {}
impl super::Demo for WindowWithPanels {
fn name(&self) -> &'static str {
"🗖 Window With Panels"
}
fn show(&mut self, ctx: &egui::CtxRef, open: &mut bool) {
use super::View;
let window = egui::Window::new("Window with Panels")
.scroll(false)
.title_bar(true)
.resizable(true)
.collapsible(false)
.enabled(true)
.open(open);
window.show(ctx, |ui| self.ui(ui));
}
}
impl super::View for WindowWithPanels {
fn ui(&mut self, ui: &mut egui::Ui) {
let left_panel_min_width = 100.;
let left_panel_max_width = left_panel_min_width * 4.;
let bottom_height = 25.;
ui.expand_to_include_rect(ui.max_rect()); // Expand frame to include it all
let mut top_rect = ui.available_rect_before_wrap_finite();
top_rect.min.y += ui.spacing().item_spacing.y;
let mut top_ui = ui.child_ui(top_rect, Layout::top_down(Align::Max));
let top_response = TopBottomPanel::top("window_menu")
.resizable(false)
.show_inside(&mut top_ui, |ui| {
menu::bar(ui, |ui| {
menu::menu(ui, "Menu", |ui| {
if ui.button("Option 1").clicked() {}
if ui.button("Option 2").clicked() {}
if ui.button("Option 3").clicked() {}
});
});
});
let mut left_rect = ui.available_rect_before_wrap_finite();
left_rect.min.y = top_response.response.rect.max.y + ui.spacing().item_spacing.y;
let mut left_ui = ui.child_ui(left_rect, Layout::top_down(Align::Max));
let left_response = SidePanel::left("Folders")
.resizable(true)
.min_width(left_panel_min_width)
.max_width(left_panel_max_width)
.show_inside(&mut left_ui, |ui| {
ScrollArea::auto_sized().show(ui, |ui| {
ui.vertical(|ui| {
ui.label("Left Panel");
})
})
});
let mut right_rect = ui.available_rect_before_wrap_finite();
right_rect.min.x = left_response.response.rect.max.x;
right_rect.min.y = top_response.response.rect.max.y + ui.spacing().item_spacing.y;
let mut right_ui = ui.child_ui(right_rect, Layout::top_down(Align::Max));
CentralPanel::default().show_inside(&mut right_ui, |ui| {
let mut rect = ui.min_rect();
let mut bottom_rect = rect;
bottom_rect.min.y = ui.max_rect_finite().max.y - bottom_height;
rect.max.y = bottom_rect.min.y - ui.spacing().indent;
let mut child_ui = ui.child_ui(rect, Layout::top_down(Align::Min));
let mut bottom_ui = ui.child_ui(bottom_rect, Layout::bottom_up(Align::Max));
ScrollArea::auto_sized().show(&mut child_ui, |ui| {
ui.vertical(|ui| {
ui.label("Central Panel");
})
});
bottom_ui.vertical(|ui| {
ui.separator();
ui.horizontal(|ui| {
ui.label("Bottom Content");
});
});
});
}
}