(svn r6040) -Add: when clicking twice on a Location Button, the SmallMap centers on your position (based on FS#54 by thomasdev)
-Add: when clicking twice in SmallMap on a position, it centers there (based on FS#54 by thomasdev) -Add: add a button in SmallMap that centers the SmallMap on your current position (based on FS#54 by thomasdev)
This commit is contained in:
		| @@ -2954,6 +2954,8 @@ STR_FLAT_WORLD_HEIGHT_QUERY_CAPT                                :{WHITE}Change h | |||||||
| STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Height of flat land: | STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Height of flat land: | ||||||
| STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM} | STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM} | ||||||
|  |  | ||||||
|  | STR_SMALLMAP_CENTER                                             :{BLACK}Center the smallmap on the current position | ||||||
|  |  | ||||||
| ########### String for new airports | ########### String for new airports | ||||||
| STR_SMALL_AIRPORT                                               :{BLACK}Small | STR_SMALL_AIRPORT                                               :{BLACK}Small | ||||||
| STR_CITY_AIRPORT                                                :{BLACK}City | STR_CITY_AIRPORT                                                :{BLACK}City | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ static const Widget _smallmap_widgets[] = { | |||||||
| {    WWT_IMGBTN,   RESIZE_LRTB,    13,   380,   401,   280,   301, SPR_IMG_SHOW_ROUTES,     STR_0194_SHOW_TRANSPORT_ROUTES_ON}, | {    WWT_IMGBTN,   RESIZE_LRTB,    13,   380,   401,   280,   301, SPR_IMG_SHOW_ROUTES,     STR_0194_SHOW_TRANSPORT_ROUTES_ON}, | ||||||
| {    WWT_IMGBTN,   RESIZE_LRTB,    13,   402,   423,   280,   301, SPR_IMG_PLANTTREES,      STR_0195_SHOW_VEGETATION_ON_MAP}, | {    WWT_IMGBTN,   RESIZE_LRTB,    13,   402,   423,   280,   301, SPR_IMG_PLANTTREES,      STR_0195_SHOW_VEGETATION_ON_MAP}, | ||||||
| {    WWT_IMGBTN,   RESIZE_LRTB,    13,   424,   445,   280,   301, SPR_IMG_COMPANY_GENERAL, STR_0196_SHOW_LAND_OWNERS_ON_MAP}, | {    WWT_IMGBTN,   RESIZE_LRTB,    13,   424,   445,   280,   301, SPR_IMG_COMPANY_GENERAL, STR_0196_SHOW_LAND_OWNERS_ON_MAP}, | ||||||
| {    WWT_IMGBTN,   RESIZE_LRTB,    13,   358,   379,   258,   279, 0x0,                     STR_NULL}, | {    WWT_IMGBTN,   RESIZE_LRTB,    13,   358,   379,   258,   279, SPR_IMG_SMALLMAP,        STR_SMALLMAP_CENTER}, | ||||||
| {    WWT_IMGBTN,   RESIZE_LRTB,    13,   358,   379,   280,   301, SPR_IMG_TOWN,            STR_0197_TOGGLE_TOWN_NAMES_ON_OFF}, | {    WWT_IMGBTN,   RESIZE_LRTB,    13,   358,   379,   280,   301, SPR_IMG_TOWN,            STR_0197_TOGGLE_TOWN_NAMES_ON_OFF}, | ||||||
| {    WWT_IMGBTN,    RESIZE_RTB,    13,     0,   357,   258,   301, 0x0,                     STR_NULL}, | {    WWT_IMGBTN,    RESIZE_RTB,    13,     0,   357,   258,   301, 0x0,                     STR_NULL}, | ||||||
| {     WWT_PANEL,    RESIZE_RTB,    13,     0,   433,   302,   313, 0x0,                     STR_NULL}, | {     WWT_PANEL,    RESIZE_RTB,    13,     0,   433,   302,   313, 0x0,                     STR_NULL}, | ||||||
| @@ -792,6 +792,19 @@ skip_column: | |||||||
| 	_cur_dpi = old_dpi; | 	_cur_dpi = old_dpi; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void SmallMapCenterOnCurrentPos(Window *w) | ||||||
|  | { | ||||||
|  | 	int x, y; | ||||||
|  | 	ViewPort *vp; | ||||||
|  | 	vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport; | ||||||
|  |  | ||||||
|  | 	x  = ((vp->virtual_width  - (w->widget[4].right  - w->widget[4].left) * TILE_SIZE) / 2 + vp->virtual_left) / 4; | ||||||
|  | 	y  = ((vp->virtual_height - (w->widget[4].bottom - w->widget[4].top ) * TILE_SIZE) / 2 + vp->virtual_top ) / 2 - TILE_SIZE * 2; | ||||||
|  | 	WP(w, smallmap_d).scroll_x = (y - x) & ~0xF; | ||||||
|  | 	WP(w, smallmap_d).scroll_y = (x + y) & ~0xF; | ||||||
|  | 	SetWindowDirty(w); | ||||||
|  | } | ||||||
|  |  | ||||||
| static void SmallMapWindowProc(Window *w, WindowEvent *e) | static void SmallMapWindowProc(Window *w, WindowEvent *e) | ||||||
| { | { | ||||||
| 	switch (e->event) { | 	switch (e->event) { | ||||||
| @@ -833,25 +846,32 @@ static void SmallMapWindowProc(Window *w, WindowEvent *e) | |||||||
|  |  | ||||||
| 	case WE_CLICK: | 	case WE_CLICK: | ||||||
| 		switch (e->click.widget) { | 		switch (e->click.widget) { | ||||||
| 		case 4: {/* Main wnd */ | 		case 4: { // Map window | ||||||
| 			Window *w2; | 			Window *w2 = FindWindowById(WC_MAIN_WINDOW, 0); | ||||||
| 			Point pt; | 			Point pt; | ||||||
|  | 			int x, y; | ||||||
| 			_left_button_clicked = false; |  | ||||||
|  |  | ||||||
| 			w2 = FindWindowById(WC_MAIN_WINDOW, 0); |  | ||||||
|  |  | ||||||
| 			pt = RemapCoords(WP(w,smallmap_d).scroll_x, WP(w,smallmap_d).scroll_y, 0); | 			pt = RemapCoords(WP(w,smallmap_d).scroll_x, WP(w,smallmap_d).scroll_y, 0); | ||||||
| 			WP(w2,vp_d).scrollpos_x = pt.x + ((_cursor.pos.x - w->left + 2) << 4) - (w2->viewport->virtual_width >> 1); | 			x = pt.x + ((_cursor.pos.x - w->left + 2) << 4) - (w2->viewport->virtual_width >> 1); | ||||||
| 			WP(w2,vp_d).scrollpos_y = pt.y + ((_cursor.pos.y - w->top - 16) << 4) - (w2->viewport->virtual_height >> 1); | 			y = pt.y + ((_cursor.pos.y - w->top - 16) << 4) - (w2->viewport->virtual_height >> 1); | ||||||
|  |  | ||||||
|  | 			/* If you press twice on a place in the smallmap, center there */ | ||||||
|  | 			if (WP(w2, vp_d).scrollpos_x == x && WP(w2, vp_d).scrollpos_y == y) { | ||||||
|  | 				SmallMapCenterOnCurrentPos(w); | ||||||
|  | 			} else { | ||||||
|  | 				WP(w2, vp_d).scrollpos_x = x; | ||||||
|  | 				WP(w2, vp_d).scrollpos_y = y; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			SetWindowDirty(w); | ||||||
| 		} break; | 		} break; | ||||||
|  |  | ||||||
| 		case 5: /* Show land contours */ | 		case 5:  // Show land contours | ||||||
| 		case 6: /* Show vehicles */ | 		case 6:  // Show vehicles | ||||||
| 		case 7: /* Show industries */ | 		case 7:  // Show industries | ||||||
| 		case 8: /* Show transport routes */ | 		case 8:  // Show transport routes | ||||||
| 		case 9: /* Show vegetation */ | 		case 9:  // Show vegetation | ||||||
| 		case 10: /* Show land owners */ | 		case 10: // Show land owners | ||||||
| 			w->click_state &= ~(1<<5|1<<6|1<<7|1<<8|1<<9|1<<10); | 			w->click_state &= ~(1<<5|1<<6|1<<7|1<<8|1<<9|1<<10); | ||||||
| 			w->click_state |= 1 << e->click.widget; | 			w->click_state |= 1 << e->click.widget; | ||||||
| 			_smallmap_type = e->click.widget - 5; | 			_smallmap_type = e->click.widget - 5; | ||||||
| @@ -860,9 +880,17 @@ static void SmallMapWindowProc(Window *w, WindowEvent *e) | |||||||
| 			SndPlayFx(SND_15_BEEP); | 			SndPlayFx(SND_15_BEEP); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case 12: /* toggle town names */ | 		case 11: // Center the smallmap again | ||||||
|  | 			SmallMapCenterOnCurrentPos(w); | ||||||
|  |  | ||||||
|  | 			SetWindowDirty(w); | ||||||
|  | 			SndPlayFx(SND_15_BEEP); | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 		case 12: // Toggle town names | ||||||
| 			w->click_state ^= (1 << 12); | 			w->click_state ^= (1 << 12); | ||||||
| 			_smallmap_show_towns = (w->click_state >> 12) & 1; | 			_smallmap_show_towns = (w->click_state >> 12) & 1; | ||||||
|  |  | ||||||
| 			SetWindowDirty(w); | 			SetWindowDirty(w); | ||||||
| 			SndPlayFx(SND_15_BEEP); | 			SndPlayFx(SND_15_BEEP); | ||||||
| 			break; | 			break; | ||||||
| @@ -957,23 +985,15 @@ static const WindowDesc _smallmap_desc = { | |||||||
| void ShowSmallMap(void) | void ShowSmallMap(void) | ||||||
| { | { | ||||||
| 	Window *w; | 	Window *w; | ||||||
| 	ViewPort *vp; |  | ||||||
| 	int x,y; |  | ||||||
|  |  | ||||||
| 	w = AllocateWindowDescFront(&_smallmap_desc, 0); | 	w = AllocateWindowDescFront(&_smallmap_desc, 0); | ||||||
| 	if (w != NULL) { | 	if (w == NULL) return; | ||||||
|  |  | ||||||
| 	w->click_state = ((1 << 5) << _smallmap_type) | (_smallmap_show_towns << 12); | 	w->click_state = ((1 << 5) << _smallmap_type) | (_smallmap_show_towns << 12); | ||||||
| 	w->resize.width = 350; | 	w->resize.width = 350; | ||||||
| 	w->resize.height = 250; | 	w->resize.height = 250; | ||||||
|  |  | ||||||
| 		vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport; | 	SmallMapCenterOnCurrentPos(w); | ||||||
|  |  | ||||||
| 		x = ((vp->virtual_width  - 220 * 32) / 2 + vp->virtual_left) / 4; |  | ||||||
| 		y = ((vp->virtual_height - 120 * 32) / 2 + vp->virtual_top ) / 2 - 32; |  | ||||||
| 		WP(w,smallmap_d).scroll_x = (y - x) & ~0xF; |  | ||||||
| 		WP(w,smallmap_d).scroll_y = (x + y) & ~0xF; |  | ||||||
| 		WP(w,smallmap_d).subscroll = 0; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Extra ViewPort Window Stuff */ | /* Extra ViewPort Window Stuff */ | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								viewport.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								viewport.c
									
									
									
									
									
								
							| @@ -1788,7 +1788,21 @@ bool ScrollWindowTo(int x , int y, Window *w) | |||||||
|  |  | ||||||
| bool ScrollMainWindowTo(int x, int y) | bool ScrollMainWindowTo(int x, int y) | ||||||
| { | { | ||||||
| 	return ScrollWindowTo(x, y, FindWindowById(WC_MAIN_WINDOW, 0)); | 	Window *w; | ||||||
|  | 	bool res = ScrollWindowTo(x, y, FindWindowById(WC_MAIN_WINDOW, 0)); | ||||||
|  |  | ||||||
|  | 	/* If a user scrolls to a tile (via what way what so ever) and already is on | ||||||
|  | 	 *  that tile (e.g.: pressed twice), move the smallmap to that location, | ||||||
|  | 	 *  so you directly see where you are on the smallmap. */ | ||||||
|  |  | ||||||
|  | 	if (res) return res; | ||||||
|  |  | ||||||
|  | 	w = FindWindowById(WC_SMALLMAP, 0); | ||||||
|  | 	if (w == NULL) return res; | ||||||
|  |  | ||||||
|  | 	SmallMapCenterOnCurrentPos(w); | ||||||
|  |  | ||||||
|  | 	return res; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 truelight
					truelight