2.5 / Nodes
[blender.git] / source / blender / editors / space_node / node_state.c
1 /**
2  * $Id:
3  *
4  * ***** BEGIN GPL 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. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2008 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation, Nathan Letwory
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <stdio.h>
30
31 #include "DNA_node_types.h"
32 #include "DNA_scene_types.h"
33 #include "DNA_screen_types.h"
34 #include "DNA_space_types.h"
35
36 #include "BKE_context.h"
37 #include "BKE_node.h"
38 #include "BKE_global.h"
39
40 #include "BLI_rect.h"
41
42 #include "ED_space_api.h"
43 #include "ED_screen.h"
44 #include "ED_types.h"
45
46 #include "RNA_access.h"
47 #include "RNA_define.h"
48
49 #include "WM_api.h"
50 #include "WM_types.h"
51
52 #include "UI_view2d.h"
53  
54 #include "node_intern.h"
55
56
57 static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
58 {
59         rctf totr= node->totr;
60         
61         totr.ymin= totr.ymax-20.0f;
62         
63         totr.xmax= totr.xmin+15.0f;
64         if(BLI_in_rctf(&totr, mx, my)) {
65                 node->flag |= NODE_HIDDEN;
66                 return 1;
67         }       
68         
69         totr.xmax= node->totr.xmax;
70         totr.xmin= totr.xmax-18.0f;
71         if(node->typeinfo->flag & NODE_PREVIEW) {
72                 if(BLI_in_rctf(&totr, mx, my)) {
73                         node->flag ^= NODE_PREVIEW;
74                         return 1;
75                 }
76                 totr.xmin-=18.0f;
77         }
78         if(node->type == NODE_GROUP) {
79                 if(BLI_in_rctf(&totr, mx, my)) {
80                         snode_make_group_editable(snode, node);
81                         return 1;
82                 }
83                 totr.xmin-=18.0f;
84         }
85         if(node->typeinfo->flag & NODE_OPTIONS) {
86                 if(BLI_in_rctf(&totr, mx, my)) {
87                         node->flag ^= NODE_OPTIONS;
88                         return 1;
89                 }
90                 totr.xmin-=18.0f;
91         }
92         /* hide unused sockets */
93         if(BLI_in_rctf(&totr, mx, my)) {
94                 // XXX node_hide_unhide_sockets(snode, node);
95         }
96         
97         
98         totr= node->totr;
99         totr.xmin= totr.xmax-10.0f;
100         totr.ymax= totr.ymin+10.0f;
101         if(BLI_in_rctf(&totr, mx, my)) {
102                 // XXX scale_node(snode, node);
103                 return 1;
104         }
105         return 0;
106 }
107
108 static int do_header_hidden_node(SpaceNode *snode, bNode *node, float mx, float my)
109 {
110         rctf totr= node->totr;
111         
112         totr.xmax= totr.xmin+15.0f;
113         if(BLI_in_rctf(&totr, mx, my)) {
114                 node->flag &= ~NODE_HIDDEN;
115                 return 1;
116         }       
117         
118         totr.xmax= node->totr.xmax;
119         totr.xmin= node->totr.xmax-15.0f;
120         if(BLI_in_rctf(&totr, mx, my)) {
121                 scale_node(snode, node);
122                 return 1;
123         }
124         return 0;
125 }
126
127 static void node_toggle_visibility(SpaceNode *snode, ARegion *ar, short *mval)
128 {
129         bNode *node;
130         float mx, my;
131         
132         mx= (float)mval[0];
133         my= (float)mval[1];
134         
135         UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my);
136         
137         for(next_node(snode->edittree); (node=next_node(NULL));) {
138                 if(node->flag & NODE_HIDDEN) {
139                         if(do_header_hidden_node(snode, node, mx, my)) {
140                                 ED_region_tag_redraw(ar);
141                                 break;
142                         }
143                 }
144                 else {
145                         if(do_header_node(snode, node, mx, my)) {
146                                 ED_region_tag_redraw(ar);
147                                 break;
148                         }
149                 }
150         }
151 }
152
153 static int node_toggle_visibility_exec(bContext *C, wmOperator *op)
154 {
155         SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
156         ARegion *ar= CTX_wm_region(C);
157         short mval[2];
158
159         mval[0] = RNA_int_get(op->ptr, "mx");
160         mval[1] = RNA_int_get(op->ptr, "my");
161         node_toggle_visibility(snode, ar, mval);
162
163         return OPERATOR_FINISHED;
164 }
165
166 static int node_toggle_visibility_invoke(bContext *C, wmOperator *op, wmEvent *event)
167 {
168         ARegion *ar= CTX_wm_region(C);
169         short mval[2];  
170         
171         mval[0]= event->x - ar->winrct.xmin;
172         mval[1]= event->y - ar->winrct.ymin;
173         
174         RNA_int_set(op->ptr, "mx", mval[0]);
175         RNA_int_set(op->ptr, "my", mval[1]);
176
177         return node_toggle_visibility_exec(C,op);
178 }
179
180 void NODE_OT_toggle_visibility(wmOperatorType *ot)
181 {
182         PropertyRNA *prop;
183         
184         /* identifiers */
185         ot->name= "Toggle Visibility";
186         ot->idname= "NODE_OT_toggle_visibility";
187         
188         /* api callbacks */
189         ot->invoke= node_toggle_visibility_invoke;
190         ot->poll= ED_operator_node_active;
191         
192         prop = RNA_def_property(ot->srna, "mx", PROP_INT, PROP_NONE);
193         prop = RNA_def_property(ot->srna, "my", PROP_INT, PROP_NONE);
194 }
195
196 static int node_fit_all_exec(bContext *C, wmOperator *op)
197 {
198         ScrArea *sa= CTX_wm_area(C);
199         ARegion *ar= CTX_wm_region(C);
200         SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C);
201         snode_home(sa, ar, snode);
202         ED_region_tag_redraw(ar);
203         return OPERATOR_FINISHED;
204 }
205
206 void NODE_OT_fit_all(wmOperatorType *ot)
207 {
208         /* identifiers */
209         ot->name= "Fit All";
210         ot->idname= "NODE_OT_fit_all";
211         
212         /* api callbacks */
213         ot->exec= node_fit_all_exec;
214         ot->poll= ED_operator_node_active;
215 }