diff options
author | rubidium <rubidium@openttd.org> | 2009-11-04 20:02:14 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-11-04 20:02:14 +0000 |
commit | 8678730ce34b667113a243a067d9e1de3790b87f (patch) | |
tree | 660b1b1b08a2355a4cb454e26300e8594c01175e /src | |
parent | 3fea4e9352584c73791fbed6674b3609cb666af2 (diff) | |
download | openttd-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
Diffstat (limited to 'src')
-rw-r--r-- | src/toolbar_gui.cpp | 378 |
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) ); |