[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40066] trunk/blender/source/blender: Patch [#23443] Change outliner filter into search

Joshua Leung aligorith at gmail.com
Fri Sep 9 14:46:07 CEST 2011


Revision: 40066
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40066
Author:   aligorith
Date:     2011-09-09 12:46:07 +0000 (Fri, 09 Sep 2011)
Log Message:
-----------
Patch [#23443] Change outliner filter into search
Shane Ambler (sambler) for this 12-month vintage!

>From description:
One thing with the outliner filter box is it only filters items that
are currently visible. To find what you want you need to manually
expand a few levels so that what you want to find is visible.

This small patch expands items when filtering is done - effectively
turning it into a search.

Currently this does not alter the datablocks view as expanding all
entries takes waaaay tooooo long.
I prevent the expansion of RNA entries for userprefs which prevents
infinite recursion but the datablocks list is just too big for this
approach. I think it would need a custom outliner_build_tree for a
full search.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
    trunk/blender/source/blender/editors/space_outliner/outliner_edit.c
    trunk/blender/source/blender/editors/space_outliner/outliner_intern.h
    trunk/blender/source/blender/editors/space_outliner/outliner_select.c
    trunk/blender/source/blender/editors/space_outliner/outliner_tools.c
    trunk/blender/source/blender/editors/space_outliner/outliner_tree.c
    trunk/blender/source/blender/makesdna/DNA_outliner_types.h
    trunk/blender/source/blender/makesdna/DNA_space_types.h

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2011-09-09 12:37:56 UTC (rev 40065)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2011-09-09 12:46:07 UTC (rev 40066)
@@ -97,7 +97,7 @@
 	TreeElement *te= lb->first;
 	while(te) {
 		TreeStoreElem *tselem= TREESTORE(te);
-		if((tselem->flag & TSE_CLOSED)==0) 
+		if(TSELEM_OPEN(tselem,soops))
 			outliner_height(soops, &te->subtree, h);
 		(*h) += UI_UNIT_Y;
 		te= te->next;
@@ -112,7 +112,7 @@
 //		TreeStoreElem *tselem= TREESTORE(te);
 		
 		// XXX fixme... te->xend is not set yet
-		if(tselem->flag & TSE_CLOSED) {
+		if(!TSELEM_OPEN(tselem,soops)) {
 			if (te->xend > *w)
 				*w = te->xend;
 		}
@@ -135,7 +135,7 @@
 		if(startx+100 > *w)
 			*w = startx+100;
 
-		if((tselem->flag & TSE_CLOSED)==0)
+		if(TSELEM_OPEN(tselem,soops))
 			outliner_rna_width(soops, &te->subtree, w, startx+UI_UNIT_X);
 		te= te->next;
 	}
@@ -519,7 +519,7 @@
 			}
 		}
 		
-		if((tselem->flag & TSE_CLOSED)==0) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree);
+		if(TSELEM_OPEN(tselem,soops)) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree);
 	}
 }
 
@@ -560,7 +560,7 @@
 				ptr= &te->rnaptr;
 				prop= te->directdata;
 				
-				if(!(RNA_property_type(prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0))
+				if(!(RNA_property_type(prop) == PROP_POINTER && (TSELEM_OPEN(tselem,soops))) )
 					uiDefAutoButR(block, ptr, prop, -1, "", ICON_NONE, sizex, (int)te->ys, OL_RNA_COL_SIZEX, UI_UNIT_Y-1);
 			}
 			else if(tselem->type == TSE_RNA_ARRAY_ELEM) {
@@ -571,7 +571,7 @@
 			}
 		}
 		
-		if((tselem->flag & TSE_CLOSED)==0) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree);
+		if(TSELEM_OPEN(tselem,soops)) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree);
 	}
 }
 
@@ -828,7 +828,7 @@
 			}
 		}
 		
-		if((tselem->flag & TSE_CLOSED)==0) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
+		if(TSELEM_OPEN(tselem,soops)) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
 	}
 }
 
@@ -871,7 +871,7 @@
 			}
 		}
 		
-		if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(C, block, ar, soops, &te->subtree);
+		if(TSELEM_OPEN(tselem,soops)) outliner_buttons(C, block, ar, soops, &te->subtree);
 	}
 }
 
@@ -1237,6 +1237,18 @@
 		
 		glEnable(GL_BLEND);
 
