Orange branch: Revived hidden treasure, the Groups!
[blender.git] / source / blender / src / editgroup.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #include <string.h>
34
35 #include "MEM_guardedalloc.h"
36
37 #include "BLI_blenlib.h"
38 #include "BLI_arithb.h"
39
40 #include "DNA_group_types.h"
41 #include "DNA_object_types.h"
42 #include "DNA_scene_types.h"
43 #include "DNA_view3d_types.h"
44
45 #include "BKE_group.h"
46 #include "BKE_global.h"
47 #include "BKE_main.h"
48
49 #include "BIF_space.h"
50 #include "BIF_interface.h"
51 #include "BIF_toolbox.h"
52 #include "BIF_editgroup.h"
53
54 #include "blendef.h"
55 #include "mydevice.h"
56
57 #ifdef HAVE_CONFIG_H
58 #include <config.h>
59 #endif
60
61 void add_selected_to_group(Group *group)
62 {
63         Base *base;
64         
65         for(base=FIRSTBASE; base; base= base->next) {
66                 if TESTBASE(base) {
67                         add_to_group(group, base->object);
68                         base->object->flag |= OB_FROMGROUP;
69                         base->flag |= OB_FROMGROUP;
70                 }
71         }
72         
73         allqueue(REDRAWVIEW3D, 0);
74         allqueue(REDRAWBUTSOBJECT, 0);
75 }
76
77 void rem_selected_from_group(void)
78 {
79         Base *base;
80         Group *group;
81         
82         for(base=FIRSTBASE; base; base= base->next) {
83                 if TESTBASE(base) {
84
85                         while( (group = find_group(base->object)) ) {
86                                 rem_from_group(group, base->object);
87                         }
88                         base->object->flag &= ~OB_FROMGROUP;
89                         base->flag &= ~OB_FROMGROUP;
90                 }
91         }
92         
93         allqueue(REDRAWVIEW3D, 0);
94         allqueue(REDRAWBUTSOBJECT, 0);
95 }
96
97 void group_operation_with_menu(void)
98 {
99         Base *base;
100         Group *group= NULL;
101         int mode;
102         
103         for(base=FIRSTBASE; base; base= base->next) {
104                 if TESTBASE(base) {
105                         group= find_group(base->object);
106                         if(group) break;
107                 }
108         }
109         
110         if(base)
111                 mode= pupmenu("Groups %t|Add to current Group %x3|Add to New Group %x1|Remove from all Groups %x2");
112         else
113                 mode= pupmenu("Groups %t|Add to New Group %x1|Remove from all Groups %x2");
114         
115         if(mode>0) {
116                 if(group==NULL) group= add_group();
117                 
118                 if(mode==1 || mode==3) add_selected_to_group(group);
119                 else if(mode==2) rem_selected_from_group();
120         }
121 }