mirror of
https://github.com/emilk/egui.git
synced 2026-09-01 22:30:03 -04:00
Use egui::ViewportBuilder in eframe::NativeOptions (#3572)
* Part of https://github.com/emilk/egui/issues/3556 This PR replaces a bunch of options in `eframe::NativeOptions` with `egui::ViewportBuilder`. For instance: ``` diff let options = eframe::NativeOptions { - initial_window_size: Some(egui::vec2(320.0, 240.0)), - drag_and_drop_support: true, + viewport: egui::ViewportBuilder::default() + .with_inner_size([320.0, 240.0]) + .with_drag_and_drop(true), centered: true, ..Default::default() }; ```
This commit is contained in:
@@ -2,16 +2,18 @@
|
||||
//!
|
||||
//! TODO(emilk): port this to [`winit`].
|
||||
|
||||
use crate::IconData;
|
||||
use std::sync::Arc;
|
||||
|
||||
use egui::IconData;
|
||||
|
||||
pub struct AppTitleIconSetter {
|
||||
title: String,
|
||||
icon_data: Option<IconData>,
|
||||
icon_data: Option<Arc<IconData>>,
|
||||
status: AppIconStatus,
|
||||
}
|
||||
|
||||
impl AppTitleIconSetter {
|
||||
pub fn new(title: String, icon_data: Option<IconData>) -> Self {
|
||||
pub fn new(title: String, icon_data: Option<Arc<IconData>>) -> Self {
|
||||
Self {
|
||||
title,
|
||||
icon_data,
|
||||
@@ -22,7 +24,7 @@ impl AppTitleIconSetter {
|
||||
/// Call once per frame; we will set the icon when we can.
|
||||
pub fn update(&mut self) {
|
||||
if self.status == AppIconStatus::NotSetTryAgain {
|
||||
self.status = set_title_and_icon(&self.title, self.icon_data.as_ref());
|
||||
self.status = set_title_and_icon(&self.title, self.icon_data.as_deref());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -71,6 +73,7 @@ fn set_title_and_icon(_title: &str, _icon_data: Option<&IconData>) -> AppIconSta
|
||||
#[cfg(target_os = "windows")]
|
||||
#[allow(unsafe_code)]
|
||||
fn set_app_icon_windows(icon_data: &IconData) -> AppIconStatus {
|
||||
use crate::icon_data::IconDataExt as _;
|
||||
use winapi::um::winuser;
|
||||
|
||||
// We would get fairly far already with winit's `set_window_icon` (which is exposed to eframe) actually!
|
||||
@@ -191,6 +194,7 @@ fn set_app_icon_windows(icon_data: &IconData) -> AppIconStatus {
|
||||
#[cfg(target_os = "macos")]
|
||||
#[allow(unsafe_code)]
|
||||
fn set_title_and_icon_mac(title: &str, icon_data: Option<&IconData>) -> AppIconStatus {
|
||||
use crate::icon_data::IconDataExt as _;
|
||||
crate::profile_function!();
|
||||
|
||||
use cocoa::{
|
||||
@@ -215,6 +219,10 @@ fn set_title_and_icon_mac(title: &str, icon_data: Option<&IconData>) -> AppIconS
|
||||
// SAFETY: Accessing raw data from icon in a read-only manner. Icon data is static!
|
||||
unsafe {
|
||||
let app = NSApp();
|
||||
if app.is_null() {
|
||||
log::debug!("NSApp is null");
|
||||
return AppIconStatus::NotSetIgnored;
|
||||
}
|
||||
|
||||
if let Some(png_bytes) = png_bytes {
|
||||
let data = NSData::dataWithBytes_length_(
|
||||
@@ -222,17 +230,27 @@ fn set_title_and_icon_mac(title: &str, icon_data: Option<&IconData>) -> AppIconS
|
||||
png_bytes.as_ptr().cast::<std::ffi::c_void>(),
|
||||
png_bytes.len() as u64,
|
||||
);
|
||||
|
||||
log::trace!("NSImage::initWithData…");
|
||||
let app_icon = NSImage::initWithData_(NSImage::alloc(nil), data);
|
||||
|
||||
crate::profile_scope!("setApplicationIconImage_");
|
||||
log::trace!("setApplicationIconImage…");
|
||||
app.setApplicationIconImage_(app_icon);
|
||||
}
|
||||
|
||||
// Change the title in the top bar - for python processes this would be again "python" otherwise.
|
||||
let main_menu = app.mainMenu();
|
||||
let app_menu: id = msg_send![main_menu.itemAtIndex_(0), submenu];
|
||||
crate::profile_scope!("setTitle_");
|
||||
app_menu.setTitle_(NSString::alloc(nil).init_str(title));
|
||||
if !main_menu.is_null() {
|
||||
let item = main_menu.itemAtIndex_(0);
|
||||
if !item.is_null() {
|
||||
let app_menu: id = msg_send![item, submenu];
|
||||
if !app_menu.is_null() {
|
||||
crate::profile_scope!("setTitle_");
|
||||
app_menu.setTitle_(NSString::alloc(nil).init_str(title));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The title in the Dock apparently can't be changed.
|
||||
// At least these people didn't figure it out either:
|
||||
|
||||
Reference in New Issue
Block a user