aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic-extension/singletons/MenuSingleton.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src/openvic-extension/singletons/MenuSingleton.hpp')
-rw-r--r--extension/src/openvic-extension/singletons/MenuSingleton.hpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/extension/src/openvic-extension/singletons/MenuSingleton.hpp b/extension/src/openvic-extension/singletons/MenuSingleton.hpp
index 6bd90c5..fd1b6c5 100644
--- a/extension/src/openvic-extension/singletons/MenuSingleton.hpp
+++ b/extension/src/openvic-extension/singletons/MenuSingleton.hpp
@@ -2,10 +2,12 @@
#include <godot_cpp/classes/image.hpp>
+#include <openvic-simulation/pop/Pop.hpp>
#include <openvic-simulation/types/OrderedContainers.hpp>
namespace OpenVic {
struct GameManager;
+ struct Region;
class MenuSingleton : public godot::Object {
GDCLASS(MenuSingleton, godot::Object)
@@ -14,6 +16,70 @@ namespace OpenVic {
GameManager* game_manager;
+ public:
+ struct population_menu_t {
+ enum ProvinceListEntry {
+ LIST_ENTRY_NONE, LIST_ENTRY_COUNTRY, LIST_ENTRY_STATE, LIST_ENTRY_PROVINCE
+ };
+
+ struct country_entry_t {
+ Country const& country;
+ bool selected = true;
+ };
+
+ struct state_entry_t {
+ // TODO - change to State
+ Region const& state;
+ bool selected = true, expanded = false;
+ };
+
+ struct province_entry_t {
+ Province const& province;
+ bool selected = true;
+ };
+
+ using province_list_entry_t = std::variant<country_entry_t, state_entry_t, province_entry_t>;
+
+ std::vector<province_list_entry_t> province_list_entries;
+ int32_t visible_province_list_entries = 0;
+
+ struct pop_filter_t {
+ Pop::pop_size_t count, promotion_demotion_change;
+ bool selected;
+ };
+ ordered_map<PopType const*, pop_filter_t> pop_filters;
+
+ static constexpr int32_t DISTRIBUTION_COUNT = 6;
+ /* Distributions:
+ * - Workforce (PopType)
+ * - Religion
+ * - Ideology
+ * - Nationality (Culture)
+ * - Issues
+ * - Vote */
+ std::array<fixed_point_map_t<HasIdentifierAndColour const*>, DISTRIBUTION_COUNT> distributions;
+
+ enum PopSortKey {
+ NONE, SORT_SIZE, SORT_TYPE, SORT_CULTURE, SORT_RELIGION, SORT_LOCATION, SORT_MILITANCY, SORT_CONSCIOUSNESS,
+ SORT_IDEOLOGY, SORT_ISSUES, SORT_UNEMPLOYMENT, SORT_CASH, SORT_LIFE_NEEDS, SORT_EVERYDAY_NEEDS,
+ SORT_LUXURY_NEEDS, SORT_REBEL_FACTION, SORT_SIZE_CHANGE, SORT_LITERACY, MAX_SORT_KEY
+ } sort_key = NONE;
+ bool sort_descending = true;
+
+ std::vector<Pop const*> pops, filtered_pops;
+ };
+
+ private:
+ population_menu_t population_menu;
+
+ /* Emitted when the number of visible province list rows changes (list generated or state entry expanded).*/
+ static godot::StringName const& _signal_population_menu_province_list_changed();
+ /* Emitted when the state of visible province list rows changes (selection changes). Provides an integer argument
+ * which, if not negative, the province list scroll index should be updated to. */
+ static godot::StringName const& _signal_population_menu_province_list_selected_changed();
+ /* Emitted when the selected/filtered collection of pops changes. */
+ static godot::StringName const& _signal_population_menu_pops_changed();
+
protected:
static void _bind_methods();
@@ -44,5 +110,35 @@ namespace OpenVic {
bool can_increase_speed() const;
bool can_decrease_speed() const;
godot::String get_longform_date() const;
+
+ /* POPULATION MENU */
+ void _population_menu_update_provinces();
+ int32_t get_population_menu_province_list_row_count() const;
+ godot::TypedArray<godot::Dictionary> get_population_menu_province_list_rows(int32_t start, int32_t count) const;
+ godot::Error population_menu_select_province_list_entry(int32_t select_index, bool set_scroll_index = false);
+ godot::Error population_menu_select_province(int32_t province_index);
+ godot::Error population_menu_toggle_expanded(int32_t toggle_index, bool emit_selected_changed = true);
+
+ void _population_menu_update_pops();
+ void _population_menu_update_filtered_pops();
+ using sort_func_t = std::function<bool(Pop const*, Pop const*)>;
+ sort_func_t _get_population_menu_sort_func(population_menu_t::PopSortKey sort_key) const;
+ void _population_menu_sort_pops();
+ godot::Error population_menu_select_sort_key(population_menu_t::PopSortKey sort_key);
+ godot::TypedArray<godot::Dictionary> get_population_menu_pop_rows(int32_t start, int32_t count) const;
+ int32_t get_population_menu_pop_row_count() const;
+
+ godot::PackedInt32Array get_population_menu_pop_filter_setup_info();
+ godot::TypedArray<godot::Dictionary> get_population_menu_pop_filter_info() const;
+ godot::Error population_menu_toggle_pop_filter(int32_t filter_index);
+ void population_menu_select_all_pop_filters();
+ void population_menu_deselect_all_pop_filters();
+
+ godot::PackedStringArray get_population_menu_distribution_setup_info() const;
+ /* Array of GFXPieChartTexture::godot_pie_chart_data_t. */
+ godot::TypedArray<godot::Array> get_population_menu_distribution_info() const;
};
}
+
+VARIANT_ENUM_CAST(OpenVic::MenuSingleton::population_menu_t::ProvinceListEntry);
+VARIANT_ENUM_CAST(OpenVic::MenuSingleton::population_menu_t::PopSortKey);