Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-07-25 23:45:31 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-07-25 23:45:31 +0400
commitb66f541b426be7a5904459625627ad354c796ed2 (patch)
tree0514c09c2ada29b6c1825271bf23b24d1b4c83c8 /source/blender/editors/object/object_select.c
parent927af4ccc9826753c1176563b72018f31c2e9eed (diff)
Separate Select Linked operator into smaller function which could be reused.
Should be no functional changes.
Diffstat (limited to 'source/blender/editors/object/object_select.c')
-rw-r--r--source/blender/editors/object/object_select.c330
1 files changed, 219 insertions, 111 deletions
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index 3d3f4ef1260..f5f1ba61e8b 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -186,36 +186,198 @@ void OBJECT_OT_select_by_type(wmOperatorType *ot)
/*********************** 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 @@ static int object_select_linked_exec(bContext *C, wmOperator *op)
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;