diff --git a/main/main.cpp b/main/main.cpp index d2ba38b0949..d8038175417 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1027,6 +1027,10 @@ Error Main::setup2() { ObjectTypeDB::set_current_api(ObjectTypeDB::API_NONE); //no more api is registered at this point + if (OS::get_singleton()->is_stdout_verbose()) { + print_line("CORE API HASH: "+itos(ObjectTypeDB::get_api_hash(ObjectTypeDB::API_CORE))); + print_line("EDITOR API HASH: "+itos(ObjectTypeDB::get_api_hash(ObjectTypeDB::API_EDITOR))); + } MAIN_PRINT("Main: Done"); return OK; diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index b3f18bf8fa0..422e1f58771 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -89,6 +89,8 @@ Size2 PopupMenu::get_minimum_size() const { size.height=font_h; } + size.width+=items[i].h_ofs; + if (items[i].checkable) { size.width+=check_w+hseparation; @@ -106,6 +108,7 @@ Size2 PopupMenu::get_minimum_size() const { accel_max_w = MAX( accel_w, accel_max_w ); } + minsize.height+=size.height; max_w = MAX( max_w, size.width ); @@ -450,6 +453,7 @@ void PopupMenu::_notification(int p_what) { float h; Size2 icon_size; + item_ofs.x+=items[i].h_ofs; if (!items[i].icon.is_null()) { icon_size = items[i].icon->get_size(); @@ -461,13 +465,13 @@ void PopupMenu::_notification(int p_what) { if (i==mouse_over) { - hover->draw(ci, Rect2( ofs+Point2(-hseparation,-vseparation), Size2( get_size().width - style->get_minimum_size().width + hseparation*2, h+vseparation*2 ) )); + hover->draw(ci, Rect2( item_ofs+Point2(-hseparation,-vseparation), Size2( get_size().width - style->get_minimum_size().width + hseparation*2, h+vseparation*2 ) )); } if (items[i].separator) { int sep_h=separator->get_center_size().height+separator->get_minimum_size().height; - separator->draw(ci, Rect2( ofs+Point2(0,Math::floor((h-sep_h)/2.0)), Size2( get_size().width - style->get_minimum_size().width , sep_h ) )); + separator->draw(ci, Rect2( item_ofs+Point2(0,Math::floor((h-sep_h)/2.0)), Size2( get_size().width - style->get_minimum_size().width , sep_h ) )); } @@ -819,6 +823,15 @@ void PopupMenu::set_item_shortcut(int p_idx, const Ref& p_shortcut) { update(); } +void PopupMenu::set_item_h_offset(int p_idx, int p_offset) { + + ERR_FAIL_INDEX(p_idx,items.size()); + items[p_idx].h_ofs=p_offset; + update(); + +} + + bool PopupMenu::is_item_checkable(int p_idx) const { ERR_FAIL_INDEX_V(p_idx,items.size(),false); return items[p_idx].checkable; diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h index f35e91d4e4d..50ba3a2569b 100644 --- a/scene/gui/popup_menu.h +++ b/scene/gui/popup_menu.h @@ -54,9 +54,10 @@ class PopupMenu : public Popup { String tooltip; uint32_t accel; int _ofs_cache; + int h_ofs; Ref shortcut; - Item() { checked=false; checkable=false; separator=false; accel=0; disabled=false; _ofs_cache=0; } + Item() { checked=false; checkable=false; separator=false; accel=0; disabled=false; _ofs_cache=0; h_ofs=0; } }; @@ -115,6 +116,7 @@ public: void set_item_as_checkable(int p_idx, bool p_checkable); void set_item_tooltip(int p_idx,const String& p_tooltip); void set_item_shortcut(int p_idx, const Ref& p_shortcut); + void set_item_h_offset(int p_idx, int p_offset); String get_item_text(int p_idx) const; Ref get_item_icon(int p_idx) const; diff --git a/tools/editor/editor_path.cpp b/tools/editor/editor_path.cpp index 6b804b6a240..e7feb1afd32 100644 --- a/tools/editor/editor_path.cpp +++ b/tools/editor/editor_path.cpp @@ -27,21 +27,94 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "editor_path.h" +#include "editor_scale.h" +#include "editor_node.h" +void EditorPath::_add_children_to_popup(Object* p_obj,int p_depth) { + + if (p_depth>8) + return; + + List pinfo; + p_obj->get_property_list(&pinfo); + for (List::Element *E=pinfo.front();E;E=E->next()) { + + if (!(E->get().usage&PROPERTY_USAGE_EDITOR)) + continue; + if (E->get().hint!=PROPERTY_HINT_RESOURCE_TYPE) + continue; + + Variant value = p_obj->get(E->get().name); + if (value.get_type()!=Variant::OBJECT) + continue; + Object *obj = value; + if (!obj) + continue; + + Ref icon; + + if (has_icon(obj->get_type(),"EditorIcons")) + icon=get_icon(obj->get_type(),"EditorIcons"); + else + icon=get_icon("Object","EditorIcons"); + + int index = popup->get_item_count(); + popup->add_icon_item(icon,E->get().name.capitalize(),objects.size()); + popup->set_item_h_offset(index,p_depth*10*EDSCALE); + objects.push_back(obj->get_instance_ID()); + + _add_children_to_popup(obj,p_depth+1); + } +} + +void EditorPath::_input_event(const InputEvent& p_event) { + + if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==BUTTON_LEFT && p_event.mouse_button.pressed) { + + + Object *obj = ObjectDB::get_instance(history->get_path_object( history->get_path_size()-1)); + if (!obj) + return; + + + + objects.clear(); + popup->clear(); + _add_children_to_popup(obj); + popup->set_pos( get_global_pos() + Vector2(0,get_size().height)); + popup->set_size( Size2(get_size().width,1)); + popup->popup(); + } +} void EditorPath::_notification(int p_what) { switch(p_what) { + case NOTIFICATION_MOUSE_ENTER: { + mouse_over=true; + update(); + } break; + case NOTIFICATION_MOUSE_EXIT: { + mouse_over=false; + update(); + } break; case NOTIFICATION_DRAW: { RID ci=get_canvas_item(); Ref label_font = get_font("font","Label"); Size2i size = get_size(); Ref sn = get_icon("SmallNext","EditorIcons"); + Ref sb = get_stylebox("pressed","Button"); + + + int ofs=sb->get_margin(MARGIN_LEFT); + + if (mouse_over) { + draw_style_box(sb,Rect2(Point2(),get_size())); + } - int ofs=5; for(int i=0;iget_path_size();i++) { Object *obj = ObjectDB::get_instance(history->get_path_object(i)); @@ -108,11 +181,34 @@ void EditorPath::_notification(int p_what) { void EditorPath::update_path() { + update(); } +void EditorPath::_popup_select(int p_idx) { + + ERR_FAIL_INDEX(p_idx,objects.size()); + + Object* obj = ObjectDB::get_instance(objects[p_idx]); + if (!obj) + return; + + EditorNode::get_singleton()->push_item(obj); +} + +void EditorPath::_bind_methods() { + + ObjectTypeDB::bind_method("_input_event",&EditorPath::_input_event); + ObjectTypeDB::bind_method("_popup_select",&EditorPath::_popup_select); +} + EditorPath::EditorPath(EditorHistory *p_history) { history=p_history; + mouse_over=false; + popup = memnew( PopupMenu ); + popup->connect("item_pressed",this,"_popup_select"); + add_child(popup); + } diff --git a/tools/editor/editor_path.h b/tools/editor/editor_path.h index 11e1005ba38..7f51a5dc481 100644 --- a/tools/editor/editor_path.h +++ b/tools/editor/editor_path.h @@ -30,6 +30,7 @@ #define EDITOR_PATH_H #include "scene/gui/control.h" +#include "scene/gui/popup_menu.h" #include "editor_data.h" class EditorPath : public Control { @@ -39,10 +40,17 @@ class EditorPath : public Control { EditorHistory *history; + Vector objects; + PopupMenu *popup; + bool mouse_over; EditorPath(); + void _popup_select(int p_idx); + void _input_event(const InputEvent& p_event); + void _add_children_to_popup(Object* p_obj,int p_depth=0); protected: + static void _bind_methods(); void _notification(int p_what); public: