From cbd356adff53aab53396a8af044f1756ad9af8bc Mon Sep 17 00:00:00 2001
From: jsalmon3 <>
Date: Thu, 16 Oct 2003 21:10:44 +0000
Subject: [PATCH] Moved button-buttons inside button-panel

---
 src/include/ui.h     |   5 +--
 src/ui/script_ui.cpp | 103 +++++++++++++++++++++++++------------------
 src/ui/ui.cpp        |  25 ++++++-----
 3 files changed, 75 insertions(+), 58 deletions(-)

diff --git a/src/include/ui.h b/src/include/ui.h
index ff7b073d2..1ffa69557 100644
--- a/src/include/ui.h
+++ b/src/include/ui.h
@@ -241,6 +241,8 @@ typedef struct _ui_ {
 
     // Button panel
     GraphicConfig ButtonPanel;		/// Button panel background
+    Button*	ButtonButtons;		/// Button panel buttons
+    int		NumButtonButtons;	/// Number of button panel buttons
     int		ButtonPanelX;		/// Button panel screen X position
     int		ButtonPanelY;		/// Button panel screen Y position
 
@@ -289,9 +291,6 @@ typedef struct _ui_ {
     int		StatusLineTextY;	/// status line screen text Y position
     int		StatusLineFont;		/// Status line font
 
-    Button*	ButtonButtons;		/// Button panel buttons
-    int		NumButtonButtons;	/// Number of button panel buttons
-
     // Offsets for 640x480 center used by menus
     int		Offset640X;		/// Offset for 640x480 X position
     int		Offset480Y;		/// Offset for 640x480 Y position
diff --git a/src/ui/script_ui.cpp b/src/ui/script_ui.cpp
index 150c62917..bf5f6caf7 100644
--- a/src/ui/script_ui.cpp
+++ b/src/ui/script_ui.cpp
@@ -694,9 +694,9 @@ local void CclParseInfoText(SCM list, InfoText* text)
 }
 
 /**
-**	Parse info panel icon
+**	Parse icon
 */
-local void CclParseInfoIcon(SCM list, Button* icon)
+local void CclParseIcon(SCM list, Button* icon)
 {
     SCM value;
 
@@ -749,7 +749,7 @@ local void CclParseSelected(SCM list, UI* ui)
 		    value = gh_car(sublist);
 		    sublist = gh_cdr(sublist);
 		    ui->SingleSelectedButton = calloc(1, sizeof(Button));
-		    CclParseInfoIcon(value, ui->SingleSelectedButton);
+		    CclParseIcon(value, ui->SingleSelectedButton);
 		} else {
 		    errl("Unsupported tag", value);
 		}
@@ -781,7 +781,7 @@ local void CclParseSelected(SCM list, UI* ui)
 		    while (!gh_null_p(slist)) {
 			value = gh_car(slist);
 			slist = gh_cdr(slist);
-			CclParseInfoIcon(value, &ui->SelectedButtons[i++]);
+			CclParseIcon(value, &ui->SelectedButtons[i++]);
 		    }
 		} else {
 		    errl("Unsupported tag", value);
@@ -823,7 +823,7 @@ local void CclParseTraining(SCM list, UI* ui)
 		    value = gh_car(sublist);
 		    sublist = gh_cdr(sublist);
 		    ui->SingleTrainingButton = calloc(1, sizeof(Button));
-		    CclParseInfoIcon(value, ui->SingleTrainingButton);
+		    CclParseIcon(value, ui->SingleTrainingButton);
 		} else {
 		    errl("Unsupported tag", value);
 		}
@@ -855,7 +855,7 @@ local void CclParseTraining(SCM list, UI* ui)
 		    while (!gh_null_p(slist)) {
 			value = gh_car(slist);
 			slist = gh_cdr(slist);
-			CclParseInfoIcon(value, &ui->TrainingButtons[i++]);
+			CclParseIcon(value, &ui->TrainingButtons[i++]);
 		    }
 		} else {
 		    errl("Unsupported tag", value);
@@ -890,7 +890,7 @@ local void CclParseUpgrading(SCM list, UI* ui)
 	    value = gh_car(list);
 	    list = gh_cdr(list);
 	    ui->UpgradingButton = calloc(1, sizeof(Button));
-	    CclParseInfoIcon(value, ui->UpgradingButton);
+	    CclParseIcon(value, ui->UpgradingButton);
 	} else {
 	    errl("Unsupported tag", value);
 	}
