src/intro_gui.cpp
author KUDr
Sat, 03 Mar 2007 16:11:18 +0000
branchcpp_gui
changeset 6282 c5b92f2d924f
parent 6279 c75b2c7222ff
child 6283 7072ee68c676
permissions -rw-r--r--
(svn r8996) [cpp_gui] -Add: CloseBox added into CaptionBar
-Add: when pressing gui button and holding the mouse button down you can now move mouse out of the button and it will get released silently. So if you release mouse button after leaving gui button the button will not raise OnLeftClick() event.
-Fix: OnCreate() is now propagated properly to base classes
-Codechange: old OnLeftClick() is now OnLeftButtonDown() (same with OnRightClick() and OnRightButtonDown()). New OnLeftClick() is now raised only by button when released.
/* $Id$ */

#include "stdafx.h"
#include "openttd.h"
#include "table/strings.h"
#include "table/sprites.h"
#include "functions.h"
#include "window.h"
#include "gui.h"
#include "gfx.h"
#include "player.h"
#include "network/network.h"
#include "variables.h"
#include "settings.h"
#include "heightmap.h"
#include "genworld.h"
#include "network/network_gui.h"
#include "newgrf.h"

static const OldWidget _select_game_widgets[] = {
{    WWT_CAPTION, RESIZE_NONE, 13,   0, 335,   0,  13, STR_0307_OPENTTD,         STR_NULL},
{      WWT_PANEL, RESIZE_NONE, 13,   0, 335,  14, 194, 0x0,                      STR_NULL},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167,  22,  33, STR_0140_NEW_GAME,        STR_02FB_START_A_NEW_GAME},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325,  22,  33, STR_0141_LOAD_GAME,       STR_02FC_LOAD_A_SAVED_GAME},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167,  40,  51, STR_029A_PLAY_SCENARIO,   STR_0303_START_A_NEW_GAME_USING},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325,  40,  51, STR_PLAY_HEIGHTMAP,       STR_PLAY_HEIGHTMAP_HINT},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167,  58,  69, STR_SCENARIO_EDITOR,      STR_02FE_CREATE_A_CUSTOMIZED_GAME},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325,  58,  69, STR_MULTIPLAYER,          STR_0300_SELECT_MULTIPLAYER_GAME},

{   WWT_IMGBTN_2, RESIZE_NONE, 12,  10,  86,  77, 131, SPR_SELECT_TEMPERATE,     STR_030E_SELECT_TEMPERATE_LANDSCAPE},
{   WWT_IMGBTN_2, RESIZE_NONE, 12,  90, 166,  77, 131, SPR_SELECT_SUB_ARCTIC,    STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE},
{   WWT_IMGBTN_2, RESIZE_NONE, 12, 170, 246,  77, 131, SPR_SELECT_SUB_TROPICAL,  STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE},
{   WWT_IMGBTN_2, RESIZE_NONE, 12, 250, 326,  77, 131, SPR_SELECT_TOYLAND,       STR_0311_SELECT_TOYLAND_LANDSCAPE},

{ WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167, 139, 150, STR_0148_GAME_OPTIONS,    STR_0301_DISPLAY_GAME_OPTIONS},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325, 139, 150, STR_01FE_DIFFICULTY,      STR_0302_DISPLAY_DIFFICULTY_OPTIONS},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167, 157, 168, STR_CONFIG_PATCHES,       STR_CONFIG_PATCHES_TIP},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325, 157, 168, STR_NEWGRF_SETTINGS_BUTTON, STR_NULL},

{ WWT_PUSHTXTBTN, RESIZE_NONE, 12, 104, 231, 175, 186, STR_0304_QUIT,            STR_0305_QUIT_OPENTTD},
{   WIDGETS_END},
};

static inline void SetNewLandscapeType(byte landscape)
{
	_opt_newgame.landscape = landscape;
	InvalidateWindowClasses(WC_SELECT_GAME);
}

static void SelectGameWndProc(BaseWindow *w, WindowEvent *e)
{
	switch (e->event) {
	case WE_CREATE: w->LowerWidget(_opt_newgame.landscape + 8); break;

	case WE_PAINT:
		w->SetWidgetLoweredState(8,  _opt_newgame.landscape == LT_NORMAL);
		w->SetWidgetLoweredState(9,  _opt_newgame.landscape == LT_HILLY);
		w->SetWidgetLoweredState(10, _opt_newgame.landscape == LT_DESERT);
		w->SetWidgetLoweredState(11, _opt_newgame.landscape == LT_CANDY);
		SetDParam(0, STR_6801_EASY + _opt_newgame.diff_level);
		w->DrawWidgets();
		break;

	case WE_CLICK:
		switch (e->we.click.widget) {
		case 2: ShowGenerateLandscape(); break;
		case 3: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
		case 4: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break;
		case 5: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break;
		case 6: StartScenarioEditor(); break;
		case 7:
			if (!_network_available) {
				ShowErrorMessage(INVALID_STRING_ID, STR_NETWORK_ERR_NOTAVAILABLE, 0, 0);
			} else {
				ShowNetworkGameWindow();
			}
			break;
		case 8: case 9: case 10: case 11:
			w->RaiseWidget(_opt_newgame.landscape + 8);
			SetNewLandscapeType(e->we.click.widget - 8);
			break;
		case 12: ShowGameOptions(); break;
		case 13: ShowGameDifficulty(); break;
		case 14: ShowPatchesSelection(); break;
		case 15: ShowNewGRFSettings(true, true, false, &_grfconfig_newgame); break;
		case 16: HandleExitGameRequest(); break;
		}
		break;
	}
}

