src/music_gui.cpp
changeset 9284 e2987a51f382
parent 9273 35e0224ea8f1
child 9317 f14eb8815829
equal deleted inserted replaced
9283:dbccc281c38a 9284:e2987a51f382
   191 			ResetMusic();
   191 			ResetMusic();
   192 		}
   192 		}
   193 	}
   193 	}
   194 }
   194 }
   195 
   195 
   196 static void MusicTrackSelectionWndProc(Window *w, WindowEvent *e)
   196 struct MusicTrackSelectionWindow : public Window {
   197 {
   197 private:
   198 	switch (e->event) {
   198 	enum MusicTrackSelectionWidgets {
   199 	case WE_PAINT: {
   199 		MTSW_CLOSE,
       
   200 		MTSW_CAPTION,
       
   201 		MTSW_BACKGROUND,
       
   202 		MTSW_LIST_LEFT,
       
   203 		MTSW_LIST_RIGHT,
       
   204 		MTSW_ALL,
       
   205 		MTSW_OLD,
       
   206 		MTSW_NEW,
       
   207 		MTSW_EZY,
       
   208 		MTSW_CUSTOM1,
       
   209 		MTSW_CUSTOM2,
       
   210 		MTSW_CLEAR,
       
   211 		MTSW_SAVE,
       
   212 	};
       
   213 
       
   214 public:
       
   215 	MusicTrackSelectionWindow(const WindowDesc *desc, WindowNumber number) : Window(desc, number)
       
   216 	{
       
   217 		this->FindWindowPlacementAndResize(desc);
       
   218 	}
       
   219 
       
   220 	virtual void OnPaint()
       
   221 	{
   200 		const byte* p;
   222 		const byte* p;
   201 		uint i;
   223 		uint i;
   202 		int y;
   224 		int y;
   203 
   225 
   204 		w->SetWidgetDisabledState(11, msf.playlist <= 3);
   226 		this->SetWidgetDisabledState(MTSW_CLEAR, msf.playlist <= 3);
   205 		w->LowerWidget(3);
   227 		this->LowerWidget(MTSW_LIST_LEFT);
   206 		w->LowerWidget(4);
   228 		this->LowerWidget(MTSW_LIST_RIGHT);
   207 		w->DrawWidgets();
   229 		this->DrawWidgets();
   208 
   230 
   209 		GfxFillRect(3, 23, 3 + 177, 23 + 191, 0);
   231 		GfxFillRect(3, 23, 3 + 177, 23 + 191, 0);
   210 		GfxFillRect(251, 23, 251 + 177, 23 + 191, 0);
   232 		GfxFillRect(251, 23, 251 + 177, 23 + 191, 0);
   211 
   233 
   212 		DrawStringCentered(92, 15, STR_01EE_TRACK_INDEX, TC_FROMSTRING);
   234 		DrawStringCentered(92, 15, STR_01EE_TRACK_INDEX, TC_FROMSTRING);
   236 			SetDParam(1, SPECSTR_SONGNAME);
   258 			SetDParam(1, SPECSTR_SONGNAME);
   237 			SetDParam(2, i);
   259 			SetDParam(2, i);
   238 			DrawString(252, y, (i < 10) ? STR_01EC_0 : STR_01ED, TC_FROMSTRING);
   260 			DrawString(252, y, (i < 10) ? STR_01EC_0 : STR_01ED, TC_FROMSTRING);
   239 			y += 6;
   261 			y += 6;
   240 		}
   262 		}
   241 		break;
   263 	}
   242 	}
   264 
   243 
   265 	virtual void OnClick(Point pt, int widget)
   244 	case WE_CLICK:
   266 	{
   245 		switch (e->we.click.widget) {
   267 		switch (widget) {
   246 		case 3: { // add to playlist
   268 			case MTSW_LIST_LEFT: { // add to playlist
   247 			int y = (e->we.click.pt.y - 23) / 6;
   269 				int y = (pt.y - 23) / 6;
   248 			uint i;
   270 				uint i;
   249 			byte *p;
   271 				byte *p;
   250 
   272 
   251 			if (msf.playlist < 4) return;
   273 				if (msf.playlist < 4) return;
   252 			if (!IsInsideMM(y, 0, NUM_SONGS_AVAILABLE)) return;
   274 				if (!IsInsideMM(y, 0, NUM_SONGS_AVAILABLE)) return;
   253 
   275 
   254 			p = _playlists[msf.playlist];
   276 				p = _playlists[msf.playlist];
   255 			for (i = 0; i != NUM_SONGS_PLAYLIST - 1; i++) {
   277 				for (i = 0; i != NUM_SONGS_PLAYLIST - 1; i++) {
   256 				if (p[i] == 0) {
   278 					if (p[i] == 0) {
   257 					p[i] = y + 1;
   279 						p[i] = y + 1;
   258 					p[i + 1] = 0;
   280 						p[i + 1] = 0;
   259 					w->SetDirty();
   281 						this->SetDirty();
   260 					SelectSongToPlay();
   282 						SelectSongToPlay();
   261 					break;
   283 						break;
       
   284 					}
   262 				}
   285 				}
   263 			}
   286 			} break;
   264 		} break;
   287 
   265 
   288 			case MTSW_LIST_RIGHT: { // remove from playlist
   266 		case 4: { // remove from playlist
   289 				int y = (pt.y - 23) / 6;
   267 			int y = (e->we.click.pt.y - 23) / 6;
   290 				uint i;
   268 			uint i;
   291 				byte *p;
   269 			byte *p;
   292 
   270 
   293 				if (msf.playlist < 4) return;
   271 			if (msf.playlist < 4) return;
   294 				if (!IsInsideMM(y, 0, NUM_SONGS_AVAILABLE)) return;
   272 			if (!IsInsideMM(y, 0, NUM_SONGS_AVAILABLE)) return;
   295 
   273 
   296 				p = _playlists[msf.playlist];
   274 			p = _playlists[msf.playlist];
   297 				for (i = y; i != NUM_SONGS_PLAYLIST - 1; i++) {
   275 			for (i = y; i != NUM_SONGS_PLAYLIST - 1; i++) {
   298 					p[i] = p[i + 1];
   276 				p[i] = p[i + 1];
       
   277 				}
   299 				}
   278 
   300 
   279 			w->SetDirty();
   301 				this->SetDirty();
   280 			SelectSongToPlay();
   302 				SelectSongToPlay();
   281 		} break;
   303 			} break;
   282 
   304 
   283 		case 11: // clear
   305 			case MTSW_CLEAR: // clear
   284 			_playlists[msf.playlist][0] = 0;
   306 				_playlists[msf.playlist][0] = 0;
   285 			w->SetDirty();
   307 				this->SetDirty();
   286 			StopMusic();
   308 				StopMusic();
   287 			SelectSongToPlay();
   309 				SelectSongToPlay();
   288 			break;
   310 				break;
   289 
   311 
   290 #if 0
   312 #if 0
   291 		case 12: // save
   313 			case MTSW_SAVE: // save
   292 			ShowInfo("MusicTrackSelectionWndProc:save not implemented");
   314 				ShowInfo("MusicTrackSelectionWndProc:save not implemented");
   293 			break;
   315 				break;
   294 #endif
   316 #endif
   295 
   317 
   296 		case 5: case 6: case 7: case 8: case 9: case 10: /* set playlist */
   318 			case MTSW_ALL: case MTSW_OLD: case MTSW_NEW:
   297 			msf.playlist = e->we.click.widget - 5;
   319 			case MTSW_EZY: case MTSW_CUSTOM1: case MTSW_CUSTOM2: // set playlist
   298 			w->SetDirty();
   320 				msf.playlist = widget - MTSW_ALL;
   299 			InvalidateWindow(WC_MUSIC_WINDOW, 0);
   321 				this->SetDirty();
   300 			StopMusic();
   322 				InvalidateWindow(WC_MUSIC_WINDOW, 0);
   301 			SelectSongToPlay();
   323 				StopMusic();
   302 			break;
   324 				SelectSongToPlay();
   303 		}
   325 				break;
   304 		break;
   326 		}
   305 	}
   327 	}
   306 }
   328 };
   307 
   329 
   308 static const Widget _music_track_selection_widgets[] = {
   330 static const Widget _music_track_selection_widgets[] = {
   309 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},
   331 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},                  // MTSW_CLOSE
   310 {    WWT_CAPTION,   RESIZE_NONE,    14,    11,   431,     0,    13, STR_01EB_MUSIC_PROGRAM_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
   332 {    WWT_CAPTION,   RESIZE_NONE,    14,    11,   431,     0,    13, STR_01EB_MUSIC_PROGRAM_SELECTION, STR_018C_WINDOW_TITLE_DRAG_THIS},        // MTSW_CAPTION
   311 {      WWT_PANEL,   RESIZE_NONE,    14,     0,   431,    14,   217, 0x0,                              STR_NULL},
   333 {      WWT_PANEL,   RESIZE_NONE,    14,     0,   431,    14,   217, 0x0,                              STR_NULL},                               // MTSW_BACKGROUND
   312 {      WWT_PANEL,   RESIZE_NONE,    14,     2,   181,    22,   215, 0x0,                              STR_01FA_CLICK_ON_MUSIC_TRACK_TO},
   334 {      WWT_PANEL,   RESIZE_NONE,    14,     2,   181,    22,   215, 0x0,                              STR_01FA_CLICK_ON_MUSIC_TRACK_TO},       // MTSW_LIST_LEFT
   313 {      WWT_PANEL,   RESIZE_NONE,    14,   250,   429,    22,   215, 0x0,                              STR_CLICK_ON_TRACK_TO_REMOVE},
   335 {      WWT_PANEL,   RESIZE_NONE,    14,   250,   429,    22,   215, 0x0,                              STR_CLICK_ON_TRACK_TO_REMOVE},           // MTSW_LIST_RIGHT
   314 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    44,    51, 0x0,                              STR_01F3_SELECT_ALL_TRACKS_PROGRAM},
   336 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    44,    51, 0x0,                              STR_01F3_SELECT_ALL_TRACKS_PROGRAM},     // MTSW_ALL
   315 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    52,    59, 0x0,                              STR_01F4_SELECT_OLD_STYLE_MUSIC},
   337 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    52,    59, 0x0,                              STR_01F4_SELECT_OLD_STYLE_MUSIC},        // MTSW_OLD
   316 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    60,    67, 0x0,                              STR_01F5_SELECT_NEW_STYLE_MUSIC},
   338 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    60,    67, 0x0,                              STR_01F5_SELECT_NEW_STYLE_MUSIC},        // MTSW_NEW
   317 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    68,    75, 0x0,                              STR_0330_SELECT_EZY_STREET_STYLE},
   339 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    68,    75, 0x0,                              STR_0330_SELECT_EZY_STREET_STYLE},       // MTSW_EZY
   318 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    76,    83, 0x0,                              STR_01F6_SELECT_CUSTOM_1_USER_DEFINED},
   340 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    76,    83, 0x0,                              STR_01F6_SELECT_CUSTOM_1_USER_DEFINED},  // MTSW_CUSTOM1
   319 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    84,    91, 0x0,                              STR_01F7_SELECT_CUSTOM_2_USER_DEFINED},
   341 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,    84,    91, 0x0,                              STR_01F7_SELECT_CUSTOM_2_USER_DEFINED},  // MTSW_CUSTOM2
   320 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,   108,   115, 0x0,                              STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1},
   342 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,   108,   115, 0x0,                              STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1}, // MTSW_CLEAR
   321 #if 0
   343 #if 0
   322 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,   124,   131, 0x0,                              STR_01F9_SAVE_MUSIC_SETTINGS},
   344 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   186,   245,   124,   131, 0x0,                              STR_01F9_SAVE_MUSIC_SETTINGS},           // MTSW_SAVE
   323 #endif
   345 #endif
   324 {   WIDGETS_END},
   346 {   WIDGETS_END},
   325 };
   347 };
   326 
   348 
   327 static const WindowDesc _music_track_selection_desc = {
   349 static const WindowDesc _music_track_selection_desc = {
   328 	104, 131, 432, 218, 432, 218,
   350 	104, 131, 432, 218, 432, 218,
   329 	WC_MUSIC_TRACK_SELECTION, WC_NONE,
   351 	WC_MUSIC_TRACK_SELECTION, WC_NONE,
   330 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
   352 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
   331 	_music_track_selection_widgets,
   353 	_music_track_selection_widgets,
   332 	MusicTrackSelectionWndProc
   354 	NULL
   333 };
   355 };
   334 
   356 
   335 static void ShowMusicTrackSelection()
   357 static void ShowMusicTrackSelection()
   336 {
   358 {
   337 	AllocateWindowDescFront<Window>(&_music_track_selection_desc, 0);
   359 	AllocateWindowDescFront<MusicTrackSelectionWindow>(&_music_track_selection_desc, 0);
   338 }
   360 }
   339 
   361 
   340 static void MusicWindowWndProc(Window *w, WindowEvent *e)
   362 struct MusicWindow : public Window {
   341 {
   363 private:
   342 	switch (e->event) {
   364 	enum MusicWidgets {
   343 	case WE_PAINT: {
   365 		MW_CLOSE,
       
   366 		MW_CAPTION,
       
   367 		MW_PREV,
       
   368 		MW_NEXT,
       
   369 		MW_STOP,
       
   370 		MW_PLAY,
       
   371 		MW_SLIDERS,
       
   372 		MW_GAUGE,
       
   373 		MW_BACKGROUND,
       
   374 		MW_INFO,
       
   375 		MW_SHUFFLE,
       
   376 		MW_PROGRAMME,
       
   377 		MW_ALL,
       
   378 		MW_OLD,
       
   379 		MW_NEW,
       
   380 		MW_EZY,
       
   381 		MW_CUSTOM1,
       
   382 		MW_CUSTOM2,
       
   383 	};
       
   384 
       
   385 public:
       
   386 	MusicWindow(const WindowDesc *desc, WindowNumber number) : Window(desc, number)
       
   387 	{
       
   388 		this->FindWindowPlacementAndResize(desc);
       
   389 	}
       
   390 
       
   391 	virtual void OnPaint()
       
   392 	{
   344 		uint i;
   393 		uint i;
   345 		StringID str;
   394 		StringID str;
   346 
   395 
   347 		w->RaiseWidget(7);
   396 		this->RaiseWidget(MW_GAUGE);
   348 		w->RaiseWidget(9);
   397 		this->RaiseWidget(MW_INFO);
   349 		w->DrawWidgets();
   398 		this->DrawWidgets();
   350 
   399 
   351 		GfxFillRect(187, 16, 200, 33, 0);
   400 		GfxFillRect(187, 16, 200, 33, 0);
   352 
   401 
   353 		for (i = 0; i != 8; i++) {
   402 		for (i = 0; i != 8; i++) {
   354 			int color = 0xD0;
   403 			int color = 0xD0;
   401 		);
   450 		);
   402 
   451 
   403 		DrawFrameRect(
   452 		DrawFrameRect(
   404 			214 + msf.effect_vol / 2, 22, 217 + msf.effect_vol / 2, 28, 14, FR_NONE
   453 			214 + msf.effect_vol / 2, 22, 217 + msf.effect_vol / 2, 28, 14, FR_NONE
   405 		);
   454 		);
   406 	} break;
   455 	}
   407 
   456 
   408 	case WE_CLICK:
   457 	virtual void OnClick(Point pt, int widget)
   409 		switch (e->we.click.widget) {
   458 	{
   410 		case 2: // skip to prev
   459 		switch (widget) {
   411 			if (!_song_is_active)
   460 			case MW_PREV: // skip to prev
   412 				return;
   461 				if (!_song_is_active) return;
   413 			SkipToPrevSong();
   462 				SkipToPrevSong();
   414 			break;
   463 				break;
   415 		case 3: // skip to next
   464 
   416 			if (!_song_is_active)
   465 			case MW_NEXT: // skip to next
   417 				return;
   466 				if (!_song_is_active) return;
   418 			SkipToNextSong();
   467 				SkipToNextSong();
   419 			break;
   468 				break;
   420 		case 4: // stop playing
   469 
   421 			msf.playing = false;
   470 			case MW_STOP: // stop playing
   422 			break;
   471 				msf.playing = false;
   423 		case 5: // start playing
   472 				break;
   424 			msf.playing = true;
   473 
   425 			break;
   474 			case MW_PLAY: // start playing
   426 		case 6: { // volume sliders
   475 				msf.playing = true;
   427 			byte *vol, new_vol;
   476 				break;
   428 			int x = e->we.click.pt.x - 88;
   477 
   429 
   478 			case MW_SLIDERS: { // volume sliders
   430 			if (x < 0) return;
   479 				byte *vol, new_vol;
   431 
   480 				int x = pt.x - 88;
   432 			vol = &msf.music_vol;
   481 
   433 			if (x >= 106) {
   482 				if (x < 0) return;
   434 				vol = &msf.effect_vol;
   483 
   435 				x -= 106;
   484 				vol = &msf.music_vol;
   436 			}
   485 				if (x >= 106) {
   437 
   486 					vol = &msf.effect_vol;
   438 			new_vol = min(max(x - 21, 0) * 2, 127);
   487 					x -= 106;
   439 			if (new_vol != *vol) {
   488 				}
   440 				*vol = new_vol;
   489 
   441 				if (vol == &msf.music_vol)
   490 				new_vol = min(max(x - 21, 0) * 2, 127);
   442 					MusicVolumeChanged(new_vol);
   491 				if (new_vol != *vol) {
   443 				w->SetDirty();
   492 					*vol = new_vol;
   444 			}
   493 					if (vol == &msf.music_vol) MusicVolumeChanged(new_vol);
   445 
   494 					this->SetDirty();
   446 			_left_button_clicked = false;
   495 				}
   447 		} break;
   496 
   448 		case 10: //toggle shuffle
   497 				_left_button_clicked = false;
   449 			msf.shuffle ^= 1;
   498 			} break;
   450 			StopMusic();
   499 
   451 			SelectSongToPlay();
   500 			case MW_SHUFFLE: //toggle shuffle
   452 			break;
   501 				msf.shuffle ^= 1;
   453 		case 11: //show track selection
   502 				StopMusic();
   454 			ShowMusicTrackSelection();
   503 				SelectSongToPlay();
   455 			break;
   504 				break;
   456 		case 12: case 13: case 14: case 15: case 16: case 17: // playlist
   505 
   457 			msf.playlist = e->we.click.widget - 12;
   506 			case MW_PROGRAMME: //show track selection
   458 			w->SetDirty();
   507 				ShowMusicTrackSelection();
   459 			InvalidateWindow(WC_MUSIC_TRACK_SELECTION, 0);
   508 				break;
   460 			StopMusic();
   509 
   461 			SelectSongToPlay();
   510 			case MW_ALL: case MW_OLD: case MW_NEW:
   462 			break;
   511 			case MW_EZY: case MW_CUSTOM1: case MW_CUSTOM2: // playlist
   463 		}
   512 				msf.playlist = widget - MW_ALL;
   464 		break;
   513 				this->SetDirty();
   465 
   514 				InvalidateWindow(WC_MUSIC_TRACK_SELECTION, 0);
   466 	case WE_TICK:
   515 				StopMusic();
   467 		InvalidateWindowWidget(WC_MUSIC_WINDOW, 0, 7);
   516 				SelectSongToPlay();
   468 		break;
   517 				break;
   469 	}
   518 		}
   470 
   519 	}
   471 }
   520 
       
   521 #if 0
       
   522 	virtual void OnTick()
       
   523 	{
       
   524 		this->InvalidateWidget(MW_GAUGE);
       
   525 	}
       
   526 #endif
       
   527 };
   472 
   528 
   473 static const Widget _music_window_widgets[] = {
   529 static const Widget _music_window_widgets[] = {
   474 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,              STR_018B_CLOSE_WINDOW},
   530 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,              STR_018B_CLOSE_WINDOW},                    // MW_CLOSE
   475 {    WWT_CAPTION,   RESIZE_NONE,    14,    11,   299,     0,    13, STR_01D2_JAZZ_JUKEBOX, STR_018C_WINDOW_TITLE_DRAG_THIS},
   531 {    WWT_CAPTION,   RESIZE_NONE,    14,    11,   299,     0,    13, STR_01D2_JAZZ_JUKEBOX, STR_018C_WINDOW_TITLE_DRAG_THIS},          // MW_CAPTION
   476 { WWT_PUSHIMGBTN,   RESIZE_NONE,    14,     0,    21,    14,    35, SPR_IMG_SKIP_TO_PREV,  STR_01DE_SKIP_TO_PREVIOUS_TRACK},
   532 { WWT_PUSHIMGBTN,   RESIZE_NONE,    14,     0,    21,    14,    35, SPR_IMG_SKIP_TO_PREV,  STR_01DE_SKIP_TO_PREVIOUS_TRACK},          // MW_PREV
   477 { WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    22,    43,    14,    35, SPR_IMG_SKIP_TO_NEXT,  STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION},
   533 { WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    22,    43,    14,    35, SPR_IMG_SKIP_TO_NEXT,  STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION}, // MW_NEXT
   478 { WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    44,    65,    14,    35, SPR_IMG_STOP_MUSIC,    STR_01E0_STOP_PLAYING_MUSIC},
   534 { WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    44,    65,    14,    35, SPR_IMG_STOP_MUSIC,    STR_01E0_STOP_PLAYING_MUSIC},              // MW_STOP
   479 { WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    66,    87,    14,    35, SPR_IMG_PLAY_MUSIC,    STR_01E1_START_PLAYING_MUSIC},
   535 { WWT_PUSHIMGBTN,   RESIZE_NONE,    14,    66,    87,    14,    35, SPR_IMG_PLAY_MUSIC,    STR_01E1_START_PLAYING_MUSIC},             // MW_PLAY
   480 {      WWT_PANEL,   RESIZE_NONE,    14,    88,   299,    14,    35, 0x0,                   STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC},
   536 {      WWT_PANEL,   RESIZE_NONE,    14,    88,   299,    14,    35, 0x0,                   STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC},       // MW_SLIDERS
   481 {      WWT_PANEL,   RESIZE_NONE,    14,   186,   201,    15,    34, 0x0,                   STR_NULL},
   537 {      WWT_PANEL,   RESIZE_NONE,    14,   186,   201,    15,    34, 0x0,                   STR_NULL},                                 // MW_GAUGE
   482 {      WWT_PANEL,   RESIZE_NONE,    14,     0,   299,    36,    57, 0x0,                   STR_NULL},
   538 {      WWT_PANEL,   RESIZE_NONE,    14,     0,   299,    36,    57, 0x0,                   STR_NULL},                                 // MW_BACKGROUND
   483 {      WWT_PANEL,   RESIZE_NONE,    14,    59,   240,    45,    53, 0x0,                   STR_NULL},
   539 {      WWT_PANEL,   RESIZE_NONE,    14,    59,   240,    45,    53, 0x0,                   STR_NULL},                                 // MW_INFO
   484 {    WWT_PUSHBTN,   RESIZE_NONE,    14,     6,    55,    42,    49, 0x0,                   STR_01FB_TOGGLE_PROGRAM_SHUFFLE},
   540 {    WWT_PUSHBTN,   RESIZE_NONE,    14,     6,    55,    42,    49, 0x0,                   STR_01FB_TOGGLE_PROGRAM_SHUFFLE},          // MW_SHUFFLE
   485 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   244,   293,    42,    49, 0x0,                   STR_01FC_SHOW_MUSIC_TRACK_SELECTION},
   541 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   244,   293,    42,    49, 0x0,                   STR_01FC_SHOW_MUSIC_TRACK_SELECTION},      // MW_PROGRAMME
   486 {    WWT_PUSHBTN,   RESIZE_NONE,    14,     0,    49,    58,    65, 0x0,                   STR_01F3_SELECT_ALL_TRACKS_PROGRAM},
   542 {    WWT_PUSHBTN,   RESIZE_NONE,    14,     0,    49,    58,    65, 0x0,                   STR_01F3_SELECT_ALL_TRACKS_PROGRAM},       // MW_ALL
   487 {    WWT_PUSHBTN,   RESIZE_NONE,    14,    50,    99,    58,    65, 0x0,                   STR_01F4_SELECT_OLD_STYLE_MUSIC},
   543 {    WWT_PUSHBTN,   RESIZE_NONE,    14,    50,    99,    58,    65, 0x0,                   STR_01F4_SELECT_OLD_STYLE_MUSIC},          // MW_OLD
   488 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   100,   149,    58,    65, 0x0,                   STR_01F5_SELECT_NEW_STYLE_MUSIC},
   544 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   100,   149,    58,    65, 0x0,                   STR_01F5_SELECT_NEW_STYLE_MUSIC},          // MW_NEW
   489 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   150,   199,    58,    65, 0x0,                   STR_0330_SELECT_EZY_STREET_STYLE},
   545 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   150,   199,    58,    65, 0x0,                   STR_0330_SELECT_EZY_STREET_STYLE},         // MW_EZY
   490 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   200,   249,    58,    65, 0x0,                   STR_01F6_SELECT_CUSTOM_1_USER_DEFINED},
   546 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   200,   249,    58,    65, 0x0,                   STR_01F6_SELECT_CUSTOM_1_USER_DEFINED},    // MW_CUSTOM1
   491 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   250,   299,    58,    65, 0x0,                   STR_01F7_SELECT_CUSTOM_2_USER_DEFINED},
   547 {    WWT_PUSHBTN,   RESIZE_NONE,    14,   250,   299,    58,    65, 0x0,                   STR_01F7_SELECT_CUSTOM_2_USER_DEFINED},    // MW_CUSTOM2
   492 {   WIDGETS_END},
   548 {   WIDGETS_END},
   493 };
   549 };
   494 
   550 
   495 static const WindowDesc _music_window_desc = {
   551 static const WindowDesc _music_window_desc = {
   496 	0, 22, 300, 66, 300, 66,
   552 	0, 22, 300, 66, 300, 66,
   497 	WC_MUSIC_WINDOW, WC_NONE,
   553 	WC_MUSIC_WINDOW, WC_NONE,
   498 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
   554 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
   499 	_music_window_widgets,
   555 	_music_window_widgets,
   500 	MusicWindowWndProc
   556 	NULL
   501 };
   557 };
   502 
   558 
   503 void ShowMusicWindow()
   559 void ShowMusicWindow()
   504 {
   560 {
   505 	AllocateWindowDescFront<Window>(&_music_window_desc, 0);
   561 	AllocateWindowDescFront<MusicWindow>(&_music_window_desc, 0);
   506 }
   562 }