28#include "table/strings.h"
48 if (badge.class_index != class_index)
continue;
51 if (ps.
sprite == 0)
continue;
56 if (sprite ==
nullptr)
continue;
59 d.width = std::max(d.width, width);
78GUIBadgeClasses::GUIBadgeClasses(
GrfSpecFeature feature) : UsedBadgeClasses(feature)
82 for (BadgeClassID class_index : this->Classes()) {
84 if (class_badge->
name == STR_NULL)
continue;
87 if (size.width == 0)
continue;
91 this->gui_classes.emplace_back(class_index, config.column, config.show_icon, sort_order, size, class_badge->
label);
92 if (size.width != 0 && config.show_icon) max_column = std::max(max_column, config.column);
95 std::sort(std::begin(this->gui_classes), std::end(this->gui_classes));
98 this->column_widths.resize(max_column + 1);
99 for (
const auto &el : this->gui_classes) {
100 if (!el.visible || el.size.width == 0)
continue;
105 for (uint &badge_width : this->column_widths) {
106 if (badge_width == 0)
continue;
117 return std::accumulate(std::begin(this->column_widths), std::end(this->column_widths), 0U);
129 if (badges.empty())
return r.top;
132 for (
const BadgeID &index : badges) class_indexes.
insert(
GetBadge(index)->class_index);
135 for (
const BadgeClassID &class_index : class_indexes) {
137 if (class_badge ==
nullptr || class_badge->
name == STR_NULL)
continue;
140 for (
const BadgeID &index : badges) {
142 if (badge ==
nullptr || badge->
name == STR_NULL)
continue;
154 if (s.empty())
continue;
175 for (
const auto &gc : gui_classes.GetClasses()) {
176 if (gc.column_group != column_group)
continue;
177 if (!gc.visible)
continue;
180 for (
const BadgeID &index : badges) {
185 if (ps.
sprite == 0)
continue;
196template <
class TBase,
bool TEnd = true, FontSize TFs = FontSize::Normal>
197class DropDownBadges :
public TBase {
199 template <
typename... Args>
200 explicit DropDownBadges(
const std::shared_ptr<GUIBadgeClasses> &gui_classes, std::span<const BadgeID> badges,
GrfSpecFeature feature, std::optional<TimerGameCalendar::Date> introduction_date, Args &&...args) :
201 TBase(std::forward<Args>(args)...), gui_classes(gui_classes), badges(badges), feature(feature), introduction_date(introduction_date)
203 for (
const auto &gc : gui_classes->GetClasses()) {
204 if (gc.column_group != 0)
continue;
206 dim.height = std::max<uint>(dim.height,
ScaleGUITrad(gc.size.height));
216 for (
const BadgeID &badge_index : this->badges) {
218 if (badge->
name == STR_NULL)
continue;
221 this->TBase::FilterText(string_filter);
224 uint
Height()
const override
226 return std::max<uint>(this->dim.height, this->TBase::Height());
229 uint Width()
const override
231 if (this->dim.width == 0)
return this->TBase::Width();
235 int OnClick(
const Rect &r,
const Point &pt)
const override
237 if (this->dim.width == 0) {
238 return this->TBase::OnClick(r, pt);
245 void Draw(
const Rect &full,
const Rect &r,
bool sel,
int click_result,
Colours bg_colour)
const override
247 if (this->dim.width == 0) {
248 this->TBase::Draw(full, r, sel, click_result, bg_colour);
251 DrawBadgeColumn(r.
WithWidth(this->dim.width, rtl), 0, *this->gui_classes, this->badges, this->feature, this->introduction_date, PAL_NONE);
257 std::shared_ptr<GUIBadgeClasses> gui_classes;
259 const std::span<const BadgeID> badges;
261 const std::optional<TimerGameCalendar::Date> introduction_date;
269std::unique_ptr<DropDownListItem> MakeDropDownListBadgeItem(
const std::shared_ptr<GUIBadgeClasses> &gui_classes, std::span<const BadgeID> badges,
GrfSpecFeature feature, std::optional<TimerGameCalendar::Date> introduction_date, std::string &&str,
int value,
bool masked,
bool shaded)
271 return std::make_unique<DropDownListBadgeItem>(gui_classes, badges, feature, introduction_date,
"", std::move(str), value, masked, shaded);
274std::unique_ptr<DropDownListItem> MakeDropDownListBadgeItem(
const std::shared_ptr<GUIBadgeClasses> &gui_classes, std::span<const BadgeID> badges,
GrfSpecFeature feature, std::optional<TimerGameCalendar::Date> introduction_date, Money cost, std::string &&str,
int value,
bool masked,
bool shaded)
276 return std::make_unique<DropDownListBadgeItem>(gui_classes, badges, feature, introduction_date,
GetString(STR_JUST_CURRENCY_SHORT, cost), std::move(str), value, masked, shaded);
279std::unique_ptr<DropDownListItem> MakeDropDownListBadgeIconItem(
const std::shared_ptr<GUIBadgeClasses> &gui_classes, std::span<const BadgeID> badges,
GrfSpecFeature feature, std::optional<TimerGameCalendar::Date> introduction_date, Money cost,
const Dimension &dim,
SpriteID sprite,
PaletteID palette, std::string &&str,
int value,
bool masked,
bool shaded)
281 return std::make_unique<DropDownListBadgeIconItem>(gui_classes, badges, feature, introduction_date,
GetString(STR_JUST_CURRENCY_SHORT, cost), dim, sprite, palette, std::move(str), value, masked, shaded);
287template <
class TBase,
bool TEnd = true, FontSize TFs = FontSize::Normal>
288class DropDownMover :
public TBase {
290 template <
typename... Args>
296 uint
Height()
const override
301 uint Width()
const override
306 int OnClick(
const Rect &r,
const Point &pt)
const override
318 void Draw(
const Rect &full,
const Rect &r,
bool sel,
int click_result,
Colours bg_colour)
const override
324 if (sel && click_result != 0) {
325 if (click_result == this->click_up) state = 1;
326 if (click_result == this->click_down) state = 2;
330 DrawUpDownButtons(br.left, br.top, this->button_colour, state, this->click_up != 0, this->click_down != 0);
344enum BadgeClick :
int {
347 BADGE_CLICK_MOVE_DOWN,
348 BADGE_CLICK_TOGGLE_ICON,
349 BADGE_CLICK_TOGGLE_FILTER,
357 if (gui_classes.GetClasses().empty())
return list;
361 const BadgeClassID front = gui_classes.GetClasses().front().class_index;
362 const BadgeClassID back = gui_classes.GetClasses().back().class_index;
364 for (uint i = 0; i < columns; ++i) {
365 for (
const auto &gc : gui_classes.GetClasses()) {
366 if (gc.column_group != i)
continue;
367 if (gc.size.width == 0)
continue;
369 bool first = (i == 0 && gc.class_index == front);
370 bool last = (i == columns - 1 && gc.class_index == back);
371 list.push_back(std::make_unique<DropDownListToggleMoverItem>(first ? 0 : BADGE_CLICK_MOVE_UP, last ? 0 : BADGE_CLICK_MOVE_DOWN,
Colours::Yellow, gc.visible, BADGE_CLICK_TOGGLE_ICON,
Colours::Yellow, bg_colour,
GetString(
GetClassBadge(gc.class_index)->
name), gc.class_index.base()));
374 if (i >= column_separators.size())
continue;
376 if (column_separators[i] == STR_NULL) {
386 for (
const BadgeClassID &badge_class_index : gui_classes.Classes()) {
391 list.push_back(std::make_unique<DropDownListToggleItem>(config.show_filter, BADGE_CLICK_TOGGLE_FILTER,
Colours::Yellow, bg_colour,
GetString(badge->
name), badge_class_index.base()));
408 if (it == std::end(config))
return;
410 if (click_result == BADGE_CLICK_TOGGLE_ICON) it->show_icon = !it->show_icon;
411 if (click_result == BADGE_CLICK_TOGGLE_FILTER) {
412 it->show_filter = !it->show_filter;
425 if (gui_classes.GetClasses().empty())
return;
429 if (it == std::end(config))
return;
432 if (pos_cur == std::begin(gui_classes.GetClasses())) {
433 if (it->column > 0) --it->column;
438 if (it->column > pos_prev->column) {
442 std::rotate(pos_prev, it, std::next(it));
455 if (gui_classes.GetClasses().empty())
return;
459 if (it == std::end(config))
return;
462 if (std::next(pos_cur) == std::end(gui_classes.GetClasses())) {
463 if (it->column < columns - 1) ++it->column;
468 if (it->column < pos_next->column) {
472 std::rotate(it, std::next(it), std::next(pos_next));
487 if (result == INT_MAX) {
493 if (class_badge ==
nullptr)
return false;
495 switch (click_result) {
496 case BADGE_CLICK_MOVE_DOWN:
499 case BADGE_CLICK_MOVE_UP:
502 case BADGE_CLICK_TOGGLE_ICON:
503 case BADGE_CLICK_TOGGLE_FILTER:
515 , feature(feature), badge_class(badge_class)
521std::string NWidgetBadgeFilter::GetStringParameter(
const BadgeFilterChoices &choices)
const
524 if (it == std::end(choices)) {
549 auto start = list.size();
554 if (badge.
class_index != this->badge_class)
continue;
555 if (badge.
index == bc->index)
continue;
556 if (badge.
name == STR_NULL)
continue;
584 container->
Clear(window);
590 for (BadgeClassID class_index : used.Classes()) {
592 if (!config.show_filter)
continue;
594 container->Add(std::make_unique<NWidgetBadgeFilter>(colour, widget, feature, class_index));
598 return {first, widget};
608 choices.erase(badge_class_index);
620 assert(badge !=
nullptr);
std::string label
Class label.
BadgeClassID class_index
Index of class this badge belongs to.
std::string label
Label of badge.
BadgeID index
Index assigned to badge.
BadgeFlags flags
Display flags.
GrfSpecFeatures features
Bitmask of which features use this badge.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
Drop down element that draws a list of badges.
void FilterText(StringFilter &string_filter) const override
Add text from this dropdown item to a string filter.
Drop down component that shows extra buttons to indicate that the item can be moved up or down.
int click_down
Click result for down button. Button is inactive if 0.
Colours button_colour
Colour of buttons.
int click_up
Click result for up button. Button is inactive if 0.
static bool NatSortFunc(std::unique_ptr< const DropDownListItem > const &first, std::unique_ptr< const DropDownListItem > const &second)
Drop down boolean toggle component.
Drop down component that makes the item unselectable.
Flat set implementation that uses a sorted vector for storage.
std::pair< const_iterator, bool > insert(const Tkey &key)
Insert a key into the set, if it does not already exist.
uint GetTotalColumnsWidth() const
Get total width of all columns.
Utility class to create a list of badge classes used by a feature.
std::unique_ptr< DropDownListItem > MakeDropDownListDividerItem()
Creates new DropDownListDividerItem.
std::unique_ptr< DropDownListItem > MakeDropDownListIconItem(SpriteID sprite, PaletteID palette, StringID str, int value, bool masked, bool shaded)
Creates new DropDownListIconItem.
std::unique_ptr< DropDownListItem > MakeDropDownListStringItem(StringID str, int value, bool masked, bool shaded)
Creates new DropDownListStringItem.
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Flat set container implementation.
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
@ Normal
The most basic (normal) sprite.
@ Small
Index of the small font in the font tables.
@ SA_CENTER
Center both horizontally and vertically.
uint32_t PaletteID
The number of the palette.
Colours
One of 16 base colours used for companies and windows/widgets.
#define Rect
Macro that prevents name conflicts between included headers.
#define Point
Macro that prevents name conflicts between included headers.
Base for the NewGRF implementation.
Badge * GetBadge(BadgeID index)
Get a badge if it exists.
std::span< const Badge > GetBadges()
Get a read-only view of badges.
PalSpriteID GetBadgeSprite(const Badge &badge, GrfSpecFeature feature, std::optional< TimerGameCalendar::Date > introduction_date, PaletteID remap)
Get sprite for the given badge.
Badge * GetClassBadge(BadgeClassID class_index)
Get the badge for a badge class index.
Functions related to NewGRF badges.
void ResetBadgeClassConfiguration(GrfSpecFeature feature)
Reset badge class configuration for a feature.
std::pair< const BadgeClassConfigItem &, int > GetBadgeClassConfigItem(GrfSpecFeature feature, std::string_view label)
Get configuration for a badge class.
std::span< BadgeClassConfigItem > GetBadgeClassConfiguration(GrfSpecFeature feature)
Get the badge user configuration for a feature.
Functions related to NewGRF badge configuration.
int DrawBadgeNameList(Rect r, std::span< const BadgeID > badges, GrfSpecFeature)
Draw names for a list of badge labels.
static void BadgeClassMoveNext(GrfSpecFeature feature, Badge &class_badge, uint columns)
Move the badge class to the next position.
void DrawBadgeColumn(Rect r, int column_group, const GUIBadgeClasses &gui_classes, std::span< const BadgeID > badges, GrfSpecFeature feature, std::optional< TimerGameCalendar::Date > introduction_date, PaletteID remap)
Draw a badge column group.
static void BadgeClassToggleVisibility(GrfSpecFeature feature, Badge &class_badge, int click_result, BadgeFilterChoices &choices)
Toggle badge class visibility.
static constexpr uint MAX_BADGE_HEIGHT
Maximal height of a badge sprite.
static constexpr uint MAX_BADGE_WIDTH
Maximal width.
std::pair< WidgetID, WidgetID > AddBadgeDropdownFilters(Window *window, WidgetID container_id, WidgetID widget, Colours colour, GrfSpecFeature feature)
Add badge drop down filter widgets.
bool HandleBadgeConfigurationDropDownClick(GrfSpecFeature feature, uint columns, int result, int click_result, BadgeFilterChoices &choices)
Handle the badge configuration drop down selection.
static Dimension GetBadgeMaximalDimension(BadgeClassID class_index, GrfSpecFeature feature)
Get the largest badge size (within limits) for a badge class.
void SetBadgeFilter(BadgeFilterChoices &choices, BadgeID badge_index)
Set badge filter choice for a class.
static void BadgeClassMovePrevious(GrfSpecFeature feature, Badge &class_badge)
Move the badge class to the previous position.
void ResetBadgeFilter(BadgeFilterChoices &choices, BadgeClassID badge_class_index)
Reset badge filter choice for a class.
GUI functions related to NewGRF badges.
Types related to NewGRF badges.
@ NameListStop
Stop adding names to the name list after this badge.
@ NameListFirstOnly
Don't add this name to the name list if not first.
@ HasText
Internal flag set if the badge has text.
@ NameListSkip
Don't show name in name list at all.
A number of safeguards to prevent using unsafe methods.
void DrawUpDownButtons(int x, int y, Colours button_colour, uint8_t state, bool clickable_up, bool clickable_down)
Draw [^][v] buttons.
Functions for setting GUIs.
#define SETTING_BUTTON_WIDTH
Width of setting buttons.
#define SETTING_BUTTON_HEIGHT
Height of setting buttons.
Functions to cache sprites in memory.
Definition of base types and functions in a cross-platform compatible way.
std::string_view GetListSeparator()
Get the list separator string for the current language.
void AppendStringInPlace(std::string &result, StringID string)
Resolve the given StringID and append in place into an existing std::string with formatting but no pa...
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
TextDirection _current_text_dir
Text direction of the currently selected language.
Functions related to OTTD's strings.
@ TD_RTL
Text is written right-to-left by default.
Dimensions (a width and height) of a rectangle in 2D.
uint sort_order
Order of element.
std::string_view label
Class label (string owned by the class badge).
BadgeClassID class_index
Badge class index.
uint8_t column_group
Column group in UI. 0 = left, 1 = centre, 2 = right.
Combination of a palette sprite and a 'real' sprite.
SpriteID sprite
The 'real' sprite.
PaletteID pal
The palette (use PAL_NONE) if not needed).
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Rect CentreToHeight(int height) const
Centre a vertical dimension within this Rect.
bool Contains(const Point &pt) const
Test if a point falls inside this Rect.
Data structure describing a sprite.
uint16_t width
Width of the sprite.
Data structure for an opened window.
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
int16_t Height
Fixed point type for heights.
Definition of the game-calendar-timer.
Functions, definitions and such used only by the GUI.
Types related to windows.
Functions related to zooming.
int UnScaleByZoom(int value, ZoomLevel zoom)
Scale by zoom level, usually shift right (when zoom > ZoomLevel::Min) When shifting right,...
@ Normal
The normal zoom level.