+		/* start by highlighting search matches 
+		 *	we don't expand items when searching in the datablocks but we 
+		 *	still want to highlight any filter matches. 
+		 */
+		if ( (SEARCHING_OUTLINER(soops) || (soops->outlinevis==SO_DATABLOCKS && soops->search_string[0]!=0)) && 
+			 (tselem->flag & TSE_SEARCHMATCH)) 
+		{
+			/* TODO - add search highlight colour to theme? */
+			glColor4f(0.2f, 0.5f, 0.2f, 0.3f);
+			glRecti(startx, *starty+1, ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1);
+		}
+
 		/* colors for active/selected data */
 		if(tselem->type==0) {
 			if(te->idcode==ID_SCE) {
@@ -1317,10 +1329,10 @@
 				icon_x = startx+5*ufac;
 			
 				// icons a bit higher
-			if(tselem->flag & TSE_CLOSED) 
+			if(TSELEM_OPEN(tselem,soops)) 
+				UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_DOWN);
+			else
 				UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT);
-			else
-				UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_DOWN);
 		}
 		offsx+= UI_UNIT_X;
 		
@@ -1356,7 +1368,7 @@
 		offsx+= (int)(UI_UNIT_X + UI_GetStringWidth(te->name));
 		
 		/* closed item, we draw the icons, not when it's a scene, or master-server list though */
-		if(tselem->flag & TSE_CLOSED) {
+		if(!TSELEM_OPEN(tselem,soops)) {
 			if(te->subtree.first) {
 				if(tselem->type==0 && te->idcode==ID_SCE);
 				else if(tselem->type!=TSE_R_LAYER) { /* this tree element always has same amount of branches, so dont draw */
@@ -1382,7 +1394,7 @@
 	te->ys= (float)*starty;
 	te->xend= startx+offsx;
 		
-	if((tselem->flag & TSE_CLOSED)==0) {
+	if(TSELEM_OPEN(tselem,soops)) {
 		*starty-= UI_UNIT_Y;
 		
 		for(ten= te->subtree.first; ten; ten= ten->next)
@@ -1415,7 +1427,7 @@
 			
 		*starty-= UI_UNIT_Y;
 		
-		if((tselem->flag & TSE_CLOSED)==0)
+		if(TSELEM_OPEN(tselem,soops))
 			outliner_draw_hierarchy(soops, &te->subtree, startx+UI_UNIT_X, starty);
 	}
 	
@@ -1439,12 +1451,12 @@
 		tselem= TREESTORE(te);
 		
 		/* selection status */
-		if((tselem->flag & TSE_CLOSED)==0)
+		if(TSELEM_OPEN(tselem,soops))
 			if(tselem->type == TSE_RNA_STRUCT)
 				glRecti(0, *starty+1, (int)ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, *starty+UI_UNIT_Y-1);
 
 		*starty-= UI_UNIT_Y;
-		if((tselem->flag & TSE_CLOSED)==0) {
+		if(TSELEM_OPEN(tselem,soops)) {
 			outliner_draw_struct_marks(ar, soops, &te->subtree, starty);
 			if(tselem->type == TSE_RNA_STRUCT)
 				fdrawline(0, (float)*starty+UI_UNIT_Y, ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, (float)*starty+UI_UNIT_Y);
@@ -1465,7 +1477,7 @@
 			glRecti(0, *starty+1, (int)ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1);
 		}
 		*starty-= UI_UNIT_Y;
-		if((tselem->flag & TSE_CLOSED)==0) outliner_draw_selection(ar, soops, &te->subtree, starty);
+		if(TSELEM_OPEN(tselem,soops)) outliner_draw_selection(ar, soops, &te->subtree, starty);
 	}
 }
 

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_edit.c	2011-09-09 12:37:56 UTC (rev 40065)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_edit.c	2011-09-09 12:46:07 UTC (rev 40066)
@@ -687,7 +687,7 @@
 	te->ys= (float)(*starty);
 	*starty-= UI_UNIT_Y;
 	
-	if((tselem->flag & TSE_CLOSED)==0) {
+	if(TSELEM_OPEN(tselem,soops)) {
 		TreeElement *ten;
 		for(ten= te->subtree.first; ten; ten= ten->next) {
 			outliner_set_coordinates_element(soops, ten, startx+UI_UNIT_X, starty);
@@ -910,7 +910,7 @@
 		}
 		else tselem->flag |= TSE_CLOSED;
 		
-		if(tselem->flag & TSE_CLOSED); else tree_element_show_hierarchy(scene, soops, &te->subtree);
+		if(TSELEM_OPEN(tselem,soops)) tree_element_show_hierarchy(scene, soops, &te->subtree);
 	}
 }
 
@@ -1175,7 +1175,7 @@
 		}
 		
 		/* go over sub-tree */
-		if ((tselem->flag & TSE_CLOSED)==0)
+		if (TSELEM_OPEN(tselem,soops))
 			do_outliner_drivers_editop(soops, &te->subtree, reports, mode);
 	}
 }
@@ -1343,7 +1343,7 @@
 		}
 		
 		/* go over sub-tree */
