(svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
authorDarkvater
Tue, 07 Nov 2006 13:06:02 +0000
changeset 5045 846098142ffe
parent 5044 e4e5bcdd79c6
child 5046 d2c53a73b580
(svn r7094) -Codechange: Get rid of the window-specific code in DoZoomInOutWindow (enable, disable
buttons depending on calling window, game-mode); handle it by broadcasting messages
to the calling window, because that knows how and what buttons to set.
genworld.c
main_gui.c
smallmap_gui.c
viewport.c
viewport.h
--- a/genworld.c	Tue Nov 07 13:01:36 2006 +0000
+++ b/genworld.c	Tue Nov 07 13:06:02 2006 +0000
@@ -260,14 +260,11 @@
 		ShowGenerateWorldProgress();
 	}
 
-	/* Zoom out and center on the map (is pretty ;)) */
+	/* Hide vital windows, because we don't allow to use them */
+	if (_gw.thread != NULL) HideVitalWindows();
+
+	/* Centre the view on the map */
 	if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) {
-		while (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0) ) ) {}
 		ScrollMainWindowToTile(TileXY(MapSizeX() / 2, MapSizeY() / 2));
 	}
-
-	/* Hide vital windows, because we don't allow to use them */
-	/* XXX -- Ideal it is done after ShowGenerateWorldProgress, but stupid
-	 * enough, DoZoomInOutWindow _needs_ the toolbar to exist... */
-	if (_gw.thread != NULL) HideVitalWindows();
 }
--- a/main_gui.c	Tue Nov 07 13:01:36 2006 +0000
+++ b/main_gui.c	Tue Nov 07 13:06:02 2006 +0000
@@ -855,15 +855,8 @@
 bool DoZoomInOutWindow(int how, Window *w)
 {
 	ViewPort *vp;
-	int button;
-
-	switch (_game_mode) {
-		case GM_EDITOR: button = 9;  break;
-		case GM_NORMAL: button = 17; break;
-		default: return false;
-	}
-
-	assert(w);
+
+	assert(w != NULL);
 	vp = w->viewport;
 
 	switch (how) {
@@ -890,31 +883,8 @@
 	}
 
 	SetWindowDirty(w);
-
-	// routine to disable/enable the zoom buttons. Didn't know where to place these otherwise
-	{
-		Window *wt = NULL;
-
-		switch (w->window_class) {
-			case WC_MAIN_WINDOW:
-				wt = FindWindowById(WC_MAIN_TOOLBAR, 0);
-				break;
-
-			case WC_EXTRA_VIEW_PORT:
-				wt = FindWindowById(WC_EXTRA_VIEW_PORT, w->window_number);
-				button = 5;
-				break;
-		}
-
-		assert(wt);
-
-		// update the toolbar button too
-		SetWindowWidgetDisabledState(wt, button, vp->zoom == 0);
-		SetWindowWidgetDisabledState(wt, button + 1, vp->zoom == 2);
-
-		SetWindowDirty(wt);
-	}
-
+	/* Update the windows that have zoom-buttons to perhaps disable their buttons */
+	SendWindowMessageClass(w->window_class, how, w->window_number, 0);
 	return true;
 }
 
@@ -1891,6 +1861,10 @@
 		}
 		break;
 	}
+
+		case WE_MESSAGE:
+			HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18);
+			break;
 	}
 }
 
@@ -2078,6 +2052,9 @@
 		}
 		break;
 
+		case WE_MESSAGE:
+			HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 9, 10);
+			break;
 	}
 }
 
@@ -2380,6 +2357,11 @@
 		case WE_MOUSEWHEEL:
 			ZoomInOrOutToCursorWindow(e->we.wheel.wheel < 0, w);
 			break;
+
+		case WE_MESSAGE:
+			/* Forward the message to the appropiate toolbar (ingame or scenario editor) */
+			SendWindowMessage(WC_MAIN_TOOLBAR, 0, e->we.message.msg, e->we.message.wparam, e->we.message.lparam);
+			break;
 	}
 }
 
--- a/smallmap_gui.c	Tue Nov 07 13:01:36 2006 +0000
+++ b/smallmap_gui.c	Tue Nov 07 13:06:02 2006 +0000
@@ -1070,6 +1070,13 @@
 		case WE_MOUSEWHEEL:
 			ZoomInOrOutToCursorWindow(e->we.wheel.wheel < 0, w);
 			break;
+
+
+		case WE_MESSAGE:
+			/* Only handle zoom message if intended for us (msg ZOOM_IN/ZOOM_OUT) */
+			if (e->we.message.wparam != w->window_number) break;
+			HandleZoomMessage(w, w->viewport, 5, 6);
+			break;
 	}
 }
 
--- a/viewport.c	Tue Nov 07 13:01:36 2006 +0000
+++ b/viewport.c	Tue Nov 07 13:06:02 2006 +0000
@@ -375,6 +375,21 @@
 	return GetTileFromScreenXY(_cursor.pos.x, _cursor.pos.y, x + vp->left, y + vp->top);
 }
 
+/** Update the status of the zoom-buttons according to the zoom-level
+ * of the viewport. This will update their status and invalidate accordingly
+ * @param window pointer to the window that has the zoom buttons
+ * @param vp pointer to the viewport whose zoom-level the buttons represent
+ * @param widget_zoom_in widget index for window with zoom-in button
+ * @param widget_zoom_out widget index for window with zoom-out button */
+void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out)
+{
+	SetWindowWidgetDisabledState(w, widget_zoom_in, vp->zoom == 0);
+	InvalidateWidget(w, widget_zoom_in);
+
+	SetWindowWidgetDisabledState(w, widget_zoom_out, vp->zoom == 2);
+	InvalidateWidget(w, widget_zoom_out);
+}
+
 void DrawGroundSpriteAt(uint32 image, int32 x, int32 y, byte z)
 {
 	ViewportDrawer *vd = _cur_vd;
--- a/viewport.h	Tue Nov 07 13:01:36 2006 +0000
+++ b/viewport.h	Tue Nov 07 13:06:02 2006 +0000
@@ -31,6 +31,7 @@
 bool DoZoomInOutWindow(int how, Window *w);
 void ZoomInOrOutToCursorWindow(bool in, Window * w);
 Point GetTileZoomCenterWindow(bool in, Window * w);
+void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out);
 
 void OffsetGroundSprite(int x, int y);