From 587458cdffed05e9cf03ed271b7aed985b372204 Mon Sep 17 00:00:00 2001
From: jsalmon3 <>
Date: Fri, 17 Oct 2003 00:23:09 +0000
Subject: [PATCH] Rewrote menu-panel

---
 src/editor/editloop.cpp    |  10 +-
 src/include/ui.h           |   8 +-
 src/stratagus/mainloop.cpp |  10 +-
 src/ui/script_ui.cpp       | 211 +++++++++++++++++++++----------------
 src/ui/ui.cpp              |  18 ++--
 5 files changed, 144 insertions(+), 113 deletions(-)

diff --git a/src/editor/editloop.cpp b/src/editor/editloop.cpp
index a5b68bac6..76d58f173 100644
--- a/src/editor/editloop.cpp
+++ b/src/editor/editloop.cpp
@@ -905,11 +905,11 @@ global void EditorUpdateDisplay(void)
     //
     //  Menu button
     //
-    if (TheUI.MenuButtonGraphic.Graphic) {
-	VideoDrawSub(TheUI.MenuButtonGraphic.Graphic, 0, 0,
-	    TheUI.MenuButtonGraphic.Graphic->Width,
-	    TheUI.MenuButtonGraphic.Graphic->Height,
-	    TheUI.MenuButtonGraphicX, TheUI.MenuButtonGraphicY);
+    if (TheUI.MenuPanel.Graphic) {
+	VideoDrawSub(TheUI.MenuPanel.Graphic, 0, 0,
+	    TheUI.MenuPanel.Graphic->Width,
+	    TheUI.MenuPanel.Graphic->Height,
+	    TheUI.MenuPanelX, TheUI.MenuPanelY);
     }
     DrawMenuButton(TheUI.MenuButton.Button,
 	(ButtonAreaUnderCursor == ButtonAreaMenu
diff --git a/src/include/ui.h b/src/include/ui.h
index 1ffa69557..eba5ec011 100644
--- a/src/include/ui.h
+++ b/src/include/ui.h
@@ -255,10 +255,10 @@ typedef struct _ui_ {
     // Map* attributes of Viewport are unused here:
     Viewport	MapArea;		/// geometry of the whole map area
 
-    // The menu button graphic
-    GraphicConfig MenuButtonGraphic;	/// menu button background
-    int		MenuButtonGraphicX;	/// menu button screen X position
-    int		MenuButtonGraphicY;	/// menu button screen Y position
+    // The menu panel
+    GraphicConfig MenuPanel;		/// menu panel background
+    int		MenuPanelX;		/// menu panel screen X position
+    int		MenuPanelY;		/// menu panel screen Y position
 
     /// Menu buttons
     struct {
diff --git a/src/stratagus/mainloop.cpp b/src/stratagus/mainloop.cpp
index 29e6e2116..4ec34d2c8 100644
--- a/src/stratagus/mainloop.cpp
+++ b/src/stratagus/mainloop.cpp
@@ -266,11 +266,11 @@ global void DebugTestDisplay(void)
 */
 local void DrawMenuButtonArea(void)
 {
-    if (TheUI.MenuButtonGraphic.Graphic) {
-	VideoDrawSub(TheUI.MenuButtonGraphic.Graphic, 0, 0,
-	    TheUI.MenuButtonGraphic.Graphic->Width,
-	    TheUI.MenuButtonGraphic.Graphic->Height,
-	    TheUI.MenuButtonGraphicX, TheUI.MenuButtonGraphicY);
+    if (TheUI.MenuPanel.Graphic) {
+	VideoDrawSub(TheUI.MenuPanel.Graphic, 0, 0,
+	    TheUI.MenuPanel.Graphic->Width,
+	    TheUI.MenuPanel.Graphic->Height,
+	    TheUI.MenuPanelX, TheUI.MenuPanelY);
     }
     if (NetworkFildes == (Socket)-1) {
 	if (TheUI.MenuButton.X != -1) {
diff --git a/src/ui/script_ui.cpp b/src/ui/script_ui.cpp
index bf5f6caf7..cb2cc1c0b 100644
--- a/src/ui/script_ui.cpp
+++ b/src/ui/script_ui.cpp
@@ -1072,9 +1072,9 @@ local SCM CclDefineUI(SCM list)
     ui->ButtonPanelX = -1;
     ui->ButtonPanelY = -1;
 
-    ui->MenuButtonGraphic.File = NULL;
-    ui->MenuButtonGraphicX = -1;
-    ui->MenuButtonGraphicY = -1;
+    ui->MenuPanel.File = NULL;
+    ui->MenuPanelX = -1;
+    ui->MenuPanelY = -1;
     
     ui->MinimapPanel.File = NULL;
     ui->MinimapPanelX = -1;
@@ -1350,9 +1350,124 @@ local SCM CclDefineUI(SCM list)
 	} else if (gh_eq_p(value, gh_symbol2scm("menu-panel"))) {
 	    sublist = gh_car(list);
 	    list = gh_cdr(list);
-	    ui->MenuButtonGraphic.File = SCM_PopNewStr(&sublist);
-	    ui->MenuButtonGraphicX = SCM_PopInt(&sublist);
-	    ui->MenuButtonGraphicY = 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->MenuPanel.File = gh_scm2newstr(value, NULL);
+			} else if (gh_eq_p(value, gh_symbol2scm("pos"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->MenuPanelX = gh_scm2int(gh_car(value));
+			    ui->MenuPanelY = gh_scm2int(gh_car(gh_cdr(value)));
+			} else {
+			    errl("Unsupported tag", value);
+			}
+		    }
+		} else if (gh_eq_p(value, gh_symbol2scm("menu-button"))) {
+		    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("pos"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->MenuButton.X = gh_scm2int(gh_car(value));
+			    ui->MenuButton.Y = gh_scm2int(gh_car(gh_cdr(value)));
+			} else if (gh_eq_p(value, gh_symbol2scm("size"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->MenuButton.Width = gh_scm2int(gh_car(value));
+			    ui->MenuButton.Height = gh_scm2int(gh_car(gh_cdr(value)));
+			} else if (gh_eq_p(value, gh_symbol2scm("caption"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->MenuButton.Text = gh_scm2newstr(value, NULL);
+			} else if (gh_eq_p(value, gh_symbol2scm("style"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->MenuButton.Button = scm2buttonid(value);
+			} else {
+			    errl("Unsupported tag", value);
+			}
+		    }
+		} else if (gh_eq_p(value, gh_symbol2scm("network-menu-button"))) {
+		    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("pos"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->NetworkMenuButton.X = gh_scm2int(gh_car(value));
+			    ui->NetworkMenuButton.Y = gh_scm2int(gh_car(gh_cdr(value)));
+			} else if (gh_eq_p(value, gh_symbol2scm("size"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->NetworkMenuButton.Width = gh_scm2int(gh_car(value));
+			    ui->NetworkMenuButton.Height = gh_scm2int(gh_car(gh_cdr(value)));
+			} else if (gh_eq_p(value, gh_symbol2scm("caption"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->NetworkMenuButton.Text = gh_scm2newstr(value, NULL);
+			} else if (gh_eq_p(value, gh_symbol2scm("style"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->NetworkMenuButton.Button = scm2buttonid(value);
+			} else {
+			    errl("Unsupported tag", value);
+			}
+		    }
+		} else if (gh_eq_p(value, gh_symbol2scm("network-diplomacy-button"))) {
+		    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("pos"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->NetworkDiplomacyButton.X = gh_scm2int(gh_car(value));
+			    ui->NetworkDiplomacyButton.Y = gh_scm2int(gh_car(gh_cdr(value)));
+			} else if (gh_eq_p(value, gh_symbol2scm("size"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->NetworkDiplomacyButton.Width = gh_scm2int(gh_car(value));
+			    ui->NetworkDiplomacyButton.Height = gh_scm2int(gh_car(gh_cdr(value)));
+			} else if (gh_eq_p(value, gh_symbol2scm("caption"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->NetworkDiplomacyButton.Text = gh_scm2newstr(value, NULL);
+			} else if (gh_eq_p(value, gh_symbol2scm("style"))) {
+			    value = gh_car(slist);
+			    slist = gh_cdr(slist);
+			    ui->NetworkDiplomacyButton.Button = scm2buttonid(value);
+			} else {
+			    errl("Unsupported tag", value);
+			}
+		    }
+		} else {
+		    errl("Unsupported tag", value);
+		}
+	    }
 	} else if (gh_eq_p(value, gh_symbol2scm("minimap"))) {
 	    sublist = gh_car(list);
 	    list = gh_cdr(list);
@@ -1412,90 +1527,6 @@ local SCM CclDefineUI(SCM list)
 		    errl("Unsupported tag", value);
 		}
 	    }
-	} else if (gh_eq_p(value, gh_symbol2scm("menu-button"))) {
-	    sublist = gh_car(list);
-	    list = gh_cdr(list);
-	    while (!gh_null_p(sublist)) {
-		value = gh_car(sublist);
-		sublist = gh_cdr(sublist);
-		if (gh_eq_p(value, gh_symbol2scm("pos"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->MenuButton.X = gh_scm2int(gh_car(value));
-		    ui->MenuButton.Y = gh_scm2int(gh_car(gh_cdr(value)));
-		} else if (gh_eq_p(value, gh_symbol2scm("size"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->MenuButton.Width = gh_scm2int(gh_car(value));
-		    ui->MenuButton.Height = gh_scm2int(gh_car(gh_cdr(value)));
-		} else if (gh_eq_p(value, gh_symbol2scm("caption"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->MenuButton.Text = gh_scm2newstr(value, NULL);
-		} else if (gh_eq_p(value, gh_symbol2scm("style"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->MenuButton.Button = scm2buttonid(value);
-		} else {
-		    errl("Unsupported tag", value);
-		}
-	    }
-	} else if (gh_eq_p(value, gh_symbol2scm("network-menu-button"))) {
-	    sublist = gh_car(list);
-	    list = gh_cdr(list);
-	    while (!gh_null_p(sublist)) {
-		value = gh_car(sublist);
-		sublist = gh_cdr(sublist);
-		if (gh_eq_p(value, gh_symbol2scm("pos"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->NetworkMenuButton.X = gh_scm2int(gh_car(value));
-		    ui->NetworkMenuButton.Y = gh_scm2int(gh_car(gh_cdr(value)));
-		} else if (gh_eq_p(value, gh_symbol2scm("size"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->NetworkMenuButton.Width = gh_scm2int(gh_car(value));
-		    ui->NetworkMenuButton.Height = gh_scm2int(gh_car(gh_cdr(value)));
-		} else if (gh_eq_p(value, gh_symbol2scm("caption"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->NetworkMenuButton.Text = gh_scm2newstr(value, NULL);
-		} else if (gh_eq_p(value, gh_symbol2scm("style"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->NetworkMenuButton.Button = scm2buttonid(value);
-		} else {
-		    errl("Unsupported tag", value);
-		}
-	    }
-	} else if (gh_eq_p(value, gh_symbol2scm("network-diplomacy-button"))) {
-	    sublist = gh_car(list);
-	    list = gh_cdr(list);
-	    while (!gh_null_p(sublist)) {
-		value = gh_car(sublist);
-		sublist = gh_cdr(sublist);
-		if (gh_eq_p(value, gh_symbol2scm("pos"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->NetworkDiplomacyButton.X = gh_scm2int(gh_car(value));
-		    ui->NetworkDiplomacyButton.Y = gh_scm2int(gh_car(gh_cdr(value)));
-		} else if (gh_eq_p(value, gh_symbol2scm("size"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->NetworkDiplomacyButton.Width = gh_scm2int(gh_car(value));
-		    ui->NetworkDiplomacyButton.Height = gh_scm2int(gh_car(gh_cdr(value)));
-		} else if (gh_eq_p(value, gh_symbol2scm("caption"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->NetworkDiplomacyButton.Text = gh_scm2newstr(value, NULL);
-		} else if (gh_eq_p(value, gh_symbol2scm("style"))) {
-		    value = gh_car(sublist);
-		    sublist = gh_cdr(sublist);
-		    ui->NetworkDiplomacyButton.Button = scm2buttonid(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 04f058874..af9b38d77 100644
--- a/src/ui/ui.cpp
+++ b/src/ui/ui.cpp
@@ -239,12 +239,12 @@ global void LoadUserInterface(void)
 	    TheUI.ButtonPanel.Graphic->Height);
 #endif
     }
-    if (TheUI.MenuButtonGraphic.File) {
-	TheUI.MenuButtonGraphic.Graphic = LoadGraphic(TheUI.MenuButtonGraphic.File);
+    if (TheUI.MenuPanel.File) {
+	TheUI.MenuPanel.Graphic = LoadGraphic(TheUI.MenuPanel.File);
 #ifdef USE_OPENGL
-	MakeTexture(TheUI.MenuButtonGraphic.Graphic,
-	    TheUI.MenuButtonGraphic.Graphic->Width,
-	    TheUI.MenuButtonGraphic.Graphic->Height);
+	MakeTexture(TheUI.MenuPanel.Graphic,
+	    TheUI.MenuPanel.Graphic->Width,
+	    TheUI.MenuPanel.Graphic->Height);
 #endif
     }
     if (TheUI.MinimapPanel.File) {
@@ -512,8 +512,8 @@ local void SaveUi(CLFile* file, const UI* ui)
 
     CLprintf(file, "  ; Menu button background\n");
     CLprintf(file, "  'menu-panel (list \"%s\" %d %d)\n",
-	ui->MenuButtonGraphic.File, ui->MenuButtonGraphicX,
-	ui->MenuButtonGraphicY);
+	ui->MenuPanel.File, ui->MenuPanelX,
+	ui->MenuPanelY);
 
     CLprintf(file, "  'minimap (list\n");
     CLprintf(file, "    'file \"%s\"\n", ui->MinimapPanel.File);
@@ -706,7 +706,7 @@ global void CleanUI(UI* ui)
     free(ui->ButtonPanel.File);
 
     // Menu Button
-    free(ui->MenuButtonGraphic.File);
+    free(ui->MenuPanel.File);
 
     // Minimap
     free(ui->MinimapPanel.File);
@@ -776,7 +776,7 @@ global void CleanUserInterface(void)
 
     VideoSaveFree(TheUI.InfoPanel.Graphic);
     VideoSaveFree(TheUI.ButtonPanel.Graphic);
-    VideoSaveFree(TheUI.MenuButtonGraphic.Graphic);
+    VideoSaveFree(TheUI.MenuPanel.Graphic);
     VideoSaveFree(TheUI.MinimapPanel.Graphic);
     VideoSaveFree(TheUI.StatusLine.Graphic);