From f7408ac9b736f593e255534331f66dd785dc3ec2 Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Sun, 23 Feb 2025 21:18:21 -0500 Subject: [PATCH] Fix layouts and colors --- src/window/utils.rs | 18 ++++++++- src/window/vram/bgmap.rs | 2 +- src/window/vram/chardata.rs | 2 +- src/window/vram/framebuffer.rs | 2 +- src/window/vram/object.rs | 2 +- src/window/vram/registers.rs | 70 ++++++++++++++++++++++++---------- src/window/vram/utils.rs | 9 ++++- src/window/vram/world.rs | 2 +- 8 files changed, 78 insertions(+), 29 deletions(-) diff --git a/src/window/utils.rs b/src/window/utils.rs index d85d631..d1afab6 100644 --- a/src/window/utils.rs +++ b/src/window/utils.rs @@ -41,7 +41,7 @@ impl UiExt for Ui { frame.inner_margin.top += 2.0; let res = self.push_id(&title, |ui| { frame.show(ui, |ui| { - ui.set_min_width(ui.available_width()); + ui.set_max_width(ui.available_width()); add_contents(ui); }) }); @@ -143,6 +143,7 @@ pub struct NumberEdit<'a, T: Number> { precision: usize, min: Option, max: Option, + desired_width: Option, arrows: bool, hex: bool, } @@ -155,6 +156,7 @@ impl<'a, T: Number> NumberEdit<'a, T> { precision: 3, min: None, max: None, + desired_width: None, arrows: true, hex: false, } @@ -178,6 +180,13 @@ impl<'a, T: Number> NumberEdit<'a, T> { Self { min, max, ..self } } + pub fn desired_width(self, desired_width: f32) -> Self { + Self { + desired_width: Some(desired_width), + ..self + } + } + pub fn arrows(self, arrows: bool) -> Self { Self { arrows, ..self } } @@ -246,9 +255,16 @@ impl Widget for NumberEdit<'_, T> { }) }); } + let mut desired_width = self + .desired_width + .unwrap_or_else(|| ui.spacing().text_edit_width); + if self.arrows { + desired_width -= 16.0; + } let text = TextEdit::singleline(&mut str) .horizontal_align(Align::Max) .id(id) + .desired_width(desired_width) .margin(Margin { left: 4.0, right: if self.arrows { 20.0 } else { 4.0 }, diff --git a/src/window/vram/bgmap.rs b/src/window/vram/bgmap.rs index 3b0f39f..25f7ca4 100644 --- a/src/window/vram/bgmap.rs +++ b/src/window/vram/bgmap.rs @@ -195,7 +195,7 @@ impl AppWindow for BgMapWindow { CentralPanel::default().show(ctx, |ui| { ui.horizontal_top(|ui| { StripBuilder::new(ui) - .size(Size::relative(0.3)) + .size(Size::relative(0.3).at_most(200.0)) .size(Size::remainder()) .horizontal(|mut strip| { strip.cell(|ui| { diff --git a/src/window/vram/chardata.rs b/src/window/vram/chardata.rs index 10c14d7..3a6d841 100644 --- a/src/window/vram/chardata.rs +++ b/src/window/vram/chardata.rs @@ -259,7 +259,7 @@ impl AppWindow for CharacterDataWindow { CentralPanel::default().show(ctx, |ui| { ui.horizontal_top(|ui| { StripBuilder::new(ui) - .size(Size::relative(0.3)) + .size(Size::relative(0.3).at_most(200.0)) .size(Size::remainder()) .horizontal(|mut strip| { strip.cell(|ui| { diff --git a/src/window/vram/framebuffer.rs b/src/window/vram/framebuffer.rs index b49a4bb..3a2e722 100644 --- a/src/window/vram/framebuffer.rs +++ b/src/window/vram/framebuffer.rs @@ -161,7 +161,7 @@ impl AppWindow for FrameBufferWindow { CentralPanel::default().show(ctx, |ui| { ui.horizontal_top(|ui| { StripBuilder::new(ui) - .size(Size::relative(0.3)) + .size(Size::relative(0.3).at_most(200.0)) .size(Size::remainder()) .horizontal(|mut strip| { strip.cell(|ui| { diff --git a/src/window/vram/object.rs b/src/window/vram/object.rs index 90c200e..656c2d1 100644 --- a/src/window/vram/object.rs +++ b/src/window/vram/object.rs @@ -216,7 +216,7 @@ impl AppWindow for ObjectWindow { CentralPanel::default().show(ctx, |ui| { ui.horizontal_top(|ui| { StripBuilder::new(ui) - .size(Size::relative(0.3)) + .size(Size::relative(0.3).at_most(200.0)) .size(Size::remainder()) .horizontal(|mut strip| { strip.cell(|ui| { diff --git a/src/window/vram/registers.rs b/src/window/vram/registers.rs index b0e46f4..997d5dc 100644 --- a/src/window/vram/registers.rs +++ b/src/window/vram/registers.rs @@ -39,15 +39,16 @@ impl RegisterWindow { let mut intpnd = InterruptReg::parse(raw_intpnd); ui.section("Interrupt", |ui| { let width = ui.available_width(); + let xspace = ui.spacing().item_spacing.x; ui.with_layout(Layout::top_down_justified(Align::Center), |ui| { TableBuilder::new(ui) .id_salt("raw_values") - .columns(Column::exact(width * 0.5), 2) + .columns(Column::exact(width * 0.5 - xspace), 2) .cell_layout(Layout::left_to_right(Align::Max)) .body(|mut body| { body.row(row_height, |mut row| { row.col(|ui| { - ui.add_sized(ui.available_size(), Label::new("INTENB")); + ui.label("INTENB"); }); row.col(|ui| { let mut text = format!("{raw_intenb:04x}"); @@ -73,8 +74,8 @@ impl RegisterWindow { ui.add_space(8.0); TableBuilder::new(ui) .id_salt("flags") - .column(Column::exact(width * 0.5)) - .columns(Column::exact(width * 0.25), 2) + .column(Column::exact(width * 0.5 - xspace)) + .columns(Column::exact(width * 0.25 - xspace), 2) .cell_layout(Layout::left_to_right(Align::Center).with_main_align(Align::RIGHT)) .body(|mut body| { body.row(row_height, |mut row| { @@ -114,8 +115,8 @@ impl RegisterWindow { add_row("LFBEND", &mut intenb.lfbend, &mut intpnd.lfbend); add_row("SCANERR", &mut intenb.scanerr, &mut intpnd.scanerr); }); - ui.allocate_space(ui.available_size()); }); + ui.allocate_space(ui.available_size()); }); if intpnd.update(&mut raw_intpnd) { self.memory.write(self.sim_id, 0x0005f800, &raw_intpnd); @@ -129,6 +130,7 @@ impl RegisterWindow { let row_height = self.row_height(ui); let mut raw_dpstts = self.read_address(0x0005f820); let mut dpstts = DisplayReg::parse(raw_dpstts); + ui.add_space(-ui.spacing().item_spacing.x); ui.section("Display", |ui| { let width = ui.available_width(); TableBuilder::new(ui) @@ -211,6 +213,7 @@ impl RegisterWindow { let row_height = self.row_height(ui); let [mut raw_xpstts, raw_xpctrl] = self.read_address(0x0005f840); let mut xpstts = DrawingReg::parse(raw_xpstts); + ui.add_space(-ui.spacing().item_spacing.x); ui.section("Drawing", |ui| { let width = ui.available_width(); TableBuilder::new(ui) @@ -308,10 +311,13 @@ impl RegisterWindow { fn show_colors(&mut self, ui: &mut Ui) { let row_height = self.row_height(ui); let registers = self.registers.borrow(); + ui.add_space(-ui.spacing().item_spacing.x); ui.section("Colors", |ui| { + let width = ui.available_width(); + let xspace = ui.spacing().item_spacing.x; TableBuilder::new(ui) - .column(Column::auto()) - .columns(Column::remainder(), 4) + .column(Column::exact(width * 0.2 - xspace)) + .columns(Column::exact(width * 0.20 - xspace), 4) .cell_layout(Layout::left_to_right(Align::Max)) .body(|mut body| { body.row(row_height, |mut row| { @@ -388,6 +394,7 @@ impl RegisterWindow { .add( NumberEdit::new(value) .range(0..256) + .desired_width(width * 0.2) .arrows(false) .hex(true), ) @@ -398,7 +405,11 @@ impl RegisterWindow { }); row.col(|ui| { if ui - .add(NumberEdit::new(&mut c1).range(0..4).arrows(false)) + .add( + NumberEdit::new(&mut c1) + .range(0..4) + .desired_width(ui.available_width() - xspace), + ) .changed() { *value = (*value & 0xfff3) | (c1 << 2); @@ -407,7 +418,11 @@ impl RegisterWindow { }); row.col(|ui| { if ui - .add(NumberEdit::new(&mut c2).range(0..4).arrows(false)) + .add( + NumberEdit::new(&mut c2) + .range(0..4) + .desired_width(ui.available_width() - xspace), + ) .changed() { *value = (*value & 0xffcf) | (c2 << 4); @@ -416,7 +431,11 @@ impl RegisterWindow { }); row.col(|ui| { if ui - .add(NumberEdit::new(&mut c3).range(0..4).arrows(false)) + .add( + NumberEdit::new(&mut c3) + .range(0..4) + .desired_width(ui.available_width() - xspace), + ) .changed() { *value = (*value & 0xff3f) | (c3 << 6); @@ -445,7 +464,11 @@ impl RegisterWindow { row.col(|ui| { let mut bkcol: u16 = read_address(®isters, 0x0005f870); if ui - .add(NumberEdit::new(&mut bkcol).range(0..4).arrows(false)) + .add( + NumberEdit::new(&mut bkcol) + .range(0..4) + .desired_width(ui.available_width() - xspace), + ) .changed() { self.memory.write(self.sim_id, 0x0005f870, &bkcol); @@ -478,12 +501,14 @@ impl RegisterWindow { fn show_objects(&mut self, ui: &mut Ui) { let row_height = self.row_height(ui); + ui.add_space(-ui.spacing().item_spacing.x); ui.section("Objects", |ui| { let width = ui.available_width(); + let xspace = ui.spacing().item_spacing.x; TableBuilder::new(ui) - .column(Column::exact(width * 0.25)) - .column(Column::exact(width * 0.25)) - .column(Column::exact(width * 0.5)) + .column(Column::exact(width * 0.25 - xspace)) + .column(Column::exact(width * 0.25 - xspace)) + .column(Column::exact(width * 0.5 - xspace)) .cell_layout(Layout::left_to_right(Align::Center).with_main_align(Align::RIGHT)) .body(|mut body| { body.row(row_height, |mut row| { @@ -526,11 +551,13 @@ impl RegisterWindow { fn show_misc(&mut self, ui: &mut Ui) { let row_height = self.row_height(ui); let registers = self.registers.borrow(); + ui.add_space(-ui.spacing().item_spacing.x); ui.section("Misc.", |ui| { let width = ui.available_width(); + let xspace = ui.spacing().item_spacing.x; TableBuilder::new(ui) - .column(Column::exact(width * 0.5)) - .column(Column::exact(width * 0.5)) + .column(Column::exact(width * 0.5 - xspace)) + .column(Column::exact(width * 0.5 - xspace)) .cell_layout(Layout::left_to_right(Align::Center).with_main_align(Align::RIGHT)) .body(|mut body| { body.row(row_height, |mut row| { @@ -626,12 +653,13 @@ impl AppWindow for RegisterWindow { CentralPanel::default().show(ctx, |ui| { ScrollArea::vertical().show(ui, |ui| { ui.horizontal_top(|ui| { - let width = ui.available_width() - (ui.spacing().item_spacing.x * 8.0); + let xspace = ui.spacing().item_spacing.x; + let width = ui.available_width() - (xspace * 5.0); StripBuilder::new(ui) - .size(Size::exact(width * 0.2)) - .size(Size::exact(width * 0.2)) - .size(Size::exact(width * 0.3)) - .size(Size::exact(width * 0.2)) + .size(Size::exact(width * 0.2 - xspace)) + .size(Size::exact(width * 0.2 - xspace)) + .size(Size::exact(width * 0.4 - xspace)) + .size(Size::exact(width * 0.2 - xspace)) .horizontal(|mut strip| { strip.cell(|ui| { self.show_interrupts(ui); diff --git a/src/window/vram/utils.rs b/src/window/vram/utils.rs index 726b18f..76df3bf 100644 --- a/src/window/vram/utils.rs +++ b/src/window/vram/utils.rs @@ -1,9 +1,14 @@ use egui::{Color32, Image, ImageSource, Response, Sense, TextureOptions, Ui, Widget}; -pub const GENERIC_PALETTE: [u8; 4] = [0, 64, 128, 255]; +pub const GENERIC_PALETTE: [u8; 4] = [0, 32, 64, 128]; pub fn shade(brt: u8, color: Color32) -> Color32 { - color.gamma_multiply(brt as f32 / 255.0) + let corrected = if brt & 0x80 != 0 { + 255 + } else { + (brt << 1) | (brt >> 6) + }; + color.gamma_multiply(corrected as f32 / 255.0) } pub fn generic_palette(color: Color32) -> [Color32; 4] { diff --git a/src/window/vram/world.rs b/src/window/vram/world.rs index 4596b1b..44258d0 100644 --- a/src/window/vram/world.rs +++ b/src/window/vram/world.rs @@ -453,7 +453,7 @@ impl AppWindow for WorldWindow { CentralPanel::default().show(ctx, |ui| { ui.horizontal_top(|ui| { StripBuilder::new(ui) - .size(Size::relative(0.3)) + .size(Size::relative(0.3).at_most(200.0)) .size(Size::remainder()) .horizontal(|mut strip| { strip.cell(|ui| {