Skip to content

Commit

Permalink
Feature: Fully user configurable number format and abbreviations
Browse files Browse the repository at this point in the history
  • Loading branch information
rubidium42 committed Feb 17, 2024
1 parent 609d007 commit b741b2b
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/settings_table.cpp
Expand Up @@ -50,6 +50,7 @@
#include "void_map.h"
#include "station_func.h"
#include "station_base.h"
#include "language.h"

#include "table/strings.h"
#include "table/settings.h"
Expand Down
2 changes: 2 additions & 0 deletions src/settings_type.h
Expand Up @@ -222,6 +222,8 @@ struct GUISettings {

bool scale_bevels; ///< bevels are scaled with GUI scale.

std::string number_format; ///< formatting string for numbers (like "thousands" grouping)
std::string number_abbreviations; ///< mapping to number formats for different powers of ten/thresholds
std::string digit_decimal_separator; ///< decimal separator

/**
Expand Down
17 changes: 15 additions & 2 deletions src/strings.cpp
Expand Up @@ -389,8 +389,21 @@ static const char *GetDecimalSeparator()

void InitializeNumberFormats()
{
ParseNumberFormatSeparators(_number_format_separators, _current_language->number_format);
ParseNumberAbbreviations(_number_abbreviations, _current_language->number_abbreviations);
bool loaded_number_format = false;
if (!_settings_client.gui.number_format.empty()) {
auto res = ParseNumberFormatSeparators(_number_format_separators, _settings_client.gui.number_format);
if (res.has_value()) UserError("The setting 'number_format' under 'gui' is invalid: {}", *res);
loaded_number_format = !res.has_value();
}
if (!loaded_number_format) ParseNumberFormatSeparators(_number_format_separators, _current_language->number_format);

bool loaded_number_abbreviations = false;
if (!_settings_client.gui.number_abbreviations.empty()) {
auto res = ParseNumberAbbreviations(_number_abbreviations, _settings_client.gui.number_abbreviations);
if (res.has_value()) UserError("The setting 'number_abbreviations' under 'gui' is invalid: {}", *res);
loaded_number_abbreviations = !res.has_value();
}
if (!loaded_number_abbreviations) ParseNumberAbbreviations(_number_abbreviations, _current_language->number_abbreviations);
_number_abbreviations.emplace_back(0, _number_format_separators);
}

Expand Down
19 changes: 19 additions & 0 deletions src/table/settings/gui_settings.ini
Expand Up @@ -16,6 +16,7 @@ static void InvalidateCompanyLiveryWindow(int32_t new_value);
static void InvalidateNewGRFChangeWindows(int32_t new_value);
static void ZoomMinMaxChanged(int32_t new_value);
static void SpriteZoomMinChanged(int32_t new_value);
void InitializeNumberFormats();

static constexpr std::initializer_list<const char*> _osk_activation{"disabled", "double", "single", "immediately"};
static constexpr std::initializer_list<const char*> _savegame_date{"long", "short", "iso"};
Expand Down Expand Up @@ -904,6 +905,24 @@ post_cb = [](auto) { SetupWidgetDimensions(); ReInitAllWindows(true); }
cat = SC_BASIC
startup = true

[SDTC_SSTR]
var = gui.number_format
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
type = SLE_STRQ
def = nullptr
pre_cb = [](auto format) { NumberFormatSeparators separators; return !ParseNumberFormatSeparators(separators, format).has_value(); }
post_cb = [](auto) { InitializeNumberFormats(); MarkWholeScreenDirty(); }
startup = true

[SDTC_SSTR]
var = gui.number_abbreviations
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
type = SLE_STRQ
def = nullptr
pre_cb = [](auto format) { NumberAbbreviations abbreviations; return !ParseNumberAbbreviations(abbreviations, format).has_value(); }
post_cb = [](auto) { InitializeNumberFormats(); MarkWholeScreenDirty(); }
startup = true

[SDTC_SSTR]
var = gui.digit_decimal_separator
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
Expand Down

0 comments on commit b741b2b

Please sign in to comment.