mirror of
https://github.com/emilk/egui.git
synced 2026-09-01 14:20:04 -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,
|
app_name: &str,
|
||||||
native_options: &crate::NativeOptions,
|
native_options: &crate::NativeOptions,
|
||||||
storage: Option<Box<dyn epi::Storage>>,
|
storage: Option<Box<dyn epi::Storage>>,
|
||||||
|
desktop: bool,
|
||||||
#[cfg(feature = "glow")] gl: Option<std::sync::Arc<glow::Context>>,
|
#[cfg(feature = "glow")] gl: Option<std::sync::Arc<glow::Context>>,
|
||||||
#[cfg(feature = "wgpu")] wgpu_render_state: Option<egui_wgpu::RenderState>,
|
#[cfg(feature = "wgpu")] wgpu_render_state: Option<egui_wgpu::RenderState>,
|
||||||
) -> Self {
|
) -> 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();
|
let memory = load_egui_memory(storage.as_deref()).unwrap_or_default();
|
||||||
egui_ctx.memory_mut(|mem| *mem = memory);
|
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)]
|
#[derive(Debug)]
|
||||||
pub enum UserEvent {
|
pub enum UserEvent {
|
||||||
RequestRepaint {
|
RequestRepaint {
|
||||||
@@ -891,6 +901,7 @@ mod glow_integration {
|
|||||||
&self.app_name,
|
&self.app_name,
|
||||||
&self.native_options,
|
&self.native_options,
|
||||||
storage,
|
storage,
|
||||||
|
IS_DESKTOP,
|
||||||
Some(gl.clone()),
|
Some(gl.clone()),
|
||||||
#[cfg(feature = "wgpu")]
|
#[cfg(feature = "wgpu")]
|
||||||
None,
|
None,
|
||||||
@@ -908,12 +919,6 @@ mod glow_integration {
|
|||||||
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
||||||
integration.egui_ctx.set_visuals(theme.egui_visuals());
|
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
|
gl_window
|
||||||
.window(ViewportId::MAIN)
|
.window(ViewportId::MAIN)
|
||||||
.read()
|
.read()
|
||||||
@@ -1885,6 +1890,7 @@ mod wgpu_integration {
|
|||||||
&self.app_name,
|
&self.app_name,
|
||||||
&self.native_options,
|
&self.native_options,
|
||||||
storage,
|
storage,
|
||||||
|
IS_DESKTOP,
|
||||||
#[cfg(feature = "glow")]
|
#[cfg(feature = "glow")]
|
||||||
None,
|
None,
|
||||||
wgpu_render_state.clone(),
|
wgpu_render_state.clone(),
|
||||||
|
|||||||
@@ -365,7 +365,7 @@ impl<'open> Window<'open> {
|
|||||||
let show_close_button = open.is_some();
|
let show_close_button = open.is_some();
|
||||||
|
|
||||||
'create_viewport: {
|
'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"))) {
|
if let Some(size) = ctx.data(|data| data.get_temp::<Vec2>(area.id.with("size"))) {
|
||||||
let size = size.round()
|
let size = size.round()
|
||||||
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
+ 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();
|
let show_close_button = open.is_some();
|
||||||
|
|
||||||
'create_viewport: {
|
'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"))) {
|
if let Some(size) = ctx.data(|data| data.get_temp::<Vec2>(area.id.with("size"))) {
|
||||||
let size = size.round()
|
let size = size.round()
|
||||||
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
||||||
|
|||||||
@@ -224,6 +224,7 @@ struct ContextImpl {
|
|||||||
|
|
||||||
viewport_counter: u64,
|
viewport_counter: u64,
|
||||||
is_desktop: bool,
|
is_desktop: bool,
|
||||||
|
force_embedding: bool,
|
||||||
|
|
||||||
/// Written to during the frame.
|
/// Written to during the frame.
|
||||||
layer_rects_this_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>,
|
layer_rects_this_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>,
|
||||||
@@ -469,6 +470,7 @@ impl Default for Context {
|
|||||||
let clone = s.clone();
|
let clone = s.clone();
|
||||||
|
|
||||||
s.write(|ctx| {
|
s.write(|ctx| {
|
||||||
|
ctx.force_embedding = true;
|
||||||
ctx.render_sync = Some(Arc::new(Box::new(
|
ctx.render_sync = Some(Arc::new(Box::new(
|
||||||
move |_builder, _viewport_id, _parent_viewport_id, render| render(&clone),
|
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));
|
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`]
|
/// ## Borrows parts of [`Context`]
|
||||||
@@ -2202,16 +2213,15 @@ impl Context {
|
|||||||
self.write(|ctx| ctx.render_sync = Some(Arc::new(callback)));
|
self.write(|ctx| ctx.render_sync = Some(Arc::new(callback)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This will tell you if the app can create multiples native windows
|
/// If this is true no other native windows will be created
|
||||||
pub fn is_desktop(&self) -> bool {
|
pub fn force_embedding(&self) -> bool {
|
||||||
self.read(|ctx| ctx.is_desktop)
|
self.read(|ctx| ctx.force_embedding)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This should only be called with value true by the backend!
|
/// 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
|
||||||
/// With this you can tell egui that is able to open multiples native windows
|
pub fn set_force_embedding(&self, value: bool) {
|
||||||
pub fn set_desktop(&self, value: bool) {
|
self.write(|ctx| ctx.force_embedding = value || !ctx.is_desktop);
|
||||||
self.write(|ctx| ctx.is_desktop = value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// With this you can send a command to a viewport
|
/// With this you can send a command to a viewport
|
||||||
@@ -2230,7 +2240,7 @@ impl Context {
|
|||||||
viewport_builder: ViewportBuilder,
|
viewport_builder: ViewportBuilder,
|
||||||
render: impl Fn(&Context) + Send + Sync + 'static,
|
render: impl Fn(&Context) + Send + Sync + 'static,
|
||||||
) {
|
) {
|
||||||
if self.is_desktop() {
|
if !self.force_embedding() {
|
||||||
self.write(|ctx| {
|
self.write(|ctx| {
|
||||||
let viewport_id = ctx.get_viewport_id();
|
let viewport_id = ctx.get_viewport_id();
|
||||||
if let Some(window) = ctx.viewports.get_mut(&viewport_builder.title) {
|
if let Some(window) = ctx.viewports.get_mut(&viewport_builder.title) {
|
||||||
@@ -2269,7 +2279,7 @@ impl Context {
|
|||||||
viewport_builder: ViewportBuilder,
|
viewport_builder: ViewportBuilder,
|
||||||
func: impl FnOnce(&Context) -> T,
|
func: impl FnOnce(&Context) -> T,
|
||||||
) -> T {
|
) -> T {
|
||||||
if self.is_desktop() {
|
if !self.force_embedding() {
|
||||||
let mut viewport_id = ViewportId::MAIN;
|
let mut viewport_id = ViewportId::MAIN;
|
||||||
let mut parent_viewport_id = ViewportId::MAIN;
|
let mut parent_viewport_id = ViewportId::MAIN;
|
||||||
let render_sync = self.write(|ctx| {
|
let render_sync = self.write(|ctx| {
|
||||||
|
|||||||
@@ -172,9 +172,9 @@ impl BackendPanel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
let mut is_desktop = ui.ctx().is_desktop();
|
let mut force_embedding = ui.ctx().force_embedding();
|
||||||
ui.checkbox(&mut is_desktop, "Is Desktop");
|
ui.checkbox(&mut force_embedding, "Force Embedding");
|
||||||
ui.ctx().set_desktop(is_desktop);
|
ui.ctx().set_force_embedding(force_embedding);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ui
|
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(format!("Size: {:?}", ctx.screen_rect().max));
|
||||||
ui.label("Look at the \"Frame: \" will tell you, what viewport is rendering!");
|
ui.label("Look at the \"Frame: \" will tell you, what viewport is rendering!");
|
||||||
{
|
{
|
||||||
let mut desktop = ctx.is_desktop();
|
let mut force_embedding = ctx.force_embedding();
|
||||||
ui.checkbox(&mut desktop, "Desktop");
|
ui.checkbox(&mut force_embedding, "Force embedding!");
|
||||||
ctx.set_desktop(desktop);
|
ctx.set_force_embedding(force_embedding);
|
||||||
}
|
}
|
||||||
ui.checkbox(&mut self.show_async_viewport, "Show Async Viewport");
|
ui.checkbox(&mut self.show_async_viewport, "Show Async Viewport");
|
||||||
ui.checkbox(&mut self.show_sync_viewport, "Show Sync Viewport");
|
ui.checkbox(&mut self.show_sync_viewport, "Show Sync Viewport");
|
||||||
|
|||||||
Reference in New Issue
Block a user