summaryrefslogtreecommitdiff
path: root/scene/gui/tree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui/tree.cpp')
-rw-r--r--scene/gui/tree.cpp486
1 files changed, 283 insertions, 203 deletions
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index 6c15f1cae4..16a12fe407 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -31,7 +31,7 @@
#include "os/os.h"
#include "os/keyboard.h"
#include "globals.h"
-
+#include "os/input.h"
@@ -70,6 +70,7 @@ Size2 TreeItem::Cell::get_icon_size() const {
else
return icon_region.size;
}
+
void TreeItem::Cell::draw_icon(const RID& p_where, const Point2& p_pos, const Size2& p_size) const{
if (icon.is_null())
@@ -120,7 +121,7 @@ void TreeItem::set_cell_mode( int p_column, TreeCellMode p_mode ) {
c.val=0;
c.checked=false;
c.icon=Ref<Texture>();
- c.text="";
+ c.text="";
c.icon_max_w=0;
_changed_notify(p_column);
}
@@ -152,9 +153,9 @@ void TreeItem::set_text(int p_column,String p_text) {
ERR_FAIL_INDEX( p_column, cells.size() );
cells[p_column].text=p_text;
-
+
if (cells[p_column].mode==TreeItem::CELL_MODE_RANGE) {
-
+
cells[p_column].min=0;
cells[p_column].max=p_text.get_slice_count(",");
cells[p_column].step=0;
@@ -224,7 +225,7 @@ void TreeItem::set_range(int p_column,double p_value) {
p_value=cells[p_column].min;
if (p_value>cells[p_column].max)
p_value=cells[p_column].max;
-
+
cells[p_column].val=p_value;
_changed_notify(p_column);
@@ -236,7 +237,7 @@ double TreeItem::get_range(int p_column) const {
return cells[p_column].val;
}
-
+
bool TreeItem::is_range_exponential(int p_column) const {
ERR_FAIL_INDEX_V( p_column, cells.size(), false);
@@ -303,7 +304,7 @@ void TreeItem::set_collapsed(bool p_collapsed) {
if (tree->select_mode==Tree::SELECT_MULTI) {
- tree->selected_item=this;
+ tree->selected_item=this;
emit_signal("cell_selected");
} else {
@@ -336,11 +337,11 @@ TreeItem *TreeItem::get_prev() {
if (!parent || parent->childs==this)
return NULL;
-
+
TreeItem *prev = parent->childs;
while(prev && prev->next!=this)
prev=prev->next;
-
+
return prev;
}
@@ -635,14 +636,14 @@ void TreeItem::_bind_methods() {
ObjectTypeDB::bind_method(_MD("get_range","column"),&TreeItem::get_range);
ObjectTypeDB::bind_method(_MD("set_range_config","column","min","max","step","expr"),&TreeItem::set_range_config,DEFVAL(false));
ObjectTypeDB::bind_method(_MD("get_range_config","column"),&TreeItem::_get_range_config);
-
+
ObjectTypeDB::bind_method(_MD("set_metadata","column","meta"),&TreeItem::set_metadata);
ObjectTypeDB::bind_method(_MD("get_metadata","column"),&TreeItem::get_metadata);
ObjectTypeDB::bind_method(_MD("set_custom_draw","column","object","callback"),&TreeItem::set_custom_draw);
ObjectTypeDB::bind_method(_MD("set_collapsed","enable"),&TreeItem::set_collapsed);
- ObjectTypeDB::bind_method(_MD("is_collapsed"),&TreeItem::is_collapsed);
+ ObjectTypeDB::bind_method(_MD("is_collapsed"),&TreeItem::is_collapsed);
ObjectTypeDB::bind_method(_MD("get_next:TreeItem"),&TreeItem::get_next);
ObjectTypeDB::bind_method(_MD("get_prev:TreeItem"),&TreeItem::get_prev);
@@ -653,17 +654,17 @@ void TreeItem::_bind_methods() {
ObjectTypeDB::bind_method(_MD("get_prev_visible:TreeItem"),&TreeItem::get_prev_visible);
ObjectTypeDB::bind_method(_MD("remove_child:TreeItem","child"),&TreeItem::_remove_child);
-
+
ObjectTypeDB::bind_method(_MD("set_selectable","column","selectable"),&TreeItem::set_selectable);
ObjectTypeDB::bind_method(_MD("is_selectable","column"),&TreeItem::is_selectable);
ObjectTypeDB::bind_method(_MD("is_selected","column"),&TreeItem::is_selected);
ObjectTypeDB::bind_method(_MD("select","column"),&TreeItem::select);
ObjectTypeDB::bind_method(_MD("deselect","column"),&TreeItem::deselect);
-
+
ObjectTypeDB::bind_method(_MD("set_editable","column","enabled"),&TreeItem::set_editable);
ObjectTypeDB::bind_method(_MD("is_editable","column"),&TreeItem::is_editable);
-
+
ObjectTypeDB::bind_method(_MD("set_custom_color","column","color"),&TreeItem::set_custom_color);
ObjectTypeDB::bind_method(_MD("clear_custom_color","column"),&TreeItem::clear_custom_color);
@@ -687,7 +688,7 @@ void TreeItem::_bind_methods() {
BIND_CONSTANT( CELL_MODE_RANGE );
BIND_CONSTANT( CELL_MODE_ICON );
BIND_CONSTANT( CELL_MODE_CUSTOM );
-
+
}
@@ -728,14 +729,20 @@ TreeItem::~TreeItem() {
tree->root=0;
}
- if (tree && tree->popup_edited_item==this)
+ if (tree && tree->popup_edited_item==this) {
tree->popup_edited_item=NULL;
+ tree->pressing_for_editor=false;
+
+ }
if (tree && tree->selected_item==this)
tree->selected_item=NULL;
- if (tree && tree->edited_item==this)
+ if (tree && tree->edited_item==this) {
tree->edited_item=NULL;
+ tree->pressing_for_editor=false;
+ }
+
}
@@ -767,7 +774,7 @@ void Tree::update_cache() {
cache.arrow =get_icon("arrow");
cache.select_arrow =get_icon("select_arrow");
cache.updown=get_icon("updown");
-
+
cache.font_color=get_color("font_color");
cache.font_color_selected=get_color("font_color_selected");
cache.guide_color=get_color("guide_color");
@@ -795,10 +802,10 @@ int Tree::compute_item_height(TreeItem *p_item) const {
if (p_item==root && hide_root)
return 0;
-
+
int height=cache.font->get_height();
-
+
for (int i=0;i<columns.size();i++) {
@@ -812,23 +819,23 @@ int Tree::compute_item_height(TreeItem *p_item) const {
}
switch(p_item->cells[i].mode) {
-
+
case TreeItem::CELL_MODE_CHECK: {
-
+
int check_icon_h = cache.checked->get_height();
if (height<check_icon_h)
height=check_icon_h;
-
-
-
+
+
+
}
case TreeItem::CELL_MODE_STRING:
case TreeItem::CELL_MODE_CUSTOM:
case TreeItem::CELL_MODE_ICON: {
-
+
Ref<Texture> icon = p_item->cells[i].icon;
if (!icon.is_null()) {
-
+
Size2i s = p_item->cells[i].get_icon_size();
if (p_item->cells[i].icon_max_w>0 && s.width > p_item->cells[i].icon_max_w ) {
s.height=s.height * p_item->cells[i].icon_max_w / s.width;
@@ -836,15 +843,15 @@ int Tree::compute_item_height(TreeItem *p_item) const {
if (s.height > height )
height=s.height;
}
-
+
} break;
default: {}
}
}
-
-
+
+
height += cache.vseparation;
-
+
return height;
}
@@ -920,7 +927,7 @@ void Tree::draw_item_text(String p_text,const Ref<Texture>& p_icon,int p_icon_ma
p_rect.size.x-=Math::floor(p_rect.size.y/2);
Ref<Font> font = cache.font;
-
+
p_rect.pos.y+=Math::floor((p_rect.size.y-font->get_height())/2.0) +font->get_ascent();
font->draw(ci,p_rect.pos,p_text,p_color,p_rect.size.x);
}
@@ -943,22 +950,24 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
Point2i guide_from;
- bool skip=(p_item==root && hide_root);
+ bool skip=(p_item==root && hide_root);
// printf("skip (%p == %p && %i) %i\n",p_item,root,hide_root,skip);
if (!skip && (p_pos.y+label_h-cache.offset.y)>0) {
- // printf("entering\n");
+ // printf("entering\n");
int height=label_h;
Point2i guide_space=Point2i( cache.guide_width , height );
- if (p_item->childs) { //has childs, draw the guide box
+
+
+ if (!hide_folding && p_item->childs) { //has childs, draw the guide box
Ref<Texture> arrow;
-
+
if (p_item->collapsed) {
arrow=cache.arrow_collapsed;
@@ -976,10 +985,10 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
// if (p_item->get_parent()!=root || !hide_root)
Ref<Font> font = cache.font;
-
+
int font_ascent=font->get_ascent();
- int ofs = p_pos.x + cache.item_margin;
+ int ofs = p_pos.x + (hide_folding?cache.hseparation:cache.item_margin);
for (int i=0;i<columns.size();i++) {
int w = get_column_width(i);
@@ -1055,11 +1064,14 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
if (p_item->cells[i].custom_bg_color) {
- VisualServer::get_singleton()->canvas_item_add_rect(ci,cell_rect,p_item->cells[i].bg_color);
+ Rect2 r=cell_rect;
+ r.pos.x-=cache.hseparation;
+ r.size.x+=cache.hseparation;
+ VisualServer::get_singleton()->canvas_item_add_rect(ci,r,p_item->cells[i].bg_color);
}
Color col=p_item->cells[i].custom_color?p_item->cells[i].color:get_color( p_item->cells[i].selected?"font_color_selected":"font_color");
-
+
Point2i text_pos=item_rect.pos;
text_pos.y+=Math::floor((item_rect.size.y-font->get_height())/2) + font_ascent;
@@ -1097,7 +1109,7 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
} break;
case TreeItem::CELL_MODE_RANGE: {
-
+
if (p_item->cells[i].text!="") {
if (!p_item->cells[i].editable)
@@ -1121,7 +1133,7 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
} else {
Ref<Texture> updown = cache.updown;
-
+
String valtext = String::num( p_item->cells[i].val, Math::decimals( p_item->cells[i].step ) );
font->draw( ci, text_pos, valtext, col, item_rect.size.x-updown->get_width());
@@ -1178,7 +1190,7 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
Rect2i ir=item_rect;
ir.size.width-=downarrow->get_width();
draw_item_rect(p_item->cells[i],ir,col);
-
+
Point2i arrow_pos=item_rect.pos;
arrow_pos.x+=item_rect.size.x-downarrow->get_width();
arrow_pos.y+=Math::floor(((item_rect.size.y-downarrow->get_height()))/2.0);
@@ -1220,7 +1232,7 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
children_pos.x+=cache.item_margin;
htotal+=label_h;
children_pos.y+=htotal;
-
+
}
@@ -1265,12 +1277,12 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
continue;
if (select_mode==SELECT_ROW) {
-
+
if (p_selected==p_current) {
-
+
if (!c.selected) {
-
+
c.selected=true;
selected_item=p_selected;
selected_col=0;
@@ -1279,28 +1291,29 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
//if (p_col==i)
// p_current->selected_signal.call(p_col);
}
-
+
} else {
-
+
if (c.selected) {
-
- c.selected=false;
+
+ c.selected=false;
//p_current->deselected_signal.call(p_col);
}
-
+
}
-
+
} else if (select_mode==SELECT_SINGLE || select_mode==SELECT_MULTI) {
-
- if (&selected_cell==&c) {
-
+
+ if (!r_in_range && &selected_cell==&c) {
+
if (!selected_cell.selected) {
-
+
selected_cell.selected=true;
-
+
selected_item=p_selected;
selected_col=i;
+
emit_signal("cell_selected");
if (select_mode==SELECT_MULTI)
emit_signal("multi_selected",p_current,i,true);
@@ -1313,10 +1326,11 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
}
} else {
-
+
if (r_in_range && *r_in_range) {
+
if (!c.selected && c.selectable) {
c.selected=true;
emit_signal("multi_selected",p_current,i,true);
@@ -1363,11 +1377,11 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
int item_h=compute_item_height( p_item )+cache.vseparation;
bool skip=(p_item==root && hide_root);
-
+
if (!skip && p_pos.y<item_h) {
// check event!
- if (p_pos.x >=x_ofs && p_pos.x < (x_ofs+cache.item_margin) ) {
+ if (!hide_folding && (p_pos.x >=x_ofs && p_pos.x < (x_ofs+cache.item_margin) )) {
if (p_item->childs)
@@ -1375,7 +1389,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
return -1; //handled!
}
-
+
int x=p_pos.x;
/* find clicked column */
int col=-1;
@@ -1394,7 +1408,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
break;
}
-
+
if (col==-1)
return -1;
@@ -1467,7 +1481,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
if (select_mode==SELECT_MULTI && p_mod.shift && selected_item && selected_item!=p_item) {
bool inrange=false;
- print_line("SELECT MULTI AND SHIFT AND ALL");
+
select_single_item( p_item, root, col,selected_item,&inrange );
} else {
select_single_item( p_item, root, col );
@@ -1478,8 +1492,8 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
//}
update();
}
-
-
+
+
}
}
@@ -1490,7 +1504,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
/* editing */
- bool bring_up_editor=c.selected && already_selected;
+ bool bring_up_editor=c.selected;// && already_selected;
bool bring_up_value_editor=false;
String editor_text=c.text;
@@ -1505,14 +1519,14 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
} break;
case TreeItem::CELL_MODE_CHECK: {
-
+
Ref<Texture> checked = cache.checked;
bring_up_editor=false; //checkboxes are not edited with editor
if (x>=0 && x<= checked->get_width()+cache.hseparation ) {
-
+
p_item->set_checked(col,!c.checked);
- item_edited(col,p_item);
+ item_edited(col,p_item);
click_handled=true;
//p_item->edited_signal.call(col);
}
@@ -1540,37 +1554,37 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
//}
bring_up_editor=false;
} else {
-
+
Ref<Texture> updown = cache.updown;
-
-
+
+
if (x >= (col_width-item_h/2)) {
-
+
/* touching the combo */
bool up=p_pos.y < (item_h /2);
-
+
if (p_button==BUTTON_LEFT) {
p_item->set_range( col, c.val + (up?1.0:-1.0) * c.step );
-
- item_edited(col,p_item);
+
+ item_edited(col,p_item);
} else if (p_button==BUTTON_RIGHT) {
-
+
p_item->set_range( col, (up?c.max:c.min) );
- item_edited(col,p_item);
+ item_edited(col,p_item);
} else if (p_button==BUTTON_WHEEL_UP) {
-
+
p_item->set_range( col, c.val + c.step );
- item_edited(col,p_item);
+ item_edited(col,p_item);
} else if (p_button==BUTTON_WHEEL_DOWN) {
-
+
p_item->set_range( col, c.val - c.step );
- item_edited(col,p_item);
+ item_edited(col,p_item);
}
-
- //p_item->edited_signal.call(col);
+
+ //p_item->edited_signal.call(col);
bring_up_editor=false;
-
-
+
+
} else {
editor_text=String::num( p_item->cells[col].val, Math::decimals( p_item->cells[col].step ) );
@@ -1578,7 +1592,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
if (select_mode==SELECT_MULTI && get_tree()->get_last_event_id() == focus_in_id)
bring_up_editor=false;
- }
+ }
}
click_handled=true;
@@ -1589,12 +1603,12 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
} break;
case TreeItem::CELL_MODE_CUSTOM: {
edited_item=p_item;
- edited_col=col;
+ edited_col=col;
custom_popup_rect=Rect2i(get_global_pos() + Point2i(col_ofs,_get_title_button_height()+y_ofs+item_h-cache.offset.y), Size2(get_column_width(col),item_h));
emit_signal("custom_popup_edited",((bool)(x >= (col_width-item_h/2))));
bring_up_editor=false;
- item_edited(col,p_item);
+ item_edited(col,p_item);
click_handled=true;
return -1;
} break;
@@ -1605,44 +1619,27 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
return -1;
+
click_handled=true;
popup_edited_item=p_item;
popup_edited_item_col=col;
- text_editor->set_pos(get_global_pos() + Point2i(col_ofs,_get_title_button_height()+y_ofs)-cache.offset );
- text_editor->set_size( Size2(col_width,item_h));
- text_editor->clear();
- text_editor->set_text( editor_text );
- text_editor->select_all();
-
- if (bring_up_value_editor) {
- value_editor->set_pos(get_global_pos() + Point2i(col_ofs,_get_title_button_height()+y_ofs)-cache.offset+Point2i(0,text_editor->get_size().height) );
- value_editor->set_size( Size2(col_width,1));
- value_editor->show_modal();
- updating_value_editor=true;
- value_editor->set_min( c.min );
- value_editor->set_max( c.max );
- value_editor->set_step( c.step );
- value_editor->set_val( c.val );
- value_editor->set_exp_unit_value( c.expr );
- updating_value_editor=false;
- }
-
- text_editor->show_modal();
- text_editor->grab_focus();
+ pressing_item_rect=Rect2(get_global_pos() + Point2i(col_ofs,_get_title_button_height()+y_ofs)-cache.offset,Size2(col_width,item_h));
+ pressing_for_editor_text=editor_text;
+ pressing_for_editor=true;
return -1; //select
} else {
Point2i new_pos=p_pos;
-
+
if (!skip) {
x_ofs+=cache.item_margin;
//new_pos.x-=cache.item_margin;
y_ofs+=item_h;
new_pos.y-=item_h;
}
-
+
if (!p_item->collapsed) { /* if not collapsed, check the childs */
@@ -1705,7 +1702,7 @@ void Tree::text_editor_enter(String p_text) {
default: { ERR_FAIL(); }
}
- item_edited(popup_edited_item_col,popup_edited_item);
+ item_edited(popup_edited_item_col,popup_edited_item);
update();
}
@@ -1733,19 +1730,19 @@ void Tree::popup_select(int p_option) {
if (popup_edited_item_col<0 || popup_edited_item_col>columns.size())
return;
-
+
popup_edited_item->cells[popup_edited_item_col].val=p_option;
//popup_edited_item->edited_signal.call( popup_edited_item_col );
update();
- item_edited(popup_edited_item_col,popup_edited_item);
+ item_edited(popup_edited_item_col,popup_edited_item);
}
void Tree::_input_event(InputEvent p_event) {
-
+
switch (p_event.type) {
-
+
case InputEvent::KEY: {
if (!p_event.key.pressed)
@@ -2062,6 +2059,33 @@ void Tree::_input_event(InputEvent p_event) {
update();
}
+ if (pressing_for_editor && popup_edited_item && popup_edited_item->get_cell_mode(popup_edited_item_col)==TreeItem::CELL_MODE_RANGE) {
+ //range drag
+
+ if (!range_drag_enabled) {
+
+ Vector2 cpos = Vector2(b.x,b.y);
+ if (cpos.distance_to(pressing_pos)>2) {
+ range_drag_enabled=true;
+ range_drag_capture_pos=cpos;
+ range_drag_base=popup_edited_item->get_range(popup_edited_item_col);
+ Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
+ }
+ } else {
+
+ TreeItem::Cell &c=popup_edited_item->cells[popup_edited_item_col];
+ float diff_y = -b.relative_y;
+ diff_y=Math::pow(ABS(diff_y),1.8)*SGN(diff_y);
+ diff_y*=0.1;
+ range_drag_base=CLAMP(range_drag_base + c.step * diff_y, c.min, c.max);
+
+ popup_edited_item->set_range(popup_edited_item_col,range_drag_base);
+ item_edited(popup_edited_item_col,popup_edited_item);
+
+ }
+
+ }
+
if (drag_touching && ! drag_touching_deaccel) {
@@ -2072,18 +2096,43 @@ void Tree::_input_event(InputEvent p_event) {
}
} break;
case InputEvent::MOUSE_BUTTON: {
-
+
if (cache.font.is_null()) // avoid a strange case that may fuckup stuff
update_cache();
- const InputEventMouseButton& b=p_event.mouse_button;
+ const InputEventMouseButton& b=p_event.mouse_button;
if (!b.pressed) {
if (b.button_index==BUTTON_LEFT) {
+ if (pressing_for_editor) {
+
+ if (range_drag_enabled) {
+
+ range_drag_enabled=false;
+ Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
+ warp_mouse(range_drag_capture_pos);
+ } else {
+ text_editor->set_pos(pressing_item_rect.pos);
+ text_editor->set_size(pressing_item_rect.size);
+
+ text_editor->clear();
+ text_editor->set_text( pressing_for_editor_text );
+ text_editor->select_all();
+
+ text_editor->show_modal();
+ text_editor->grab_focus();
+
+ }
+ pressing_for_editor=false;
+
+ }
+
+
+
if (cache.click_type==Cache::CLICK_BUTTON) {
emit_signal("button_pressed",cache.click_item,cache.click_column,cache.click_id);
@@ -2116,7 +2165,7 @@ void Tree::_input_event(InputEvent p_event) {
switch(b.button_index) {
case BUTTON_LEFT: {
Ref<StyleBox> bg = cache.bg;
-
+
Point2 pos = Point2(b.x,b.y) - bg->get_offset();
cache.click_type=Cache::CLICK_NONE;
if (show_column_titles) {
@@ -2145,11 +2194,15 @@ void Tree::_input_event(InputEvent p_event) {
break;
click_handled=false;
+ pressing_for_editor=false;
blocked++;
bool handled = propagate_mouse_event(pos+cache.offset,0,0,b.doubleclick,root,b.button_index,b.mod);
blocked--;
+ if (pressing_for_editor) {
+ pressing_pos=Point2(b.x,b.y);
+ }
if (drag_touching) {
@@ -2174,18 +2227,18 @@ void Tree::_input_event(InputEvent p_event) {
} break;
- case BUTTON_WHEEL_UP: {
+ case BUTTON_WHEEL_UP: {
v_scroll->set_val( v_scroll->get_val()-v_scroll->get_page()/8 );
} break;
case BUTTON_WHEEL_DOWN: {
-
+
v_scroll->set_val( v_scroll->get_val()+v_scroll->get_page()/8 );
} break;
}
-
+
} break;
}
-
+
}
@@ -2218,9 +2271,12 @@ bool Tree::edit_selected() {
TreeItem::Cell &c = s->cells[col];
+ if (c.mode==TreeItem::CELL_MODE_CHECK) {
-
- if (c.mode==TreeItem::CELL_MODE_CUSTOM) {
+ s->set_checked(col, !c.checked);
+ item_edited(col,s);
+ return true;
+ } else if (c.mode==TreeItem::CELL_MODE_CUSTOM) {
edited_item=s;
edited_col=col;
@@ -2283,10 +2339,10 @@ Size2 Tree::get_internal_min_size() const {
if (root)
size.height+=get_item_height(root);
for (int i=0;i<columns.size();i++) {
-
+
size.width+=columns[i].min_width;
}
-
+
return size;
}
@@ -2305,39 +2361,39 @@ void Tree::update_scrollbars() {
Size2 vmin = v_scroll->get_combined_minimum_size();
-
+
v_scroll->set_begin( Point2(size.width - vmin.width , cache.bg->get_margin(MARGIN_TOP)) );
v_scroll->set_end( Point2(size.width, size.height-cache.bg->get_margin(MARGIN_TOP)-cache.bg->get_margin(MARGIN_BOTTOM)) );
-
+
h_scroll->set_begin( Point2( 0, size.height - hmin.height) );
h_scroll->set_end( Point2(size.width-vmin.width, size.height) );
-
-
+
+
Size2 min = get_internal_min_size();
-
+
if (min.height < size.height - hmin.height) {
-
+
v_scroll->hide();
cache.offset.y=0;
} else {
-
+
v_scroll->show();
v_scroll->set_max(min.height);
v_scroll->set_page(size.height - hmin.height - tbh);
cache.offset.y=v_scroll->get_val();
}
-
+
if (min.width < size.width - vmin.width) {
-
+
h_scroll->hide();
cache.offset.x=0;
} else {
-
+
h_scroll->show();
h_scroll->set_max(min.width);
h_scroll->set_page(size.width - vmin.width);
cache.offset.x=h_scroll->get_val();
- }
+ }
}
@@ -2360,6 +2416,11 @@ void Tree::_notification(int p_what) {
}
}
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+
+ drag_touching=false;
+ }
+
if (p_what==NOTIFICATION_ENTER_TREE) {
update_cache();;
@@ -2411,16 +2472,16 @@ void Tree::_notification(int p_what) {
}
if (p_what==NOTIFICATION_DRAW) {
-
+
update_cache();
update_scrollbars();
- RID ci = get_canvas_item();
-
+ RID ci = get_canvas_item();
+
VisualServer::get_singleton()->canvas_item_set_clip(ci,true);
-
+
Ref<StyleBox> bg = cache.bg;
Ref<StyleBox> bg_focus = get_stylebox("bg_focus");
-
+
Point2 draw_ofs;
draw_ofs+=bg->get_offset();
Size2 draw_size=get_size()-bg->get_minimum_size();
@@ -2438,7 +2499,7 @@ void Tree::_notification(int p_what) {
draw_size.y-=tbh;
if (root) {
-
+
draw_item( Point2(),draw_ofs,draw_size,root);
@@ -2449,10 +2510,10 @@ void Tree::_notification(int p_what) {
// int size_y=exposed.size.height-bg->get_minimum_size().height;
for (int i=0;i<(columns.size()-1-1);i++) {
-
+
ofs+=get_column_width(i);
//get_painter()->draw_fill_rect( Point2(ofs+cache.hseparation/2, from_y), Size2( 1, size_y ),color( COLOR_TREE_GRID) );
- }
+ }
if (show_column_titles) {
@@ -2552,7 +2613,7 @@ TreeItem* Tree::get_last_item() {
}
void Tree::item_edited(int p_column,TreeItem *p_item) {
-
+
edited_item=p_item;
edited_col=p_column;
emit_signal("item_edited");
@@ -2560,14 +2621,14 @@ void Tree::item_edited(int p_column,TreeItem *p_item) {
void Tree::item_changed(int p_column,TreeItem *p_item) {
- update();
+ update();
}
void Tree::item_selected(int p_column,TreeItem *p_item) {
if (select_mode==SELECT_MULTI) {
-
+
if (!p_item->cells[p_column].selectable)
return;
@@ -2583,16 +2644,16 @@ void Tree::item_selected(int p_column,TreeItem *p_item) {
void Tree::item_deselected(int p_column,TreeItem *p_item) {
if (select_mode==SELECT_MULTI) {
-
+
p_item->cells[p_column].selected=false;
- }
+ }
update();
}
void Tree::set_select_mode(SelectMode p_mode) {
- select_mode=p_mode;
+ select_mode=p_mode;
}
void Tree::clear() {
@@ -2610,6 +2671,8 @@ void Tree::clear() {
selected_item=NULL;
edited_item=NULL;
popup_edited_item=NULL;
+ selected_item=NULL;
+ pressing_for_editor=false;
update();
};
@@ -2620,15 +2683,15 @@ void Tree::set_hide_root(bool p_enabled) {
- hide_root=p_enabled;
- update();
+ hide_root=p_enabled;
+ update();
}
void Tree::set_column_min_width(int p_column,int p_min_width) {
ERR_FAIL_INDEX(p_column,columns.size());
-
+
if (p_min_width<1)
return;
columns[p_column].min_width=p_min_width;
@@ -2638,8 +2701,8 @@ void Tree::set_column_min_width(int p_column,int p_min_width) {
void Tree::set_column_expand(int p_column,bool p_expand) {
ERR_FAIL_INDEX(p_column,columns.size());
-
- columns[p_column].expand=p_expand;
+
+ columns[p_column].expand=p_expand;
update();
}
@@ -2654,78 +2717,78 @@ int Tree::get_selected_column() const {
}
TreeItem *Tree::get_edited() const {
-
+
return edited_item;
}
int Tree::get_edited_column() const {
-
+
return edited_col;
}
TreeItem* Tree::get_next_selected( TreeItem* p_item) {
-
+
//if (!p_item)
// return NULL;
if (!root)
- return NULL;
-
+ return NULL;
+
while(true) {
-
-
+
+
if (!p_item) {
p_item=root;
} else {
-
+
if (p_item->childs) {
-
+
p_item=p_item->childs;
-
+
} else if (p_item->next) {
-
- p_item=p_item->next;
+
+ p_item=p_item->next;
} else {
-
+
while(!p_item->next) {
-
+
p_item=p_item->parent;
if (p_item==NULL)
return NULL;
}
-
+
p_item=p_item->next;
}
-
+
}
-
+
for (int i=0;i<columns.size();i++)
if (p_item->cells[i].selected)
return p_item;
}
-
+
return NULL;
}
int Tree::get_column_width(int p_column) const {
-
+
ERR_FAIL_INDEX_V(p_column,columns.size(),-1);
-
-
+
+
if (!columns[p_column].expand)
return columns[p_column].min_width;
-
+
Ref<StyleBox> bg = cache.bg;
-
+
int expand_area=get_size().width-(bg->get_margin(MARGIN_LEFT)+bg->get_margin(MARGIN_RIGHT));
-
+
if (v_scroll->is_visible())
expand_area-=v_scroll->get_combined_minimum_size().width;
-
+
int expanding_columns=0;
int expanding_total=0;
-
+
for (int i=0;i<columns.size();i++) {
-
+
if (!columns[i].expand) {
expand_area-=columns[i].min_width;
} else {
@@ -2736,30 +2799,30 @@ int Tree::get_column_width(int p_column) const {
if (expand_area<expanding_total)
return columns[p_column].min_width;
-
+
ERR_FAIL_COND_V(expanding_columns==0,-1); // shouldnt happen
-
+
return expand_area * columns[p_column].min_width / expanding_total;
}
void Tree::propagate_set_columns(TreeItem *p_item) {
-
+
p_item->cells.resize( columns.size() );
-
+
TreeItem *c = p_item->get_children();
while(c) {
-
+
propagate_set_columns(c);
c=c->get_next();
}
}
void Tree::set_columns(int p_columns) {
-
+
ERR_FAIL_COND(p_columns<1);
ERR_FAIL_COND(blocked>0);
columns.resize(p_columns);
-
+
if (root)
propagate_set_columns(root);
if (selected_col>=p_columns)
@@ -2769,17 +2832,17 @@ void Tree::set_columns(int p_columns) {
}
int Tree::get_columns() const {
-
+
return columns.size();
}
void Tree::_scroll_moved(float) {
-
+
update();
}
Rect2 Tree::get_custom_popup_rect() const {
-
+
return custom_popup_rect;
}
@@ -3059,9 +3122,19 @@ bool Tree::can_cursor_exit_tree() const {
return cursor_can_exit_tree;
}
+void Tree::set_hide_folding(bool p_hide) {
+ hide_folding=p_hide;
+ update();
+}
+
+bool Tree::is_folding_hidden() const {
+
+ return hide_folding;
+}
+
void Tree::_bind_methods() {
-
+
ObjectTypeDB::bind_method(_MD("_input_event"),&Tree::_input_event);
ObjectTypeDB::bind_method(_MD("_popup_select"),&Tree::popup_select);
ObjectTypeDB::bind_method(_MD("_text_editor_enter"),&Tree::text_editor_enter);
@@ -3085,7 +3158,7 @@ void Tree::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_columns","amount"),&Tree::set_columns);
ObjectTypeDB::bind_method(_MD("get_columns"),&Tree::get_columns);
-
+
ObjectTypeDB::bind_method(_MD("get_edited:TreeItem"),&Tree::get_edited);
ObjectTypeDB::bind_method(_MD("get_edited_column"),&Tree::get_edited_column);
ObjectTypeDB::bind_method(_MD("get_custom_popup_rect"),&Tree::get_custom_popup_rect);
@@ -3100,6 +3173,9 @@ void Tree::_bind_methods() {
ObjectTypeDB::bind_method(_MD("get_column_title","column"),&Tree::get_column_title);
ObjectTypeDB::bind_method(_MD("get_scroll"),&Tree::get_scroll);
+ ObjectTypeDB::bind_method(_MD("set_hide_folding","hide"),&Tree::set_hide_folding);
+ ObjectTypeDB::bind_method(_MD("is_folding_hidden"),&Tree::is_folding_hidden);
+
ADD_SIGNAL( MethodInfo("item_selected"));
ADD_SIGNAL( MethodInfo("cell_selected"));
@@ -3124,7 +3200,7 @@ Tree::Tree() {
edited_item=NULL;
selected_col=-1;
edited_col=-1;
-
+
hide_root=false;
select_mode=SELECT_SINGLE;
root=0;
@@ -3132,8 +3208,8 @@ Tree::Tree() {
popup_edited_item=NULL;
text_editor=NULL;
set_focus_mode(FOCUS_ALL);
-
-
+
+
popup_menu = memnew( PopupMenu );
popup_menu->hide();
add_child(popup_menu);
@@ -3149,7 +3225,7 @@ Tree::Tree() {
h_scroll = memnew( HScrollBar );
v_scroll = memnew( VScrollBar );
-
+
add_child(h_scroll);
add_child(v_scroll);
@@ -3184,6 +3260,10 @@ Tree::Tree() {
drag_speed=0;
drag_touching=false;
drag_touching_deaccel=false;
+ pressing_for_editor=false;
+ range_drag_enabled=false;
+
+ hide_folding=false;
}
@@ -3193,6 +3273,6 @@ Tree::~Tree() {
if (root) {
memdelete( root );
}
-
+
}