mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r16517) -Codechange: Switched intro-screen and town directory window to nested widget trees.
This commit is contained in:
parent
b144a5451c
commit
19ccf6912c
|
@ -25,34 +25,6 @@
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
#include "table/sprites.h"
|
#include "table/sprites.h"
|
||||||
|
|
||||||
static const Widget _select_game_widgets[] = {
|
|
||||||
{ WWT_CAPTION, RESIZE_NONE, COLOUR_BROWN, 0, 335, 0, 13, STR_INTRO_CAPTION, STR_NULL},
|
|
||||||
{ WWT_PANEL, RESIZE_NONE, COLOUR_BROWN, 0, 335, 14, 212, 0x0, STR_NULL},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 10, 167, 22, 33, STR_INTRO_NEW_GAME, STR_INTRO_TOOLTIP_NEW_GAME},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 168, 325, 22, 33, STR_INTRO_LOAD_GAME, STR_INTRO_TOOLTIP_LOAD_GAME},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 10, 167, 40, 51, STR_INTRO_PLAY_SCENARIO, STR_INTRO_TOOLTIP_PLAY_SCENARIO},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 168, 325, 40, 51, STR_INTRO_PLAY_HEIGHTMAP, STR_INTRO_PLAY_HEIGHTMAP_TOOLTIP},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 10, 167, 58, 69, STR_INTRO_SCENARIO_EDITOR, STR_INTRO_TOOLTIP_SCENARIO_EDITOR},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 168, 325, 58, 69, STR_INTRO_MULTIPLAYER, STR_INTRO_TOOLTIP_MULTIPLAYER},
|
|
||||||
|
|
||||||
{ WWT_IMGBTN_2, RESIZE_NONE, COLOUR_ORANGE, 10, 86, 77, 131, SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE},
|
|
||||||
{ WWT_IMGBTN_2, RESIZE_NONE, COLOUR_ORANGE, 90, 166, 77, 131, SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE},
|
|
||||||
{ WWT_IMGBTN_2, RESIZE_NONE, COLOUR_ORANGE, 170, 246, 77, 131, SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE},
|
|
||||||
{ WWT_IMGBTN_2, RESIZE_NONE, COLOUR_ORANGE, 250, 326, 77, 131, SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE},
|
|
||||||
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 10, 167, 139, 150, STR_INTRO_GAME_OPTIONS, STR_INTRO_TOOLTIP_GAME_OPTIONS},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 168, 325, 139, 150, STR_INTRO_DIFFICULTY, STR_INTRO_TOOLTIP_DIFFICULTY_OPTIONS},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 10, 167, 157, 168, STR_CONFIG_SETTING, STR_CONFIG_SETTING_TIP},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 168, 325, 157, 168, STR_NEWGRF_SETTINGS_BUTTON, STR_NEWGRF_SETTINGS_BUTTON_TIP},
|
|
||||||
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 10, 167, 175, 186, STR_CONTENT_INTRO_BUTTON, STR_CONTENT_INTRO_BUTTON_TIP},
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 168, 325, 175, 186, STR_AI_SETTINGS_BUTTON, STR_AI_SETTINGS_BUTTON_TIP},
|
|
||||||
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_ORANGE, 104, 231, 193, 204, STR_INTRO_QUIT, STR_INTRO_TOOLTIP_QUIT},
|
|
||||||
|
|
||||||
{ WIDGETS_END},
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void SetNewLandscapeType(byte landscape)
|
static inline void SetNewLandscapeType(byte landscape)
|
||||||
{
|
{
|
||||||
_settings_newgame.game_creation.landscape = landscape;
|
_settings_newgame.game_creation.landscape = landscape;
|
||||||
|
@ -83,10 +55,10 @@ enum SelectGameIntroWidgets {
|
||||||
|
|
||||||
struct SelectGameWindow : public Window {
|
struct SelectGameWindow : public Window {
|
||||||
|
|
||||||
SelectGameWindow(const WindowDesc *desc) : Window(desc)
|
SelectGameWindow(const WindowDesc *desc) : Window()
|
||||||
{
|
{
|
||||||
|
this->InitNested(desc);
|
||||||
this->LowerWidget(_settings_newgame.game_creation.landscape + SGI_TEMPERATE_LANDSCAPE);
|
this->LowerWidget(_settings_newgame.game_creation.landscape + SGI_TEMPERATE_LANDSCAPE);
|
||||||
this->FindWindowPlacementAndResize(desc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void OnPaint()
|
virtual void OnPaint()
|
||||||
|
@ -265,7 +237,7 @@ static const WindowDesc _select_game_desc(
|
||||||
WDP_CENTER, WDP_CENTER, 336, 213, 336, 213,
|
WDP_CENTER, WDP_CENTER, 336, 213, 336, 213,
|
||||||
WC_SELECT_GAME, WC_NONE,
|
WC_SELECT_GAME, WC_NONE,
|
||||||
WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
|
WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
|
||||||
_select_game_widgets,
|
NULL,
|
||||||
_nested_select_game_widgets, lengthof(_nested_select_game_widgets)
|
_nested_select_game_widgets, lengthof(_nested_select_game_widgets)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -501,19 +501,6 @@ enum TownDirectoryWidgets {
|
||||||
TDW_RESIZEBOX,
|
TDW_RESIZEBOX,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Widget _town_directory_widgets[] = {
|
|
||||||
{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_BROWN, 0, 10, 0, 13, STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW}, // TDW_CLOSEBOX
|
|
||||||
{ WWT_CAPTION, RESIZE_NONE, COLOUR_BROWN, 11, 195, 0, 13, STR_TOWN_DIRECTORY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS}, // TDW_CAPTION
|
|
||||||
{ WWT_STICKYBOX, RESIZE_NONE, COLOUR_BROWN, 196, 207, 0, 13, 0x0, STR_STICKY_BUTTON}, // TDW_STICKYBOX
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_BROWN, 0, 98, 14, 25, STR_SORT_BY_NAME, STR_SORT_ORDER_TIP}, // TDW_SORTNAME
|
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_BROWN, 99, 195, 14, 25, STR_SORT_BY_POPULATION, STR_SORT_ORDER_TIP}, // TDW_SORTPOPULATION
|
|
||||||
{ WWT_PANEL, RESIZE_BOTTOM, COLOUR_BROWN, 0, 195, 26, 189, 0x0, STR_TOWN_DIRECTORY_LIST_TOOLTIP}, // TDW_CENTERTOWN
|
|
||||||
{ WWT_SCROLLBAR, RESIZE_BOTTOM, COLOUR_BROWN, 196, 207, 14, 189, 0x0, STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST}, // TDW_SCROLLBAR
|
|
||||||
{ WWT_PANEL, RESIZE_TB, COLOUR_BROWN, 0, 195, 190, 201, 0x0, STR_NULL}, // TDW_EMPTYBOTTOM
|
|
||||||
{ WWT_RESIZEBOX, RESIZE_TB, COLOUR_BROWN, 196, 207, 190, 201, 0x0, STR_RESIZE_BUTTON}, // TDW_RESIZEBOX
|
|
||||||
{ WIDGETS_END},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const NWidgetPart _nested_town_directory_widgets[] = {
|
static const NWidgetPart _nested_town_directory_widgets[] = {
|
||||||
NWidget(NWID_HORIZONTAL),
|
NWidget(NWID_HORIZONTAL),
|
||||||
NWidget(WWT_CLOSEBOX, COLOUR_BROWN, TDW_CLOSEBOX),
|
NWidget(WWT_CLOSEBOX, COLOUR_BROWN, TDW_CLOSEBOX),
|
||||||
|
@ -599,17 +586,15 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TownDirectoryWindow(const WindowDesc *desc) : Window(desc, 0)
|
TownDirectoryWindow(const WindowDesc *desc) : Window()
|
||||||
{
|
{
|
||||||
this->vscroll.cap = 16;
|
this->InitNested(desc, 0);
|
||||||
this->resize.step_height = 10;
|
|
||||||
this->resize.height = this->height - 10 * 6; // minimum of 10 items in the list, each item 10 high
|
this->vscroll.cap = this->nested_array[TDW_CENTERTOWN]->current_y / this->resize.step_height;
|
||||||
|
|
||||||
this->towns.SetListing(this->last_sorting);
|
this->towns.SetListing(this->last_sorting);
|
||||||
this->towns.SetSortFuncs(this->sorter_funcs);
|
this->towns.SetSortFuncs(this->sorter_funcs);
|
||||||
this->towns.ForceRebuild();
|
this->towns.ForceRebuild();
|
||||||
|
|
||||||
this->FindWindowPlacementAndResize(desc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~TownDirectoryWindow()
|
~TownDirectoryWindow()
|
||||||
|
@ -726,7 +711,7 @@ static const WindowDesc _town_directory_desc(
|
||||||
WDP_AUTO, WDP_AUTO, 208, 202, 208, 202,
|
WDP_AUTO, WDP_AUTO, 208, 202, 208, 202,
|
||||||
WC_TOWN_DIRECTORY, WC_NONE,
|
WC_TOWN_DIRECTORY, WC_NONE,
|
||||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
|
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
|
||||||
_town_directory_widgets, _nested_town_directory_widgets, lengthof(_nested_town_directory_widgets)
|
NULL, _nested_town_directory_widgets, lengthof(_nested_town_directory_widgets)
|
||||||
);
|
);
|
||||||
|
|
||||||
void ShowTownDirectory()
|
void ShowTownDirectory()
|
||||||
|
|
|
@ -825,19 +825,33 @@ static void AssignWidgetToWindow(Window *w, const Widget *widget)
|
||||||
* This function is called the constructors.
|
* This function is called the constructors.
|
||||||
* See descriptions for those functions for usage
|
* See descriptions for those functions for usage
|
||||||
* Only addition here is window_number, which is the window_number being assigned to the new window
|
* Only addition here is window_number, which is the window_number being assigned to the new window
|
||||||
* @param x offset in pixels from the left of the screen
|
* @param x Offset in pixels from the left of the screen of the new window.
|
||||||
* @param y offset in pixels from the top of the screen
|
* @param y Offset in pixels from the top of the screen of the new window.
|
||||||
* @param min_width minimum width in pixels of the window
|
* @param min_width Minimum width in pixels of the window
|
||||||
* @param min_height minimum height in pixels of the window
|
* @param min_height Minimum height in pixels of the window
|
||||||
* @param cls see WindowClass class of the window, used for identification and grouping
|
* @param cls Class of the window, used for identification and grouping. @see WindowClass
|
||||||
* @param *widget see Widget pointer to the window layout and various elements
|
* @param *widget Pointer to the window layout and various elements. @see Widget
|
||||||
* @param window_number number being assigned to the new window
|
* @param nested_root Root of the nested widget tree.
|
||||||
|
* @param window_number Number being assigned to the new window
|
||||||
* @return Window pointer of the newly created window
|
* @return Window pointer of the newly created window
|
||||||
*/
|
*/
|
||||||
void Window::Initialize(int x, int y, int min_width, int min_height,
|
void Window::Initialize(int x, int y, int min_width, int min_height,
|
||||||
WindowClass cls, const Widget *widget, int window_number)
|
WindowClass cls, const Widget *widget, NWidgetBase *nested_root, int window_number)
|
||||||
{
|
{
|
||||||
/* All data members of nested widgets have been set to 0 by the #ZeroedMemoryAllocator base class. */
|
/* If available, initialize nested widget tree. */
|
||||||
|
if (nested_root != NULL) {
|
||||||
|
this->nested_root = nested_root;
|
||||||
|
/* Setup nested_array pointers into the tree. */
|
||||||
|
int biggest_index = this->nested_root->SetupSmallestSize();
|
||||||
|
this->nested_array_size = (uint)(biggest_index + 1);
|
||||||
|
this->nested_array = CallocT<NWidgetCore *>(this->nested_array_size);
|
||||||
|
this->nested_root->FillNestedArray(this->nested_array, this->nested_array_size);
|
||||||
|
/* Initialize to smallest size. */
|
||||||
|
this->nested_root->AssignSizePosition(ST_SMALLEST, 0, 0, this->nested_root->smallest_x, this->nested_root->smallest_y, false, false, false);
|
||||||
|
min_width = this->nested_root->smallest_x;
|
||||||
|
min_height = this->nested_root->smallest_y;
|
||||||
|
}
|
||||||
|
/* Else, all data members of nested widgets have been set to 0 by the #ZeroedMemoryAllocator base class. */
|
||||||
|
|
||||||
/* Set up window properties */
|
/* Set up window properties */
|
||||||
this->window_class = cls;
|
this->window_class = cls;
|
||||||
|
@ -852,8 +866,8 @@ void Window::Initialize(int x, int y, int min_width, int min_height,
|
||||||
this->nested_focus = NULL;
|
this->nested_focus = NULL;
|
||||||
this->resize.width = min_width;
|
this->resize.width = min_width;
|
||||||
this->resize.height = min_height;
|
this->resize.height = min_height;
|
||||||
this->resize.step_width = 1;
|
this->resize.step_width = (this->nested_root != NULL) ? this->nested_root->resize_x : 1;
|
||||||
this->resize.step_height = 1;
|
this->resize.step_height = (this->nested_root != NULL) ? this->nested_root->resize_y : 1;
|
||||||
this->window_number = window_number;
|
this->window_number = window_number;
|
||||||
|
|
||||||
/* Give focus to the opened window unless it is the OSK window or a text box
|
/* Give focus to the opened window unless it is the OSK window or a text box
|
||||||
|
@ -916,6 +930,8 @@ void Window::Initialize(int x, int y, int min_width, int min_height,
|
||||||
*/
|
*/
|
||||||
void Window::FindWindowPlacementAndResize(int def_width, int def_height)
|
void Window::FindWindowPlacementAndResize(int def_width, int def_height)
|
||||||
{
|
{
|
||||||
|
def_width = max(def_width, this->width); // Don't allow default size to be smaller than smallest size
|
||||||
|
def_height = max(def_height, this->height);
|
||||||
/* Try to make windows smaller when our window is too small.
|
/* Try to make windows smaller when our window is too small.
|
||||||
* w->(width|height) is normally the same as min_(width|height),
|
* w->(width|height) is normally the same as min_(width|height),
|
||||||
* but this way the GUIs can be made a little more dynamic;
|
* but this way the GUIs can be made a little more dynamic;
|
||||||
|
@ -989,7 +1005,7 @@ void Window::FindWindowPlacementAndResize(const WindowDesc *desc)
|
||||||
*/
|
*/
|
||||||
Window::Window(int x, int y, int width, int height, WindowClass cls, const Widget *widget)
|
Window::Window(int x, int y, int width, int height, WindowClass cls, const Widget *widget)
|
||||||
{
|
{
|
||||||
this->Initialize(x, y, width, height, cls, widget, 0);
|
this->Initialize(x, y, width, height, cls, widget, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1214,10 +1230,29 @@ static Point LocalGetWindowPlacement(const WindowDesc *desc, int window_number)
|
||||||
Window::Window(const WindowDesc *desc, WindowNumber window_number)
|
Window::Window(const WindowDesc *desc, WindowNumber window_number)
|
||||||
{
|
{
|
||||||
Point pt = LocalGetWindowPlacement(desc, window_number);
|
Point pt = LocalGetWindowPlacement(desc, window_number);
|
||||||
this->Initialize(pt.x, pt.y, desc->minimum_width, desc->minimum_height, desc->cls, desc->GetWidgets(), window_number);
|
this->Initialize(pt.x, pt.y, desc->minimum_width, desc->minimum_height, desc->cls, desc->GetWidgets(), NULL, window_number);
|
||||||
this->desc_flags = desc->flags;
|
this->desc_flags = desc->flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform initialization of the #Window with nested widgets, to allow use.
|
||||||
|
* @param desc Window description.
|
||||||
|
* @param window_number Number of the new window.
|
||||||
|
*/
|
||||||
|
void Window::InitNested(const WindowDesc *desc, WindowNumber window_number)
|
||||||
|
{
|
||||||
|
NWidgetBase *nested_root = MakeNWidgets(desc->nwid_parts, desc->nwid_length);
|
||||||
|
Point pt = LocalGetWindowPlacement(desc, window_number);
|
||||||
|
this->Initialize(pt.x, pt.y, desc->minimum_width, desc->minimum_height, desc->cls, NULL, nested_root, window_number); // min_width and min_height are not used.
|
||||||
|
this->desc_flags = desc->flags;
|
||||||
|
this->FindWindowPlacementAndResize(desc->default_width, desc->default_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Empty constructor, initialization has been moved to #InitNested() called from the constructor of the derived class. */
|
||||||
|
Window::Window()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/** Do a search for a window at specific coordinates. For this we start
|
/** Do a search for a window at specific coordinates. For this we start
|
||||||
* at the topmost window, obviously and work our way down to the bottom
|
* at the topmost window, obviously and work our way down to the bottom
|
||||||
* @param x position x to query
|
* @param x position x to query
|
||||||
|
|
|
@ -138,13 +138,14 @@ struct Window : ZeroedMemoryAllocator {
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Initialize(int x, int y, int min_width, int min_height,
|
void Initialize(int x, int y, int min_width, int min_height,
|
||||||
WindowClass cls, const Widget *widget, int window_number);
|
WindowClass cls, const Widget *widget, NWidgetBase *nwid, int window_number);
|
||||||
void FindWindowPlacementAndResize(int def_width, int def_height);
|
void FindWindowPlacementAndResize(int def_width, int def_height);
|
||||||
void FindWindowPlacementAndResize(const WindowDesc *desc);
|
void FindWindowPlacementAndResize(const WindowDesc *desc);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Window(int x, int y, int width, int height, WindowClass cls, const Widget *widget);
|
Window(int x, int y, int width, int height, WindowClass cls, const Widget *widget);
|
||||||
Window(const WindowDesc *desc, WindowNumber number = 0);
|
Window(const WindowDesc *desc, WindowNumber number = 0);
|
||||||
|
Window();
|
||||||
|
|
||||||
virtual ~Window();
|
virtual ~Window();
|
||||||
/* Don't allow arrays; arrays of Windows are pointless as you need
|
/* Don't allow arrays; arrays of Windows are pointless as you need
|
||||||
|
@ -183,6 +184,8 @@ public:
|
||||||
Window *z_front; ///< The window in front of us in z-order.
|
Window *z_front; ///< The window in front of us in z-order.
|
||||||
Window *z_back; ///< The window behind us in z-order.
|
Window *z_back; ///< The window behind us in z-order.
|
||||||
|
|
||||||
|
void InitNested(const WindowDesc *desc, WindowNumber number = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the enabled/disabled status of a widget.
|
* Sets the enabled/disabled status of a widget.
|
||||||
* By default, widgets are enabled.
|
* By default, widgets are enabled.
|
||||||
|
|
Loading…
Reference in New Issue