(svn r3178) - Codechange: move static _dropdown_* vars into the window custom data, giving var1 and var2 more meaningful names.
authorpeter1138
Mon, 14 Nov 2005 08:42:45 +0000
changeset 2636 e2bfdc3e82b6
parent 2635 88b8b74c01ac
child 2637 8807e6a63f89
(svn r3178) - Codechange: move static _dropdown_* vars into the window custom data, giving var1 and var2 more meaningful names.
widget.c
window.h
--- a/widget.c	Mon Nov 14 08:09:57 2005 +0000
+++ b/widget.c	Mon Nov 14 08:42:45 2005 +0000
@@ -436,15 +436,6 @@
 
 }
 
-static uint _dropdown_item_count;
-static const StringID *_dropdown_items;
-static int _dropdown_selindex;
-static byte _dropdown_button;
-static WindowClass _dropdown_windowclass;
-static WindowNumber _dropdown_windownum;
-static byte _dropdown_var1;
-static byte _dropdown_var2;
-
 static const Widget _dropdown_menu_widgets[] = {
 {     WWT_IMGBTN,   RESIZE_NONE,     0,     0, 0,     0, 0, 0x0, STR_NULL},
 {   WIDGETS_END},
@@ -464,7 +455,7 @@
 		return - 1;
 
 	item = y / 10;
-	if (item >= _dropdown_item_count || (HASBIT(w->disabled_state, item) && !HASBIT(w->hidden_state, item)) || _dropdown_items[item] == 0)
+	if (item >= WP(w,dropdown_d).num_items || (HASBIT(w->disabled_state, item) && !HASBIT(w->hidden_state, item)) || WP(w,dropdown_d).items[item] == 0)
 		return - 1;
 
 	// Skip hidden items -- +1 for each hidden item before the clicked item.
@@ -486,18 +477,18 @@
 
 			x = 1;
 			y = 2;
-			sel    = _dropdown_selindex;
+			sel    = WP(w,dropdown_d).selected_index;
 
-			for(i=0; _dropdown_items[i] != INVALID_STRING_ID; i++) {
+			for (i = 0; WP(w,dropdown_d).items[i] != INVALID_STRING_ID; i++) {
 				if (HASBIT(w->hidden_state, i)) {
 					sel--;
 					continue;
 				}
-				if (_dropdown_items[i] != 0) {
+				if (WP(w,dropdown_d).items[i] != 0) {
 					if (sel == 0) {
 						GfxFillRect(x+1, y, x+w->width-4, y + 9, 0);
 					}
-					DrawString(x+2, y, _dropdown_items[i], sel==0 ? 12 : 16);
+					DrawString(x+2, y, WP(w,dropdown_d).items[i], sel==0 ? 12 : 16);
 
 					if (HASBIT(w->disabled_state, i)) {
 						GfxFillRect(x, y, x+w->width-3, y + 9, PALETTE_MODIFIER_GREYOUT |
@@ -517,52 +508,52 @@
 		case WE_CLICK: {
 			item = GetDropdownItem(w);
 			if (item >= 0) {
-				_dropdown_var1 = 4;
-				_dropdown_selindex = item;
+				WP(w,dropdown_d).click_delay = 4;
+				WP(w,dropdown_d).selected_index = item;
 				SetWindowDirty(w);
 			}
 		} break;
 
 		case WE_MOUSELOOP: {
-			Window *w2 = FindWindowById(_dropdown_windowclass, _dropdown_windownum);
+			Window *w2 = FindWindowById(WP(w,dropdown_d).parent_wnd_class, WP(w,dropdown_d).parent_wnd_num);
 			if (w2 == NULL) {
 				DeleteWindow(w);
 				return;
 			}
 
-			if (_dropdown_var1 != 0 && --_dropdown_var1 == 0) {
+			if (WP(w,dropdown_d).click_delay != 0 && --WP(w,dropdown_d).click_delay == 0) {
 				WindowEvent e;
 				e.event = WE_DROPDOWN_SELECT;
-				e.dropdown.button = _dropdown_button;
-				e.dropdown.index = _dropdown_selindex;
+				e.dropdown.button = WP(w,dropdown_d).parent_button;
+				e.dropdown.index = WP(w,dropdown_d).selected_index;
 				w2->wndproc(w2, &e);
 				DeleteWindow(w);
 				return;
 			}
 
-			if (_dropdown_var2 != 0) {
+			if (WP(w,dropdown_d).drag_mode) {
 				item = GetDropdownItem(w);
 
 				if (!_left_button_clicked) {
-					_dropdown_var2 = 0;
+					WP(w,dropdown_d).drag_mode = false;
 					if (item < 0)
 						return;
-					_dropdown_var1 = 2;
+					WP(w,dropdown_d).click_delay = 2;
 				} else {
 					if (item < 0)
 						return;
 				}
 
-				_dropdown_selindex = item;
+				WP(w,dropdown_d).selected_index = item;
 				SetWindowDirty(w);
 			}
 		} break;
 
 		case WE_DESTROY: {
-			Window *w2 = FindWindowById(_dropdown_windowclass, _dropdown_windownum);
+			Window *w2 = FindWindowById(WP(w,dropdown_d).parent_wnd_class, WP(w,dropdown_d).parent_wnd_num);
 			if (w2 != NULL) {
-				CLRBIT(w2->click_state, _dropdown_button);
-				InvalidateWidget(w2, _dropdown_button);
+				CLRBIT(w2->click_state, WP(w,dropdown_d).parent_button);
+				InvalidateWidget(w2, WP(w,dropdown_d).parent_button);
 			}
 		} break;
 	}
@@ -589,33 +580,21 @@
 
 	InvalidateWidget(w, button);
 
-	for(i=0;strings[i] != INVALID_STRING_ID;i++);
+	for (i = 0; strings[i] != INVALID_STRING_ID; i++);
 	if (i == 0)
 		return;
 
-	_dropdown_items = strings;
-	_dropdown_selindex = selected;
-
-	_dropdown_windowclass = w->window_class;
-	_dropdown_windownum = w->window_number;
-	_dropdown_button = button;
-
-	_dropdown_var1 = 0;
-	_dropdown_var2 = 1;
-
 	wi = &w->widget[button];
 
 	if (hidden_mask != 0) {
 		int j;
-		for(j=0; _dropdown_items[j] != INVALID_STRING_ID; j++) {
+		for (j = 0; strings[j] != INVALID_STRING_ID; j++) {
 			if (HASBIT(hidden_mask, j)) {
 				i--;
 			}
 		}
 	}
 
-	_dropdown_item_count = i;
-
 	w2 = AllocateWindow(
 		w->left + wi[-1].left + 1,
 		w->top + wi->bottom + 2,
@@ -633,4 +612,15 @@
 
 	w2->disabled_state = disabled_mask;
 	w2->hidden_state = hidden_mask;
+
+	WP(w2,dropdown_d).parent_wnd_class = w->window_class;
+	WP(w2,dropdown_d).parent_wnd_num = w->window_number;
+	WP(w2,dropdown_d).parent_button = button;
+
+	WP(w2,dropdown_d).num_items = i;
+	WP(w2,dropdown_d).selected_index = selected;
+	WP(w2,dropdown_d).items = strings;
+
+	WP(w2,dropdown_d).click_delay = 0;
+	WP(w2,dropdown_d).drag_mode = true;
 }
--- a/window.h	Mon Nov 14 08:09:57 2005 +0000
+++ b/window.h	Mon Nov 14 08:42:45 2005 +0000
@@ -452,6 +452,18 @@
 } message_d;
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(message_d));
 
+typedef struct dropdown_d {
+	WindowClass parent_wnd_class;
+	WindowNumber parent_wnd_num;
+	byte parent_button;
+	byte num_items;
+	byte selected_index;
+	const StringID *items;
+	byte click_delay;
+	bool drag_mode;
+} dropdown_d;
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(dropdown_d));
+
 enum WindowEvents {
 	WE_CLICK = 0,
 	WE_PAINT = 1,