1
0
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:
Konkitoman
2023-08-22 09:39:41 +03:00
parent 2919a325d9
commit 013f01dbcb
7 changed files with 42 additions and 25 deletions

View File

@@ -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);

View File

@@ -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(),

View File

@@ -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();

View File

@@ -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| {

View File

@@ -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.

View File

@@ -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");