Merging r42723 through r42769 from trunk into soc-2011-tomato
[blender.git] / source / blender / editors / space_node / node_buttons.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2009 Blender Foundation.
19  * All rights reserved.
20  *
21  * 
22  * Contributor(s): Blender Foundation
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/editors/space_node/node_buttons.c
28  *  \ingroup spnode
29  */
30
31
32 #include <string.h>
33 #include <stdio.h>
34 #include <math.h>
35 #include <float.h>
36
37 #include "MEM_guardedalloc.h"
38
39 #include "DNA_node_types.h"
40 #include "DNA_scene_types.h"
41
42 #include "BLI_math.h"
43 #include "BLI_blenlib.h"
44 #include "BLI_rand.h"
45 #include "BLI_utildefines.h"
46
47 #include "BKE_context.h"
48 #include "BKE_global.h"
49 #include "BKE_node.h"
50 #include "BKE_screen.h"
51
52 #include "WM_api.h"
53 #include "WM_types.h"
54
55 #include "RNA_access.h"
56
57 #include "ED_gpencil.h"
58 #include "ED_screen.h"
59
60 #include "UI_interface.h"
61 #include "UI_resources.h"
62
63 #include "node_intern.h"        // own include
64
65
66 /* ******************* node space & buttons ************** */
67 #define B_NOP           1
68 #define B_REDR          2
69
70 static void do_node_region_buttons(bContext *C, void *UNUSED(arg), int event)
71 {
72         //SpaceNode *snode= CTX_wm_space_node(C);
73         
74         switch(event) {
75         case B_REDR:
76                 ED_area_tag_redraw(CTX_wm_area(C));
77                 return; /* no notifier! */
78         }
79 }
80
81 /* poll callback for active node */
82 static int active_node_poll(const bContext *C, PanelType *UNUSED(pt))
83 {
84         SpaceNode *snode= CTX_wm_space_node(C);
85         
86         // TODO: include check for whether there is an active node...
87         return (snode && snode->nodetree);
88 }
89
90 /* active node */
91 static void active_node_panel(const bContext *C, Panel *pa)
92 {
93         SpaceNode *snode= CTX_wm_space_node(C);
94         bNodeTree *ntree= (snode) ? snode->edittree : NULL;
95         bNode *node = (ntree) ? nodeGetActive(ntree) : NULL; // xxx... for editing group nodes
96         uiLayout *layout= pa->layout;
97         uiBlock *block;
98         PointerRNA ptr;
99         
100         /* verify pointers, and create RNA pointer for the node */
101         if ELEM(NULL, ntree, node)
102                 return;
103         //if (node->id) /* for group nodes */
104         //      RNA_pointer_create(node->id, &RNA_Node, node, &ptr);
105         //else
106                 RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr); 
107         
108         /* set update callback */
109         // xxx is this really needed
110         block= uiLayoutGetBlock(layout);
111         uiBlockSetHandleFunc(block, do_node_region_buttons, NULL);
112         
113         /* draw this node's name, etc. */
114         uiItemR(layout, &ptr, "label", 0, NULL, ICON_NODE);
115         uiItemS(layout);
116         uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
117         uiItemS(layout);
118         
119         uiItemO(layout, NULL, 0, "NODE_OT_hide_socket_toggle");
120         uiItemS(layout);
121
122         /* draw this node's settings */
123         if (node->typeinfo && node->typeinfo->uifuncbut)
124                 node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr);
125         else if (node->typeinfo && node->typeinfo->uifunc)
126                 node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
127 }
128
129 static int node_sockets_poll(const bContext *C, PanelType *UNUSED(pt))
130 {
131         SpaceNode *snode= CTX_wm_space_node(C);
132         
133         return (snode && snode->nodetree && G.rt == 777);
134 }
135
136 static void node_sockets_panel(const bContext *C, Panel *pa)
137 {
138         SpaceNode *snode= CTX_wm_space_node(C);
139         bNodeTree *ntree= (snode) ? snode->edittree : NULL;
140         bNode *node = (ntree) ? nodeGetActive(ntree) : NULL;
141         bNodeSocket *sock;
142         uiLayout *layout= pa->layout, *split;
143         char name[UI_MAX_NAME_STR];
144         
145         if(ELEM(NULL, ntree, node))
146                 return;
147         
148         for(sock=node->inputs.first; sock; sock=sock->next) {
149                 BLI_snprintf(name, sizeof(name), "%s:", sock->name);
150
151                 split = uiLayoutSplit(layout, 0.35f, 0);
152                 uiItemL(split, name, ICON_NONE);
153                 uiTemplateNodeLink(split, ntree, node, sock);
154         }
155 }
156
157 /* ******************* node buttons registration ************** */
158
159 void node_buttons_register(ARegionType *art)
160 {
161         PanelType *pt;
162         
163         pt= MEM_callocN(sizeof(PanelType), "spacetype node panel active node");
164         strcpy(pt->idname, "NODE_PT_item");
165         strcpy(pt->label, "Active Node");
166         pt->draw= active_node_panel;
167         pt->poll= active_node_poll;
168         BLI_addtail(&art->paneltypes, pt);
169
170         pt= MEM_callocN(sizeof(PanelType), "spacetype node panel node sockets");
171         strcpy(pt->idname, "NODE_PT_sockets");
172         strcpy(pt->label, "Sockets");
173         pt->draw= node_sockets_panel;
174         pt->poll= node_sockets_poll;
175         pt->flag |= PNL_DEFAULT_CLOSED;
176         BLI_addtail(&art->paneltypes, pt);
177         
178         pt= MEM_callocN(sizeof(PanelType), "spacetype node panel gpencil");
179         strcpy(pt->idname, "NODE_PT_gpencil");
180         strcpy(pt->label, "Grease Pencil");
181         pt->draw= gpencil_panel_standard;
182         BLI_addtail(&art->paneltypes, pt);
183 }
184
185 static int node_properties(bContext *C, wmOperator *UNUSED(op))
186 {
187         ScrArea *sa= CTX_wm_area(C);
188         ARegion *ar= node_has_buttons_region(sa);
189         
190         if(ar)
191                 ED_region_toggle_hidden(C, ar);
192
193         return OPERATOR_FINISHED;
194 }
195
196 /* non-standard poll operator which doesn't care if there are any nodes */
197 static int node_properties_poll(bContext *C)
198 {
199         ScrArea *sa= CTX_wm_area(C);
200         return (sa && (sa->spacetype == SPACE_NODE));
201 }
202
203 void NODE_OT_properties(wmOperatorType *ot)
204 {
205         ot->name= "Properties";
206         ot->description= "Toggles the properties panel display";
207         ot->idname= "NODE_OT_properties";
208         
209         ot->exec= node_properties;
210         ot->poll= node_properties_poll;
211         
212         /* flags */
213         ot->flag= 0;
214 }