diff options
author | Fabian Schempp <fabianschempp@googlemail.com> | 2021-06-25 08:57:24 +0300 |
---|---|---|
committer | Fabian Schempp <fabianschempp@googlemail.com> | 2021-06-25 08:57:24 +0300 |
commit | ae085e301c2aac0d6956609bfe93a90a19f0e235 (patch) | |
tree | 38b86749807915a6b6d46504a2acb90e41a4a77a /source/blender/blenlib | |
parent | 841df831e89dfc4011c323203c2efb8265dc1878 (diff) |
Spreadsheet: Dataset region for spreadsheet editor
This patch adds a left aligned sidebar to the spreadsheet editor. This
Sidebar can be used to navigate the geometry component types and
attribute domains. It also provides a quick overview of domain sizes.
It replaces the two dropdowns in the regions header.
Next step will be to add the domain cycling shortcut
using the CTRL + mouse wheel.
Reviewer: Dalai Felinto (dfelinto), Julian Eisel (Severin),
Hans Goudey (HooglyBoogly).
Differential Revision: https://developer.blender.org/D11046
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r-- | source/blender/blenlib/BLI_string.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/string.c | 38 | ||||
-rw-r--r-- | source/blender/blenlib/tests/BLI_string_test.cc | 95 |
3 files changed, 134 insertions, 1 deletions
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h index 5a80680c350..f4a417dbe65 100644 --- a/source/blender/blenlib/BLI_string.h +++ b/source/blender/blenlib/BLI_string.h @@ -100,7 +100,7 @@ size_t BLI_str_format_int_grouped(char dst[16], int num) ATTR_NONNULL(); size_t BLI_str_format_uint64_grouped(char dst[16], uint64_t num) ATTR_NONNULL(); void BLI_str_format_byte_unit(char dst[15], long long int bytes, const bool base_10) ATTR_NONNULL(); - +void BLI_str_format_attribute_domain_size(char dst[4], int number_to_format) ATTR_NONNULL(); int BLI_strcaseeq(const char *a, const char *b) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); char *BLI_strcasestr(const char *s, const char *find) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); char *BLI_strncasestr(const char *s, const char *find, size_t len) ATTR_WARN_UNUSED_RESULT diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 3d40c6ef146..cadee2bfe12 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -1230,6 +1230,44 @@ void BLI_str_format_byte_unit(char dst[15], long long int bytes, const bool base } /** + * Format a attribute domain to a up to 6 places (plus '\0' terminator) string using long number names abbreviations. + * This function is designed to produce a compact representation of large numbers. + * 1 -> 1 + * 15 -> 15 + * 155 -> 155 + * 1555 -> 1.6K + * 15555 -> 15.6K + * 155555 -> 156K + * 1555555 -> 1.6M + * 15555555 -> 15.6M + * 155555555 -> 156M + * 1000000000 -> 1B + * ... + * Dimension of 7 is the maximum length of the resulting string + * A combination with 7 places would be -15.5K\0 + */ +void BLI_str_format_attribute_domain_size(char dst[7], int number_to_format) +{ + float number_to_format_converted = number_to_format; + int order = 0; + const float base = 1000; + const char *units[] = {"", "K", "M", "B"}; + const int tot_units = ARRAY_SIZE(units); + + while ((fabsf(number_to_format_converted) >= base) && ((order + 1) < tot_units)) { + number_to_format_converted /= base; + order++; + } + + const size_t dst_len = 7; + int decimals = 0; + if ((order > 0) && fabsf(number_to_format_converted) < 100.0f) { + decimals = 1; + } + BLI_snprintf(dst, dst_len, "%.*f%s", decimals, number_to_format_converted, units[order]); +} + +/** * Find the ranges needed to split \a str into its individual words. * * \param str: The string to search for words. diff --git a/source/blender/blenlib/tests/BLI_string_test.cc b/source/blender/blenlib/tests/BLI_string_test.cc index 0b68ee8b93c..ccd2d01be98 100644 --- a/source/blender/blenlib/tests/BLI_string_test.cc +++ b/source/blender/blenlib/tests/BLI_string_test.cc @@ -420,6 +420,101 @@ TEST(string, StrFormatByteUnits) EXPECT_STREQ("-8191.8472 PiB", size_str); } +/* BLI_str_format_attribute_domain_size */ +TEST(string, StrFormatAttributeDomainSize) +{ + char size_str[7]; + int size; + + BLI_str_format_attribute_domain_size(size_str, size = 0); + EXPECT_STREQ("0", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 1); + EXPECT_STREQ("1", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 10); + EXPECT_STREQ("10", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 15); + EXPECT_STREQ("15", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 100); + EXPECT_STREQ("100", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 155); + EXPECT_STREQ("155", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 1000); + EXPECT_STREQ("1.0K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 1555); + EXPECT_STREQ("1.6K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 10000); + EXPECT_STREQ("10.0K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 15555); + EXPECT_STREQ("15.6K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 100000); + EXPECT_STREQ("100K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 100000); + EXPECT_STREQ("100K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 155555); + EXPECT_STREQ("156K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 1000000); + EXPECT_STREQ("1.0M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 1555555); + EXPECT_STREQ("1.6M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 10000000); + EXPECT_STREQ("10.0M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 15555555); + EXPECT_STREQ("15.6M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 100000000); + EXPECT_STREQ("100M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 155555555); + EXPECT_STREQ("156M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = 1000000000); + EXPECT_STREQ("1.0B", size_str); + + /* Largest possible value. */ + BLI_str_format_attribute_domain_size(size_str, size = INT32_MAX); + EXPECT_STREQ("2.1B", size_str); + + BLI_str_format_attribute_domain_size(size_str, size = -0); + EXPECT_STREQ("0", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -1); + EXPECT_STREQ("-1", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -10); + EXPECT_STREQ("-10", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -15); + EXPECT_STREQ("-15", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -100); + EXPECT_STREQ("-100", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -155); + EXPECT_STREQ("-155", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -1000); + EXPECT_STREQ("-1.0K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -1555); + EXPECT_STREQ("-1.6K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -10000); + EXPECT_STREQ("-10.0K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -15555); + EXPECT_STREQ("-15.6K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -100000); + EXPECT_STREQ("-100K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -155555); + EXPECT_STREQ("-156K", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -1000000); + EXPECT_STREQ("-1.0M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -1555555); + EXPECT_STREQ("-1.6M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -10000000); + EXPECT_STREQ("-10.0M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -15555555); + EXPECT_STREQ("-15.6M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -100000000); + EXPECT_STREQ("-100M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -155555555); + EXPECT_STREQ("-156M", size_str); + BLI_str_format_attribute_domain_size(size_str, size = -1000000000); + EXPECT_STREQ("-1.0B", size_str); + + /* Smallest possible value. */ + BLI_str_format_attribute_domain_size(size_str, size = -INT32_MAX); + EXPECT_STREQ("-2.1B", size_str); +} + struct WordInfo { WordInfo() = default; WordInfo(int start, int end) : start(start), end(end) |