aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src/openvic-extension/classes/GFXPieChartTexture.hpp')
-rw-r--r--extension/src/openvic-extension/classes/GFXPieChartTexture.hpp41
1 files changed, 36 insertions, 5 deletions
diff --git a/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp b/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
index 315b00e..ad8e751 100644
--- a/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
+++ b/extension/src/openvic-extension/classes/GFXPieChartTexture.hpp
@@ -4,6 +4,8 @@
#include <openvic-simulation/interface/GFX.hpp>
+#include "openvic-extension/utility/Utilities.hpp"
+
namespace OpenVic {
class GFXPieChartTexture : public godot::ImageTexture {
GDCLASS(GFXPieChartTexture, godot::ImageTexture)
@@ -23,11 +25,40 @@ namespace OpenVic {
public:
GFXPieChartTexture();
- /* Set slices given new_slices, an Array of Dictionaries, each with the following keys:
+ /* Set slices given an Array of Dictionaries, each with the following key-value entries:
* - colour: Color
- * - weight: float
- */
- godot::Error set_slices(godot::Array const& new_slices);
+ * - weight: float */
+ godot::Error set_slices_array(godot::TypedArray<godot::Dictionary> const& new_slices);
+
+ /* Generate slice data from a distribution of HasIdentifierAndColour derived objects, sorted by their weight.
+ * The resulting Array of Dictionaries can be used as an argument for set_slices_array. */
+ template<std::derived_from<HasIdentifierAndColour> T>
+ static godot::TypedArray<godot::Dictionary> distribution_to_slices_array(fixed_point_map_t<T const*> const& dist) {
+ using entry_t = std::pair<T const*, fixed_point_t>;
+ std::vector<entry_t> sorted_dist;
+ sorted_dist.reserve(dist.size());
+ for (entry_t const& entry : dist) {
+ ERR_CONTINUE_MSG(
+ entry.first == nullptr, godot::vformat("Null distribution key with value %f", entry.second.to_float())
+ );
+ sorted_dist.push_back(entry);
+ }
+ std::sort(sorted_dist.begin(), sorted_dist.end(), [](entry_t const& lhs, entry_t const& rhs) -> bool {
+ return lhs.second < rhs.second;
+ });
+ static const godot::StringName identifier_key = "identifier";
+ static const godot::StringName colour_key = "colour";
+ static const godot::StringName weight_key = "weight";
+ godot::TypedArray<godot::Dictionary> array;
+ for (auto const& [key, val] : sorted_dist) {
+ godot::Dictionary sub_dict;
+ sub_dict[identifier_key] = Utilities::std_view_to_godot_string(key->get_identifier());
+ sub_dict[colour_key] = Utilities::to_godot_color(key->get_colour());
+ sub_dict[weight_key] = val.to_float();
+ array.push_back(sub_dict);
+ }
+ return array;
+ }
/* Create a GFXPieChartTexture using the specific GFX::PieChart.
* Returns nullptr if setting gfx_pie_chart fails. */
@@ -43,7 +74,7 @@ namespace OpenVic {
/* Search for a GFX::PieChart with the specfied name and, if successful, set it using set_gfx_pie_chart. */
godot::Error set_gfx_pie_chart_name(godot::String const& gfx_pie_chart_name);
- /* Return the name of the GFX::PieChart, or an empty String if it's null */
+ /* Return the name of the GFX::PieChart, or an empty String if it's null. */
godot::String get_gfx_pie_chart_name() const;
};
}