OpenTTD Source 20260208-master-g43af8e94d0
settingentry_gui.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#ifndef SETTINGENTRY_GUI_H
11#define SETTINGENTRY_GUI_H
12
13#include "core/enum_type.hpp"
14#include "settings_internal.h"
15#include "stringfilter_type.h"
16
27using SettingEntryFlags = EnumBitSet<SettingEntryFlag, uint8_t>;
28
30
41
42
50
52struct BaseSettingEntry {
53 SettingEntryFlags flags;
54 uint8_t level;
55
56 BaseSettingEntry() : flags(), level(0) {}
57 virtual ~BaseSettingEntry() = default;
58
59 virtual void Init(uint8_t level = 0);
60 virtual void FoldAll() {}
61 virtual void UnFoldAll() {}
62 virtual void ResetAll() = 0;
63
68 void SetLastField(bool last_field) { this->flags.Set(SettingEntryFlag::LastField, last_field); }
69
70 virtual uint Length() const = 0;
71 virtual void GetFoldingState([[maybe_unused]] bool &all_folded, [[maybe_unused]] bool &all_unfolded) const {}
72 virtual bool IsVisible(const BaseSettingEntry *item) const;
73 virtual BaseSettingEntry *FindEntry(uint row, uint *cur_row);
74 virtual uint GetMaxHelpHeight([[maybe_unused]] int maxw) { return 0; }
75
80 bool IsFiltered() const { return this->flags.Test(SettingEntryFlag::Filtered); }
81
82 virtual bool UpdateFilterState(SettingFilter &filter, bool force_visible) = 0;
83
84 virtual uint Draw(GameSettings *settings_ptr, int left, int right, int y, uint first_row, uint max_row, BaseSettingEntry *selected, uint cur_row = 0, uint parent_last = 0) const;
85
86 static inline Dimension circle_size;
87 static inline int line_height;
88
89protected:
98 virtual void DrawSetting(GameSettings *settings_ptr, int left, int right, int y, bool highlight) const = 0;
99};
100
102struct SettingEntry : BaseSettingEntry {
103 const std::string_view name;
104 const IntSettingDesc *setting = nullptr;
105
106 SettingEntry(std::string_view name) : name(name) {}
107
108 void Init(uint8_t level = 0) override;
109 void ResetAll() override;
110 uint Length() const override;
111 uint GetMaxHelpHeight(int maxw) override;
112 bool UpdateFilterState(SettingFilter &filter, bool force_visible) override;
113
114 void SetButtons(SettingEntryFlags new_val);
115
116protected:
117 void DrawSetting(GameSettings *settings_ptr, int left, int right, int y, bool highlight) const override;
118
119private:
121};
122
125 typedef std::vector<BaseSettingEntry*> EntryVector;
126 EntryVector entries;
127
128 template <typename T>
129 T *Add(T *item)
130 {
131 this->entries.push_back(item);
132 return item;
133 }
134
135 void Init(uint8_t level = 0);
136 void ResetAll();
137 void FoldAll();
138 void UnFoldAll();
139
140 uint Length() const;
141 void GetFoldingState(bool &all_folded, bool &all_unfolded) const;
142 bool IsVisible(const BaseSettingEntry *item) const;
143 BaseSettingEntry *FindEntry(uint row, uint *cur_row);
144 uint GetMaxHelpHeight(int maxw);
145
146 bool UpdateFilterState(SettingFilter &filter, bool force_visible);
147
148 uint Draw(GameSettings *settings_ptr, int left, int right, int y, uint first_row, uint max_row, BaseSettingEntry *selected, uint cur_row = 0, uint parent_last = 0) const;
149};
150
152struct SettingsPage : BaseSettingEntry, SettingsContainer {
154 bool folded;
155
157
158 void Init(uint8_t level = 0) override;
159 void ResetAll() override;
160 void FoldAll() override;
161 void UnFoldAll() override;
162
163 uint Length() const override;
164 void GetFoldingState(bool &all_folded, bool &all_unfolded) const override;
165 bool IsVisible(const BaseSettingEntry *item) const override;
166 BaseSettingEntry *FindEntry(uint row, uint *cur_row) override;
167 uint GetMaxHelpHeight(int maxw) override { return SettingsContainer::GetMaxHelpHeight(maxw); }
168
169 bool UpdateFilterState(SettingFilter &filter, bool force_visible) override;
170
171 uint Draw(GameSettings *settings_ptr, int left, int right, int y, uint first_row, uint max_row, BaseSettingEntry *selected, uint cur_row = 0, uint parent_last = 0) const override;
172
173protected:
174 void DrawSetting(GameSettings *settings_ptr, int left, int right, int y, bool highlight) const override;
175};
176
178const void *ResolveObject(const GameSettings *settings_ptr, const IntSettingDesc *sd);
179
180#endif /* SETTINGENTRY_GUI_H */
181
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Timpl & Set()
Set all bits.
Enum-as-bit-set wrapper.
Type (helpers) for enums.
#define DECLARE_INCREMENT_DECREMENT_OPERATORS(enum_type)
For some enums it is useful to have pre/post increment/decrement operators.
Definition enum_type.hpp:66
RestrictionMode
How the list of advanced settings is filtered.
@ RM_CHANGED_AGAINST_DEFAULT
Show only settings which are different compared to default values.
@ RM_ADVANCED
Display settings associated to the "advanced" list.
@ RM_ALL
List all settings regardless of the default/newgame/... values.
@ RM_CHANGED_AGAINST_NEW
Show only settings which are different compared to the user's new game setting values.
@ RM_END
End for iteration.
@ RM_BASIC
Display settings associated to the "basic" list.
static constexpr SettingEntryFlags SEF_BUTTONS_MASK
Mask for button flags.
SettingEntryFlag
Flags for SettingEntry.
@ LeftDepressed
Of a numeric setting entry, the left button is depressed.
@ LastField
This entry is the last one in a (sub-)page.
@ RightDepressed
Of a numeric setting entry, the right button is depressed.
@ Filtered
Entry is hidden by the string filter.
SettingsContainer & GetSettingsTree()
Construct settings tree.
Functions and types used internally for the settings configurations.
SettingType
Type of settings for filtering.
Searching and filtering using a stringterm.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Data structure describing a single setting in a tab.
void SetLastField(bool last_field)
Set whether this is the last visible entry of the parent node.
bool IsFiltered() const
Check whether an entry is hidden due to filters.
virtual BaseSettingEntry * FindEntry(uint row, uint *cur_row)
Find setting entry at row row_num.
static Dimension circle_size
Dimension of the circle +/- icon.
virtual void Init(uint8_t level=0)
Initialization of a setting entry.
static int line_height
Height of a single setting.
virtual uint Draw(GameSettings *settings_ptr, int left, int right, int y, uint first_row, uint max_row, BaseSettingEntry *selected, uint cur_row=0, uint parent_last=0) const
Draw a row in the settings panel.
virtual void DrawSetting(GameSettings *settings_ptr, int left, int right, int y, bool highlight) const =0
Function to draw setting value (button + text + current value).
SettingEntryFlags flags
Flags of the setting entry.
virtual bool IsVisible(const BaseSettingEntry *item) const
Check whether an entry is visible and not folded or filtered away.
uint8_t level
Nesting level of this setting entry.
Dimensions (a width and height) of a rectangle in 2D.
All settings together for the game.
Base integer type, including boolean, settings.
uint Length() const override
Return number of rows needed to display the (filtered) entry.
void SetButtons(SettingEntryFlags new_val)
Set the button-depressed flags (SettingsEntryFlag::LeftDepressed and SettingsEntryFlag::RightDepresse...
void DrawSetting(GameSettings *settings_ptr, int left, int right, int y, bool highlight) const override
Function to draw setting value (button + text + current value).
bool IsVisibleByRestrictionMode(RestrictionMode mode) const
Checks whether an entry shall be made visible based on the restriction mode.
const std::string_view name
Name of the setting.
uint GetMaxHelpHeight(int maxw) override
Get the biggest height of the help text(s), if the width is at least maxw.
void Init(uint8_t level=0) override
Initialization of a setting entry.
const IntSettingDesc * setting
Setting description of the setting.
bool UpdateFilterState(SettingFilter &filter, bool force_visible) override
Update the filter state.
Filter for settings list.
SettingType type
Filter based on type.
bool type_hides
Whether the type hides filtered strings.
RestrictionMode mode
Filter based on category.
RestrictionMode min_cat
Minimum category needed to display all filtered strings (RM_BASIC, RM_ADVANCED, or RM_ALL).
StringFilter string
Filter string.
Containers for BaseSettingEntry.
bool UpdateFilterState(SettingFilter &filter, bool force_visible)
Update the filter state.
void GetFoldingState(bool &all_folded, bool &all_unfolded) const
Recursively accumulate the folding state of the tree.
uint GetMaxHelpHeight(int maxw)
Get the biggest height of the help texts, if the width is at least maxw.
void ResetAll()
Resets all settings to their default values.
bool IsVisible(const BaseSettingEntry *item) const
Check whether an entry is visible and not folded or filtered away.
void FoldAll()
Recursively close all folds of sub-pages.
void UnFoldAll()
Recursively open all folds of sub-pages.
BaseSettingEntry * FindEntry(uint row, uint *cur_row)
Find the setting entry at row number row_num.
EntryVector entries
Settings on this page.
uint Length() const
Return number of rows needed to display the whole page.
uint Draw(GameSettings *settings_ptr, int left, int right, int y, uint first_row, uint max_row, BaseSettingEntry *selected, uint cur_row=0, uint parent_last=0) const
Draw a row in the settings panel.
void Init(uint8_t level=0)
Initialization of an entire setting page.
StringID title
Title of the sub-page.
bool IsVisible(const BaseSettingEntry *item) const override
Check whether an entry is visible and not folded or filtered away.
SettingsPage(StringID title)
Constructor for a sub-page in the 'advanced settings' window.
void UnFoldAll() override
Recursively open all (filtered) folds of sub-pages.
void FoldAll() override
Recursively close all (filtered) folds of sub-pages.
uint Length() const override
Return number of rows needed to display the (filtered) entry.
BaseSettingEntry * FindEntry(uint row, uint *cur_row) override
Find setting entry at row row_num.
uint Draw(GameSettings *settings_ptr, int left, int right, int y, uint first_row, uint max_row, BaseSettingEntry *selected, uint cur_row=0, uint parent_last=0) const override
Draw a row in the settings panel.
void Init(uint8_t level=0) override
Initialization of an entire setting page.
void GetFoldingState(bool &all_folded, bool &all_unfolded) const override
Recursively accumulate the folding state of the (filtered) tree.
void ResetAll() override
Resets all settings to their default values.
bool folded
Sub-page is folded (not visible except for its title).
bool UpdateFilterState(SettingFilter &filter, bool force_visible) override
Update the filter state.
void DrawSetting(GameSettings *settings_ptr, int left, int right, int y, bool highlight) const override
Function to draw setting value (button + text + current value).
String filter and state.