From 6ba6e89a018f247702dc4a90057bc6b40bdf8994 Mon Sep 17 00:00:00 2001
From: Louis Capitanchik <contact@louiscap.co>
Date: Thu, 8 Dec 2022 04:39:13 +0000
Subject: [PATCH] Manual sizing for buttons unless sizing is specified from
 outside

---
 game_core/src/ui/components/button.rs | 37 ++++++++++++++++++++++-----
 game_core/src/ui/widgets/town_menu.rs | 18 ++++++-------
 2 files changed, 40 insertions(+), 15 deletions(-)

diff --git a/game_core/src/ui/components/button.rs b/game_core/src/ui/components/button.rs
index 09d0882..89d6d06 100644
--- a/game_core/src/ui/components/button.rs
+++ b/game_core/src/ui/components/button.rs
@@ -1,4 +1,5 @@
 use bevy::prelude::*;
+use kayak_font::{KayakFont, TextProperties};
 use kayak_ui::prelude::*;
 use kayak_ui::widgets::{ElementBundle, NinePatch, NinePatchBundle, TextProps, TextWidgetBundle};
 use micro_musicbox::prelude::MusicBox;
@@ -56,6 +57,7 @@ pub fn render_button_widget(
 	state_query: Query<&ButtonWidgetState>,
 	mut query: Query<(&ButtonWidgetProps, &KChildren, &mut ComputedStyles, &KStyle)>,
 	assets: Res<AssetHandles>,
+	fonts: Res<Assets<KayakFont>>,
 ) -> bool {
 	if let Ok((props, children, mut computed, style)) = query.get_mut(entity) {
 		let state_entity =
@@ -132,27 +134,49 @@ pub fn render_button_widget(
 				},
 			);
 
-			let button_height = props.font_size + 2.0 + 24.0; // + 8.0;
+			let font_data = fonts.get(&assets.kayak_font("equipment_pro")).unwrap();
+			let content_measurement = font_data.measure(
+				props.text.as_str(),
+				TextProperties {
+					font_size: props.font_size,
+					line_height: props.font_size + 2.0,
+					alignment: Alignment::Start,
+					tab_size: 4,
+					max_size: (100000.0, props.font_size + 2.0),
+				},
+			);
+
+			let edge_padding = 12.0;
+			let (text_width, text_height) = content_measurement.size();
+			let button_height = text_height + (edge_padding * 2.0); // + 8.0;
+			let mut button_width = text_width + (edge_padding * 2.0) + 8.0;
+
+			if !props.left_icon.is_none() {
+				button_width += props.font_size + 23.0;
+			}
+			if !props.right_icon.is_none() {
+				button_width += props.font_size + 23.0;
+			}
 
 			let nine_vals = if props.is_disabled {
 				NinePatch {
 					handle: assets.image("button_disabled"),
-					border: Edge::all(12.0),
+					border: Edge::all(edge_padding),
 				}
 			} else if state.is_pressed {
 				NinePatch {
 					handle: assets.image("button_down"),
-					border: Edge::all(12.0),
+					border: Edge::all(edge_padding),
 				}
 			} else if state.is_hovered {
 				NinePatch {
 					handle: assets.image("button_active"),
-					border: Edge::all(12.0),
+					border: Edge::all(edge_padding),
 				}
 			} else {
 				NinePatch {
 					handle: assets.image("button_idle"),
-					border: Edge::all(12.0),
+					border: Edge::all(edge_padding),
 				}
 			};
 
@@ -175,7 +199,7 @@ pub fn render_button_widget(
 			};
 
 			*computed = KStyle {
-				render_command: value(RenderCommand::Layout),
+				render_command: value(RenderCommand::Quad),
 				min_height: px(32.0),
 				min_width: px(32.0),
 				height: px(button_height),
@@ -183,6 +207,7 @@ pub fn render_button_widget(
 			}
 			.with_style(style.clone())
 			.with_style(KStyle {
+				width: px(button_width),
 				padding_bottom: stretch(0.0),
 				padding_top: stretch(0.0),
 				padding_left: stretch(0.0),
diff --git a/game_core/src/ui/widgets/town_menu.rs b/game_core/src/ui/widgets/town_menu.rs
index c204ab8..8eedbe1 100644
--- a/game_core/src/ui/widgets/town_menu.rs
+++ b/game_core/src/ui/widgets/town_menu.rs
@@ -126,9 +126,9 @@ pub fn render_town_menu_panel(
 				}}>
 					<ButtonWidget
 						styles={KStyle {
-							width: px(225.0),
-							padding_left: px(30.0),
-							padding_right: px(20.0),
+							// width: px(225.0),
+							// padding_left: px(30.0),
+							// padding_right: px(20.0),
 							..Default::default()
 						}}
 						props={ButtonWidgetProps {
@@ -139,9 +139,9 @@ pub fn render_town_menu_panel(
 					/>
 					<ButtonWidget
 						styles={KStyle {
-							width: px(260.0),
-							padding_left: px(30.0),
-							padding_right: px(20.0),
+							// width: px(260.0),
+							// padding_left: px(30.0),
+							// padding_right: px(20.0),
 							..Default::default()
 						}}
 						props={ButtonWidgetProps {
@@ -152,9 +152,9 @@ pub fn render_town_menu_panel(
 					/>
 					<ButtonWidget
 						styles={KStyle {
-							width: px(225.0),
-							padding_left: px(30.0),
-							padding_right: px(20.0),
+							// width: px(225.0),
+							// padding_left: px(30.0),
+							// padding_right: px(20.0),
 							..Default::default()
 						}}
 						props={ButtonWidgetProps {
-- 
GitLab