@@ -920,7 +920,7 @@ local void CclParseResearching(SCM list, UI* ui)
 	    value = gh_car(list);
 	    list = gh_cdr(list);
 	    ui->ResearchingButton = calloc(1, sizeof(Button));
-	    CclParseInfoIcon(value, ui->ResearchingButton);
+	    CclParseIcon(value, ui->ResearchingButton);
 	} else {
 	    errl("Unsupported tag", value);
 	}
@@ -959,7 +959,7 @@ local void CclParseTransporting(SCM list, UI* ui)
 	    while (!gh_null_p(sublist)) {
 		value = gh_car(sublist);
 		sublist = gh_cdr(sublist);
-		CclParseInfoIcon(value, &ui->TransportingButtons[i++]);
+		CclParseIcon(value, &ui->TransportingButtons[i++]);
 	    }
 	} else {
 	    errl("Unsupported tag", value);
@@ -967,6 +967,24 @@ local void CclParseTransporting(SCM list, UI* ui)
     }
 }
 
+/**
+**	Parse button panel icons section
+*/
+local void CclParseButtonIcons(SCM list, UI* ui)
+{
+    SCM value;
+    int i;
+
+    ui->NumButtonButtons = gh_length(list);
+    ui->ButtonButtons = calloc(ui->NumButtonButtons, sizeof(Button));
+    i = 0;
+    while (!gh_null_p(list)) {
+	value = gh_car(list);
+	list = gh_cdr(list);
+	CclParseIcon(value, &ui->ButtonButtons[i++]);
+    }
+}
+
 /**
 **	Define the look+feel of the user interface.
 **
@@ -1270,9 +1288,38 @@ local SCM CclDefineUI(SCM list)
 	} else if (gh_eq_p(value, gh_symbol2scm("button-panel"))) {
 	    sublist = gh_car(list);
 	    list = gh_cdr(list);
-	    ui->ButtonPanel.File = SCM_PopNewStr(&sublist);
-	    ui->ButtonPanelX = SCM_PopInt(&sublist);
-	    ui->ButtonPanelY = SCM_PopInt(&sublist);
+	    while (!gh_null_p(sublist)) {
+		value = gh_car(sublist);
+		sublist = gh_cdr(sublist);
+		if (gh_eq_p(value, gh_symbol2scm("panel"))) {
+		    SCM slist;
+
+		    slist = gh_car(sublist);
+		    sublist = gh_cdr(sublist);
+		    while (!gh_null_p(slist)) {
+			value = gh_car(slist);
+			slist = gh_cdr(slist);
+			if (gh_eq_p(value, gh_symbol2scm("file"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->ButtonPanel.File = gh_scm2newstr(value, NULL);
+			} else if (gh_eq_p(value, gh_symbol2scm("pos"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->ButtonPanelX = gh_scm2int(gh_car(value));
+			    ui->ButtonPanelY = gh_scm2int(gh_car(gh_cdr(value)));
+			} else {
+			    errl("Unsupported tag", value);
+			}
+		    }
+		} else if (gh_eq_p(value, gh_symbol2scm("icons"))) {
+		    value = gh_car(sublist);
+		    sublist = gh_cdr(sublist);
+		    CclParseButtonIcons(value, ui);
+		} else {
+		    errl("Unsupported tag", value);
+		}
+	    }
 	} else if (gh_eq_p(value, gh_symbol2scm("map-area"))) {
 	    int w;
 	    int h;
@@ -1449,38 +1496,6 @@ local SCM CclDefineUI(SCM list)
 		    errl("Unsupported tag", value);
 		}
 	    }
-	} else if (gh_eq_p(value, gh_symbol2scm("button-buttons"))) {
-	    SCM slist;
-	    SCM sslist;
-	    Button* b;
-	    
-	    slist = gh_car(list);
-	    list = gh_cdr(list);
-	    while (!gh_null_p(slist)) {
-		sslist = gh_car(slist);
-		slist = gh_cdr(slist);
-		ui->NumButtonButtons++;
-		ui->ButtonButtons = realloc(ui->ButtonButtons,
-		    ui->NumButtonButtons * sizeof(*ui->ButtonButtons));
-		b = &ui->ButtonButtons[ui->NumButtonButtons - 1];
-		while (!gh_null_p(sslist)) {
-		    value = gh_car(sslist);
-		    sslist = gh_cdr(sslist);
-		    if (gh_eq_p(value, gh_symbol2scm("pos"))) {
-			value = gh_car(sslist);
-			sslist = gh_cdr(sslist);
-			b->X = gh_scm2int(gh_car(value));
-			b->Y = gh_scm2int(gh_car(gh_cdr(value)));
-		    } else if (gh_eq_p(value, gh_symbol2scm("size"))) {
-			value = gh_car(sslist);
-			sslist = gh_cdr(sslist);
-			b->Width = gh_scm2int(gh_car(value));
-			b->Height = gh_scm2int(gh_car(gh_cdr(value)));
-		    } else {
-			errl("Unsupported tag", value);
-		    }
-		}
-	    }
 	} else if (gh_eq_p(value, gh_symbol2scm("cursors"))) {
 	    sublist = gh_car(list);
 	    list = gh_cdr(list);
diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp
index e80b0280d..04f058874 100644
--- a/src/ui/ui.cpp
+++ b/src/ui/ui.cpp
@@ -488,8 +488,19 @@ local void SaveUi(CLFile* file, const UI* ui)
 
     CLprintf(file, ")\n");    // 'info-panel
 
-    CLprintf(file, "\n  'button-panel (list \"%s\" %d %d)",
-	ui->ButtonPanel.File, ui->ButtonPanelX, ui->ButtonPanelY);
+    CLprintf(file, "\n  'button-panel (list\n");
+    CLprintf(file, "\n    'panel (list\n");
+    CLprintf(file, "\n      'file \"%s\"\n", ui->ButtonPanel.File);
+    CLprintf(file, "\n      'pos '(%d %d))",
+	ui->ButtonPanelX, ui->ButtonPanelY);
+    CLprintf(file, "\n    'icons (list\n");
+    for (i = 0; i < ui->NumButtonButtons; ++i) {
+	CLprintf(file, "\n      (list 'pos '(%d %d) 'size '(%d %d))",
+	    ui->ButtonButtons[i].X, ui->ButtonButtons[i].Y,
+	    ui->ButtonButtons[i].Width, ui->ButtonButtons[i].Height);
+    }
+    CLprintf(file, ")");
+    CLprintf(file, ")\n");
 
     CLprintf(file, "\n  'map-area (list");
     CLprintf(file, "\n    'pos '(%3d %3d)",
@@ -557,15 +568,7 @@ local void SaveUi(CLFile* file, const UI* ui)
 	MenuButtonStyle(ui->NetworkDiplomacyButton.Button));
     CLprintf(file, ")\n");
 
-    CLprintf(file, "\n  'button-buttons '(");
-    for (i = 0; i < ui->NumButtonButtons; ++i) {
-	CLprintf(file, "\n    (pos (%3d %3d) size (%d %d))",
-	    ui->ButtonButtons[i].X, ui->ButtonButtons[i].Y,
-	    ui->ButtonButtons[i].Width, ui->ButtonButtons[i].Height);
-    }
-    CLprintf(file, ")");
-
-    CLprintf(file, "\n\n  'cursors '(");
+    CLprintf(file, "\n  'cursors '(");
     CLprintf(file, "\n    point %s", ui->Point.Name);
     CLprintf(file, "\n    glass %s", ui->Glass.Name);
     CLprintf(file, "\n    cross %s", ui->Cross.Name);