Skip to content

Commit

Permalink
[libgui - Rust] Bordered separately models outer and inner border insets
Browse files Browse the repository at this point in the history
This will allow us to use a wide outer border to draw a scroll bar for scroll views
  • Loading branch information
codyd51 committed Feb 12, 2024
1 parent 15e4a8b commit 5f724d1
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 31 deletions.
24 changes: 16 additions & 8 deletions rust_programs/file_browser/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,16 @@ impl Drawable for CurrentPathView {
}

impl Bordered for CurrentPathView {
fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
self.view.draw_inner_content(outer_frame, onto);
fn outer_border_insets(&self) -> RectInsets {
self.view.outer_border_insets()
}

fn border_insets(&self) -> RectInsets {
self.view.border_insets()
fn inner_border_insets(&self) -> RectInsets {
self.view.inner_border_insets()
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
self.view.draw_inner_content(outer_frame, onto);
}
}

Expand Down Expand Up @@ -391,12 +395,16 @@ impl Drawable for DirectoryContentsView {
}

impl Bordered for DirectoryContentsView {
fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
self.view.draw_inner_content(outer_frame, onto);
fn outer_border_insets(&self) -> RectInsets {
self.view.outer_border_insets()
}

fn border_insets(&self) -> RectInsets {
self.view.border_insets()
fn inner_border_insets(&self) -> RectInsets {
self.view.inner_border_insets()
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
self.view.draw_inner_content(outer_frame, onto);
}
}

Expand Down
10 changes: 8 additions & 2 deletions rust_programs/libgui/src/bordered.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use agx_definitions::{
Color, Drawable, LikeLayerSlice, Line, Point, Rect, RectInsets, StrokeThickness,
Color, Drawable, LikeLayerSlice, Line, Point, Rect, RectInsets, Size, StrokeThickness,
};
use alloc::boxed::Box;
use alloc::rc::Rc;
Expand All @@ -8,7 +8,13 @@ use alloc::vec::Vec;
use crate::ui_elements::UIElement;

pub trait Bordered: Drawable + UIElement {
fn border_insets(&self) -> RectInsets;
fn outer_border_insets(&self) -> RectInsets;

fn inner_border_insets(&self) -> RectInsets;

fn border_insets(&self) -> RectInsets {
self.outer_border_insets() + self.inner_border_insets()
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>);

Expand Down
8 changes: 6 additions & 2 deletions rust_programs/libgui/src/button.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,12 @@ impl Button {
}

impl Bordered for Button {
fn border_insets(&self) -> RectInsets {
RectInsets::new(10, 10, 10, 10)
fn outer_border_insets(&self) -> RectInsets {
RectInsets::new(5, 5, 5, 5)
}

fn inner_border_insets(&self) -> RectInsets {
RectInsets::new(5, 5, 5, 5)
}

fn draw_border(&self) -> Rect {
Expand Down
12 changes: 10 additions & 2 deletions rust_programs/libgui/src/scroll_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -686,11 +686,19 @@ impl ScrollView {
pub fn add_component(self: Rc<Self>, elem: Rc<dyn UIElement>) {
Rc::clone(&self.view).add_component(elem)
}

fn scroll_bar_width() -> isize {
60
}
}

impl Bordered for ScrollView {
fn border_insets(&self) -> RectInsets {
self.view.border_insets()
fn outer_border_insets(&self) -> RectInsets {
RectInsets::new(5, 5, Self::scroll_bar_width(), 5)
}

fn inner_border_insets(&self) -> RectInsets {
RectInsets::new(6, 6, 6, 6)
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
Expand Down
8 changes: 6 additions & 2 deletions rust_programs/libgui/src/text_input_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -365,8 +365,12 @@ impl UIElement for TextInputView {
}

impl Bordered for TextInputView {
fn border_insets(&self) -> RectInsets {
self.view.border_insets()
fn outer_border_insets(&self) -> RectInsets {
self.view.outer_border_insets()
}

fn inner_border_insets(&self) -> RectInsets {
self.view.inner_border_insets()
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
Expand Down
8 changes: 6 additions & 2 deletions rust_programs/libgui/src/text_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -378,8 +378,12 @@ impl TextView {
}

impl Bordered for TextView {
fn border_insets(&self) -> RectInsets {
self.view.border_insets()
fn outer_border_insets(&self) -> RectInsets {
self.view.outer_border_insets()
}

fn inner_border_insets(&self) -> RectInsets {
self.view.inner_border_insets()
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
Expand Down
23 changes: 16 additions & 7 deletions rust_programs/libgui/src/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,20 @@ impl NestedLayerSlice for View {
}

impl Bordered for View {
fn outer_border_insets(&self) -> RectInsets {
match *self.border_enabled.borrow() {
true => RectInsets::new(5, 5, 5, 5),
false => RectInsets::zero(),
}
}

fn inner_border_insets(&self) -> RectInsets {
match *self.border_enabled.borrow() {
true => RectInsets::new(6, 6, 6, 6),
false => RectInsets::zero(),
}
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
onto.fill(self.background_color);
self.draw_subviews();
Expand All @@ -118,13 +132,6 @@ impl Bordered for View {
fn border_enabled(&self) -> bool {
*self.border_enabled.borrow()
}

fn border_insets(&self) -> RectInsets {
match *self.border_enabled.borrow() {
true => RectInsets::new(11, 11, 11, 11),
false => RectInsets::zero(),
}
}
}

impl Drawable for View {
Expand Down Expand Up @@ -164,6 +171,7 @@ impl UIElement for View {

fn handle_mouse_entered(&self) {
*self.currently_contains_mouse_int.borrow_mut() = true;
// Redraw the border so we can update the outline highlight
self.draw_border();
}

Expand All @@ -175,6 +183,7 @@ impl UIElement for View {
elem.handle_mouse_exited();
}

// Redraw the border so we can update the outline highlight
self.draw_border();
}

Expand Down
8 changes: 6 additions & 2 deletions rust_programs/libgui_derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,12 @@ fn impl_bordered_derive(ast: &syn::DeriveInput) -> TokenStream {
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
let gen = quote! {
impl #impl_generics Bordered for #name #ty_generics #where_clause {
fn border_insets(&self) -> RectInsets {
self.view.border_insets()
fn outer_border_insets(&self) -> RectInsets {
self.view.outer_border_insets()
}

fn inner_border_insets(&self) -> RectInsets {
self.view.inner_border_insets()
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
Expand Down
16 changes: 12 additions & 4 deletions rust_programs/xplatform_gui/src/main_std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,12 @@ impl BackedByView {
}

impl Bordered for BackedByView {
fn border_insets(&self) -> RectInsets {
self.view.border_insets()
fn outer_border_insets(&self) -> RectInsets {
self.view.outer_border_insets()
}

fn inner_border_insets(&self) -> RectInsets {
self.view.inner_border_insets()
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
Expand All @@ -132,8 +136,12 @@ impl BackedByScrollView {
}

impl Bordered for BackedByScrollView {
fn border_insets(&self) -> RectInsets {
self.view.border_insets()
fn outer_border_insets(&self) -> RectInsets {
self.view.outer_border_insets()
}

fn inner_border_insets(&self) -> RectInsets {
self.view.inner_border_insets()
}

fn draw_inner_content(&self, outer_frame: Rect, onto: &mut Box<dyn LikeLayerSlice>) {
Expand Down

0 comments on commit 5f724d1

Please sign in to comment.