Fixed shortcut saving and 'original' comparisons

This commit is contained in:
Eric M 2021-10-13 12:33:53 +10:00
parent 6f1d2133bb
commit 7e435fa841
2 changed files with 20 additions and 15 deletions

View File

@ -140,32 +140,37 @@ bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const {
if (p_name == "shortcuts") {
Array save_array;
const OrderedHashMap<String, List<Ref<InputEvent>>> &builtin_list = InputMap::get_singleton()->get_builtins();
for (const KeyValue<String, Ref<Shortcut>> &shortcut_definition : shortcuts) {
Ref<Shortcut> sc = shortcut_definition.value;
if (builtin_action_overrides.has(shortcut_definition.key)) {
if (builtin_list.has(shortcut_definition.key)) {
// This shortcut was auto-generated from built in actions: don't save.
// If the builtin is overriden, it will be saved in the "builtin_action_overrides" section below.
continue;
}
if (optimize_save) {
if (!sc->has_meta("original")) {
continue; //this came from settings but is not any longer used
}
Array shortcut_events = sc->get_events();
Dictionary dict;
dict["name"] = shortcut_definition.key;
dict["shortcuts"] = shortcut_events;
if (!sc->has_meta("original")) {
// Getting the meta when it doesn't exist will return an empty array. If the 'shortcut_events' have been cleared,
// we still want save the shortcut in this case so that shortcuts that the user has customised are not reset,
// even if the 'original' has not been populated yet. This can happen when calling save() from the Project Manager.
save_array.push_back(dict);
continue;
}
Array original_events = sc->get_meta("original");
Array shortcut_events = sc->get_events();
bool is_same = Shortcut::is_event_array_equal(original_events, shortcut_events);
if (is_same) {
continue; // Not changed from default; don't save.
}
Dictionary dict;
dict["name"] = shortcut_definition.key;
dict["shortcuts"] = shortcut_events;
save_array.push_back(dict);
}
r_ret = save_array;
@ -1511,7 +1516,7 @@ void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, c
// Directly override the existing shortcut.
sc->set_events(events);
sc->set_meta("original", events);
sc->set_meta("original", events.duplicate(true));
}
Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, Key p_keycode) {
@ -1545,21 +1550,21 @@ Ref<Shortcut> ED_SHORTCUT_ARRAY(const String &p_path, const String &p_name, cons
sc.instantiate();
sc->set_name(p_name);
sc->set_events(events);
sc->set_meta("original", events);
sc->set_meta("original", events.duplicate(true));
return sc;
}
Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(p_path);
if (sc.is_valid()) {
sc->set_name(p_name); //keep name (the ones that come from disk have no name)
sc->set_meta("original", events); //to compare against changes
sc->set_meta("original", events.duplicate(true)); //to compare against changes
return sc;
}
sc.instantiate();
sc->set_name(p_name);
sc->set_events(events);
sc->set_meta("original", events); //to compare against changes
sc->set_meta("original", events.duplicate(true)); //to compare against changes
EditorSettings::get_singleton()->add_shortcut(p_path, sc);
return sc;

View File

@ -433,7 +433,7 @@ void EditorSettingsDialog::_update_shortcuts() {
}
Array original = sc->get_meta("original");
Array shortcuts_array = sc->get_events();
Array shortcuts_array = sc->get_events().duplicate(true);
bool same_as_defaults = Shortcut::is_event_array_equal(original, shortcuts_array);
bool collapse = !collapsed.has(E) || (collapsed.has(E) && collapsed[E]);