From 306d300edfbb5595d0a14330fce29096d39566ea Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 14 Mar 2023 22:26:56 -0700 Subject: [PATCH] persist choose items choice per building type --- plugins/buildingplan/buildingplan.cpp | 7 +++---- plugins/buildingplan/buildingplan.h | 1 + plugins/buildingplan/defaultitemfilters.cpp | 9 ++++++++- plugins/buildingplan/defaultitemfilters.h | 3 +++ 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/plugins/buildingplan/buildingplan.cpp b/plugins/buildingplan/buildingplan.cpp index ef808c09b..304b7001e 100644 --- a/plugins/buildingplan/buildingplan.cpp +++ b/plugins/buildingplan/buildingplan.cpp @@ -55,7 +55,6 @@ static PersistentDataItem config; // for use in counting available materials for the UI static map> mat_cache; static unordered_map, BuildingTypeKeyHash> job_item_cache; -static unordered_map cur_choose_items; static unordered_map cur_heat_safety; static unordered_map cur_item_filters; // building id -> PlannedBuilding @@ -267,7 +266,6 @@ static void clear_state(color_ostream &out) { call_buildingplan_lua(&out, "reload_pens"); planned_buildings.clear(); tasks.clear(); - cur_choose_items.clear(); cur_heat_safety.clear(); cur_item_filters.clear(); for (auto &entry : job_item_cache ) { @@ -895,7 +893,8 @@ static int getMaterialFilter(lua_State *L) { static void setChooseItems(color_ostream &out, df::building_type type, int16_t subtype, int32_t custom, bool choose) { DEBUG(status,out).print("entering setChooseItems\n"); BuildingTypeKey key(type, subtype, custom); - cur_choose_items[key] = choose; + auto &filters = get_item_filters(out, key); + filters.setChooseItems(choose); // no need to reset signal; no change to the state of any other UI element } @@ -910,7 +909,7 @@ static int getChooseItems(lua_State *L) { "entering getChooseItems building_type=%d subtype=%d custom=%d\n", type, subtype, custom); BuildingTypeKey key(type, subtype, custom); - Lua::Push(L, cur_choose_items[key]); + Lua::Push(L, get_item_filters(*out, key).getChooseItems()); return 1; } diff --git a/plugins/buildingplan/buildingplan.h b/plugins/buildingplan/buildingplan.h index 0d0d5b45f..6aa5e544f 100644 --- a/plugins/buildingplan/buildingplan.h +++ b/plugins/buildingplan/buildingplan.h @@ -27,6 +27,7 @@ enum FilterConfigValues { FILTER_CONFIG_TYPE = 0, FILTER_CONFIG_SUBTYPE = 1, FILTER_CONFIG_CUSTOM = 2, + FILTER_CONFIG_CHOOSE_ITEMS = 3, }; enum BuildingConfigValues { diff --git a/plugins/buildingplan/defaultitemfilters.cpp b/plugins/buildingplan/defaultitemfilters.cpp index 3c3b2f3a9..e866808f8 100644 --- a/plugins/buildingplan/defaultitemfilters.cpp +++ b/plugins/buildingplan/defaultitemfilters.cpp @@ -32,13 +32,14 @@ static int get_max_quality(const df::job_item *jitem) { } DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, const std::vector &jitems) - : key(key) { + : key(key), choose_items(false) { DEBUG(status,out).print("creating persistent data for filter key %d,%d,%d\n", std::get<0>(key), std::get<1>(key), std::get<2>(key)); filter_config = World::AddPersistentData(FILTER_CONFIG_KEY); set_config_val(filter_config, FILTER_CONFIG_TYPE, std::get<0>(key)); set_config_val(filter_config, FILTER_CONFIG_SUBTYPE, std::get<1>(key)); set_config_val(filter_config, FILTER_CONFIG_CUSTOM, std::get<2>(key)); + set_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose_items); item_filters.resize(jitems.size()); for (size_t idx = 0; idx < jitems.size(); ++idx) { item_filters[idx].setMaxQuality(get_max_quality(jitems[idx]), true); @@ -48,6 +49,7 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, BuildingTypeKey key, DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &filter_config, const std::vector &jitems) : key(getKey(filter_config)), filter_config(filter_config) { + choose_items = get_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS); auto &serialized = filter_config.val(); DEBUG(status,out).print("deserializing item filters for key %d,%d,%d: %s\n", std::get<0>(key), std::get<1>(key), std::get<2>(key), serialized.c_str()); @@ -60,6 +62,11 @@ DefaultItemFilters::DefaultItemFilters(color_ostream &out, PersistentDataItem &f item_filters = filters; } +void DefaultItemFilters::setChooseItems(bool choose) { + choose_items = choose; + set_config_bool(filter_config, FILTER_CONFIG_CHOOSE_ITEMS, choose); +} + void DefaultItemFilters::setItemFilter(DFHack::color_ostream &out, const ItemFilter &filter, int index) { if (index < 0 || item_filters.size() <= (size_t)index) { WARN(status,out).print("invalid index for filter key %d,%d,%d: %d\n", diff --git a/plugins/buildingplan/defaultitemfilters.h b/plugins/buildingplan/defaultitemfilters.h index 4d1d5cbd2..37ebdcaae 100644 --- a/plugins/buildingplan/defaultitemfilters.h +++ b/plugins/buildingplan/defaultitemfilters.h @@ -14,11 +14,14 @@ public: DefaultItemFilters(DFHack::color_ostream &out, BuildingTypeKey key, const std::vector &jitems); DefaultItemFilters(DFHack::color_ostream &out, DFHack::PersistentDataItem &filter_config, const std::vector &jitems); + void setChooseItems(bool choose); void setItemFilter(DFHack::color_ostream &out, const ItemFilter &filter, int index); + bool getChooseItems() const { return choose_items; } const std::vector & getItemFilters() const { return item_filters; } private: DFHack::PersistentDataItem filter_config; + bool choose_items; std::vector item_filters; };