src/widget.cpp
changeset 8729 1f57e8a0d5b3
parent 8418 afae92fe35f1
child 8737 4405e2e80db6
equal deleted inserted replaced
8728:b12d7d750c2f 8729:1f57e8a0d5b3
    52 {
    52 {
    53 	int mi, ma, pos;
    53 	int mi, ma, pos;
    54 	Scrollbar *sb;
    54 	Scrollbar *sb;
    55 
    55 
    56 	switch (wi->type) {
    56 	switch (wi->type) {
    57 		case WWT_SCROLLBAR: {
    57 		case WWT_SCROLLBAR:
    58 			/* vertical scroller */
    58 			/* vertical scroller */
    59 			w->flags4 &= ~WF_HSCROLL;
    59 			w->flags4 &= ~WF_HSCROLL;
    60 			w->flags4 &= ~WF_SCROLL2;
    60 			w->flags4 &= ~WF_SCROLL2;
    61 			mi = wi->top;
    61 			mi = wi->top;
    62 			ma = wi->bottom;
    62 			ma = wi->bottom;
    63 			pos = y;
    63 			pos = y;
    64 			sb = &w->vscroll;
    64 			sb = &w->vscroll;
    65 			break;
    65 			break;
    66 		}
    66 
    67 		case WWT_SCROLL2BAR: {
    67 		case WWT_SCROLL2BAR:
    68 			/* 2nd vertical scroller */
    68 			/* 2nd vertical scroller */
    69 			w->flags4 &= ~WF_HSCROLL;
    69 			w->flags4 &= ~WF_HSCROLL;
    70 			w->flags4 |= WF_SCROLL2;
    70 			w->flags4 |= WF_SCROLL2;
    71 			mi = wi->top;
    71 			mi = wi->top;
    72 			ma = wi->bottom;
    72 			ma = wi->bottom;
    73 			pos = y;
    73 			pos = y;
    74 			sb = &w->vscroll2;
    74 			sb = &w->vscroll2;
    75 			break;
    75 			break;
    76 		}
    76 
    77 		case  WWT_HSCROLLBAR: {
    77 		case  WWT_HSCROLLBAR:
    78 			/* horizontal scroller */
    78 			/* horizontal scroller */
    79 			w->flags4 &= ~WF_SCROLL2;
    79 			w->flags4 &= ~WF_SCROLL2;
    80 			w->flags4 |= WF_HSCROLL;
    80 			w->flags4 |= WF_HSCROLL;
    81 			mi = wi->left;
    81 			mi = wi->left;
    82 			ma = wi->right;
    82 			ma = wi->right;
    83 			pos = x;
    83 			pos = x;
    84 			sb = &w->hscroll;
    84 			sb = &w->hscroll;
    85 			break;
    85 			break;
    86 		}
    86 
    87 		default: return; //this should never happen
    87 		default: NOT_REACHED();
    88 	}
    88 	}
    89 	if (pos <= mi+9) {
    89 	if (pos <= mi+9) {
    90 		/* Pressing the upper button? */
    90 		/* Pressing the upper button? */
    91 		w->flags4 |= WF_SCROLL_UP;
    91 		w->flags4 |= WF_SCROLL_UP;
    92 		if (_scroller_click_timeout == 0) {
    92 		if (_scroller_click_timeout == 0) {
    93 			_scroller_click_timeout = 6;
    93 			_scroller_click_timeout = 6;
    94 			if (sb->pos != 0) sb->pos--;
    94 			if (sb->pos != 0) sb->pos--;
    95 		}
    95 		}
    96 		_left_button_clicked = false;
    96 		_left_button_clicked = false;
    97 	} else if (pos >= ma-10) {
    97 	} else if (pos >= ma - 10) {
    98 		/* Pressing the lower button? */
    98 		/* Pressing the lower button? */
    99 		w->flags4 |= WF_SCROLL_DOWN;
    99 		w->flags4 |= WF_SCROLL_DOWN;
   100 
   100 
   101 		if (_scroller_click_timeout == 0) {
   101 		if (_scroller_click_timeout == 0) {
   102 			_scroller_click_timeout = 6;
   102 			_scroller_click_timeout = 6;
   214 			if ((wi->type & WWT_MASK) == WWT_IMGBTN_2 && clicked) img++;
   214 			if ((wi->type & WWT_MASK) == WWT_IMGBTN_2 && clicked) img++;
   215 			DrawSprite(img, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
   215 			DrawSprite(img, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
   216 			break;
   216 			break;
   217 		}
   217 		}
   218 
   218 
   219 		case WWT_PANEL: {
   219 		case WWT_PANEL:
   220 			assert(wi->data == 0);
   220 			assert(wi->data == 0);
   221 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   221 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   222 			break;
   222 			break;
   223 		}
       
   224 
   223 
   225 		case WWT_TEXTBTN:
   224 		case WWT_TEXTBTN:
   226 		case WWT_TEXTBTN_2: {
   225 		case WWT_TEXTBTN_2:
   227 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   226 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   228 			}
   227 			/* FALL THROUGH */
   229 		/* fall through */
       
   230 
   228 
   231 		case WWT_LABEL: {
   229 		case WWT_LABEL: {
   232 			StringID str = wi->data;
   230 			StringID str = wi->data;
   233 
   231 
   234 			if ((wi->type & WWT_MASK) == WWT_TEXTBTN_2 && clicked) str++;
   232 			if ((wi->type & WWT_MASK) == WWT_TEXTBTN_2 && clicked) str++;
   251 			if (str != STR_NULL) DrawStringTruncated(r.left + 2, r.top + 1, str, TC_FROMSTRING, r.right - r.left - 10);
   249 			if (str != STR_NULL) DrawStringTruncated(r.left + 2, r.top + 1, str, TC_FROMSTRING, r.right - r.left - 10);
   252 			break;
   250 			break;
   253 		}
   251 		}
   254 
   252 
   255 		case WWT_MATRIX: {
   253 		case WWT_MATRIX: {
   256 			int c, d, ctr;
       
   257 			int x, amt1, amt2;
       
   258 			int color;
       
   259 
       
   260 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   254 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   261 
   255 
   262 			c = GB(wi->data, 0, 8);
   256 			int c = GB(wi->data, 0, 8);
   263 			amt1 = (wi->right - wi->left + 1) / c;
   257 			int amt1 = (wi->right - wi->left + 1) / c;
   264 
   258 
   265 			d = GB(wi->data, 8, 8);
   259 			int d = GB(wi->data, 8, 8);
   266 			amt2 = (wi->bottom - wi->top + 1) / d;
   260 			int amt2 = (wi->bottom - wi->top + 1) / d;
   267 
   261 
   268 			color = _colour_gradient[wi->color & 0xF][6];
   262 			int color = _colour_gradient[wi->color & 0xF][6];
   269 
   263 
   270 			x = r.left;
   264 			int x = r.left;
   271 			for (ctr = c; ctr > 1; ctr--) {
   265 			for (int ctr = c; ctr > 1; ctr--) {
   272 				x += amt1;
   266 				x += amt1;
   273 				GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
   267 				GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
   274 			}
   268 			}
   275 
   269 
   276 			x = r.top;
   270 			x = r.top;
   277 			for (ctr = d; ctr > 1; ctr--) {
   271 			for (int ctr = d; ctr > 1; ctr--) {
   278 				x += amt2;
   272 				x += amt2;
   279 				GfxFillRect(r.left + 1, x, r.right - 1, x, color);
   273 				GfxFillRect(r.left + 1, x, r.right - 1, x, color);
   280 			}
   274 			}
   281 
   275 
   282 			color = _colour_gradient[wi->color & 0xF][4];
   276 			color = _colour_gradient[wi->color & 0xF][4];
   283 
   277 
   284 			x = r.left - 1;
   278 			x = r.left - 1;
   285 			for (ctr = c; ctr > 1; ctr--) {
   279 			for (int ctr = c; ctr > 1; ctr--) {
   286 				x += amt1;
   280 				x += amt1;
   287 				GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
   281 				GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
   288 			}
   282 			}
   289 
   283 
   290 			x = r.top - 1;
   284 			x = r.top - 1;
   291 			for (ctr = d; ctr > 1; ctr--) {
   285 			for (int ctr = d; ctr > 1; ctr--) {
   292 				x += amt2;
   286 				x += amt2;
   293 				GfxFillRect(r.left + 1, x, r.right - 1, x, color);
   287 				GfxFillRect(r.left + 1, x, r.right - 1, x, color);
   294 			}
   288 			}
   295 
   289 
   296 			break;
   290 			break;
   297 		}
   291 		}
   298 
   292 
   299 		/* vertical scrollbar */
   293 		/* vertical scrollbar */
   300 		case WWT_SCROLLBAR: {
   294 		case WWT_SCROLLBAR: {
   301 			Point pt;
       
   302 			int c1, c2;
       
   303 
       
   304 			assert(wi->data == 0);
   295 			assert(wi->data == 0);
   305 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
   296 			assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
   306 
   297 
   307 			/* draw up/down buttons */
   298 			/* draw up/down buttons */
   308 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_UP);
   299 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_UP);
   309 			DrawFrameRect(r.left, r.top, r.right, r.top + 9, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   300 			DrawFrameRect(r.left, r.top, r.right, r.top + 9, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   310 			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, TC_BLACK);
   301 			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, TC_BLACK);
   311 
   302 
   312 			clicked = (((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_DOWN));
   303 			clicked = (((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_DOWN));
   313 			DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   304 			DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   314 			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
   305 			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
   315 
   306 
   316 			c1 = _colour_gradient[wi->color & 0xF][3];
   307 			int c1 = _colour_gradient[wi->color & 0xF][3];
   317 			c2 = _colour_gradient[wi->color & 0xF][7];
   308 			int c2 = _colour_gradient[wi->color & 0xF][7];
   318 
   309 
   319 			/* draw "shaded" background */
   310 			/* draw "shaded" background */
   320 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
   311 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
   321 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
   312 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
   322 
   313 
   324 			GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
   315 			GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
   325 			GfxFillRect(r.left + 3, r.top + 10, r.left + 3, r.bottom - 10, c2);
   316 			GfxFillRect(r.left + 3, r.top + 10, r.left + 3, r.bottom - 10, c2);
   326 			GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
   317 			GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
   327 			GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
   318 			GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
   328 
   319 
   329 			pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom);
   320 			Point pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom);
   330 			DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_MIDDLE ? FR_LOWERED : FR_NONE);
   321 			DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_MIDDLE ? FR_LOWERED : FR_NONE);
   331 			break;
   322 			break;
   332 		}
   323 		}
       
   324 
   333 		case WWT_SCROLL2BAR: {
   325 		case WWT_SCROLL2BAR: {
   334 			Point pt;
       
   335 			int c1, c2;
       
   336 
       
   337 			assert(wi->data == 0);
   326 			assert(wi->data == 0);
   338 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
   327 			assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
   339 
   328 
   340 			/* draw up/down buttons */
   329 			/* draw up/down buttons */
   341 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_UP | WF_SCROLL2));
   330 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_UP | WF_SCROLL2));
   342 			DrawFrameRect(r.left, r.top, r.right, r.top + 9, wi->color,  (clicked) ? FR_LOWERED : FR_NONE);
   331 			DrawFrameRect(r.left, r.top, r.right, r.top + 9, wi->color,  (clicked) ? FR_LOWERED : FR_NONE);
   343 			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, TC_BLACK);
   332 			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, TC_BLACK);
   344 
   333 
   345 			clicked = ((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_DOWN | WF_SCROLL2));
   334 			clicked = ((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_DOWN | WF_SCROLL2));
   346 			DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color,  (clicked) ? FR_LOWERED : FR_NONE);
   335 			DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color,  (clicked) ? FR_LOWERED : FR_NONE);
   347 			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
   336 			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
   348 
   337 
   349 			c1 = _colour_gradient[wi->color & 0xF][3];
   338 			int c1 = _colour_gradient[wi->color & 0xF][3];
   350 			c2 = _colour_gradient[wi->color & 0xF][7];
   339 			int c2 = _colour_gradient[wi->color & 0xF][7];
   351 
   340 
   352 			/* draw "shaded" background */
   341 			/* draw "shaded" background */
   353 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
   342 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
   354 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
   343 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
   355 
   344 
   357 			GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
   346 			GfxFillRect(r.left + 2, r.top + 10, r.left + 2, r.bottom - 10, c1);
   358 			GfxFillRect(r.left + 3, r.top + 10, r.left + 3, r.bottom - 10, c2);
   347 			GfxFillRect(r.left + 3, r.top + 10, r.left + 3, r.bottom - 10, c2);
   359 			GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
   348 			GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
   360 			GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
   349 			GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
   361 
   350 
   362 			pt = HandleScrollbarHittest(&w->vscroll2, r.top, r.bottom);
   351 			Point pt = HandleScrollbarHittest(&w->vscroll2, r.top, r.bottom);
   363 			DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_MIDDLE | WF_SCROLL2) ? FR_LOWERED : FR_NONE);
   352 			DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_MIDDLE | WF_SCROLL2) ? FR_LOWERED : FR_NONE);
   364 			break;
   353 			break;
   365 		}
   354 		}
   366 
   355 
   367 		/* horizontal scrollbar */
   356 		/* horizontal scrollbar */
   368 		case WWT_HSCROLLBAR: {
   357 		case WWT_HSCROLLBAR: {
   369 			Point pt;
       
   370 			int c1, c2;
       
   371 
       
   372 			assert(wi->data == 0);
   358 			assert(wi->data == 0);
   373 			assert(r.bottom - r.top == 11); // XXX - to ensure the same sizes are used everywhere!
   359 			assert(r.bottom - r.top == 11); // To ensure the same sizes are used everywhere!
   374 
   360 
   375 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL)) == (WF_SCROLL_UP | WF_HSCROLL));
   361 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL)) == (WF_SCROLL_UP | WF_HSCROLL));
   376 			DrawFrameRect(r.left, r.top, r.left + 9, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   362 			DrawFrameRect(r.left, r.top, r.left + 9, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   377 			DrawSprite(SPR_ARROW_LEFT, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
   363 			DrawSprite(SPR_ARROW_LEFT, PAL_NONE, r.left + 1 + clicked, r.top + 1 + clicked);
   378 
   364 
   379 			clicked = ((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL)) == (WF_SCROLL_DOWN | WF_HSCROLL));
   365 			clicked = ((w->flags4 & (WF_SCROLL_DOWN | WF_HSCROLL)) == (WF_SCROLL_DOWN | WF_HSCROLL));
   380 			DrawFrameRect(r.right - 9, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   366 			DrawFrameRect(r.right - 9, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   381 			DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - 8 + clicked, r.top + 1 + clicked);
   367 			DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - 8 + clicked, r.top + 1 + clicked);
   382 
   368 
   383 			c1 = _colour_gradient[wi->color & 0xF][3];
   369 			int c1 = _colour_gradient[wi->color & 0xF][3];
   384 			c2 = _colour_gradient[wi->color & 0xF][7];
   370 			int c2 = _colour_gradient[wi->color & 0xF][7];
   385 
   371 
   386 			/* draw "shaded" background */
   372 			/* draw "shaded" background */
   387 			GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c2);
   373 			GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c2);
   388 			GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
   374 			GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
   389 
   375 
   392 			GfxFillRect(r.left + 10, r.top + 3, r.right - 10, r.top + 3, c2);
   378 			GfxFillRect(r.left + 10, r.top + 3, r.right - 10, r.top + 3, c2);
   393 			GfxFillRect(r.left + 10, r.top + 7, r.right - 10, r.top + 7, c1);
   379 			GfxFillRect(r.left + 10, r.top + 7, r.right - 10, r.top + 7, c1);
   394 			GfxFillRect(r.left + 10, r.top + 8, r.right - 10, r.top + 8, c2);
   380 			GfxFillRect(r.left + 10, r.top + 8, r.right - 10, r.top + 8, c2);
   395 
   381 
   396 			/* draw actual scrollbar */
   382 			/* draw actual scrollbar */
   397 			pt = HandleScrollbarHittest(&w->hscroll, r.left, r.right);
   383 			Point pt = HandleScrollbarHittest(&w->hscroll, r.left, r.right);
   398 			DrawFrameRect(pt.x, r.top, pt.y, r.bottom, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL)) == (WF_SCROLL_MIDDLE | WF_HSCROLL) ? FR_LOWERED : FR_NONE);
   384 			DrawFrameRect(pt.x, r.top, pt.y, r.bottom, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL)) == (WF_SCROLL_MIDDLE | WF_HSCROLL) ? FR_LOWERED : FR_NONE);
   399 
   385 
   400 			break;
   386 			break;
   401 		}
   387 		}
   402 
   388 
   403 		case WWT_FRAME: {
   389 		case WWT_FRAME: {
   404 			const StringID str = wi->data;
   390 			const StringID str = wi->data;
   405 			int c1, c2;
       
   406 			int x2 = r.left; // by default the left side is the left side of the widget
   391 			int x2 = r.left; // by default the left side is the left side of the widget
   407 
   392 
   408 			if (str != STR_NULL) x2 = DrawString(r.left + 6, r.top, str, TC_FROMSTRING);
   393 			if (str != STR_NULL) x2 = DrawString(r.left + 6, r.top, str, TC_FROMSTRING);
   409 
   394 
   410 			c1 = _colour_gradient[wi->color][3];
   395 			int c1 = _colour_gradient[wi->color][3];
   411 			c2 = _colour_gradient[wi->color][7];
   396 			int c2 = _colour_gradient[wi->color][7];
   412 
   397 
   413 			/* Line from upper left corner to start of text */
   398 			/* Line from upper left corner to start of text */
   414 			GfxFillRect(r.left, r.top + 4, r.left + 4, r.top + 4, c1);
   399 			GfxFillRect(r.left, r.top + 4, r.left + 4, r.top + 4, c1);
   415 			GfxFillRect(r.left + 1, r.top + 5, r.left + 4, r.top + 5, c2);
   400 			GfxFillRect(r.left + 1, r.top + 5, r.left + 4, r.top + 5, c2);
   416 
   401 
   430 			GfxFillRect(r.left, r.bottom, r.right, r.bottom, c2);
   415 			GfxFillRect(r.left, r.bottom, r.right, r.bottom, c2);
   431 
   416 
   432 			break;
   417 			break;
   433 		}
   418 		}
   434 
   419 
   435 		case WWT_STICKYBOX: {
   420 		case WWT_STICKYBOX:
   436 			assert(wi->data == 0);
   421 			assert(wi->data == 0);
   437 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
   422 			assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
   438 
   423 
   439 			clicked = !!(w->flags4 & WF_STICKY);
   424 			clicked = !!(w->flags4 & WF_STICKY);
   440 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   425 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   441 			DrawSprite((clicked) ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, r.left + 2 + clicked, r.top + 3 + clicked);
   426 			DrawSprite((clicked) ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, r.left + 2 + clicked, r.top + 3 + clicked);
   442 			break;
   427 			break;
   443 		}
   428 
   444 
   429 		case WWT_RESIZEBOX:
   445 		case WWT_RESIZEBOX: {
       
   446 			assert(wi->data == 0);
   430 			assert(wi->data == 0);
   447 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
   431 			assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
   448 
   432 
   449 			clicked = !!(w->flags4 & WF_SIZING);
   433 			clicked = !!(w->flags4 & WF_SIZING);
   450 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   434 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
   451 			DrawSprite(SPR_WINDOW_RESIZE, PAL_NONE, r.left + 3 + clicked, r.top + 3 + clicked);
   435 			DrawSprite(SPR_WINDOW_RESIZE, PAL_NONE, r.left + 3 + clicked, r.top + 3 + clicked);
   452 			break;
   436 			break;
   453 		}
       
   454 
   437 
   455 		case WWT_CLOSEBOX: {
   438 		case WWT_CLOSEBOX: {
   456 			const StringID str = wi->data;
   439 			const StringID str = wi->data;
   457 
   440 
   458 			assert(str == STR_00C5 || str == STR_00C6); // black or silver cross
   441 			assert(str == STR_00C5 || str == STR_00C6); // black or silver cross
   459 			assert(r.right - r.left == 10); // ensure the same sizes are used everywhere
   442 			assert(r.right - r.left == 10); // To ensure the same sizes are used everywhere
   460 
   443 
   461 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_NONE);
   444 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_NONE);
   462 			DrawString(r.left + 2, r.top + 2, str, TC_FROMSTRING);
   445 			DrawString(r.left + 2, r.top + 2, str, TC_FROMSTRING);
   463 			break;
   446 			break;
   464 		}
   447 		}
   465 
   448 
   466 		case WWT_CAPTION: {
   449 		case WWT_CAPTION:
   467 			assert(r.bottom - r.top == 13); // XXX - to ensure the same sizes are used everywhere!
   450 			assert(r.bottom - r.top == 13); // To ensure the same sizes are used everywhere!
   468 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_BORDERONLY);
   451 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_BORDERONLY);
   469 			DrawFrameRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, wi->color, (w->caption_color == 0xFF) ? FR_LOWERED | FR_DARKENED : FR_LOWERED | FR_DARKENED | FR_BORDERONLY);
   452 			DrawFrameRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, wi->color, (w->caption_color == 0xFF) ? FR_LOWERED | FR_DARKENED : FR_LOWERED | FR_DARKENED | FR_BORDERONLY);
   470 
   453 
   471 			if (w->caption_color != 0xFF) {
   454 			if (w->caption_color != 0xFF) {
   472 				GfxFillRect(r.left + 2, r.top + 2, r.right - 2, r.bottom - 2, _colour_gradient[_player_colors[w->caption_color]][4]);
   455 				GfxFillRect(r.left + 2, r.top + 2, r.right - 2, r.bottom - 2, _colour_gradient[_player_colors[w->caption_color]][4]);
   473 			}
   456 			}
   474 
   457 
   475 			DrawStringCenteredTruncated(r.left + 2, r.right - 2, r.top + 2, wi->data, 0x84);
   458 			DrawStringCenteredTruncated(r.left + 2, r.right - 2, r.top + 2, wi->data, 0x84);
   476 			break;
   459 			break;
   477 		}
       
   478 
   460 
   479 		case WWT_DROPDOWN: {
   461 		case WWT_DROPDOWN: {
   480 			assert(r.bottom - r.top == 11); // ensure consistent size
   462 			assert(r.bottom - r.top == 11); // ensure consistent size
   481 
   463 
   482 			StringID str = wi->data;
   464 			StringID str = wi->data;
   514 static void ResizeWidgets(Window *w, byte a, byte b)
   496 static void ResizeWidgets(Window *w, byte a, byte b)
   515 {
   497 {
   516 	int16 offset = w->widget[a].left;
   498 	int16 offset = w->widget[a].left;
   517 	int16 length = w->widget[b].right - offset;
   499 	int16 length = w->widget[b].right - offset;
   518 
   500 
   519 	w->widget[a].right  = (length / 2) + offset;
   501 	w->widget[a].right = (length / 2) + offset;
   520 
   502 
   521 	w->widget[b].left  = w->widget[a].right + 1;
   503 	w->widget[b].left  = w->widget[a].right + 1;
   522 }
   504 }
   523 
   505 
   524 static void ResizeWidgets(Window *w, byte a, byte b, byte c)
   506 static void ResizeWidgets(Window *w, byte a, byte b, byte c)