prevent copy/paste from incompatible types (compo -> material for eg) - would crash instantly.

This commit is contained in:
Campbell Barton 2012-08-06 08:41:45 +00:00
parent 5bb97305a4
commit df81b50bf2
3 changed files with 25 additions and 5 deletions

@ -386,11 +386,13 @@ int nodeSocketIsHidden(struct bNodeSocket *sock);
void nodeSocketSetType(struct bNodeSocket *sock, int type);
/* Node Clipboard */
void BKE_node_clipboard_clear(void);
void BKE_node_clipboard_add_node(struct bNode *node);
void BKE_node_clipboard_add_link(struct bNodeLink *link);
void BKE_node_clipboard_init(struct bNodeTree *ntree);
void BKE_node_clipboard_clear(void);
void BKE_node_clipboard_add_node(struct bNode *node);
void BKE_node_clipboard_add_link(struct bNodeLink *link);
const struct ListBase *BKE_node_clipboard_get_nodes(void);
const struct ListBase *BKE_node_clipboard_get_links(void);
int BKE_node_clipboard_get_type(void);
/* ************** NODE TYPE ACCESS *************** */

@ -1428,10 +1428,16 @@ void nodeSocketSetType(bNodeSocket *sock, int type)
typedef struct bNodeClipboard {
ListBase nodes;
ListBase links;
int type;
} bNodeClipboard;
bNodeClipboard node_clipboard;
void BKE_node_clipboard_init(struct bNodeTree *ntree)
{
node_clipboard.type = ntree->type;
}
void BKE_node_clipboard_clear(void)
{
bNode *node, *node_next;
@ -1470,6 +1476,11 @@ const ListBase *BKE_node_clipboard_get_links(void)
return &node_clipboard.links;
}
int BKE_node_clipboard_get_type(void)
{
return node_clipboard.type;
}
/* ************** dependency stuff *********** */
/* node is guaranteed to be not checked before */

@ -46,9 +46,10 @@
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_paint.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_texture.h"
@ -1918,6 +1919,7 @@ static int node_clipboard_copy_exec(bContext *C, wmOperator *UNUSED(op))
/* clear current clipboard */
BKE_node_clipboard_clear();
BKE_node_clipboard_init(ntree);
/* get group node offset */
if (gnode)
@ -1992,7 +1994,7 @@ void NODE_OT_clipboard_copy(wmOperatorType *ot)
/* ****************** Paste from clipboard ******************* */
static int node_clipboard_paste_exec(bContext *C, wmOperator *UNUSED(op))
static int node_clipboard_paste_exec(bContext *C, wmOperator *op)
{
SpaceNode *snode = CTX_wm_space_node(C);
bNodeTree *ntree = snode->edittree;
@ -2003,6 +2005,11 @@ static int node_clipboard_paste_exec(bContext *C, wmOperator *UNUSED(op))
int num_nodes;
float centerx, centery;
if (BKE_node_clipboard_get_type() != ntree->type) {
BKE_report(op->reports, RPT_ERROR, "Clipboard nodes are an incompatible type");
return OPERATOR_CANCELLED;
}
ED_preview_kill_jobs(C);
/* deselect old nodes */