Browse Source

Changed tree so shift-selection skips folded children, closes #5515

Juan Linietsky 9 years ago
parent
commit
1d6be8b00d
2 changed files with 5 additions and 5 deletions
  1. 4 4
      scene/gui/tree.cpp
  2. 1 1
      scene/gui/tree.h

+ 4 - 4
scene/gui/tree.cpp

@@ -1335,7 +1335,7 @@ int Tree::_count_selected_items(TreeItem* p_from) const {
 	return count;
 	return count;
 
 
 }
 }
-void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col,TreeItem *p_prev,bool *r_in_range) {
+void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev, bool *r_in_range, bool p_force_deselect) {
 
 
 	TreeItem::Cell &selected_cell=p_selected->cells[p_col];
 	TreeItem::Cell &selected_cell=p_selected->cells[p_col];
 
 
@@ -1409,7 +1409,7 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
 			} else {
 			} else {
 
 
 
 
-				if (r_in_range && *r_in_range) {
+				if (r_in_range && *r_in_range && !p_force_deselect) {
 
 
 
 
 					if (!c.selected && c.selectable) {
 					if (!c.selected && c.selectable) {
@@ -1417,7 +1417,7 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
 						emit_signal("multi_selected",p_current,i,true);
 						emit_signal("multi_selected",p_current,i,true);
 					}
 					}
 
 
-				} else if (!r_in_range){
+				} else if (!r_in_range || p_force_deselect){
 					if (select_mode==SELECT_MULTI && c.selected)
 					if (select_mode==SELECT_MULTI && c.selected)
 						emit_signal("multi_selected",p_current,i,false);
 						emit_signal("multi_selected",p_current,i,false);
 					c.selected=false;
 					c.selected=false;
@@ -1436,7 +1436,7 @@ void Tree::select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col
 
 
 	while (c) {
 	while (c) {
 
 
-		select_single_item(p_selected,c,p_col,p_prev,r_in_range);
+		select_single_item(p_selected,c,p_col,p_prev,r_in_range,p_current->is_collapsed() || p_force_deselect);
 		c=c->next;
 		c=c->next;
 	}
 	}
 
 

+ 1 - 1
scene/gui/tree.h

@@ -331,7 +331,7 @@ friend class TreeItem;
 //	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_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);
 	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);
 	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);
+	void select_single_item(TreeItem *p_selected,TreeItem *p_current,int p_col,TreeItem *p_prev=NULL,bool *r_in_range=NULL,bool p_force_deselect=false);
 	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);
 	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 text_editor_enter(String p_text);
 	void _text_editor_modal_close();
 	void _text_editor_modal_close();