summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-11-04 20:02:14 +0000
committerrubidium <rubidium@openttd.org>2009-11-04 20:02:14 +0000
commit8678730ce34b667113a243a067d9e1de3790b87f (patch)
tree660b1b1b08a2355a4cb454e26300e8594c01175e
parent3fea4e9352584c73791fbed6674b3609cb666af2 (diff)
downloadopenttd-8678730ce34b667113a243a067d9e1de3790b87f.tar.xz
(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
-rw-r--r--src/toolbar_gui.cpp378
1 files changed, 230 insertions, 148 deletions
diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp
index e46c9aa04..3f64a508d 100644
--- a/src/toolbar_gui.cpp
+++ b/src/toolbar_gui.cpp
@@ -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)
);