gui: optimize paddings

This commit is contained in:
ardocrat
2023-04-18 16:19:43 +03:00
parent 092e943795
commit db602ff9a0
16 changed files with 318 additions and 149 deletions
+8 -7
View File
@@ -17,13 +17,13 @@ use log::LevelFilter::{Debug, Info, Trace, Warn};
#[cfg(target_os = "android")]
use winit::platform::android::activity::AndroidApp;
use eframe::{AppCreator, CreationContext, NativeOptions, Renderer};
use crate::gui::{MainApp};
use eframe::{AppCreator, NativeOptions, Renderer};
use crate::gui::PlatformApp;
#[allow(dead_code)]
#[cfg(target_os = "android")]
#[no_mangle]
fn android_main(app: AndroidApp) {
unsafe fn android_main(app: AndroidApp) {
#[cfg(debug_assertions)]
{
std::env::set_var("RUST_BACKTRACE", "full");
@@ -31,6 +31,7 @@ fn android_main(app: AndroidApp) {
android_logger::Config::default().with_max_level(Info).with_tag("grim"),
);
}
let _app = app.clone();
use winit::platform::android::EventLoopBuilderExtAndroid;
let mut options = NativeOptions::default();
@@ -38,9 +39,9 @@ fn android_main(app: AndroidApp) {
builder.with_android_app(app);
}));
use crate::gui::AndroidUi;
start(options, Box::new(|_cc| Box::new(MainApp::new(_cc)
.with_status_bar_height(24.0)
use crate::gui::platform::app::Android;
start(options, Box::new(|_cc| Box::new(
PlatformApp::new(_cc, Android::new(_app))
)));
}
@@ -54,7 +55,7 @@ fn main() {
.init();
let options = NativeOptions::default();
start(options, Box::new(|_cc| Box::new(MainApp::new(_cc))));
start(options, Box::new(|_cc| Box::new(App::new(_cc))));
}
fn start(mut options: NativeOptions, app_creator: AppCreator) {
+4 -51
View File
@@ -12,55 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use egui::FontTweak;
#[derive(Default)]
pub struct MainApp {
root: egui_demo_lib::DemoWindows,
status_bar_height: Option<f32>
}
impl MainApp {
pub fn new(cc: &eframe::CreationContext<'_>) -> Self {
setup_fonts(&cc.egui_ctx);
Self::default()
}
}
#[cfg(target_os = "android")]
impl crate::gui::AndroidUi for MainApp {
fn with_status_bar_height(mut self, value: f32) -> Self {
self.status_bar_height = Some(value);
self
}
}
impl eframe::App for MainApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::TopBottomPanel::top("top_padding_panel")
.resizable(false)
.exact_height(self.status_bar_height.unwrap_or(0.0))
.show(ctx, |ui| {});
self.root.ui(ctx);
}
}
fn setup_fonts(ctx: &egui::Context) {
let mut fonts = egui::FontDefinitions::default();
fonts.font_data.insert(
"jura".to_owned(),
egui::FontData::from_static(include_bytes!(
"../../fonts/jura.ttf"
)).tweak(FontTweak {
scale: 1.0,
y_offset_factor: -0.25,
y_offset: 0.0
}),
);
fonts
.families
.entry(egui::FontFamily::Proportional)
.or_default()
.insert(0, "jura".to_owned());
ctx.set_fonts(fonts);
pub struct PlatformApp<Platform> {
pub(crate) root: egui_demo_lib::DemoWindows,
// root: super::views::main
pub(crate) platform: Platform,
}
+4 -8
View File
@@ -1,4 +1,4 @@
// Copyright 2023 The Grin Developers
// Copyright 2023 The Grim Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -13,11 +13,7 @@
// limitations under the License.
mod app;
pub mod root;
pub use crate::gui::app::PlatformApp;
pub use app::MainApp;
#[cfg(target_os = "android")]
pub trait AndroidUi {
fn with_status_bar_height(self, value: f32) -> Self;
}
pub mod views;
pub mod platform;
+177
View File
@@ -0,0 +1,177 @@
// Copyright 2023 The Grim Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use egui::{Color32, FontTweak, Visuals};
use egui::epaint::Shadow;
use jni::objects::{JObject, JPrimitiveArray};
use crate::gui::PlatformApp;
use winit::platform::android::activity::AndroidApp;
pub struct Android {
pub android_app: AndroidApp,
pub cutouts: [i32; 4],
pub window_size: [f32; 2]
}
impl Android {
pub fn new(app: AndroidApp) -> Self {
Android {
android_app: app,
cutouts: Default::default(),
window_size: Default::default()
}
}
}
impl PlatformApp<Android> {
pub fn new(cc: &eframe::CreationContext<'_>, platform: Android) -> Self {
setup_fonts(&cc.egui_ctx);
// cc.egui_ctx.set_visuals(Visuals {
// dark_mode: false,
// override_text_color: None,
// widgets: Default::default(),
// selection: Default::default(),
// hyperlink_color: Default::default(),
// faint_bg_color: Default::default(),
// extreme_bg_color: Default::default(),
// code_bg_color: Default::default(),
// warn_fg_color: Default::default(),
// error_fg_color: Default::default(),
// window_rounding: Default::default(),
// window_shadow: Default::default(),
// window_fill: Default::default(),
// window_stroke: Default::default(),
// panel_fill: Default::default(),
// popup_shadow: Default::default(),
// resize_corner_size: 0.0,
// text_cursor_width: 0.0,
// text_cursor_preview: false,
// clip_rect_margin: 0.0,
// button_frame: false,
// collapsing_header_frame: false,
// });
Self {
root: Default::default(),
platform,
}
}
}
fn setup_fonts(ctx: &egui::Context) {
let mut fonts = egui::FontDefinitions::default();
fonts.font_data.insert(
"roboto".to_owned(),
egui::FontData::from_static(include_bytes!(
"../../../../fonts/roboto.ttf"
)).tweak(FontTweak {
scale: 1.0,
y_offset_factor: -0.20,
y_offset: 0.0
}),
);
fonts
.families
.entry(egui::FontFamily::Proportional)
.or_default()
.insert(0, "roboto".to_owned());
ctx.set_fonts(fonts);
}
impl eframe::App for PlatformApp<Android> {
fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
println!("12345 - X {}", frame.info().window_info.size.x);
println!("12345 - Y {}", frame.info().window_info.size.y);
let _x = frame.info().window_info.size.x;
let _y = frame.info().window_info.size.y;
if _x != self.platform.window_size[0] || _y != self.platform.window_size[1] {
self.platform.window_size[0] = _x;
self.platform.window_size[1] = _y;
self.platform.cutouts = get_display_cutouts(&self.platform.android_app);
}
egui::TopBottomPanel::top("top_padding_panel")
.frame(egui::Frame {
shadow: Shadow::NONE,
fill: Color32::TRANSPARENT,
..Default::default()
})
.show_separator_line(false)
.resizable(false)
.exact_height(self.platform.cutouts[0] as f32)
.show(ctx, |ui| {});
egui::SidePanel::right("right_padding_panel")
.frame(egui::Frame {
shadow: Shadow::NONE,
fill: Color32::TRANSPARENT,
..Default::default()
})
.show_separator_line(false)
.resizable(false)
.default_width(self.platform.cutouts[1] as f32)
.show(ctx, |ui| {});
egui::TopBottomPanel::bottom("bottom_padding_panel")
.frame(egui::Frame {
shadow: Shadow::NONE,
fill: Color32::TRANSPARENT,
..Default::default()
})
.show_separator_line(false)
.resizable(false)
.exact_height(self.platform.cutouts[2] as f32)
.show(ctx, |ui| {});
egui::SidePanel::left("left_padding_panel")
.frame(egui::Frame {
shadow: Shadow::NONE,
fill: Color32::TRANSPARENT,
..Default::default()
})
.show_separator_line(false)
.resizable(false)
.default_width(self.platform.cutouts[3] as f32)
.show(ctx, |ui| {});
egui::CentralPanel::default().show(ctx, |ui| {
self.root.ui(ctx);
});
}
}
fn get_display_cutouts(app: &AndroidApp) -> [i32; 4] {
let vm = unsafe { jni::JavaVM::from_raw(app.vm_as_ptr() as _) }.unwrap();
let mut env = vm.attach_current_thread().unwrap();
let activity = unsafe {
JObject::from_raw(app.activity_as_ptr() as jni::sys::jobject)
};
let _res = env
.call_method(
activity,
"getDisplayCutouts",
"()[I",
&[],
)
.unwrap();
let mut array: [i32; 4] = [0; 4];
let object: jni::sys::jobject = unsafe { _res.as_jni().l };
unsafe {
env.get_int_array_region(JPrimitiveArray::from(
JObject::from_raw(object)), 0, array.as_mut()
).unwrap();
}
array
}
+24
View File
@@ -0,0 +1,24 @@
// Copyright 2023 The Grim Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use crate::gui::PlatformApp;
#[derive(Default)]
pub struct Desktop;
impl PlatformApp<Desktop> {
pub fn new(cc: &eframe::CreationContext<'_>) -> Self {
Self::default()
}
}
+21
View File
@@ -0,0 +1,21 @@
// Copyright 2023 The Grim Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#[cfg(target_os = "android")]
#[path = "android/mod.rs"]
pub mod app;
#[cfg(not(target_os = "android"))]
#[path = "desktop/mod.rs"]
pub mod app;
View File
+14
View File
@@ -0,0 +1,14 @@
// Copyright 2023 The Grim Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
+14
View File
@@ -0,0 +1,14 @@
// Copyright 2023 The Grim Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
pub mod main;