svn merge ^/trunk/blender -r46930:HEAD
[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 "BLF_translation.h"
48
49 #include "BKE_context.h"
50 #include "BKE_global.h"
51 #include "BKE_node.h"
52 #include "BKE_screen.h"
53
54 #include "WM_api.h"
55 #include "WM_types.h"
56
57 #include "RNA_access.h"
58
59 #include "ED_gpencil.h"
60 #include "ED_screen.h"
61
62 #include "UI_interface.h"
63 #include "UI_resources.h"
64
65 #include "node_intern.h"        // own include
66
67
68 /* ******************* node space & buttons ************** */
69
70 /* poll for active nodetree */
71 static int active_nodetree_poll(const bContext *C, PanelType *UNUSED(pt))
72 {
73         SpaceNode *snode= CTX_wm_space_node(C);
74         
75         return (snode && snode->nodetree);
76 }
77
78 /* poll callback for active node */
79 static int active_node_poll(const bContext *C, PanelType *UNUSED(pt))
80 {
81         SpaceNode *snode= CTX_wm_space_node(C);
82         
83         return (snode && snode->edittree && nodeGetActive(snode->edittree));
84 }
85
86 /* active node */
87 static void active_node_panel(const bContext *C, Panel *pa)
88 {
89         SpaceNode *snode= CTX_wm_space_node(C);
90         bNodeTree *ntree= (snode) ? snode->edittree : NULL;
91         bNode *node = (ntree) ? nodeGetActive(ntree) : NULL; // xxx... for editing group nodes
92         uiLayout *layout, *row, *col, *sub;
93         PointerRNA ptr, opptr;
94         
95         /* verify pointers, and create RNA pointer for the node */
96         if (ELEM(NULL, ntree, node))
97                 return;
98         //if (node->id) /* for group nodes */
99         //      RNA_pointer_create(node->id, &RNA_Node, node, &ptr);
100         //else
101                 RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr); 
102         
103         layout = uiLayoutColumn(pa->layout, 0);
104         uiLayoutSetContextPointer(layout, "node", &ptr);
105         
106         /* draw this node's name, etc. */
107         uiItemR(layout, &ptr, "label", 0, NULL, ICON_NODE);
108         uiItemS(layout);
109         uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
110         uiItemS(layout);
111         
112         uiItemO(layout, NULL, 0, "NODE_OT_hide_socket_toggle");
113         uiItemS(layout);
114         uiItemS(layout);
115
116         row = uiLayoutRow(layout, 0);
117         
118         col = uiLayoutColumn(row, 1);
119         uiItemM(col, (bContext *)C, "NODE_MT_node_color_presets", NULL, 0);
120         uiItemR(col, &ptr, "use_custom_color", UI_ITEM_R_ICON_ONLY, NULL, ICON_NONE);
121         sub = uiLayoutRow(col, 0);
122         if (!(node->flag & NODE_CUSTOM_COLOR))
123                 uiLayoutSetEnabled(sub, 0);
124         uiItemR(sub, &ptr, "color", 0, "", 0);
125         
126         col = uiLayoutColumn(row, 1);
127         uiItemO(col, "", ICON_ZOOMIN, "node.node_color_preset_add");
128         opptr = uiItemFullO(col, "node.node_color_preset_add", "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS);
129         RNA_boolean_set(&opptr, "remove_active", 1);
130         uiItemM(col, (bContext *)C, "NODE_MT_node_color_specials", "", ICON_DOWNARROW_HLT);
131         
132         /* draw this node's settings */
133         if (node->typeinfo && node->typeinfo->uifuncbut) {
134                 uiItemS(layout);
135                 uiItemS(layout);
136                 node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr);
137         }
138         else if (node->typeinfo && node->typeinfo->uifunc) {
139                 uiItemS(layout);
140                 uiItemS(layout);
141                 node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
142         }
143 }
144
145 static int node_sockets_poll(const bContext *C, PanelType *UNUSED(pt))
146 {
147         SpaceNode *snode= CTX_wm_space_node(C);
148         
149         return (snode && snode->nodetree && G.rt == 777);
150 }
151
152 static void node_sockets_panel(const bContext *C, Panel *pa)
153 {
154         SpaceNode *snode= CTX_wm_space_node(C);
155         bNodeTree *ntree= (snode) ? snode->edittree : NULL;
156         bNode *node = (ntree) ? nodeGetActive(ntree) : NULL;
157         bNodeSocket *sock;
158         uiLayout *layout= pa->layout, *split;
159         char name[UI_MAX_NAME_STR];
160         
161         if (ELEM(NULL, ntree, node))
162                 return;
163         
164         for (sock=node->inputs.first; sock; sock=sock->next) {
165                 BLI_snprintf(name, sizeof(name), "%s:", sock->name);
166
167                 split = uiLayoutSplit(layout, 0.35f, 0);
168                 uiItemL(split, name, ICON_NONE);
169                 uiTemplateNodeLink(split, ntree, node, sock);
170         }
171 }
172
173 /* ******************* node buttons registration ************** */
174
175 void node_buttons_register(ARegionType *art)
176 {
177         PanelType *pt;
178         
179         pt= MEM_callocN(sizeof(PanelType), "spacetype node panel active node");
180         strcpy(pt->idname, "NODE_PT_item");
181         strcpy(pt->label, IFACE_("Active Node"));
182         pt->draw= active_node_panel;
183         pt->poll= active_node_poll;
184         BLI_addtail(&art->paneltypes, pt);
185
186         pt= MEM_callocN(sizeof(PanelType), "spacetype node panel node sockets");
187         strcpy(pt->idname, "NODE_PT_sockets");
188         strcpy(pt->label, "Sockets");
189         pt->draw= node_sockets_panel;
190         pt->poll= node_sockets_poll;
191         pt->flag |= PNL_DEFAULT_CLOSED;
192         BLI_addtail(&art->paneltypes, pt);
193         
194         pt= MEM_callocN(sizeof(PanelType), "spacetype node panel gpencil");
195         strcpy(pt->idname, "NODE_PT_gpencil");
196         strcpy(pt->label, "Grease Pencil");
197         pt->draw= gpencil_panel_standard;
198         pt->poll= active_nodetree_poll;
199         BLI_addtail(&art->paneltypes, pt);
200 }
201
202 static int node_properties(bContext *C, wmOperator *UNUSED(op))
203 {
204         ScrArea *sa= CTX_wm_area(C);
205         ARegion *ar= node_has_buttons_region(sa);
206         
207         if (ar)
208                 ED_region_toggle_hidden(C, ar);
209
210         return OPERATOR_FINISHED;
211 }
212
213 /* non-standard poll operator which doesn't care if there are any nodes */
214 static int node_properties_poll(bContext *C)
215 {
216         ScrArea *sa= CTX_wm_area(C);
217         return (sa && (sa->spacetype == SPACE_NODE));
218 }
219
220 void NODE_OT_properties(wmOperatorType *ot)
221 {
222         ot->name = "Properties";
223         ot->description = "Toggles the properties panel display";
224         ot->idname = "NODE_OT_properties";
225         
226         ot->exec = node_properties;
227         ot->poll = node_properties_poll;
228         
229         /* flags */
230         ot->flag = 0;
231 }