41 inline auto operator<=>(
const PickerItem &other)
const
43 if (
auto cmp = this->grfid <=> other.grfid; cmp != 0)
return cmp;
44 return this->local_id <=> other.local_id;
49class PickerCallbacks {
51 explicit PickerCallbacks(
const std::string &
ini_group);
56 virtual void Close([[maybe_unused]]
int data) { }
146 virtual std::span<const BadgeID>
GetTypeBadges(
int cls_id,
int id)
const = 0;
161 virtual void DrawType(
int x,
int y,
int cls_id,
int id)
const = 0;
180 virtual std::map<std::string, std::set<PickerItem>>
UpdateSavedItems(
const std::map<std::string, std::set<PickerItem>> &src) = 0;
188 std::set<std::string> inactive;
190 for (
const auto &collection : collections) {
191 if ((collection.second.size() == 1 && collection.second.contains({})) || collection.first ==
"")
continue;
192 for (
const PickerItem &item : collection.second) {
193 if (item.class_index == -1 || item.index == -1) {
194 inactive.emplace(collection.first);
198 inactive.emplace(collection.first);
224 std::map<std::string, std::set<PickerItem>>
saved;
242 inline typename T::index_type
GetClassIndex(
int cls_id)
const {
return static_cast<typename T::index_type
>(cls_id); }
257 inline const typename T::spec_type *
GetSpec(
int cls_id,
int id)
const {
return this->
GetClass(cls_id)->GetSpec(
id); }
273 if (spec ==
nullptr)
return {0, 0, cls_id,
id};
274 return {spec->grf_prop.grfid, spec->grf_prop.local_id, spec->class_index.base(), spec->index};
288 std::map<std::string, std::set<PickerItem>>
UpdateSavedItems(
const std::map<std::string, std::set<PickerItem>> &src)
override
290 if (src.empty())
return {};
292 std::map<std::string, std::set<PickerItem>> dst;
293 for (
auto it = src.begin(); it != src.end(); it++) {
294 if (it->second.empty() || (it->second.size() == 1 && it->second.contains({}))) {
299 for (
const auto &item : it->second) {
300 const auto *spec = T::GetByGrf(item.grfid, item.local_id);
301 if (spec ==
nullptr) {
302 dst[it->first].emplace(item.grfid, item.local_id, -1, -1);
314 std::optional<BadgeTextFilter> btf;
315 std::optional<BadgeDropdownFilter> bdf;
322class PickerWindow :
public PickerWindowBase {
357 void Close(
int data = 0)
override;
364 void static DeletePickerCollectionCallback(
Window *win,
bool confirmed);
379 void ConstructWindow();
381 PickerCallbacks &callbacks;
389 void EnsureSelectedClassIsValid();
390 void EnsureSelectedClassIsVisible();
396 void RefreshUsedTypeList();
398 void EnsureSelectedTypeIsValid();
399 void EnsureSelectedTypeIsVisible();
406 std::pair<WidgetID, WidgetID> badge_filters{};
407 BadgeFilterChoices badge_filter_choices{};
409 const IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::Trigger::Year, TimerGameCalendar::Priority::None}, [
this](
auto) {
413 const IntervalTimer<TimerWindow> refresh_interval = {std::chrono::seconds(3), [
this](
auto) {
414 RefreshUsedTypeList();
List template of 'things' T to sort in a GUI.
std::map< std::string, std::set< PickerItem > > UpdateSavedItems(const std::map< std::string, std::set< PickerItem > > &src) override
Update link between grfid/localidx and class_index/index in saved items.
PickerItem GetPickerItem(int cls_id, int id) const override
Get the PickerItem for the given index with the class.
int GetClassCount() const override
Get the number of classes.
T::index_type GetClassIndex(int cls_id) const
Casts the given index to the right type.
const T * GetClass(int cls_id) const
Get the class with the given index.
int GetTypeCount(int cls_id) const override
Get the number of types in a class.
bool HasClassChoice() const override
Are there multiple classes to chose from?
PickerItem GetPickerItem(const typename T::spec_type *spec, int cls_id=-1, int id=-1) const
Get the PickerItem for the given spec.
PickerCallbacksNewGRFClass(const std::string &ini_group)
Create the callback instance.
const T::spec_type * GetSpec(int cls_id, int id) const
Get the spec of an object within a class.
Class for PickerClassWindow to collect information and retain state.
std::set< std::string > InitializeInactiveCollections(const std::map< std::string, std::set< PickerItem > > collections)
Initialize the list of active collections for sorting purposes.
virtual ~PickerCallbacks()
Ensure the destructor of the sub classes are called as well.
virtual int GetSelectedClass() const =0
Get the index of the selected class.
std::string edit_collection
Collection to rename or delete.
Filtering type_last_filtering
Default filtering of PickerTypeList.
virtual PickerItem GetPickerItem(int cls_id, int id) const =0
Get data about an item.
const std::string ini_group
Ini Group for saving favourites.
bool rename_collection
Are we renaming a collection?
Listing collection_last_sorting
Default sorting of PickerCollectionList.
virtual void SetSelectedClass(int id) const =0
Set the selected class.
std::string sel_collection
Currently selected collection of saved items.
virtual bool IsActive() const =0
Should picker class/type selection be enabled?
virtual StringID GetTypeName(int cls_id, int id) const =0
Get the item name of a type.
virtual bool IsTypeAvailable(int cls_id, int id) const =0
Test if an item is currently buildable.
virtual void FillUsedItems(std::set< PickerItem > &items)=0
Fill a set with all items that are used by the current player.
virtual StringID GetTypeTooltip() const =0
Get the tooltip string for the type grid.
virtual bool HasClassChoice() const =0
Are there multiple classes to chose from?
Listing type_last_sorting
Default sorting of PickerTypeList.
virtual StringID GetCollectionTooltip() const =0
Get the tooltip string for the collection list.
std::set< PickerItem > used
Set of items used in the current game by the current company.
virtual StringID GetClassTooltip() const =0
Get the tooltip string for the class list.
virtual int GetTypeCount(int cls_id) const =0
Get the number of types in a class.
virtual int GetClassCount() const =0
Get the number of classes.
virtual GrfSpecFeature GetFeature() const =0
NewGRF feature this picker is for.
virtual void SetSelectedType(int id) const =0
Set the selected type.
virtual StringID GetClassName(int id) const =0
Get the name of a class.
int preview_height
Previously adjusted height.
PickerFilterModes mode
Bitmask of PickerFilterModes.
virtual void DrawType(int x, int y, int cls_id, int id) const =0
Draw preview image of an item.
virtual std::span< const BadgeID > GetTypeBadges(int cls_id, int id) const =0
Get the item's badges of a type.
virtual std::map< std::string, std::set< PickerItem > > UpdateSavedItems(const std::map< std::string, std::set< PickerItem > > &src)=0
Update link between grfid/localidx and class_index/index in saved items.
Filtering class_last_filtering
Default filtering of PickerClassList.
virtual void Close(int data)
Hide the window and all its child windows, and mark them for a later deletion.
std::set< std::string > rm_collections
Set of removed or renamed collections for updating ini file.
std::map< std::string, std::set< PickerItem > > saved
Set of saved collections of items.
virtual int GetSelectedType() const =0
Get the selected type.
Listing class_last_sorting
Default sorting of PickerClassList.
static constexpr int MAX_PREVIEW_HEIGHT
Maximum height of each preview button.
static constexpr int PREVIEW_WIDTH
Width of each preview button.
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
int preview_height
Height of preview images.
bool has_class_picker
Set if this window has a class picker 'component'.
static constexpr int PREVIEW_HEIGHT
Height of each preview button.
static constexpr uint EDITBOX_MAX_SIZE
The maximum number of characters for the filter edit box.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
PickerInvalidation
The things of a picker that can be invalidated.
@ Position
Update scroll positions.
@ Class
Refresh the class list.
@ Type
Refresh the type list.
@ Validate
Validate selected item.
@ Collection
Refresh the collection list.
@ Filter
Update filter state.
bool has_collection_picker
Set if this window has a collection picker 'component'.
static constexpr int PREVIEW_LEFT
Offset from left edge to draw preview.
PickerTypeList types
List of types.
std::set< std::string > inactive
Set of collections with inactive items.
QueryString class_editbox
Filter editbox.
bool has_type_picker
Set if this window has a type picker 'component'.
void BuildPickerClassList()
Builds the filter list of classes.
void BuildPickerCollectionList()
Builds the filter list of collections.
void OnEditboxChanged(WidgetID wid) override
The text in an editbox has been edited.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void BuildPickerTypeList()
Builds the filter list of types.
void OnDropdownSelect(WidgetID widget, int index, int click_result) override
A dropdown option associated to this window has been selected.
void OnResize() override
Called after the window got resized.
static constexpr int PREVIEW_BOTTOM
Offset from bottom edge to draw preview.
PickerClassWindowHotkeys
Enum referring to the Hotkeys in the picker window.
@ PCWHK_FOCUS_FILTER_BOX
Focus the edit box for editing the filter string.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
PickerCollectionList collections
List of collections.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
QueryString type_editbox
Filter editbox.
EventState OnHotkey(int hotkey) override
A hotkey has been pressed.
EnumBitSet< PickerInvalidation, uint8_t > PickerInvalidations
Bitset of Pickerinvalidation elements.
void OnInit() override
Notification that the nested widget tree gets initialized.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
PickerClassList classes
List of classes.
static constexpr int STEP_PREVIEW_HEIGHT
Step for decreasing or increase preview button height.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
#define T
Climate temperate.
void SetDirty() const
Mark entire window as dirty (in need of re-paint).
#define Rect
Macro that prevents name conflicts between included headers.
#define Point
Macro that prevents name conflicts between included headers.
Functions related to NewGRF badges.
GUI functions related to NewGRF badges.
GUIList< PickerItem, std::nullptr_t, PickerFilterData & > PickerTypeList
GUIList holding classes/types to display.
GUIList< int, std::nullptr_t, PickerFilterData & > PickerClassList
GUIList holding classes to display.
PickerFilterMode
Picker filter mode.
std::unique_ptr< NWidgetBase > MakePickerClassWidgets()
Create nested widgets for the class picker widgets.
EnumBitSet< PickerFilterMode, uint8_t > PickerFilterModes
Bitset of PickerFilterMode elements.
std::unique_ptr< NWidgetBase > MakePickerTypeWidgets()
Create nested widgets for the type picker widgets.
GUIList< std::string, std::nullptr_t, PickerFilterData & > PickerCollectionList
GUIList holding collections to display.
Base for the GUIs that have an edit box in them.
Base types for having sorted lists in GUIs.
Searching and filtering using a stringterm.
Types related to strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames).
Dimensions (a width and height) of a rectangle in 2D.
Data structure describing what to show in the list (filter criteria).
Data structure describing how to show the list (what sort direction and criteria).
const PickerCallbacks * callbacks
Callbacks for filter functions to access to callbacks.
Data stored about a string that can be modified in the GUI.
StringFilter(const bool *case_sensitive=nullptr, bool locale_aware=true)
Constructor for filter.
High level window description.
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing).
Window * parent
Parent window.
ResizeInfo resize
Resize information.
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
WindowNumber window_number
Window number within the window class.
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
Definition of the Window system.
Functions, definitions and such used only by the GUI.
Types related to windows.
EventState
State of handling an event.