(svn r17973) -Fix: 'save' toolbar button didn't change when clicking it

-Fix: wrong widgets (e.g. finances and company) could be visually disabled, based on the state of the zoom in/out buttons. However, they were still clickable
-Codechange: make the main toolbar a nested window
pull/155/head
rubidium 15 years ago
parent aedb678130
commit 752c4e30c5

@ -49,8 +49,6 @@
#include "table/strings.h"
#include "table/sprites.h"
static void SplitToolbar(Window *w);
RailType _last_built_railtype;
RoadType _last_built_roadtype;
@ -60,8 +58,6 @@ enum ToolBarProperties {
TBP_BUTTONHEIGHT = 22, ///< height of a button as well as the toolbars
TBP_DATEPANELWIDTH = 130, ///< used in scenario editor to calculate width of the toolbar.
TBP_TOOLBAR_MINBUTTON = 14, ///< references both toolbars
TBP_NORMAL_MAXBUTTON = 19, ///< normal toolbar has this many buttons
TBP_SCENARIO_MAXBUTTON = 16, ///< while the scenario has these
};
@ -101,6 +97,7 @@ enum ToolbarNormalWidgets {
TBN_NEWSREPORT,
TBN_HELP,
TBN_SWITCHBAR, ///< only available when toolbar has been split
TBN_END ///< The end marker
};
enum ToolbarScenEditorWidgets {
@ -778,9 +775,8 @@ static void ToolbarSwitchClick(Window *w)
_toolbar_mode = TB_UPPER;
}
SplitToolbar(w);
w->ReInit();
w->SetWidgetLoweredState(TBN_SWITCHBAR, _toolbar_mode == TB_LOWER);
w->SetDirty();
SndPlayFx(SND_15_BEEP);
}
@ -867,93 +863,6 @@ static void ToolbarBtn_NULL(Window *w)
{
}
/* --- Resizing the toolbar */
static void ResizeToolbar(Window *w)
{
/* There are 27 buttons plus some spacings if the space allows it */
uint button_width;
uint spacing;
uint widgetcount = w->widget_count - 1;
if (w->width >= (int)widgetcount * TBP_BUTTONWIDTH) {
button_width = TBP_BUTTONWIDTH;
spacing = w->width - (widgetcount * button_width);
} else {
button_width = w->width / widgetcount;
spacing = 0;
}
static const uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
uint i = 0;
for (uint x = 0, j = 0; i < widgetcount; i++) {
if (extra_spacing_at[j] == i) {
j++;
uint add = spacing / (lengthof(extra_spacing_at) - j);
spacing -= add;
x += add;
}
w->widget[i].type = WWT_IMGBTN;
w->widget[i].left = x;
x += (spacing != 0) ? button_width : (w->width - x) / (widgetcount - i);
w->widget[i].right = x - 1;
}
w->widget[i].type = WWT_EMPTY; // i now points to the last item
_toolbar_mode = TB_NORMAL;
}
/* --- Split the toolbar */
static void SplitToolbar(Window *w)
{
static const byte arrange14[] = {
0, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 27,
2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27,
};
static const byte arrange15[] = {
0, 1, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
0, 2, 4, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27,
};
static const byte arrange16[] = {
0, 1, 2, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
0, 1, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27,
};
static const byte arrange17[] = {
0, 1, 2, 4, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
0, 1, 3, 4, 6, 5, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27,
};
static const byte arrange18[] = {
0, 1, 2, 4, 5, 6, 7, 8, 9, 12, 19, 20, 21, 22, 23, 17, 18, 27,
0, 1, 3, 4, 5, 6, 7, 10, 13, 14, 15, 16, 24, 25, 26, 17, 18, 27,
};
static const byte arrange19[] = {
0, 1, 2, 4, 5, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 17, 18, 27,
0, 1, 3, 4, 7, 8, 9, 10, 12, 25, 19, 20, 21, 22, 23, 26, 17, 18, 27,
};
static const byte * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19 };
uint max_icons = max(TBP_TOOLBAR_MINBUTTON, (ToolBarProperties)((w->width + TBP_BUTTONWIDTH / 2) / TBP_BUTTONWIDTH));
assert(max_icons >= TBP_TOOLBAR_MINBUTTON && max_icons <= TBP_NORMAL_MAXBUTTON);
/* first hide all icons */
for (uint i = 0; i < w->widget_count - 1; i++) {
w->widget[i].type = WWT_EMPTY;
}
/* now activate them all on their proper positions */
for (uint i = 0, x = 0, n = max_icons - TBP_TOOLBAR_MINBUTTON; i < max_icons; i++) {
uint icon = arrangements[n][i + ((_toolbar_mode == TB_LOWER) ? max_icons : 0)];
w->widget[icon].type = WWT_IMGBTN;
w->widget[icon].left = x;
x += (w->width - x) / (max_icons - i);
w->widget[icon].right = x - 1;
}
}
typedef void MenuClickedProc(int index);
static MenuClickedProc * const _menu_clicked_procs[] = {
@ -986,6 +895,181 @@ static MenuClickedProc * const _menu_clicked_procs[] = {
MenuClickHelp, // 26
};
/** Full blown container to make it behave exactly as we want :) */
class NWidgetToolbarContainer : public NWidgetContainer {
bool visible[TBN_END]; ///< The visible headers
uint spacers; ///< Number of spacer widgets in this toolbar
public:
NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
{
}
void SetupSmallestSize(Window *w, bool init_array)
{
this->smallest_x = 0; // Biggest child
this->smallest_y = 0; // Biggest child
this->fill_x = true;
this->fill_y = false;
this->resize_x = 1; // We only resize in this direction
this->resize_y = 0; // We never resize in this direction
this->spacers = 0;
/* First initialise some variables... */
for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
child_wid->SetupSmallestSize(w, init_array);
this->smallest_y = max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
this->smallest_x = max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
if (child_wid->type == NWID_SPACER) this->spacers++;
}
/* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) child_wid->current_y = this->smallest_y;
}
void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool allow_resize_x, bool allow_resize_y, bool rtl)
{
assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
this->pos_x = x;
this->pos_y = y;
this->current_x = given_width;
this->current_y = given_height;
/* Figure out what are the visible buttons */
memset(this->visible, 0, sizeof(this->visible));
uint visible_buttons;
const byte *arrangement = GetButtonArrangement(given_width, visible_buttons);
for (uint i = 0; i < visible_buttons; i++) {
this->visible[arrangement[i]] = true;
}
/* Create us ourselves a quick lookup table */
NWidgetBase *widgets[TBN_END];
for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
if (child_wid->type == NWID_SPACER) continue;
widgets[((NWidgetCore*)child_wid)->index] = child_wid;
}
/* Now assign the widgets to their rightful place */
uint position = 0; // Place to put next child relative to origin of the container.
uint spacer_i = 0;
uint spacing = max(0, (int)given_width - (int)(visible_buttons * this->smallest_x)); // Remaining spacing for 'spacer' widgets
uint visible_i = 0;
/* Index into the arrangement indices. The macro lastof cannot be used here! */
const byte *cur_wid = rtl ? &arrangement[visible_buttons - 1] : arrangement;
for (uint i = 0; i < visible_buttons; i++) {
NWidgetBase *child_wid = widgets[*cur_wid];
if (spacing != 0) {
NWidgetBase *possible_spacer = rtl ? child_wid->next : child_wid->prev;
if (possible_spacer != NULL && possible_spacer->type == NWID_SPACER) {
uint add = spacing / (this->spacers - spacer_i);
position += add;
spacing -= add;
spacer_i++;
}
}
child_wid->current_x = (spacing != 0) ? this->smallest_x : (given_width - position) / (visible_buttons - visible_i);
child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, allow_resize_x, (this->resize_y > 0), rtl);
position += child_wid->current_x;
visible_i++;
if (rtl) {
cur_wid--;
} else {
cur_wid++;
}
}
}
void StoreWidgets(Widget *widgets, int length, bool left_moving, bool top_moving, bool rtl)
{
/* We don't need to support the old version anymore! */
NOT_REACHED();
}
/* virtual */ void Draw(const Window *w)
{
/* Draw brown-red toolbar bg. */
GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, 0xB2);
GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, 0xB4, FILLRECT_CHECKER);
for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
if (child_wid->type == NWID_SPACER) continue;
if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
child_wid->Draw(w);
}
}
/* virtual */ NWidgetCore *GetWidgetFromPos(int x, int y)
{
if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return NULL;
for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
if (child_wid->type == NWID_SPACER) continue;
if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y);
if (nwid != NULL) return nwid;
}
return NULL;
}
/**
* Get the arrangement of the buttons for the toolbar.
* @param width the new width of the toolbar
* @param count output for the number of buttons
* @return the button configuration
*/
const byte *GetButtonArrangement(uint width, uint &count) const
{
static const uint SMALLEST_ARRANGEMENT = 14;
static const uint BIGGEST_ARRANGEMENT = 19;
static const byte arrange14[] = {
0, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 27,
2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27,
};
static const byte arrange15[] = {
0, 1, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
0, 2, 4, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27,
};
static const byte arrange16[] = {
0, 1, 2, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
0, 1, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27,
};
static const byte arrange17[] = {
0, 1, 2, 4, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
0, 1, 3, 4, 6, 5, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27,
};
static const byte arrange18[] = {
0, 1, 2, 4, 5, 6, 7, 8, 9, 12, 19, 20, 21, 22, 23, 17, 18, 27,
0, 1, 3, 4, 5, 6, 7, 10, 13, 14, 15, 16, 24, 25, 26, 17, 18, 27,
};
static const byte arrange19[] = {
0, 1, 2, 4, 5, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 17, 18, 27,
0, 1, 3, 4, 7, 8, 9, 10, 12, 25, 19, 20, 21, 22, 23, 26, 17, 18, 27,
};
static const byte arrange_all[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
};
uint full_buttons = max((width + this->smallest_x - 1) / this->smallest_x, SMALLEST_ARRANGEMENT);
if (full_buttons > BIGGEST_ARRANGEMENT) {
count = lengthof(arrange_all);
return arrange_all;
}
static const byte * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19 };
count = full_buttons;
return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
}
};
/* --- Toolbar handling for the 'normal' case */
typedef void ToolbarButtonProc(Window *w);
@ -1022,24 +1106,19 @@ static ToolbarButtonProc * const _toolbar_button_procs[] = {
};
struct MainToolbarWindow : Window {
MainToolbarWindow(const WindowDesc *desc) : Window(desc)
MainToolbarWindow(const WindowDesc *desc) : Window()
{
this->SetWidgetDisabledState(TBN_PAUSE, _networking && !_network_server); // if not server, disable pause button
this->SetWidgetDisabledState(TBN_FASTFORWARD, _networking); // if networking, disable fast-forward button
this->InitNested(desc, 0);
CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
this->FindWindowPlacementAndResize(desc);
this->SetWidgetDisabledState(TBN_PAUSE, _networking && !_network_server); // if not server, disable pause button
this->SetWidgetDisabledState(TBN_FASTFORWARD, _networking); // if networking, disable fast-forward button
PositionMainToolbar(this);
DoZoomInOutWindow(ZOOM_NONE, this);
}
virtual void OnPaint()
{
/* Draw brown-red toolbar bg. */
GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2);
GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4, FILLRECT_CHECKER);
/* If spectator, disable all construction buttons
* ie : Build road, rail, ships, airports and landscaping
* Since enabled state is the default, just disable when needed */
@ -1127,15 +1206,6 @@ struct MainToolbarWindow : Window {
}
}
virtual void OnResize()
{
if (this->width <= TBP_NORMAL_MAXBUTTON * TBP_BUTTONWIDTH) {
SplitToolbar(this);
} else {
ResizeToolbar(this);
}
}
virtual void OnTimeout()
{
/* We do not want to automatically raise the pause, fast forward and
@ -1154,49 +1224,61 @@ struct MainToolbarWindow : Window {
}
};
static const Widget _toolb_normal_widgets[] = {
{ WWT_IMGBTN, RESIZE_LEFT, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME}, // TBN_PAUSE
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD}, // TBN_FASTFORWARD
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS}, // TBN_SETTINGS
{ WWT_IMGBTN_2, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SAVE, STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME}, // TBN_SAVEGAME
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_TOOLBAR_TOOLTIP_DISPLAY_MAP}, // TBN_SMALLMAP
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TOWN, STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY}, // TBN_TOWNDIRECTORY
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SUBSIDIES, STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES}, // TBN_SUBSIDIES
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_LIST, STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS}, // TBN_STATIONS
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES}, // TBN_FINANCES
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL}, // TBN_COMPANIES
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_GRAPHS, STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS}, // TBN_GRAPHICS
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE}, // TBN_LEAGUE
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW}, // TBN_INDUSTRIES
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TRAINLIST, STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS}, // TBN_TRAINS
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TRUCKLIST, STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES}, // TBN_ROADVEHS
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SHIPLIST, STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS}, // TBN_SHIPS
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_AIRPLANESLIST, STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT}, // TBN_AIRCRAFTS
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN}, // TBN_ZOOMIN
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT}, // TBN_ZOOMOUT
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDRAIL, STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK}, // TBN_RAILS
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_TOOLBAR_TOOLTIP_BUILD_ROADS}, // TBN_ROADS
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS}, // TBN_WATER
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDAIR, STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS}, // TBN_AIR
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_TOOLBAR_TOOLTIP_LANDSCAPING}, // TBN_LANDSCAPE tree icon is SPR_IMG_PLANTTREES
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW}, // TBN_MUSICSOUND
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_MESSAGES, STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS}, // TBN_NEWSREPORT
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION}, // TBN_HELP
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR}, // TBN_SWITCHBAR
{ WIDGETS_END},
static NWidgetBase *MakeMainToolbar(int *biggest_index)
{
/** Sprites to use for the different toolbar buttons */
static const SpriteID toolbar_button_sprites[] = {
SPR_IMG_PAUSE, // TBN_PAUSE
SPR_IMG_FASTFORWARD, // TBN_FASTFORWARD
SPR_IMG_SETTINGS, // TBN_SETTINGS
SPR_IMG_SAVE, // TBN_SAVEGAME
SPR_IMG_SMALLMAP, // TBN_SMALLMAP
SPR_IMG_TOWN, // TBN_TOWNDIRECTORY
SPR_IMG_SUBSIDIES, // TBN_SUBSIDIES
SPR_IMG_COMPANY_LIST, // TBN_STATIONS
SPR_IMG_COMPANY_FINANCE, // TBN_FINANCES
SPR_IMG_COMPANY_GENERAL, // TBN_COMPANIES
SPR_IMG_GRAPHS, // TBN_GRAPHICS
SPR_IMG_COMPANY_LEAGUE, // TBN_LEAGUE
SPR_IMG_INDUSTRY, // TBN_INDUSTRIES
SPR_IMG_TRAINLIST, // TBN_TRAINS
SPR_IMG_TRUCKLIST, // TBN_ROADVEHS
SPR_IMG_SHIPLIST, // TBN_SHIPS
SPR_IMG_AIRPLANESLIST, // TBN_AIRCRAFTS
SPR_IMG_ZOOMIN, // TBN_ZOOMIN
SPR_IMG_ZOOMOUT, // TBN_ZOOMOUT
SPR_IMG_BUILDRAIL, // TBN_RAILS
SPR_IMG_BUILDROAD, // TBN_ROADS
SPR_IMG_BUILDWATER, // TBN_WATER
SPR_IMG_BUILDAIR, // TBN_AIR
SPR_IMG_LANDSCAPING, // TBN_LANDSCAPE
SPR_IMG_MUSIC, // TBN_MUSICSOUND
SPR_IMG_MESSAGES, // TBN_NEWSREPORT
SPR_IMG_QUERY, // TBN_HELP
SPR_IMG_SWITCH_TOOLBAR, // TBN_SWITCHBAR
};
NWidgetToolbarContainer *hor = new NWidgetToolbarContainer();
for (uint i = 0; i < TBN_END; i++) {
switch (i) {
case 4: case 8: case 13: case 17: case 19: case 24: hor->Add(new NWidgetSpacer(0, 0)); break;
}
hor->Add(new NWidgetLeaf(i == TBN_SAVEGAME ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, toolbar_button_sprites[i], STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i));
}
*biggest_index = max<int>(*biggest_index, TBN_SWITCHBAR);
return hor;
}
static const NWidgetPart _nested_toolbar_normal_widgets[] = {
NWidgetFunction(MakeMainToolbar),
};
static const WindowDesc _toolb_normal_desc(
0, 0, 0, TBP_BUTTONHEIGHT, 640, TBP_BUTTONHEIGHT,
WC_MAIN_TOOLBAR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_NO_FOCUS,
_toolb_normal_widgets
NULL, _nested_toolbar_normal_widgets, lengthof(_nested_toolbar_normal_widgets)
);

Loading…
Cancel
Save