[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49221] trunk/blender/source/blender/ editors/object/object_select.c: Separate Select Linked operator into smaller function which could be reused .

Sergey Sharybin sergey.vfx at gmail.com
Wed Jul 25 21:45:31 CEST 2012


Revision: 49221
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49221
Author:   nazgul
Date:     2012-07-25 19:45:31 +0000 (Wed, 25 Jul 2012)
Log Message:
-----------
Separate Select Linked operator into smaller function which could be reused.
Should be no functional changes.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/object/object_select.c

Modified: trunk/blender/source/blender/editors/object/object_select.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_select.c	2012-07-25 19:36:59 UTC (rev 49220)
+++ trunk/blender/source/blender/editors/object/object_select.c	2012-07-25 19:45:31 UTC (rev 49221)
@@ -186,36 +186,198 @@
 
 /*********************** Selection by Links *********************/
 
+enum {
+	OBJECT_SELECT_LINKED_IPO = 1,
+	OBJECT_SELECT_LINKED_OBDATA,
+	OBJECT_SELECT_LINKED_MATERIAL,
+	OBJECT_SELECT_LINKED_TEXTURE,
+	OBJECT_SELECT_LINKED_DUPGROUP,
+	OBJECT_SELECT_LINKED_PARTICLE,
+	OBJECT_SELECT_LINKED_LIBRARY,
+	OBJECT_SELECT_LINKED_LIBRARY_OBDATA
+};
+
 static EnumPropertyItem prop_select_linked_types[] = {
-	//{1, "IPO", 0, "Object IPO", ""}, // XXX depreceated animation system stuff...
-	{2, "OBDATA", 0, "Object Data", ""},
-	{3, "MATERIAL", 0, "Material", ""},
-	{4, "TEXTURE", 0, "Texture", ""},
-	{5, "DUPGROUP", 0, "Dupligroup", ""},
-	{6, "PARTICLE", 0, "Particle System", ""},
-	{7, "LIBRARY", 0, "Library", ""},
-	{8, "LIBRARY_OBDATA", 0, "Library (Object Data)", ""},
+	//{OBJECT_SELECT_LINKED_IPO, "IPO", 0, "Object IPO", ""}, // XXX depreceated animation system stuff...
+	{OBJECT_SELECT_LINKED_OBDATA, "OBDATA", 0, "Object Data", ""},
+	{OBJECT_SELECT_LINKED_MATERIAL, "MATERIAL", 0, "Material", ""},
+	{OBJECT_SELECT_LINKED_TEXTURE, "TEXTURE", 0, "Texture", ""},
+	{OBJECT_SELECT_LINKED_DUPGROUP, "DUPGROUP", 0, "Dupligroup", ""},
+	{OBJECT_SELECT_LINKED_PARTICLE, "PARTICLE", 0, "Particle System", ""},
+	{OBJECT_SELECT_LINKED_LIBRARY, "LIBRARY", 0, "Library", ""},
+	{OBJECT_SELECT_LINKED_LIBRARY_OBDATA, "LIBRARY_OBDATA", 0, "Library (Object Data)", ""},
 	{0, NULL, 0, NULL, NULL}
 };
 
