1
0
mirror of https://github.com/emilk/egui.git synced 2026-06-27 23:13:13 -04:00

Added maximize_button, mimimize_button and hittest on ViewportBuilder

!!! hittest is not working because of winit !!!
This commit is contained in:
Konkitoman
2023-08-11 18:19:57 +03:00
parent 6201caf00b
commit 74e50044b5
3 changed files with 78 additions and 4 deletions

View File

@@ -1029,7 +1029,9 @@ pub fn process_viewport_commands(
}
ViewportCommand::CursorVisible(v) => win.set_cursor_visible(v),
ViewportCommand::CursorHitTest(v) => {
win.set_cursor_hittest(v);
if let Err(err) = win.set_cursor_hittest(v) {
log::error!("Setting viewport CursorHitTest: {err}");
}
}
}
}
@@ -1054,6 +1056,8 @@ pub fn create_winit_window_builder(builder: &ViewportBuilder) -> winit::window::
.with_decorations(builder.decorations.map_or(false, |e| e))
.with_resizable(builder.resizable.map_or(false, |e| e))
.with_visible(builder.visible.map_or(false, |e| e))
.with_maximized(builder.minimized.map_or(false, |e| e))
.with_maximized(builder.maximized.map_or(false, |e| e))
.with_fullscreen(
builder
.fullscreen
@@ -1061,8 +1065,16 @@ pub fn create_winit_window_builder(builder: &ViewportBuilder) -> winit::window::
.flatten(),
)
.with_enabled_buttons(
WindowButtons::MAXIMIZE
| WindowButtons::MINIMIZE
builder
.minimize_button
.map(|v| v.then(|| WindowButtons::MINIMIZE))
.flatten()
.unwrap_or(WindowButtons::empty())
| builder
.maximize_button
.map(|v| v.then(|| WindowButtons::MAXIMIZE))
.flatten()
.unwrap_or(WindowButtons::empty())
| builder
.close_button
.map(|v| v.then(|| WindowButtons::CLOSE))
@@ -1098,6 +1110,9 @@ pub fn create_winit_window_builder(builder: &ViewportBuilder) -> winit::window::
));
}
// TODO: implement `ViewportBuilder::hittest`
// Is not implemented because winit in his current state will not allow to set cursor_hittest on a `WindowBuilder`
window_builder
}
@@ -1211,6 +1226,13 @@ pub fn changes_between_builders(
}
}
if let Some(hittest) = new.hittest {
if Some(hittest) != last.hittest {
last.hittest = Some(hittest);
commands.push(ViewportCommand::CursorHitTest(hittest));
}
}
// TODO: Implement compare for windows buttons
let mut recreate_window = false;
@@ -1229,6 +1251,20 @@ pub fn changes_between_builders(
}
}
if let Some(minimize_button) = new.minimize_button {
if Some(minimize_button) != last.minimize_button {
last.minimize_button = Some(minimize_button);
recreate_window = true;
}
}
if let Some(maximized_button) = new.maximize_button {
if Some(maximized_button) != last.maximize_button {
last.maximize_button = Some(maximized_button);
recreate_window = true;
}
}
if let Some(title_hidden) = new.title_hidden {
if Some(title_hidden) != last.title_hidden {
last.title_hidden = Some(title_hidden);

View File

@@ -257,9 +257,19 @@ fn show_tooltip_area_dyn<'c, R>(
add_contents: Box<dyn FnOnce(&mut Ui) -> R + 'c>,
) -> InnerResponse<R> {
use containers::*;
// TODO: Get window pos from winit
let parent_window_pos = (0, 0);
// TODO: Need some how to calculate the ui size before rendering!
ctx.create_viewport_sync(
ViewportBuilder::default().with_title(format!("Popup Window: {area_id:?}")),
ViewportBuilder::default()
.with_position(Some((
window_pos.x as i32 + parent_window_pos.0,
window_pos.y as i32 + parent_window_pos.1,
)))
.with_decorations(false)
.with_title(format!("Popup Window: {area_id:?}")),
|ctx| {
ctx.viewport_command(ctx.get_viewport_id(), ViewportCommand::CursorHitTest(false));
Area::new(area_id)
.order(Order::Tooltip)
.fixed_pos(window_pos)

View File

@@ -47,6 +47,10 @@ pub struct ViewportBuilder {
pub drag_and_drop: Option<bool>,
pub close_button: Option<bool>,
pub minimize_button: Option<bool>,
pub maximize_button: Option<bool>,
pub hittest: Option<bool>,
}
impl Default for ViewportBuilder {
@@ -72,6 +76,9 @@ impl Default for ViewportBuilder {
drag_and_drop: None,
close_button: None,
minimized: Some(false),
minimize_button: Some(true),
maximize_button: Some(true),
hittest: Some(true),
}
}
}
@@ -99,6 +106,9 @@ impl ViewportBuilder {
drag_and_drop: None,
close_button: None,
minimized: None,
minimize_button: None,
maximize_button: None,
hittest: None,
}
}
pub fn with_title(mut self, title: impl Into<String>) -> Self {
@@ -187,6 +197,16 @@ impl ViewportBuilder {
self
}
pub fn with_minimize_button(mut self, value: bool) -> Self {
self.minimize_button = Some(value);
self
}
pub fn with_maximize_button(mut self, value: bool) -> Self {
self.maximize_button = Some(value);
self
}
pub fn with_drag_and_drop(mut self, value: bool) -> Self {
self.drag_and_drop = Some(value);
self
@@ -196,8 +216,16 @@ impl ViewportBuilder {
self.position = Some(value);
self
}
/// Is not implemented for winit
/// You should use `ViewportCommand::CursorHitTest` if you want to set this!
pub fn with_hittest(mut self, value: bool) -> Self {
self.hittest = Some(value);
self
}
}
/// You can send a `ViewportCommand` to the viewport with `Context::viewport_command`
#[derive(Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum ViewportCommand {