Dictionary editing support in inspector

This commit is contained in:
Juan Linietsky
2018-05-19 17:57:44 -03:00
parent eded061668
commit 9b567cc549
5 changed files with 613 additions and 3 deletions
+26
View File
@@ -50,6 +50,32 @@ void Dictionary::get_key_list(List<Variant> *p_keys) const {
}
}
Variant Dictionary::get_key_at_index(int p_index) const {
int index = 0;
for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) {
if (index == p_index) {
return E.key();
}
index++;
}
return Variant();
}
Variant Dictionary::get_value_at_index(int p_index) const {
int index = 0;
for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) {
if (index == p_index) {
return E.value();
}
index++;
}
return Variant();
}
Variant &Dictionary::operator[](const Variant &p_key) {
return _p->variant_map[p_key];
+2
View File
@@ -47,6 +47,8 @@ class Dictionary {
public:
void get_key_list(List<Variant> *p_keys) const;
Variant get_key_at_index(int p_index) const;
Variant get_value_at_index(int p_index) const;
Variant &operator[](const Variant &p_key);
const Variant &operator[](const Variant &p_key) const;
+2
View File
@@ -2648,6 +2648,8 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break;
case Variant::DICTIONARY: {
EditorPropertyDictionary *editor = memnew(EditorPropertyDictionary);
add_property_editor(p_path, editor);
} break;
case Variant::ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
File diff suppressed because it is too large Load Diff
+58
View File
@@ -22,6 +22,31 @@ public:
EditorPropertyArrayObject();
};
class EditorPropertyDictionaryObject : public Reference {
GDCLASS(EditorPropertyDictionaryObject, Reference);
Variant new_item_key;
Variant new_item_value;
Dictionary dict;
protected:
bool _set(const StringName &p_name, const Variant &p_value);
bool _get(const StringName &p_name, Variant &r_ret) const;
public:
void set_dict(const Dictionary &p_dict);
Dictionary get_dict();
void set_new_item_key(const Variant &p_new_item);
Variant get_new_item_key();
void set_new_item_value(const Variant &p_new_item);
Variant get_new_item_value();
EditorPropertyDictionaryObject();
};
class EditorPropertyArray : public EditorProperty {
GDCLASS(EditorPropertyArray, EditorProperty)
@@ -54,4 +79,37 @@ public:
EditorPropertyArray();
};
class EditorPropertyDictionary : public EditorProperty {
GDCLASS(EditorPropertyDictionary, EditorProperty)
PopupMenu *change_type;
bool updating;
Ref<EditorPropertyDictionaryObject> object;
int page_len;
int page_idx;
int changing_type_idx;
Button *edit;
VBoxContainer *vbox;
EditorSpinSlider *length;
EditorSpinSlider *page;
HBoxContainer *page_hb;
void _page_changed(double p_page);
void _edit_pressed();
void _property_changed(const String &p_prop, Variant p_value);
void _change_type(Object *p_button, int p_index);
void _change_type_menu(int p_index);
void _add_key_value();
protected:
static void _bind_methods();
void _notification(int p_what);
public:
virtual void update_property();
EditorPropertyDictionary();
};
#endif // EDITOR_PROPERTIES_ARRAY_DICT_H