diff options
Diffstat (limited to 'scene/gui/tree.h')
| -rw-r--r-- | scene/gui/tree.h | 464 |
1 files changed, 464 insertions, 0 deletions
diff --git a/scene/gui/tree.h b/scene/gui/tree.h new file mode 100644 index 000000000..3ffbececb --- /dev/null +++ b/scene/gui/tree.h @@ -0,0 +1,464 @@ +/*************************************************************************/ +/* tree.h */ +/*************************************************************************/ +/* 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. */ +/*************************************************************************/ +#ifndef TREE_H +#define TREE_H + +#include "scene/gui/control.h" +#include "scene/gui/popup_menu.h" +#include "scene/gui/line_edit.h" +#include "scene/gui/scroll_bar.h" +#include "scene/gui/slider.h" + +/** + @author Juan Linietsky <reduzio@gmail.com> +*/ + + +class Tree; + +class TreeItem : public Object { + + OBJ_TYPE(TreeItem,Object); +public: + + enum TreeCellMode { + + CELL_MODE_STRING, ///< just a string + CELL_MODE_CHECK, ///< string + check + CELL_MODE_RANGE, ///< Contains a range + CELL_MODE_ICON, ///< Contains a icon, not editable + CELL_MODE_CUSTOM, ///< Contains a custom value, show a string, and an edit button + }; + +private: +friend class Tree; + + + struct Cell { + + TreeCellMode mode; + + Ref<Texture> icon; + Rect2i icon_region; + String text; + double min,max,step,val; + int icon_max_w; + bool expr; + bool checked; + bool editable; + bool selected; + bool selectable; + bool custom_color; + Color color; + bool custom_bg_color; + Color bg_color; + Variant meta; + String tooltip; + + ObjectID custom_draw_obj; + StringName custom_draw_callback; + + struct Button { + int id; + Ref<Texture> texture; + Button() { id=0; } + }; + + Vector< Button > buttons; + + Cell() { + + custom_draw_obj=0; + mode=TreeItem::CELL_MODE_STRING; + min=0; + max=100; + step=1; + val=0; + checked=false; + editable=false; + selected=false; + selectable=true; + custom_color=false; + custom_bg_color=false; + expr=false; + icon_max_w=0; + } + + + Size2 get_icon_size() const; + void draw_icon(const RID& p_where, const Point2& p_pos, const Size2& p_size=Size2()) const; + + }; + + Vector<Cell> cells; + + bool collapsed; // wont show childs + + TreeItem *parent; // parent item + TreeItem *next; // next in list + TreeItem *childs; //child items + Tree *tree; //tree (for reference) + + + + TreeItem(Tree *p_tree); + + + void _changed_notify(int p_cell); + void _changed_notify(); + void _cell_selected(int p_cell); + void _cell_deselected(int p_cell); +protected: + + static void _bind_methods(); + //bind helpers + Dictionary _get_range_config( int p_column ) { + Dictionary d; + double min,max,step; + get_range_config(p_column,min,max,step); + d["min"]=min; + d["max"]=max; + d["step"]=step; + d["expr"]=false; + + return d; + } + void _remove_child(Object *p_child) { remove_child( p_child->cast_to<TreeItem>() ); } +public: + + /* cell mode */ + void set_cell_mode( int p_column, TreeCellMode p_mode ); + TreeCellMode get_cell_mode( int p_column ) const; + + /* check mode */ + void set_checked(int p_column,bool p_checked); + bool is_checked(int p_column) const; + + void set_text(int p_column,String p_text); + String get_text(int p_column) const; + + void set_icon(int p_column,const Ref<Texture>& p_icon); + Ref<Texture> get_icon(int p_column) const; + + void set_icon_region(int p_column,const Rect2& p_icon_region); + Rect2 get_icon_region(int p_column) const; + + void set_icon_max_width(int p_column,int p_max); + int get_icon_max_width(int p_column) const; + + void add_button(int p_column,const Ref<Texture>& p_button,int p_id=-1); + int get_button_count(int p_column) const; + Ref<Texture> get_button(int p_column,int p_idx) const; + int get_button_id(int p_column,int p_idx) const; + void erase_button(int p_column,int p_idx); + int get_button_by_id(int p_column,int p_id) const; + void set_button(int p_column,int p_idx,const Ref<Texture>& p_button); + + /* range works for mode number or mode combo */ + + void set_range(int p_column,double p_value); + double get_range(int p_column) const; + + void set_range_config(int p_column,double p_min,double p_max,double p_step,bool p_exp=false); + void get_range_config(int p_column,double& r_min,double& r_max,double &r_step) const; + bool is_range_exponential(int p_column) const; + + void set_metadata(int p_column,const Variant& p_meta); + Variant get_metadata(int p_column) const; + + void set_custom_draw(int p_column,Object *p_object,const StringName& p_callback); + + void set_collapsed(bool p_collapsed); + bool is_collapsed(); + + TreeItem *get_prev(); + TreeItem *get_next(); + TreeItem *get_parent(); + TreeItem *get_children(); + + TreeItem *get_prev_visible(); + TreeItem *get_next_visible(); + + void remove_child(TreeItem *p_item); + + void set_selectable(int p_column,bool p_selectable); + bool is_selectable(int p_column) const; + + bool is_selected(int p_column); + void select(int p_column); + void deselect(int p_column); + void set_as_cursor(int p_column); + + void set_editable(int p_column,bool p_editable); + bool is_editable(int p_column); + + void set_custom_color(int p_column,const Color& p_color); + void clear_custom_color(int p_column); + + void set_custom_bg_color(int p_column,const Color& p_color); + void clear_custom_bg_color(int p_column); + Color get_custom_bg_color(int p_column) const; + + void set_tooltip(int p_column, const String& p_tooltip); + String get_tooltip(int p_column) const; + + void clear_children(); + + void move_to_top(); + void move_to_bottom(); + + ~TreeItem(); + +}; + + +VARIANT_ENUM_CAST( TreeItem::TreeCellMode ); + + +class Tree : public Control { + + OBJ_TYPE( Tree, Control ); +public: + enum SelectMode { + SELECT_SINGLE, + SELECT_ROW, + SELECT_MULTI + }; + +private: +friend class TreeItem; + + TreeItem *root; + TreeItem *popup_edited_item; + TreeItem *selected_item; + TreeItem *edited_item; + int pressed_button; + + //TreeItem *cursor_item; + //int cursor_column; + + Rect2 custom_popup_rect; + int edited_col; + int selected_col; + int popup_edited_item_col; + bool hide_root; + SelectMode select_mode; + + int blocked; + + struct ColumnInfo { + + int min_width; + bool expand; + String title; + ColumnInfo() { min_width=1; expand=true; } + }; + + bool show_column_titles; + LineEdit *text_editor; + HSlider *value_editor; + bool updating_value_editor; + uint32_t focus_in_id; + PopupMenu *popup_menu; + + Vector<ColumnInfo> columns; + + int compute_item_height(TreeItem *p_item) const; + int get_item_height(TreeItem *p_item) const; +// void draw_item_text(String p_text,const Ref<Texture>& p_icon,int p_icon_max_w,bool p_tool,Rect2i p_rect,const Color& p_color); + void draw_item_rect(const TreeItem::Cell& p_cell,const Rect2i& p_rect,const Color& p_color); + int draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2& p_draw_size,TreeItem *p_item); + void select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col,TreeItem *p_prev=NULL,bool *r_in_range=NULL); + int propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_doubleclick,TreeItem *p_item,int p_button,const InputModifierState& p_mod); + void text_editor_enter(String p_text); + void value_editor_changed(double p_value); + + void popup_select(int p_option); + + void _input_event(InputEvent p_event); + void _notification(int p_what); + + Size2 get_minimum_size() const; + + void item_edited(int p_column,TreeItem *p_item); + void item_changed(int p_column,TreeItem *p_item); + void item_selected(int p_column,TreeItem *p_item); + void item_deselected(int p_column,TreeItem *p_item); + + void propagate_set_columns(TreeItem *p_item); + + struct Cache { + + Ref<Font> font; + Ref<Font> tb_font; + Ref<StyleBox> bg; + Ref<StyleBox> selected; + Ref<StyleBox> selected_focus; + Ref<StyleBox> cursor; + Ref<StyleBox> cursor_unfocus; + Ref<StyleBox> button_pressed; + Ref<StyleBox> title_button; + Ref<StyleBox> title_button_hover; + Ref<StyleBox> title_button_pressed; + Color title_button_color; + + Ref<Texture> checked; + Ref<Texture> unchecked; + Ref<Texture> arrow_collapsed; + Ref<Texture> arrow; + Ref<Texture> select_arrow; + Ref<Texture> updown; + + Color font_color; + Color font_color_selected; + Color guide_color; + int hseparation; + int vseparation; + int item_margin; + int guide_width; + int button_margin; + Point2 offset; + + enum ClickType { + CLICK_NONE, + CLICK_TITLE, + CLICK_BUTTON, + + }; + + ClickType click_type; + ClickType hover_type; + int click_index; + int click_id; + TreeItem *click_item; + int click_column; + int hover_index; + + } cache; + + + int _get_title_button_height() const; + + void _scroll_moved(float p_value); + HScrollBar *h_scroll; + VScrollBar *v_scroll; + + Size2 get_internal_min_size() const; + void update_cache(); + void update_scrollbars(); + + Rect2 search_item_rect(TreeItem *p_from, TreeItem *p_item); + //Rect2 get_item_rect(TreeItem *p_item); + uint64_t last_keypress; + String incr_search; + bool cursor_can_exit_tree; + void _do_incr_search(const String& p_add); + + TreeItem* _search_item_text(TreeItem *p_at, const String& p_find,int *r_col,bool p_selectable,bool p_backwards=false); + + TreeItem* _find_item_at_pos(TreeItem *p_current, const Point2& p_pos,int& r_column,int &h) const; + +/* float drag_speed; + float drag_accum; + + float last_drag_accum; + float last_drag_time; + float time_since_motion;*/ + + float drag_speed; + float drag_from; + float drag_accum; + Vector2 last_speed; + bool drag_touching; + bool drag_touching_deaccel; + bool click_handled; + +protected: + static void _bind_methods(); + + //bind helpers + Object* _create_item(Object *p_parent) { return create_item(p_parent->cast_to<TreeItem>() ); } + TreeItem *_get_next_selected(Object *p_item) { return get_next_selected(p_item->cast_to<TreeItem>() ); } + Rect2 _get_item_rect(Object *p_item,int p_column) const { return get_item_rect(p_item->cast_to<TreeItem>(),p_column ); } +public: + + virtual String get_tooltip(const Point2& p_pos) const; + + void clear(); + + TreeItem* create_item(TreeItem *p_parent=0); + TreeItem* get_root(); + TreeItem* get_last_item(); + + void set_column_min_width(int p_column,int p_min_width); + void set_column_expand(int p_column,bool p_expand); + int get_column_width(int p_column) const; + + void set_hide_root(bool p_eanbled); + TreeItem *get_next_selected( TreeItem* p_item); + TreeItem *get_selected() const; + int get_selected_column() const; + int get_pressed_button() const; + void set_select_mode(SelectMode p_mode); + + void set_columns(int p_columns); + int get_columns() const; + + void set_column_title(int p_column,const String& p_title); + String get_column_title(int p_column) const; + + void set_column_titles_visible(bool p_show); + bool are_column_titles_visible() const; + + TreeItem *get_edited() const; + int get_edited_column() const; + + void ensure_cursor_is_visible(); + + Rect2 get_custom_popup_rect() const; + + int get_item_offset(TreeItem *p_item) const; + Rect2 get_item_rect(TreeItem *p_item,int p_column=-1) const; + bool edit_selected(); + + TreeItem* search_item_text(const String& p_find,int *r_col=NULL,bool p_selectable=false); + + Point2 get_scroll() const; + + void set_cursor_can_exit_tree(bool p_enable); + bool can_cursor_exit_tree() const; + + Tree(); + ~Tree(); + +}; + +VARIANT_ENUM_CAST( Tree::SelectMode ); +#endif + |
