Merge pull request #49803 from naithar/feature/ios-plugin-multitype-plist-4.0
[4.0] [iOS] Support multiple `plist` types in plugin
This commit is contained in:
commit
277db14b64
|
@ -367,6 +367,26 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options)
|
||||||
for (int i = 0; i < found_plugins.size(); i++) {
|
for (int i = 0; i < found_plugins.size(); i++) {
|
||||||
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "plugins/" + found_plugins[i].name), false));
|
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "plugins/" + found_plugins[i].name), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < found_plugins.size(); i++) {
|
||||||
|
// Editable plugin plist values
|
||||||
|
PluginConfigIOS plugin = found_plugins[i];
|
||||||
|
const String *K = nullptr;
|
||||||
|
|
||||||
|
while ((K = plugin.plist.next(K))) {
|
||||||
|
String key = *K;
|
||||||
|
PluginConfigIOS::PlistItem item = plugin.plist[key];
|
||||||
|
switch (item.type) {
|
||||||
|
case PluginConfigIOS::PlistItemType::STRING_INPUT: {
|
||||||
|
String preset_name = "plugins_plist/" + key;
|
||||||
|
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, preset_name), item.value));
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
plugins_changed.clear();
|
plugins_changed.clear();
|
||||||
plugins = found_plugins;
|
plugins = found_plugins;
|
||||||
|
|
||||||
|
@ -1467,13 +1487,28 @@ Error EditorExportPlatformIOS::_export_ios_plugins(const Ref<EditorExportPreset>
|
||||||
|
|
||||||
while ((K = plugin.plist.next(K))) {
|
while ((K = plugin.plist.next(K))) {
|
||||||
String key = *K;
|
String key = *K;
|
||||||
String value = plugin.plist[key];
|
PluginConfigIOS::PlistItem item = plugin.plist[key];
|
||||||
|
|
||||||
|
String value;
|
||||||
|
|
||||||
|
switch (item.type) {
|
||||||
|
case PluginConfigIOS::PlistItemType::STRING_INPUT: {
|
||||||
|
String preset_name = "plugins_plist/" + key;
|
||||||
|
String input_value = p_preset->get(preset_name);
|
||||||
|
value = "<string>" + input_value + "</string>";
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
value = item.value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (key.is_empty() || value.is_empty()) {
|
if (key.is_empty() || value.is_empty()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
plist_values[key] = value;
|
String plist_key = "<key>" + key + "</key>";
|
||||||
|
|
||||||
|
plist_values[plist_key] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CPP Code
|
// CPP Code
|
||||||
|
@ -1500,7 +1535,7 @@ Error EditorExportPlatformIOS::_export_ios_plugins(const Ref<EditorExportPreset>
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
p_config_data.plist_content += "<key>" + key + "</key><string>" + value + "</string>\n";
|
p_config_data.plist_content += key + value + "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,20 @@ struct PluginConfigIOS {
|
||||||
|
|
||||||
inline static const char *PLIST_SECTION = "plist";
|
inline static const char *PLIST_SECTION = "plist";
|
||||||
|
|
||||||
|
enum PlistItemType {
|
||||||
|
UNKNOWN,
|
||||||
|
STRING,
|
||||||
|
INTEGER,
|
||||||
|
BOOLEAN,
|
||||||
|
RAW,
|
||||||
|
STRING_INPUT,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PlistItem {
|
||||||
|
PlistItemType type;
|
||||||
|
String value;
|
||||||
|
};
|
||||||
|
|
||||||
// Set to true when the config file is properly loaded.
|
// Set to true when the config file is properly loaded.
|
||||||
bool valid_config = false;
|
bool valid_config = false;
|
||||||
bool supports_targets = false;
|
bool supports_targets = false;
|
||||||
|
@ -93,8 +107,10 @@ struct PluginConfigIOS {
|
||||||
Vector<String> linker_flags;
|
Vector<String> linker_flags;
|
||||||
|
|
||||||
// Optional plist section
|
// Optional plist section
|
||||||
// Supports only string types for now
|
// String value is default value.
|
||||||
HashMap<String, String> plist;
|
// Currently supports `string`, `boolean`, `integer`, `raw`, `string_input` types
|
||||||
|
// <name>:<type> = <value>
|
||||||
|
HashMap<String, PlistItem> plist;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline String resolve_local_dependency_path(String plugin_config_dir, String dependency_path) {
|
static inline String resolve_local_dependency_path(String plugin_config_dir, String dependency_path) {
|
||||||
|
@ -273,13 +289,68 @@ static inline PluginConfigIOS load_plugin_config(Ref<ConfigFile> config_file, co
|
||||||
config_file->get_section_keys(PluginConfigIOS::PLIST_SECTION, &keys);
|
config_file->get_section_keys(PluginConfigIOS::PLIST_SECTION, &keys);
|
||||||
|
|
||||||
for (int i = 0; i < keys.size(); i++) {
|
for (int i = 0; i < keys.size(); i++) {
|
||||||
String value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], String());
|
Vector<String> key_components = keys[i].split(":");
|
||||||
|
|
||||||
if (value.is_empty()) {
|
String key_value = "";
|
||||||
|
PluginConfigIOS::PlistItemType key_type = PluginConfigIOS::PlistItemType::UNKNOWN;
|
||||||
|
|
||||||
|
if (key_components.size() == 1) {
|
||||||
|
key_value = key_components[0];
|
||||||
|
key_type = PluginConfigIOS::PlistItemType::STRING;
|
||||||
|
} else if (key_components.size() == 2) {
|
||||||
|
key_value = key_components[0];
|
||||||
|
|
||||||
|
if (key_components[1].to_lower() == "string") {
|
||||||
|
key_type = PluginConfigIOS::PlistItemType::STRING;
|
||||||
|
} else if (key_components[1].to_lower() == "integer") {
|
||||||
|
key_type = PluginConfigIOS::PlistItemType::INTEGER;
|
||||||
|
} else if (key_components[1].to_lower() == "boolean") {
|
||||||
|
key_type = PluginConfigIOS::PlistItemType::BOOLEAN;
|
||||||
|
} else if (key_components[1].to_lower() == "raw") {
|
||||||
|
key_type = PluginConfigIOS::PlistItemType::RAW;
|
||||||
|
} else if (key_components[1].to_lower() == "string_input") {
|
||||||
|
key_type = PluginConfigIOS::PlistItemType::STRING_INPUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key_value.is_empty() || key_type == PluginConfigIOS::PlistItemType::UNKNOWN) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin_config.plist[keys[i]] = value;
|
String value;
|
||||||
|
|
||||||
|
switch (key_type) {
|
||||||
|
case PluginConfigIOS::PlistItemType::STRING: {
|
||||||
|
String raw_value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], String());
|
||||||
|
value = "<string>" + raw_value + "</string>";
|
||||||
|
} break;
|
||||||
|
case PluginConfigIOS::PlistItemType::INTEGER: {
|
||||||
|
int raw_value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], 0);
|
||||||
|
Dictionary value_dictionary;
|
||||||
|
String value_format = "<integer>$value</integer>";
|
||||||
|
value_dictionary["value"] = raw_value;
|
||||||
|
value = value_format.format(value_dictionary, "$_");
|
||||||
|
} break;
|
||||||
|
case PluginConfigIOS::PlistItemType::BOOLEAN:
|
||||||
|
if (config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], false)) {
|
||||||
|
value = "<true/>";
|
||||||
|
} else {
|
||||||
|
value = "<false/>";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PluginConfigIOS::PlistItemType::RAW: {
|
||||||
|
String raw_value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], String());
|
||||||
|
value = raw_value;
|
||||||
|
} break;
|
||||||
|
case PluginConfigIOS::PlistItemType::STRING_INPUT: {
|
||||||
|
String raw_value = config_file->get_value(PluginConfigIOS::PLIST_SECTION, keys[i], String());
|
||||||
|
value = raw_value;
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin_config.plist[key_value] = PluginConfigIOS::PlistItem{ key_type, value };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue