mirror of
https://github.com/emilk/egui.git
synced 2026-06-26 22:53:14 -04:00
* Now: is_desktop can only be set at the creation with egui::Context::new insted of default!
* Removed: egui::Context::is_desktop, egui::Context::set_desktop * Added: egui::Context::force_embedding, egui::Context::set_force_embedding
This commit is contained in:
@@ -333,10 +333,11 @@ impl EpiIntegration {
|
||||
app_name: &str,
|
||||
native_options: &crate::NativeOptions,
|
||||
storage: Option<Box<dyn epi::Storage>>,
|
||||
desktop: bool,
|
||||
#[cfg(feature = "glow")] gl: Option<std::sync::Arc<glow::Context>>,
|
||||
#[cfg(feature = "wgpu")] wgpu_render_state: Option<egui_wgpu::RenderState>,
|
||||
) -> Self {
|
||||
let egui_ctx = egui::Context::default();
|
||||
let egui_ctx = egui::Context::new(desktop);
|
||||
|
||||
let memory = load_egui_memory(storage.as_deref()).unwrap_or_default();
|
||||
egui_ctx.memory_mut(|mem| *mem = memory);
|
||||
|
||||
@@ -19,6 +19,16 @@ use super::epi_integration::{self, EpiIntegration};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
pub const IS_DESKTOP: bool = cfg!(any(
|
||||
target_os = "windows",
|
||||
target_os = "linux",
|
||||
target_os = "macos",
|
||||
target_os = "freebsd",
|
||||
target_os = "openbsd"
|
||||
));
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum UserEvent {
|
||||
RequestRepaint {
|
||||
@@ -891,6 +901,7 @@ mod glow_integration {
|
||||
&self.app_name,
|
||||
&self.native_options,
|
||||
storage,
|
||||
IS_DESKTOP,
|
||||
Some(gl.clone()),
|
||||
#[cfg(feature = "wgpu")]
|
||||
None,
|
||||
@@ -908,12 +919,6 @@ mod glow_integration {
|
||||
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
||||
integration.egui_ctx.set_visuals(theme.egui_visuals());
|
||||
|
||||
// !!! WARNING This is needed to be improved !!!
|
||||
// I don't really know not to detect if is on desktop or web/mobile
|
||||
// This allows to have multiples windows
|
||||
|
||||
integration.egui_ctx.set_desktop(true);
|
||||
|
||||
gl_window
|
||||
.window(ViewportId::MAIN)
|
||||
.read()
|
||||
@@ -1885,6 +1890,7 @@ mod wgpu_integration {
|
||||
&self.app_name,
|
||||
&self.native_options,
|
||||
storage,
|
||||
IS_DESKTOP,
|
||||
#[cfg(feature = "glow")]
|
||||
None,
|
||||
wgpu_render_state.clone(),
|
||||
|
||||
@@ -365,7 +365,7 @@ impl<'open> Window<'open> {
|
||||
let show_close_button = open.is_some();
|
||||
|
||||
'create_viewport: {
|
||||
if !is_embedded && ctx.is_desktop() {
|
||||
if !is_embedded && !ctx.force_embedding() {
|
||||
if let Some(size) = ctx.data(|data| data.get_temp::<Vec2>(area.id.with("size"))) {
|
||||
let size = size.round()
|
||||
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
||||
@@ -822,7 +822,7 @@ impl<'open> Window<'open> {
|
||||
let show_close_button = open.is_some();
|
||||
|
||||
'create_viewport: {
|
||||
if !is_embedded && ctx.is_desktop() {
|
||||
if !is_embedded && !ctx.force_embedding() {
|
||||
if let Some(size) = ctx.data(|data| data.get_temp::<Vec2>(area.id.with("size"))) {
|
||||
let size = size.round()
|
||||
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
||||
|
||||
@@ -224,6 +224,7 @@ struct ContextImpl {
|
||||
|
||||
viewport_counter: u64,
|
||||
is_desktop: bool,
|
||||
force_embedding: bool,
|
||||
|
||||
/// Written to during the frame.
|
||||
layer_rects_this_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>,
|
||||
@@ -469,6 +470,7 @@ impl Default for Context {
|
||||
let clone = s.clone();
|
||||
|
||||
s.write(|ctx| {
|
||||
ctx.force_embedding = true;
|
||||
ctx.render_sync = Some(Arc::new(Box::new(
|
||||
move |_builder, _viewport_id, _parent_viewport_id, render| render(&clone),
|
||||
)));
|
||||
@@ -549,6 +551,15 @@ impl Context {
|
||||
) {
|
||||
self.write(|ctx| ctx.begin_frame_mut(new_input, viewport_id, parent_viewport_id));
|
||||
}
|
||||
|
||||
pub fn new(desktop: bool) -> Context {
|
||||
let context = Context::default();
|
||||
context.write(|ctx| {
|
||||
ctx.is_desktop = desktop;
|
||||
ctx.force_embedding = !desktop;
|
||||
});
|
||||
context
|
||||
}
|
||||
}
|
||||
|
||||
/// ## Borrows parts of [`Context`]
|
||||
@@ -2202,16 +2213,15 @@ impl Context {
|
||||
self.write(|ctx| ctx.render_sync = Some(Arc::new(callback)));
|
||||
}
|
||||
|
||||
/// This will tell you if the app can create multiples native windows
|
||||
pub fn is_desktop(&self) -> bool {
|
||||
self.read(|ctx| ctx.is_desktop)
|
||||
/// If this is true no other native windows will be created
|
||||
pub fn force_embedding(&self) -> bool {
|
||||
self.read(|ctx| ctx.force_embedding)
|
||||
}
|
||||
|
||||
/// This should only be called with value true by the backend!
|
||||
///
|
||||
/// With this you can tell egui that is able to open multiples native windows
|
||||
pub fn set_desktop(&self, value: bool) {
|
||||
self.write(|ctx| ctx.is_desktop = value);
|
||||
/// If this is true no other native windows, will not be created for a ```egui::Window``` or Viewport
|
||||
/// You will always be able to set to false
|
||||
pub fn set_force_embedding(&self, value: bool) {
|
||||
self.write(|ctx| ctx.force_embedding = value || !ctx.is_desktop);
|
||||
}
|
||||
|
||||
/// With this you can send a command to a viewport
|
||||
@@ -2230,7 +2240,7 @@ impl Context {
|
||||
viewport_builder: ViewportBuilder,
|
||||
render: impl Fn(&Context) + Send + Sync + 'static,
|
||||
) {
|
||||
if self.is_desktop() {
|
||||
if !self.force_embedding() {
|
||||
self.write(|ctx| {
|
||||
let viewport_id = ctx.get_viewport_id();
|
||||
if let Some(window) = ctx.viewports.get_mut(&viewport_builder.title) {
|
||||
@@ -2269,7 +2279,7 @@ impl Context {
|
||||
viewport_builder: ViewportBuilder,
|
||||
func: impl FnOnce(&Context) -> T,
|
||||
) -> T {
|
||||
if self.is_desktop() {
|
||||
if !self.force_embedding() {
|
||||
let mut viewport_id = ViewportId::MAIN;
|
||||
let mut parent_viewport_id = ViewportId::MAIN;
|
||||
let render_sync = self.write(|ctx| {
|
||||
|
||||
@@ -172,9 +172,9 @@ impl BackendPanel {
|
||||
}
|
||||
}
|
||||
{
|
||||
let mut is_desktop = ui.ctx().is_desktop();
|
||||
ui.checkbox(&mut is_desktop, "Is Desktop");
|
||||
ui.ctx().set_desktop(is_desktop);
|
||||
let mut force_embedding = ui.ctx().force_embedding();
|
||||
ui.checkbox(&mut force_embedding, "Force Embedding");
|
||||
ui.ctx().set_force_embedding(force_embedding);
|
||||
}
|
||||
|
||||
if ui
|
||||
|
||||
Binary file not shown.
@@ -48,9 +48,9 @@ impl eframe::App for App {
|
||||
ui.label(format!("Size: {:?}", ctx.screen_rect().max));
|
||||
ui.label("Look at the \"Frame: \" will tell you, what viewport is rendering!");
|
||||
{
|
||||
let mut desktop = ctx.is_desktop();
|
||||
ui.checkbox(&mut desktop, "Desktop");
|
||||
ctx.set_desktop(desktop);
|
||||
let mut force_embedding = ctx.force_embedding();
|
||||
ui.checkbox(&mut force_embedding, "Force embedding!");
|
||||
ctx.set_force_embedding(force_embedding);
|
||||
}
|
||||
ui.checkbox(&mut self.show_async_viewport, "Show Async Viewport");
|
||||
ui.checkbox(&mut self.show_sync_viewport, "Show Sync Viewport");
|
||||
|
||||
Reference in New Issue
Block a user