fix: modal padding and window border on desktop

This commit is contained in:
ardocrat 2024-10-26 23:23:39 +03:00
parent 5c8b9c40be
commit 75cf7edc96
3 changed files with 35 additions and 29 deletions

View file

@ -14,7 +14,7 @@
use std::sync::atomic::{AtomicBool, Ordering};
use lazy_static::lazy_static;
use egui::{Align, Context, CursorIcon, Layout, Modifiers, ResizeDirection, Rounding, UiBuilder, ViewportCommand};
use egui::{Align, Context, CursorIcon, Layout, Modifiers, ResizeDirection, Rounding, Stroke, UiBuilder, ViewportCommand};
use egui::epaint::{RectShape};
use egui::os::OperatingSystem;
@ -114,7 +114,7 @@ impl<Platform: PlatformCallbacks> App<Platform> {
} else {
self.window_title_ui(ui, is_fullscreen);
ui.add_space(-1.0);
Self::title_panel_bg(ui, is_fullscreen);
Self::title_panel_bg(ui);
self.content.ui(ui, &self.platform);
}
} else {
@ -138,29 +138,24 @@ impl<Platform: PlatformCallbacks> App<Platform> {
/// Draw mobile platform window content.
fn mobile_window_ui(&mut self, ui: &mut egui::Ui) {
Self::title_panel_bg(ui, true);
Self::title_panel_bg(ui);
self.content.ui(ui, &self.platform);
}
/// Draw desktop platform window content.
fn desktop_window_ui(&mut self, ui: &mut egui::Ui, is_fullscreen: bool) {
Self::title_panel_bg(ui, is_fullscreen);
let rect = ui.max_rect();
let content_bg_rect = {
let mut r = rect.clone();
let mut r = ui.max_rect();
if !is_fullscreen {
r = r.shrink(Content::WINDOW_FRAME_MARGIN);
}
let top = Content::WINDOW_TITLE_HEIGHT + TitlePanel::HEIGHT + if !is_fullscreen {
Content::WINDOW_FRAME_MARGIN
} else {
0.0
};
r.min.y = top;
r.min.y += Content::WINDOW_TITLE_HEIGHT + TitlePanel::HEIGHT;
r
};
let content_bg = RectShape::filled(content_bg_rect, Rounding::ZERO, Colors::fill_lite());
let content_bg = RectShape::new(content_bg_rect,
Rounding::ZERO,
Colors::fill_lite(),
View::default_stroke());
// Draw content background.
ui.painter().add(content_bg);
@ -172,6 +167,10 @@ impl<Platform: PlatformCallbacks> App<Platform> {
ui.allocate_new_ui(UiBuilder::new().max_rect(content_rect), |ui| {
// Draw window title.
self.window_title_ui(ui, is_fullscreen);
ui.add_space(-1.0);
// Draw title panel background.
Self::title_panel_bg(ui);
let content_rect = {
let mut rect = ui.max_rect();
@ -199,15 +198,11 @@ impl<Platform: PlatformCallbacks> App<Platform> {
}
/// Draw title panel background.
fn title_panel_bg(ui: &mut egui::Ui, is_fullscreen: bool) {
fn title_panel_bg(ui: &mut egui::Ui) {
let title_rect = {
let mut rect = ui.max_rect();
if View::is_desktop() {
let is_mac = OperatingSystem::from_target_os() == OperatingSystem::Mac;
if !is_mac && !is_fullscreen {
rect = rect.shrink(Content::WINDOW_FRAME_MARGIN)
}
rect.min.y += Content::WINDOW_TITLE_HEIGHT;
rect.min.y += Content::WINDOW_TITLE_HEIGHT - 0.5;
}
rect.max.y = rect.min.y + View::get_top_inset() + TitlePanel::HEIGHT;
rect
@ -224,8 +219,13 @@ impl<Platform: PlatformCallbacks> App<Platform> {
rect
};
let title_bg_rect = {
let mut r = title_rect.clone();
r.max.y += TitlePanel::HEIGHT - 1.0;
r
};
let is_mac = OperatingSystem::from_target_os() == OperatingSystem::Mac;
let window_title_bg = RectShape::filled(title_rect, if is_fullscreen || is_mac {
let window_title_bg = RectShape::new(title_bg_rect, if is_fullscreen || is_mac {
Rounding::ZERO
} else {
Rounding {
@ -234,7 +234,7 @@ impl<Platform: PlatformCallbacks> App<Platform> {
sw: 0.0,
se: 0.0,
}
}, Colors::yellow_dark());
}, Colors::yellow_dark(), Stroke::new(1.0, Colors::STROKE));
// Draw title background.
ui.painter().add(window_title_bg);

View file

@ -64,7 +64,6 @@ const TITLE_DARK: Color32 = Color32::from_gray(205);
const GRAY: Color32 = Color32::from_gray(120);
const GRAY_DARK: Color32 = Color32::from_gray(145);
const STROKE: Color32 = Color32::from_gray(200);
const STROKE_DARK: Color32 = Color32::from_gray(50);
const INACTIVE_TEXT: Color32 = Color32::from_gray(150);
@ -86,6 +85,7 @@ fn use_dark() -> bool {
impl Colors {
pub const TRANSPARENT: Color32 = Color32::from_rgba_premultiplied(0, 0, 0, 0);
pub const STROKE: Color32 = Color32::from_gray(200);
pub fn white_or_black(black_in_white: bool) -> Color32 {
if use_dark() {
@ -219,7 +219,7 @@ impl Colors {
if use_dark() {
STROKE_DARK
} else {
STROKE
Self::STROKE
}
}

View file

@ -185,10 +185,11 @@ impl Modal {
});
// Setup background rect.
let bg_rect = if View::is_desktop() && !is_fullscreen {
let bg_rect = if View::is_desktop() {
let mut r = ctx.screen_rect();
if OperatingSystem::Mac != OperatingSystem::from_target_os() {
r = r.shrink(Content::WINDOW_FRAME_MARGIN);
let is_mac = OperatingSystem::Mac == OperatingSystem::from_target_os();
if !is_mac && !is_fullscreen {
r = r.shrink(Content::WINDOW_FRAME_MARGIN - 1.0);
}
r.min.y += Content::WINDOW_TITLE_HEIGHT;
r
@ -253,12 +254,17 @@ impl Modal {
};
let x_align = View::get_left_inset() - View::get_right_inset();
let is_mac = OperatingSystem::Mac == OperatingSystem::from_target_os();
let extra_y = if View::is_desktop() {
Content::WINDOW_TITLE_HEIGHT - Self::DEFAULT_MARGIN / 2.0
Content::WINDOW_TITLE_HEIGHT + if !is_mac {
Content::WINDOW_FRAME_MARGIN
} else {
0.0
}
} else {
0.0
};
let y_align = View::get_top_inset() + Self::DEFAULT_MARGIN + extra_y;
let y_align = View::get_top_inset() + Self::DEFAULT_MARGIN / 2.0 + extra_y;
let offset = match self.position {
ModalPosition::CenterTop => Vec2::new(x_align, y_align),