Improve implementation of builtin action overrides

This commit is contained in:
Eric M 2021-08-06 16:30:15 +10:00
parent 82c12060b2
commit 28b7c1be80
4 changed files with 55 additions and 21 deletions

View file

@ -33,6 +33,7 @@
#include "core/config/project_settings.h"
#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "core/os/os.h"
InputMap *InputMap::singleton = nullptr;
@ -699,34 +700,57 @@ const OrderedHashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() {
return default_builtin_cache;
}
void InputMap::load_default() {
const OrderedHashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins_with_feature_overrides_applied() {
if (default_builtin_with_overrides_cache.size() > 0) {
return default_builtin_with_overrides_cache;
}
OrderedHashMap<String, List<Ref<InputEvent>>> builtins = get_builtins();
// List of Builtins which have an override for macOS.
Vector<String> macos_builtins;
// Get a list of all built in inputs which are valid overrides for the OS
// Key = builtin name (e.g. ui_accept)
// Value = override/feature names (e.g. macos, if it was defined as "ui_accept.macos" and the platform supports that feature)
Map<String, Vector<String>> builtins_with_overrides;
for (OrderedHashMap<String, List<Ref<InputEvent>>>::Element E = builtins.front(); E; E = E.next()) {
if (String(E.key()).ends_with(".macos")) {
// Strip .macos from name: some_input_name.macos -> some_input_name
macos_builtins.push_back(String(E.key()).split(".")[0]);
String fullname = E.key();
Vector<String> split = fullname.split(".");
String name = split[0];
String override_for = split.size() > 1 ? split[1] : String();
if (override_for != String() && OS::get_singleton()->has_feature(override_for)) {
builtins_with_overrides[name].push_back(override_for);
}
}
for (OrderedHashMap<String, List<Ref<InputEvent>>>::Element E = builtins.front(); E; E = E.next()) {
String fullname = E.key();
String name = fullname.split(".")[0];
String override_for = fullname.split(".").size() > 1 ? fullname.split(".")[1] : "";
#ifdef APPLE_STYLE_KEYS
if (macos_builtins.has(name) && override_for != "macos") {
// Name has `macos` builtin but this particular one is for non-macOS systems - so skip.
Vector<String> split = fullname.split(".");
String name = split[0];
String override_for = split.size() > 1 ? split[1] : String();
if (builtins_with_overrides.has(name) && override_for == String()) {
// Builtin has an override but this particular one is not an override, so skip.
continue;
}
#else
if (override_for == "macos") {
// Override for macOS - not needed on non-macOS platforms.
if (override_for != String() && !OS::get_singleton()->has_feature(override_for)) {
// OS does not support this override - skip.
continue;
}
#endif
default_builtin_with_overrides_cache.insert(name, E.value());
}
return default_builtin_with_overrides_cache;
}
void InputMap::load_default() {
OrderedHashMap<String, List<Ref<InputEvent>>> builtins = get_builtins_with_feature_overrides_applied();
for (OrderedHashMap<String, List<Ref<InputEvent>>>::Element E = builtins.front(); E; E = E.next()) {
String name = E.key();
add_action(name);

View file

@ -56,6 +56,7 @@ private:
mutable OrderedHashMap<StringName, Action> input_map;
OrderedHashMap<String, List<Ref<InputEvent>>> default_builtin_cache;
OrderedHashMap<String, List<Ref<InputEvent>>> default_builtin_with_overrides_cache;
List<Ref<InputEvent>>::Element *_find_event(Action &p_action, const Ref<InputEvent> &p_event, bool p_exact_match = false, bool *p_pressed = nullptr, float *p_strength = nullptr, float *p_raw_strength = nullptr) const;
@ -93,6 +94,7 @@ public:
String get_builtin_display_name(const String &p_name) const;
// Use an Ordered Map so insertion order is preserved. We want the elements to be 'grouped' somewhat.
const OrderedHashMap<String, List<Ref<InputEvent>>> &get_builtins();
const OrderedHashMap<String, List<Ref<InputEvent>>> &get_builtins_with_feature_overrides_applied();
InputMap();
~InputMap();