diff options
author | Juan Linietsky <reduzio@gmail.com> | 2014-02-09 22:10:30 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2014-02-09 22:10:30 -0300 |
commit | 0b806ee0fc9097fa7bda7ac0109191c9c5e0a1ac (patch) | |
tree | 276c4d099e178eb67fbd14f61d77b05e3808e9e3 /scene/gui/menu_button.cpp | |
parent | 0e49da1687bc8192ed210947da52c9e5c5f301bb (diff) | |
download | redot-engine-0b806ee0fc9097fa7bda7ac0109191c9c5e0a1ac.tar.gz |
GODOT IS OPEN SOURCE
Diffstat (limited to 'scene/gui/menu_button.cpp')
-rw-r--r-- | scene/gui/menu_button.cpp | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/scene/gui/menu_button.cpp b/scene/gui/menu_button.cpp new file mode 100644 index 0000000000..4d1609bef9 --- /dev/null +++ b/scene/gui/menu_button.cpp @@ -0,0 +1,153 @@ +/*************************************************************************/ +/* menu_button.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "menu_button.h" +#include "os/keyboard.h" + + +void MenuButton::_unhandled_key_input(InputEvent p_event) { + + //check accelerators + + if (p_event.type==InputEvent::KEY && p_event.key.pressed) { + + if (!get_parent() || !is_visible() || is_disabled()) + return; + + uint32_t code=p_event.key.scancode; + if (code==0) + code=p_event.key.unicode; + + if (p_event.key.mod.control) + code|=KEY_MASK_CTRL; + if (p_event.key.mod.alt) + code|=KEY_MASK_ALT; + if (p_event.key.mod.meta) + code|=KEY_MASK_META; + if (p_event.key.mod.shift) + code|=KEY_MASK_SHIFT; + + + int item = popup->find_item_by_accelerator(code); + if (item>=0 && ! popup->is_item_disabled(item)) + popup->activate_item(item); + /* + for(int i=0;i<items.size();i++) { + + + if (items[i].accel==0) + continue; + + if (items[i].accel==code) { + + emit_signal("item_pressed",items[i].ID); + } + }*/ + } + +} + + +void MenuButton::pressed() { + + emit_signal("about_to_show"); + Size2 size=get_size(); + + Point2 gp = get_global_pos(); + popup->set_global_pos( gp + Size2( 0, size.height ) ); + popup->set_size( Size2( size.width, 0) ); + popup->set_parent_rect( Rect2(Point2(gp-popup->get_global_pos()),get_size())); + popup->popup(); + popup->call_deferred("grab_click_focus"); + +} + +void MenuButton::_input_event(InputEvent p_event) { + + /*if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==BUTTON_LEFT) { + clicked=p_event.mouse_button.pressed; + } + if (clicked && p_event.type==InputEvent::MOUSE_MOTION && popup->is_visible()) { + + Point2 gt = Point2(p_event.mouse_motion.x,p_event.mouse_motion.y); + gt = get_global_transform().xform(gt); + Point2 lt = popup->get_transform().affine_inverse().xform(gt); + if (popup->has_point(lt)) { + //print_line("HAS POINT!!!"); + popup->call_deferred("grab_click_focus"); + } + + }*/ + + BaseButton::_input_event(p_event); +} + +PopupMenu *MenuButton::get_popup() { + + return popup; +} + +Array MenuButton::_get_items() const { + + return popup->get("items"); +} +void MenuButton::_set_items(const Array& p_items) { + + popup->set("items",p_items); +} + +void MenuButton::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("get_popup"),&MenuButton::get_popup); + ObjectTypeDB::bind_method(_MD("_unhandled_key_input"),&MenuButton::_unhandled_key_input); + ObjectTypeDB::bind_method(_MD("_set_items"),&MenuButton::_set_items); + ObjectTypeDB::bind_method(_MD("_get_items"),&MenuButton::_get_items); + + ADD_PROPERTY( PropertyInfo(Variant::ARRAY,"items",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR), _SCS("_set_items"),_SCS("_get_items") ); + + ADD_SIGNAL( MethodInfo("about_to_show") ); +} +MenuButton::MenuButton() { + + + set_flat(true); + set_focus_mode(FOCUS_NONE); + popup = memnew( PopupMenu ); + popup->hide(); + add_child(popup); + popup->set_as_toplevel(true); + add_to_group("unhandled_key_input"); + set_click_on_press(true); +} + + +MenuButton::~MenuButton() { + +} + + |