(svn r1121) -Feature: Added sticky windows feature. A small pin allows the user to set the window as undeletable and can only be closed by hand. As an example the viewport window has been stickied (thanks to Neko-San)
authordarkvater
Wed, 15 Dec 2004 23:33:04 +0000
changeset 682 74c70f645d95
parent 681 6aefab406b0d
child 683 3bd410628868
(svn r1121) -Feature: Added sticky windows feature. A small pin allows the user to set the window as undeletable and can only be closed by hand. As an example the viewport window has been stickied (thanks to Neko-San)
-To use the feature add WDF_STICKY_BUTTON to the widget description and update all widget-ID's since sticky button will be widget 2.
lang/english.txt
main_gui.c
smallmap_gui.c
table/sprites.h
ttd.vcproj
widget.c
window.c
window.h
--- a/lang/english.txt	Wed Dec 15 22:50:20 2004 +0000
+++ b/lang/english.txt	Wed Dec 15 23:33:04 2004 +0000
@@ -418,6 +418,7 @@
 STR_018A_CAN_T_CHANGE_SERVICING					:{WHITE}Can't change servicing interval...
 STR_018B_CLOSE_WINDOW						:{BLACK}Close window
 STR_018C_WINDOW_TITLE_DRAG_THIS					:{BLACK}Window title - drag this to move window
+STR_STICKY_BUTTON                       :{BLACK}Mark this window as undeletable for the 'Close All Windows' key
 STR_018D_DEMOLISH_BUILDINGS_ETC					:{BLACK}Demolish buildings etc. on a square of land
 STR_018E_LOWER_A_CORNER_OF_LAND					:{BLACK}Lower a corner of land
 STR_018F_RAISE_A_CORNER_OF_LAND					:{BLACK}Raise a corner of land
--- a/main_gui.c	Wed Dec 15 22:50:20 2004 +0000
+++ b/main_gui.c	Wed Dec 15 23:33:04 2004 +0000
@@ -888,7 +888,7 @@
 			break;
 		case WC_EXTRA_VIEW_PORT:
 			wt = FindWindowById(WC_EXTRA_VIEW_PORT, w->window_number);
-			button = 4;
+			button = 5;
 			break;
 		}
 
--- a/smallmap_gui.c	Wed Dec 15 22:50:20 2004 +0000
+++ b/smallmap_gui.c	Wed Dec 15 23:33:04 2004 +0000
@@ -1003,7 +1003,8 @@
 /* Extra ViewPort Window Stuff */
 static Widget _extra_view_port_widgets[] = {
 {   WWT_CLOSEBOX,    14,     0,    10,     0,    13, STR_00C5,	STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,    14,    11,   299,     0,    13, STR_EXTRA_VIEW_PORT_TITLE,				STR_018C_WINDOW_TITLE_DRAG_THIS},
+{    WWT_CAPTION,    14,    11,   287,     0,    13, STR_EXTRA_VIEW_PORT_TITLE,				STR_018C_WINDOW_TITLE_DRAG_THIS},
+{  WWT_STICKYBOX,    14,   288,   299,     0,    13, 0x0,       STR_STICKY_BUTTON},
 {      WWT_PANEL,    14,     0,   299,    14,   233, 0x0,				STR_NULL},
 {          WWT_6,    14,     2,   297,    16,   231, 0x0,				STR_NULL},
 {      WWT_PANEL,    14,     0,    21,   234,   255, 0x2DF,			STR_017F_ZOOM_THE_VIEW_IN},
@@ -1027,15 +1028,15 @@
 	}	break;
 	case WE_CLICK: {
 		switch(e->click.widget) {
-		case 4: { /* zoom in */
+		case 5: { /* zoom in */
 			DoZoomInOutWindow(ZOOM_IN,w);
 		} break;
 
-		case 5: { /* zoom out */
+		case 6: { /* zoom out */
 			DoZoomInOutWindow(ZOOM_OUT,w);
 		} break;
 
-		case 6: { /* location button (move main view to same spot as this view) */
+		case 7: { /* location button (move main view to same spot as this view) */
 			Window * w2 = FindWindowById(WC_MAIN_WINDOW, 0);
 			int x = WP(w,vp_d).scrollpos_x; // Where is the main looking at
 			int y = WP(w,vp_d).scrollpos_y;
@@ -1044,7 +1045,7 @@
 			WP(w2,vp_d).scrollpos_x =  x - (w2->viewport->virtual_width - (294 <<vp->zoom) )/2;
 			WP(w2,vp_d).scrollpos_y =  y - (w2->viewport->virtual_height - (214 << vp->zoom) )/2;
 		} break;
-		case 7: { /* inverse location button (move this view to same spot as main view) */
+		case 8: { /* inverse location button (move this view to same spot as main view) */
 			Window * w2 = FindWindowById(WC_MAIN_WINDOW, 0);
 			int x = WP(w2,vp_d).scrollpos_x;
 			int y = WP(w2,vp_d).scrollpos_y;
@@ -1060,7 +1061,7 @@
 static const WindowDesc _extra_view_port_desc = {
 	-1,-1, 300, 256,
 	WC_EXTRA_VIEW_PORT,0,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
 	_extra_view_port_widgets,
 	ExtraViewPortWndProc
 };
--- a/table/sprites.h	Wed Dec 15 22:50:20 2004 +0000
+++ b/table/sprites.h	Wed Dec 15 23:33:04 2004 +0000
@@ -48,8 +48,8 @@
 
 	SPR_BLOT = SPR_OPENTTD_BASE + 32, // colored circle (mainly used as vehicle profit marker and for sever compatibility)
 
-	SPR_PIN_UP = SPR_OPENTTD_BASE + 62,   // pin icon 
-	SPR_PIN_DOWN = SPR_OPENTTD_BASE + 63,
+	SPR_PIN_UP        = SPR_OPENTTD_BASE + 62,   // pin icon 
+	SPR_PIN_DOWN      = SPR_OPENTTD_BASE + 63,
 	
 	
 	/* Network GUI sprites */
--- a/ttd.vcproj	Wed Dec 15 22:50:20 2004 +0000
+++ b/ttd.vcproj	Wed Dec 15 23:33:04 2004 +0000
@@ -456,6 +456,9 @@
 				</FileConfiguration>
 			</File>
 			<File
+				RelativePath=".\map.c">
+			</File>
+			<File
 				RelativePath=".\md5.c">
 			</File>
 			<File
@@ -1168,6 +1171,9 @@
 				RelativePath="macros.h">
 			</File>
 			<File
+				RelativePath=".\map.h">
+			</File>
+			<File
 				RelativePath="md5.h">
 			</File>
 			<File
--- a/widget.c	Wed Dec 15 22:50:20 2004 +0000
+++ b/widget.c	Wed Dec 15 23:33:04 2004 +0000
@@ -348,6 +348,12 @@
 			goto restore_dparam;
 		}
 
+		case WWT_STICKYBOX: {
+			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (cur_click & 1) ? 0x20 : 0);
+			DrawSprite((cur_click & 1) ? SPR_PIN_UP :SPR_PIN_DOWN, r.left + 2, r.top + 3);
+			break;
+		}
+		
 		case WWT_CAPTION: {
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, 0x10);
 			DrawFrameRect(r.left+1, r.top+1, r.right-1, r.bottom-1, wi->color, (w->caption_color == 0xFF) ? 0x60 : 0x70);
--- a/window.c	Wed Dec 15 22:50:20 2004 +0000
+++ b/window.c	Wed Dec 15 23:33:04 2004 +0000
@@ -61,6 +61,14 @@
 				}
 			}
 		}
+		
+		if (w->desc_flags & WDF_STICKY_BUTTON) {
+			if (e.click.widget == 2) {
+				w->click_state ^= (1 << e.click.widget);
+				w->flags4 ^= WF_STICKY;
+				InvalidateWidget(w, e.click.widget);
+			}
+		}
 	} else {
 		w->wndproc(w, &e);
 	}
@@ -296,7 +304,8 @@
 			assert(w < _last_window);
 
 			if (w->window_class != WC_MAIN_WINDOW && w->window_class != WC_MAIN_TOOLBAR &&
-			    w->window_class != WC_STATUS_BAR && w->window_class != WC_NEWS_WINDOW) {
+			    w->window_class != WC_STATUS_BAR && w->window_class != WC_NEWS_WINDOW &&
+					!(w->flags4 & WF_STICKY) ) {
 
 					DeleteWindow(w);
 					goto restart;
@@ -1324,7 +1333,8 @@
 				w->window_class != WC_MAIN_TOOLBAR &&
 				w->window_class != WC_STATUS_BAR &&
 				w->window_class != WC_TOOLBAR_MENU &&
-				w->window_class != WC_TOOLTIPS) {
+				w->window_class != WC_TOOLTIPS &&
+				(w->flags4 & WF_STICKY) == 0) { // do not delete windows which are 'pinned'
 			DeleteWindow(w);
 			w = _windows;
 		} else {
--- a/window.h	Wed Dec 15 22:50:20 2004 +0000
+++ b/window.h	Wed Dec 15 23:33:04 2004 +0000
@@ -157,11 +157,12 @@
 } WindowDesc;
 
 enum {
-	WDF_STD_TOOLTIPS = 1,		/* use standard routine when displaying tooltips */
-	WDF_DEF_WIDGET = 2,			/* default widget control for some widgets in the on click event */
-	WDF_STD_BTN = 4,				/* default handling for close and drag widgets (widget no 0 and 1) */
+	WDF_STD_TOOLTIPS   = 1, /* use standard routine when displaying tooltips */
+	WDF_DEF_WIDGET     = 2,	/* default widget control for some widgets in the on click event */
+	WDF_STD_BTN        = 4,	/* default handling for close and drag widgets (widget no 0 and 1) */
 	WDF_RESTORE_DPARAM = 8, /* when drawing widgets, restore the dparam so all widgets recieve the same set of them */
 	WDF_UNCLICK_BUTTONS=16, /* Unclick buttons when the window event times out */
+	WDF_STICKY_BUTTON  =32, /* Set window to sticky mode; they are not closed unless closed with 'X' (widget 2) */
 };
 
 /* can be used as x or y coordinates to cause a specific placement */
@@ -356,7 +357,8 @@
 	WWT_CAPTION = 10,
 
 	WWT_HSCROLLBAR = 11,
-	WWT_LAST = 12,						/* Last Item. use WIDGETS_END to fill up padding!! */
+	WWT_STICKYBOX = 12,
+	WWT_LAST = 13,						/* Last Item. use WIDGETS_END to fill up padding!! */
 
 	WWT_MASK = 31,
 
@@ -376,7 +378,8 @@
 	WF_SCROLL_MIDDLE = 1 << 6,
 	WF_HSCROLL = 1 << 7,
 	WF_SIZING = 1 << 8,
-
+	WF_STICKY = 1 << 9,
+	
 	WF_DISABLE_VP_SCROLL = 1 << 10,
 
 	WF_WHITE_BORDER_ONE = 1 << 11,
@@ -458,7 +461,7 @@
 void DeleteNonVitalWindows();
 
 /* window.c */
-VARDEF Window _windows[20];
+VARDEF Window _windows[25];
 VARDEF Window *_last_window;
 
 VARDEF Point _cursorpos_drag_start;