main_gui.c
changeset 4820 223cc0ebc44b
parent 4781 f944e20fac7b
child 4821 c8d85defeec2
--- a/main_gui.c	Thu Oct 12 10:14:45 2006 +0000
+++ b/main_gui.c	Thu Oct 12 10:43:14 2006 +0000
@@ -433,6 +433,8 @@
 static void MenuWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
+		case WE_CREATE: w->widget[0].right = w->width - 1; break;
+
 	case WE_PAINT: {
 		int count,sel;
 		int x,y;
@@ -452,7 +454,7 @@
 		x = 1;
 		y = 1;
 
-		eo = 157;
+		eo = w->width - 3;
 
 		inc = (chk != 0) ? 2 : 1;
 
@@ -505,9 +507,11 @@
 	}
 }
 
+/* Dynamic widget length determined by toolbar-string length.
+ * See PopupMainToolbMenu en MenuWndProc */
 static const Widget _menu_widgets[] = {
-{      WWT_PANEL,   RESIZE_NONE,    14,     0,   159,     0, 65535,     0, STR_NULL},
-{   WIDGETS_END},
+{    WWT_PANEL, RESIZE_NONE, 14, 0,  0, 0, 0, STR_NULL, STR_NULL},
+{ WIDGETS_END},
 };
 
 
@@ -659,23 +663,49 @@
 	}
 }
 
-static Window *PopupMainToolbMenu(Window *w, int x, int main_button, StringID base_string, int item_count, byte disabled_mask)
+/** Get the maximum length of a given string in a string-list. This is an
+ * implicit string-list where the ID's are consecutive
+ * @param base_string StringID of the first string in the list
+ * @param count amount of StringID's in the list
+ * @return the length of the longest string */
+static int GetStringListMaxWidth(StringID base_string, byte count)
 {
+	char buffer[512];
+	int width, max_width;
+	byte i;
+
+	max_width = 0;
+	for (i = 0; i != count; i++) {
+		GetString(buffer, base_string + i);
+		width = GetStringBoundingBox(buffer).width;
+		if (width > max_width) max_width = width;
+	}
+
+	return max_width;
+}
+
+static Window *PopupMainToolbMenu(Window *w, int x, uint16 main_button, StringID base_string, byte item_count, byte disabled_mask)
+{
+	int width;
 	x += w->left;
 
+	assert(disabled_mask == 0 || item_count <= 8);
 	LowerWindowWidget(w, main_button);
 	InvalidateWidget(w, main_button);
 
 	DeleteWindowById(WC_TOOLBAR_MENU, 0);
 
-	w = AllocateWindow(x, 0x16, 0xA0, item_count * 10 + 2, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets);
+	/* Extend the dropdown toolbar to the longest string in the list */
+	width = max(GetStringListMaxWidth(base_string, item_count) + 6, 160);
+
+	w = AllocateWindow(x, 22, width, item_count * 10 + 2, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets);
 	w->widget[0].bottom = item_count * 10 + 1;
 	w->flags4 &= ~WF_WHITE_BORDER_MASK;
 
 	WP(w,menu_d).item_count = item_count;
 	WP(w,menu_d).sel_index = 0;
-	WP(w,menu_d).main_button = main_button;
-	WP(w,menu_d).action_id = (main_button >> 8) ? (main_button >> 8) : main_button;
+	WP(w,menu_d).main_button = GB(main_button, 0, 8);
+	WP(w,menu_d).action_id = (GB(main_button, 8, 8) != 0) ? GB(main_button, 8, 8) : main_button;
 	WP(w,menu_d).string_id = base_string;
 	WP(w,menu_d).checked_items = 0;
 	WP(w,menu_d).disabled_items = disabled_mask;
@@ -683,7 +713,6 @@
 	_popup_menu_active = true;
 
 	SndPlayFx(SND_15_BEEP);
-
 	return w;
 }