static const WindowDesc _select_game_desc = {
	WDP_CENTER, WDP_CENTER, 336, 195,
	WC_SELECT_GAME, WC_NONE,
	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
	_select_game_widgets,
	SelectGameWndProc
};

void ShowSelectGameWindow(void)
{
	BaseWindow::Allocate(&_select_game_desc);
	WindowFactory::NewWindow(WC_TEST1, 0);
}

static void AskExitGameCallback(BaseWindow *w, bool confirmed)
{
	if (confirmed) _exit_game = true;
}

void AskExitGame(void)
{
#if defined(_WIN32)
		SetDParam(0, STR_0133_WINDOWS);
#elif defined(__APPLE__)
		SetDParam(0, STR_0135_OSX);
#elif defined(__BEOS__)
		SetDParam(0, STR_OSNAME_BEOS);
#elif defined(__MORPHOS__)
		SetDParam(0, STR_OSNAME_MORPHOS);
#elif defined(__AMIGA__)
		SetDParam(0, STR_OSNAME_AMIGAOS);
#elif defined(__OS2__)
		SetDParam(0, STR_OSNAME_OS2);
#else
		SetDParam(0, STR_0134_UNIX);
#endif
	ShowQuery(
		STR_00C7_QUIT,
		STR_00CA_ARE_YOU_SURE_YOU_WANT_TO,
		NULL,
		AskExitGameCallback
	);
}


static void AskExitToGameMenuCallback(BaseWindow *w, bool confirmed)
{
	if (confirmed) _switch_mode = SM_MENU;
}

void AskExitToGameMenu(void)
{
	ShowQuery(
		STR_0161_QUIT_GAME,
		(_game_mode != GM_EDITOR) ? STR_ABANDON_GAME_QUERY : STR_QUIT_SCENARIO_QUERY,
		NULL,
		AskExitToGameMenuCallback
	);
}

static const WindowDesc _select_game_desc_2 = {
	40, 40, 336, 195,
	WC_SELECT_GAME, WC_NONE,
	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
	NULL,
	NULL
};



template <> struct WindowT<WC_TEST1> : public BaseWindow {

	gui::WidgetPtr m_button1;

	WindowT()
		: BaseWindow(WC_TEST1)
	{
	}

	/*virtual*/ void CreateWidgets()
	{
		/* set common window properties */
		SetTopLeft(Point16(140, 40));
		SetSize(Point16(336, 195));
		desc_flags = WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS;
		m_color = COLOUR_BROWN;

		/* add caption bar (later this will be done automatically by window core */
		gui::CaptionBar *capt_bar = new gui::CaptionBar(this, -100, RESIZE_LR, COLOUR_BROWN, 0x84, STR_0282_CONSTRUCT_BUBBLE_GENERATOR, STR_015B_OPENTTD);
		AddWidget(capt_bar);

		/* add resize box (later this will be done automatically by window core */
		gui::ResizeBox *resize_box = new gui::ResizeBox(this);
		AddWidget(resize_box);

		/* add controls */
		m_button1 = new gui::TextButton(this, 22, RESIZE_NONE, COLOUR_YELLOW, Rect16(104, 175, 231, 186), STR_0305_QUIT_OPENTTD, STR_0304_QUIT);
		m_button1->SetAnchors(PIN_RIGHT | PIN_BOTTOM);
		AddWidget(m_button1);

		/* connect control callbacks */
		m_button1->AddReflectHandlerT(&WindowT::Button1_OnClick);
//		m_button1->AddOnClickHandlerT(&WindowT::Button1_OnClick);
	}

	void Button1_OnClick(gui::EvtLeftClick &e)
	{
		/* move window randomly */
		SetTopLeft(TopLeft() + Point16(rand() % 21 - 10, rand() % 21 - 10));
		SetDirty();
	}
};

//RESIZE_NONE, 12, 104, 231, 175, 186, STR_0304_QUIT,            STR_0305_QUIT_OPENTTD

WindowFactoryT<WC_TEST1> _register_window_select_game;