2.5 / Nodes
* Operator to toggle node visibility (hide/unhide)
This commit is contained in:
@@ -855,11 +855,12 @@ static void node_addgroup(SpaceNode *snode)
|
|||||||
MEM_freeN(strp);
|
MEM_freeN(strp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
/* ************************** Node generic ************** */
|
/* ************************** Node generic ************** */
|
||||||
|
|
||||||
/* allows to walk the list in order of visibility */
|
/* allows to walk the list in order of visibility */
|
||||||
static bNode *next_node(bNodeTree *ntree)
|
bNode *next_node(bNodeTree *ntree)
|
||||||
{
|
{
|
||||||
static bNode *current=NULL, *last= NULL;
|
static bNode *current=NULL, *last= NULL;
|
||||||
|
|
||||||
@@ -912,6 +913,8 @@ static bNode *next_node(bNodeTree *ntree)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
/* is rct in visible part of node? */
|
/* is rct in visible part of node? */
|
||||||
static bNode *visible_node(SpaceNode *snode, rctf *rct)
|
static bNode *visible_node(SpaceNode *snode, rctf *rct)
|
||||||
{
|
{
|
||||||
|
@@ -53,6 +53,7 @@ void node_keymap(wmWindowManager *wm);
|
|||||||
/* node_select.c */
|
/* node_select.c */
|
||||||
void NODE_OT_select(struct wmOperatorType *ot);
|
void NODE_OT_select(struct wmOperatorType *ot);
|
||||||
void NODE_OT_extend_select(struct wmOperatorType *ot);
|
void NODE_OT_extend_select(struct wmOperatorType *ot);
|
||||||
|
void NODE_OT_toggle_visibility(struct wmOperatorType *ot);
|
||||||
|
|
||||||
/* drawnode.c */
|
/* drawnode.c */
|
||||||
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link);
|
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link);
|
||||||
@@ -60,6 +61,7 @@ void node_draw_link_bezier(View2D *v2d, float vec[][3], int th_col1, int th_col2
|
|||||||
void draw_nodespace_back_pix(ScrArea *sa, SpaceNode *snode);
|
void draw_nodespace_back_pix(ScrArea *sa, SpaceNode *snode);
|
||||||
|
|
||||||
/* node_edit.c */
|
/* node_edit.c */
|
||||||
|
bNode *next_node(bNodeTree *ntree);
|
||||||
void snode_set_context(SpaceNode *snode, Scene *scene);
|
void snode_set_context(SpaceNode *snode, Scene *scene);
|
||||||
void scale_node(SpaceNode *snode, bNode *node);
|
void scale_node(SpaceNode *snode, bNode *node);
|
||||||
void snode_make_group_editable(SpaceNode *snode, bNode *gnode);
|
void snode_make_group_editable(SpaceNode *snode, bNode *gnode);
|
||||||
|
@@ -48,6 +48,7 @@ void node_operatortypes(void)
|
|||||||
{
|
{
|
||||||
WM_operatortype_append(NODE_OT_select);
|
WM_operatortype_append(NODE_OT_select);
|
||||||
WM_operatortype_append(NODE_OT_extend_select);
|
WM_operatortype_append(NODE_OT_extend_select);
|
||||||
|
WM_operatortype_append(NODE_OT_toggle_visibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
void node_keymap(struct wmWindowManager *wm)
|
void node_keymap(struct wmWindowManager *wm)
|
||||||
@@ -56,4 +57,5 @@ void node_keymap(struct wmWindowManager *wm)
|
|||||||
|
|
||||||
RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, 0, 0)->ptr, "select_type", NODE_SELECT_MOUSE);
|
RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, 0, 0)->ptr, "select_type", NODE_SELECT_MOUSE);
|
||||||
RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_extend_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select_type", NODE_SELECT_MOUSE);
|
RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_extend_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select_type", NODE_SELECT_MOUSE);
|
||||||
|
WM_keymap_add_item(keymap, "NODE_OT_toggle_visibility", ACTIONMOUSE, KM_PRESS, 0, 0);
|
||||||
}
|
}
|
||||||
|
@@ -53,136 +53,6 @@
|
|||||||
|
|
||||||
#include "node_intern.h"
|
#include "node_intern.h"
|
||||||
|
|
||||||
/* ************************** Node generic ************** */
|
|
||||||
|
|
||||||
/* allows to walk the list in order of visibility */
|
|
||||||
static bNode *next_node(bNodeTree *ntree)
|
|
||||||
{
|
|
||||||
static bNode *current=NULL, *last= NULL;
|
|
||||||
|
|
||||||
if(ntree) {
|
|
||||||
/* set current to the first selected node */
|
|
||||||
for(current= ntree->nodes.last; current; current= current->prev)
|
|
||||||
if(current->flag & NODE_SELECT)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* set last to the first unselected node */
|
|
||||||
for(last= ntree->nodes.last; last; last= last->prev)
|
|
||||||
if((last->flag & NODE_SELECT)==0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if(current==NULL)
|
|
||||||
current= last;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/* no nodes, or we are ready */
|
|
||||||
if(current==NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* now we walk the list backwards, but we always return current */
|
|
||||||
if(current->flag & NODE_SELECT) {
|
|
||||||
bNode *node= current;
|
|
||||||
|
|
||||||
/* find previous selected */
|
|
||||||
current= current->prev;
|
|
||||||
while(current && (current->flag & NODE_SELECT)==0)
|
|
||||||
current= current->prev;
|
|
||||||
|
|
||||||
/* find first unselected */
|
|
||||||
if(current==NULL)
|
|
||||||
current= last;
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
bNode *node= current;
|
|
||||||
|
|
||||||
/* find previous unselected */
|
|
||||||
current= current->prev;
|
|
||||||
while(current && (current->flag & NODE_SELECT))
|
|
||||||
current= current->prev;
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
|
|
||||||
{
|
|
||||||
rctf totr= node->totr;
|
|
||||||
|
|
||||||
totr.ymin= totr.ymax-20.0f;
|
|
||||||
|
|
||||||
totr.xmax= totr.xmin+15.0f;
|
|
||||||
if(BLI_in_rctf(&totr, mx, my)) {
|
|
||||||
node->flag |= NODE_HIDDEN;
|
|
||||||
// allqueue(REDRAWNODE, 0);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
totr.xmax= node->totr.xmax;
|
|
||||||
totr.xmin= totr.xmax-18.0f;
|
|
||||||
if(node->typeinfo->flag & NODE_PREVIEW) {
|
|
||||||
if(BLI_in_rctf(&totr, mx, my)) {
|
|
||||||
node->flag ^= NODE_PREVIEW;
|
|
||||||
// allqueue(REDRAWNODE, 0);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
totr.xmin-=18.0f;
|
|
||||||
}
|
|
||||||
if(node->type == NODE_GROUP) {
|
|
||||||
if(BLI_in_rctf(&totr, mx, my)) {
|
|
||||||
snode_make_group_editable(snode, node);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
totr.xmin-=18.0f;
|
|
||||||
}
|
|
||||||
if(node->typeinfo->flag & NODE_OPTIONS) {
|
|
||||||
if(BLI_in_rctf(&totr, mx, my)) {
|
|
||||||
node->flag ^= NODE_OPTIONS;
|
|
||||||
// allqueue(REDRAWNODE, 0);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
totr.xmin-=18.0f;
|
|
||||||
}
|
|
||||||
/* hide unused sockets */
|
|
||||||
if(BLI_in_rctf(&totr, mx, my)) {
|
|
||||||
// XXX node_hide_unhide_sockets(snode, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
totr= node->totr;
|
|
||||||
totr.xmin= totr.xmax-10.0f;
|
|
||||||
totr.ymax= totr.ymin+10.0f;
|
|
||||||
if(BLI_in_rctf(&totr, mx, my)) {
|
|
||||||
// XXX scale_node(snode, node);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int do_header_hidden_node(SpaceNode *snode, bNode *node, float mx, float my)
|
|
||||||
{
|
|
||||||
rctf totr= node->totr;
|
|
||||||
|
|
||||||
totr.xmax= totr.xmin+15.0f;
|
|
||||||
if(BLI_in_rctf(&totr, mx, my)) {
|
|
||||||
node->flag &= ~NODE_HIDDEN;
|
|
||||||
// allqueue(REDRAWNODE, 0);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
totr.xmax= node->totr.xmax;
|
|
||||||
totr.xmin= node->totr.xmax-15.0f;
|
|
||||||
if(BLI_in_rctf(&totr, mx, my)) {
|
|
||||||
scale_node(snode, node);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short modifier)
|
static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short modifier)
|
||||||
{
|
{
|
||||||
bNode *node;
|
bNode *node;
|
||||||
|
194
source/blender/editors/space_node/node_state.c
Normal file
194
source/blender/editors/space_node/node_state.c
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
/**
|
||||||
|
* $Id:
|
||||||
|
*
|
||||||
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* The Original Code is Copyright (C) 2008 Blender Foundation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Contributor(s): Blender Foundation, Nathan Letwory
|
||||||
|
*
|
||||||
|
* ***** END GPL LICENSE BLOCK *****
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "DNA_node_types.h"
|
||||||
|
#include "DNA_scene_types.h"
|
||||||
|
#include "DNA_screen_types.h"
|
||||||
|
#include "DNA_space_types.h"
|
||||||
|
|
||||||
|
#include "BKE_context.h"
|
||||||
|
#include "BKE_node.h"
|
||||||
|
#include "BKE_global.h"
|
||||||
|
|
||||||
|
#include "BLI_rect.h"
|
||||||
|
|
||||||
|
#include "ED_space_api.h"
|
||||||
|
#include "ED_screen.h"
|
||||||
|
#include "ED_types.h"
|
||||||
|
|
||||||
|
#include "RNA_access.h"
|
||||||
|
#include "RNA_define.h"
|
||||||
|
|
||||||
|
#include "WM_api.h"
|
||||||
|
#include "WM_types.h"
|
||||||
|
|
||||||
|
#include "UI_view2d.h"
|
||||||
|
|
||||||
|
#include "node_intern.h"
|
||||||
|
|
||||||
|
|
||||||
|
static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
|
||||||
|
{
|
||||||
|
rctf totr= node->totr;
|
||||||
|
|
||||||
|
totr.ymin= totr.ymax-20.0f;
|
||||||
|
|
||||||
|
totr.xmax= totr.xmin+15.0f;
|
||||||
|
if(BLI_in_rctf(&totr, mx, my)) {
|
||||||
|
node->flag |= NODE_HIDDEN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
totr.xmax= node->totr.xmax;
|
||||||
|
totr.xmin= totr.xmax-18.0f;
|
||||||
|
if(node->typeinfo->flag & NODE_PREVIEW) {
|
||||||
|
if(BLI_in_rctf(&totr, mx, my)) {
|
||||||
|
node->flag ^= NODE_PREVIEW;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
totr.xmin-=18.0f;
|
||||||
|
}
|
||||||
|
if(node->type == NODE_GROUP) {
|
||||||
|
if(BLI_in_rctf(&totr, mx, my)) {
|
||||||
|
snode_make_group_editable(snode, node);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
totr.xmin-=18.0f;
|
||||||
|
}
|
||||||
|
if(node->typeinfo->flag & NODE_OPTIONS) {
|
||||||
|
if(BLI_in_rctf(&totr, mx, my)) {
|
||||||
|
node->flag ^= NODE_OPTIONS;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
totr.xmin-=18.0f;
|
||||||
|
}
|
||||||
|
/* hide unused sockets */
|
||||||
|
if(BLI_in_rctf(&totr, mx, my)) {
|
||||||
|
// XXX node_hide_unhide_sockets(snode, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
totr= node->totr;
|
||||||
|
totr.xmin= totr.xmax-10.0f;
|
||||||
|
totr.ymax= totr.ymin+10.0f;
|
||||||
|
if(BLI_in_rctf(&totr, mx, my)) {
|
||||||
|
// XXX scale_node(snode, node);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_header_hidden_node(SpaceNode *snode, bNode *node, float mx, float my)
|
||||||
|
{
|
||||||
|
rctf totr= node->totr;
|
||||||
|
|
||||||
|
totr.xmax= totr.xmin+15.0f;
|
||||||
|
if(BLI_in_rctf(&totr, mx, my)) {
|
||||||
|
node->flag &= ~NODE_HIDDEN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
totr.xmax= node->totr.xmax;
|
||||||
|
totr.xmin= node->totr.xmax-15.0f;
|
||||||
|
if(BLI_in_rctf(&totr, mx, my)) {
|
||||||
|
scale_node(snode, node);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void node_toggle_visibility(SpaceNode *snode, ARegion *ar, short *mval)
|
||||||
|
{
|
||||||
|
bNode *node;
|
||||||
|
float mx, my;
|
||||||
|
|
||||||
|
mx= (float)mval[0];
|
||||||
|
my= (float)mval[1];
|
||||||
|
|
||||||
|
UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my);
|
||||||
|
|
||||||
|
for(next_node(snode->edittree); (node=next_node(NULL));) {
|
||||||
|
if(node->flag & NODE_HIDDEN) {
|
||||||
|
if(do_header_hidden_node(snode, node, mx, my)) {
|
||||||
|
ED_region_tag_redraw(ar);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(do_header_node(snode, node, mx, my)) {
|
||||||
|
ED_region_tag_redraw(ar);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int node_toggle_visibility_exec(bContext *C, wmOperator *op)
|
||||||
|
{
|
||||||
|
SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
|
||||||
|
ARegion *ar= CTX_wm_region(C);
|
||||||
|
short mval[2];
|
||||||
|
|
||||||
|
mval[0] = RNA_int_get(op->ptr, "mx");
|
||||||
|
mval[1] = RNA_int_get(op->ptr, "my");
|
||||||
|
node_toggle_visibility(snode, ar, mval);
|
||||||
|
|
||||||
|
return OPERATOR_FINISHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int node_toggle_visibility_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||||
|
{
|
||||||
|
ARegion *ar= CTX_wm_region(C);
|
||||||
|
short mval[2];
|
||||||
|
|
||||||
|
mval[0]= event->x - ar->winrct.xmin;
|
||||||
|
mval[1]= event->y - ar->winrct.ymin;
|
||||||
|
|
||||||
|
RNA_int_set(op->ptr, "mx", mval[0]);
|
||||||
|
RNA_int_set(op->ptr, "my", mval[1]);
|
||||||
|
|
||||||
|
return node_toggle_visibility_exec(C,op);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NODE_OT_toggle_visibility(wmOperatorType *ot)
|
||||||
|
{
|
||||||
|
PropertyRNA *prop;
|
||||||
|
|
||||||
|
/* identifiers */
|
||||||
|
ot->name= "Toggle Visibility";
|
||||||
|
ot->idname= "NODE_OT_toggle_visibility";
|
||||||
|
|
||||||
|
/* api callbacks */
|
||||||
|
ot->invoke= node_toggle_visibility_invoke;
|
||||||
|
ot->poll= ED_operator_node_active;
|
||||||
|
|
||||||
|
prop = RNA_def_property(ot->srna, "mx", PROP_INT, PROP_NONE);
|
||||||
|
prop = RNA_def_property(ot->srna, "my", PROP_INT, PROP_NONE);
|
||||||
|
}
|
Reference in New Issue
Block a user