+// XXX old animation system
+#if 0
+static int object_select_all_by_ipo(bContext *C, Ipo *ipo)
+{
+	int changed = FALSE;
+
+	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
+	{
+		if (base->object->ipo == ipo) {
+			base->flag |= SELECT;
+			base->object->flag = base->flag;
+
+			changed = TRUE;
+		}
+	}
+	CTX_DATA_END;
+
+	return changed;
+}
+#endif
+
+static int object_select_all_by_obdata(bContext *C, void *obdata)
+{
+	int changed = FALSE;
+
+	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
+	{
+		if (base->object->data == obdata) {
+			base->flag |= SELECT;
+			base->object->flag = base->flag;
+
+			changed = TRUE;
+		}
+	}
+	CTX_DATA_END;
+
+	return changed;
+}
+
+static int object_select_all_by_material_texture(bContext *C, int use_texture, Material *mat, Tex *tex)
+{
+	int changed = FALSE;
+
+	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
+	{
+		Object *ob = base->object;
+		Material *mat1;
+		int a, b;
+
+		for (a = 1; a <= ob->totcol; a++) {
+			mat1 = give_current_material(ob, a);
+
+			if (!use_texture) {
+				if (mat1 == mat) {
+					base->flag |= SELECT;
+					changed = TRUE;
+				}
+			}
+			else if (mat1 && use_texture) {
+				for (b = 0; b < MAX_MTEX; b++) {
+					if (mat1->mtex[b]) {
+						if (tex == mat1->mtex[b]->tex) {
+							base->flag |= SELECT;
+							changed = TRUE;
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		base->object->flag = base->flag;
+	}
+	CTX_DATA_END;
+
+	return changed;
+}
+
+static int object_select_all_by_dup_group(bContext *C, Group *dup_group)
+{
+	int changed = FALSE;
+
+	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
+	{
+		if (base->object->dup_group == dup_group) {
+			base->flag |= SELECT;
+			base->object->flag = base->flag;
+
+			changed = TRUE;
+		}
+	}
+	CTX_DATA_END;
+
+	return changed;
+}
+
+static int object_select_all_by_particle(bContext *C, Object *ob)
+{
+	int changed = FALSE;
+
+	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
+	{
+		/* loop through other, then actives particles*/
+		ParticleSystem *psys;
+		ParticleSystem *psys_act;
+
+		for (psys = base->object->particlesystem.first; psys; psys = psys->next) {
+			for (psys_act = ob->particlesystem.first; psys_act; psys_act = psys_act->next) {
+				if (psys->part == psys_act->part) {
+					base->flag |= SELECT;
+					changed = TRUE;
+					break;
+				}
+			}
+
+			if (base->flag & SELECT) {
+				break;
+			}
+		}
+
+		base->object->flag = base->flag;
+	}
+	CTX_DATA_END;
+
+	return changed;
+}
+
+static int object_select_all_by_library(bContext *C, Library *lib)
+{
+	int changed = FALSE;
+
+	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
+	{
+		if (lib == base->object->id.lib) {
+			base->flag |= SELECT;
+			base->object->flag = base->flag;
+
+			changed = TRUE;
+		}
+	}
+	CTX_DATA_END;
+
+	return changed;
+}
+
+static int object_select_all_by_library_obdata(bContext *C, Library *lib)
+{
+	int changed = FALSE;
+
+	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
+	{
+		if (base->object->data && lib == ((ID *)base->object->data)->lib) {
+			base->flag |= SELECT;
+			base->object->flag = base->flag;
+
+			changed = TRUE;
+		}
+	}
+	CTX_DATA_END;
+
+	return changed;
+}
+
 static int object_select_linked_exec(bContext *C, wmOperator *op)
 {
 	Scene *scene = CTX_data_scene(C);
 	Object *ob;
-	void *obdata = NULL;
-	Material *mat = NULL, *mat1;
-	Tex *tex = NULL;
-	int a, b;
 	int nr = RNA_enum_get(op->ptr, "type");
-	short changed = 0, extend;
-	/* events (nr):
-	 * Object Ipo: 1
-	 * ObData: 2
-	 * Current Material: 3
-	 * Current Texture: 4
-	 * DupliGroup: 5
-	 * PSys: 6
-	 */
+	short changed = FALSE, extend;
 
 	extend = RNA_boolean_get(op->ptr, "extend");
 	
@@ -233,113 +395,59 @@
 		return OPERATOR_CANCELLED;
 	}
 	
-	if (nr == 1) {
+	if (nr == OBJECT_SELECT_LINKED_IPO) {
 		// XXX old animation system
-		//ipo= ob->ipo;
-		//if (ipo==0) return OPERATOR_CANCELLED;
+		//if (ob->ipo==0) return OPERATOR_CANCELLED;
+		//object_select_all_by_ipo(C, ob->ipo)
 		return OPERATOR_CANCELLED;
 	}
-	else if (nr == 2) {
-		if (ob->data == NULL) return OPERATOR_CANCELLED;
-		obdata = ob->data;
+	else if (nr == OBJECT_SELECT_LINKED_OBDATA) {
+		if (ob->data == 0)
+			return OPERATOR_CANCELLED;
+
+		changed = object_select_all_by_obdata(C, ob->data);
 	}
-	else if (nr == 3 || nr == 4) {
+	else if (nr == OBJECT_SELECT_LINKED_MATERIAL || nr == OBJECT_SELECT_LINKED_TEXTURE) {
+		Material *mat = NULL;
+		Tex *tex = NULL;
+		int use_texture = FALSE;
+
 		mat = give_current_material(ob, ob->actcol);
 		if (mat == NULL) return OPERATOR_CANCELLED;
-		if (nr == 4) {
+		if (nr == OBJECT_SELECT_LINKED_TEXTURE) {
+			use_texture = TRUE;
+
 			if (mat->mtex[(int)mat->texact]) tex = mat->mtex[(int)mat->texact]->tex;
 			if (tex == NULL) return OPERATOR_CANCELLED;
 		}
+
+		changed = object_select_all_by_material_texture(C, use_texture, mat, tex);
 	}
-	else if (nr == 5) {
-		if (ob->dup_group == NULL) return OPERATOR_CANCELLED;
+	else if (nr == OBJECT_SELECT_LINKED_DUPGROUP) {
+		if (ob->dup_group == NULL)
+			return OPERATOR_CANCELLED;
+
+		changed = object_select_all_by_dup_group(C, ob->dup_group);
 	}
-	else if (nr == 6) {
-		if (ob->particlesystem.first == NULL) return OPERATOR_CANCELLED;
+	else if (nr == OBJECT_SELECT_LINKED_PARTICLE) {
+		if (ob->particlesystem.first == NULL)
+			return OPERATOR_CANCELLED;
+
+		changed = object_select_all_by_particle(C, ob);
 	}
-	else if (nr == 7) {
+	else if (nr == OBJECT_SELECT_LINKED_LIBRARY) {
 		/* do nothing */
+		changed = object_select_all_by_library(C, ob->id.lib);
 	}
-	else if (nr == 8) {
-		if (ob->data == NULL) return OPERATOR_CANCELLED;
+	else if (nr == OBJECT_SELECT_LINKED_LIBRARY_OBDATA) {
+		if (ob->data == NULL)
+			return OPERATOR_CANCELLED;
+
+		changed = object_select_all_by_library_obdata(C, ((ID *) ob->data)->lib);
 	}
 	else
 		return OPERATOR_CANCELLED;
-	
-	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
-	{
-		if (nr == 1) {
-			// XXX old animation system
-			//if (base->object->ipo == ipo) base->flag |= SELECT;
-			//changed = 1;
-		}
-		else if (nr == 2) {
-			if (base->object->data == obdata) base->flag |= SELECT;
-			changed = 1;
-		}
-		else if (nr == 3 || nr == 4) {
-			ob = base->object;
-			
-			for (a = 1; a <= ob->totcol; a++) {
-				mat1 = give_current_material(ob, a);
-				if (nr == 3) {
-					if (mat1 == mat) base->flag |= SELECT;
-					changed = 1;
-				}
-				else if (mat1 && nr == 4) {
-					for (b = 0; b < MAX_MTEX; b++) {
-						if (mat1->mtex[b]) {
-							if (tex == mat1->mtex[b]->tex) {
-								base->flag |= SELECT;
-								changed = 1;
-								break;
-							}
-						}
-					}
-				}
-			}
-		}
-		else if (nr == 5) {
-			if (base->object->dup_group == ob->dup_group) {
-				base->flag |= SELECT;
-				changed = 1;
-			}
-		}
-		else if (nr == 6) {
-			/* loop through other, then actives particles*/
-			ParticleSystem *psys;
-			ParticleSystem *psys_act;
-			
-			for (psys = base->object->particlesystem.first; psys; psys = psys->next) {
-				for (psys_act = ob->particlesystem.first; psys_act; psys_act = psys_act->next) {
-					if (psys->part == psys_act->part) {
-						base->flag |= SELECT;
-						changed = 1;
-						break;
-					}
-				}
-				
-				if (base->flag & SELECT) {
-					break;
-				}
-			}
-		}
-		else if (nr == 7) {
-			if (ob->id.lib == base->object->id.lib) {
-				base->flag |= SELECT;
-				changed = 1;
-			}
-		}
-		else if (nr == 8) {
-			if (base->object->data && ((ID *)ob->data)->lib == ((ID *)base->object->data)->lib) {
-				base->flag |= SELECT;
-				changed = 1;
-			}
-		}
-		base->object->flag = base->flag;
-	}
-	CTX_DATA_END;
-	
+
 	if (changed) {
 		WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, CTX_data_scene(C));
 		return OPERATOR_FINISHED;




More information about the Bf-blender-cvs mailing list