-		if ((tselem->flag & TSE_CLOSED)==0)
+		if (TSELEM_OPEN(tselem,soops))
 			do_outliner_keyingset_editop(soops, ks, &te->subtree, mode);
 	}
 }

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_intern.h	2011-09-09 12:37:56 UTC (rev 40065)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_intern.h	2011-09-09 12:46:07 UTC (rev 40066)
@@ -126,6 +126,27 @@
 #define OL_RNA_COL_SPACEX	(UI_UNIT_X*2.5f)
 
 
+/* Outliner Searching --
+
+   Are we looking for something in the outliner?
+   If so finding matches in child items makes it more useful
+
+	 - We want to flag parents to act as being open to filter child matches 
+	 - and also flag matches so we can highlight them
+	 - Flags are stored in TreeStoreElem->flag
+	 - Flag options defined in DNA_outliner_types.h
+	 - SO_SEARCH_RECURSIVE defined in DNA_space_types.h
+	 
+	 - NOT in datablocks view - searching all datablocks takes way too long 
+		to be useful
+	 - not searching into RNA items helps but isn't the complete solution
+	*/
+
+#define SEARCHING_OUTLINER(sov)   (sov->search_flags & SO_SEARCH_RECURSIVE)
+
+/* is the currrent element open? if so we also show children */
+#define TSELEM_OPEN(telm,sv)	( (telm->flag & TSE_CLOSED)==0 || (SEARCHING_OUTLINER(sv) && (telm->flag & TSE_CHILDSEARCH)) )
+
 /* outliner_tree.c ----------------------------------------------- */
 
 void outliner_free_tree(ListBase *lb);

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_select.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_select.c	2011-09-09 12:37:56 UTC (rev 40065)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_select.c	2011-09-09 12:46:07 UTC (rev 40066)
@@ -134,7 +134,7 @@
 				change |= 1;
 			}
 		}
-		else if ((tselem->flag & TSE_CLOSED)==0) {
+		else if (TSELEM_OPEN(tselem,soops)) {
 			/* Only try selecting sub-elements if we haven't hit the right element yet
 			 *
 			 * Hack warning:

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_tools.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_tools.c	2011-09-09 12:37:56 UTC (rev 40065)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_tools.c	2011-09-09 12:46:07 UTC (rev 40066)
@@ -145,7 +145,7 @@
 				}
 			}
 		}
-		if((tselem->flag & TSE_CLOSED)==0) {
+		if(TSELEM_OPEN(tselem,soops)) {
 			set_operation_types(soops, &te->subtree,
 								scenelevel, objectlevel, idlevel, datalevel);
 		}
@@ -250,7 +250,7 @@
 				operation_cb(C, scene, te, tsep, tselem);
 			}
 		}
-		if((tselem->flag & TSE_CLOSED)==0) {
+		if(TSELEM_OPEN(tselem,soops)) {
 			outliner_do_libdata_operation(C, scene, soops, &te->subtree, operation_cb);
 		}
 	}
@@ -397,7 +397,7 @@
 				operation_cb(C, scene_owner ? scene_owner : scene_act, te, NULL, tselem);
 			}
 		}
-		if((tselem->flag & TSE_CLOSED)==0) {
+		if(TSELEM_OPEN(tselem,soops)) {
 			outliner_do_object_operation(C, scene_act, soops, &te->subtree, operation_cb);
 		}
 	}
@@ -504,7 +504,7 @@
 				operation_cb(event, te, tselem);
 			}
 		}
-		if((tselem->flag & TSE_CLOSED)==0) {
+		if(TSELEM_OPEN(tselem,soops)) {
 			outliner_do_data_operation(soops, type, event, &te->subtree, operation_cb);
 		}
 	}
@@ -857,7 +857,7 @@
 				operation_cb(te, tselem, tsep, newid);
 			}
 		}
-		if ((tselem->flag & TSE_CLOSED)==0) {
+		if (TSELEM_OPEN(tselem,soops)) {
 			outliner_do_id_set_operation(soops, type, &te->subtree, newid, operation_cb);
 		}
 	}

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_tree.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_tree.c	2011-09-09 12:37:56 UTC (rev 40065)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list