1/******************************************************************************
2	NintendoWare for CTR Maya Plugin
3
4	File:         NW4C_SetUserData.mel
5	Description:  set user data
6	Date:         2010/10/14
7	Author:       Takashi Endo
8
9	Copyright 2010 Nintendo Co., Ltd. All rights reserved.
10******************************************************************************/
11
12// UpdateWindowT OpenInputWindow
13// InputApplyCB DeleteBtnCB MoveUpBtnCB
14
15/******************************************************************************
16	user data size
17******************************************************************************/
18global proc int nw4cSetUserData_Get_UserDataSize(string $node)
19{
20	return (`attributeQuery -n $node -ex "nw4cUserDataSize"`) ?
21		`getAttr ($node + ".nw4cUserDataSize")` : 0;
22}
23
24global proc nw4cSetUserData_Add_UserDataSize(string $node)
25{
26	if (!`attributeQuery -n $node -ex "nw4cUserDataSize"`)
27	{
28		addAttr -ln "nw4cUserDataSize" -at "short" -dv 0 -h 1 $node;
29	}
30}
31
32global proc nw4cSetUserData_Set_UserDataSize(string $node, int $val)
33{
34	nw4cSetUserData_Add_UserDataSize($node);
35	setAttr ($node + ".nw4cUserDataSize") $val;
36}
37
38/******************************************************************************
39	user data value
40******************************************************************************/
41global proc string nw4cSetUserData_Get_UserDataValue(string $node, int $index)
42{
43	if (!`attributeQuery -n $node -ex "nw4cUserData"` ||
44		$index >= nw4cSetUserData_Get_UserDataSize($node))
45	{
46		return "";
47	}
48	string $val = `getAttr ($node + ".nw4cUserData[" + $index + "]")`;
49	return $val;
50}
51
52global proc nw4cSetUserData_Add_UserDataValue(string $node)
53{
54	if (!`attributeQuery -n $node -ex "nw4cUserData"`)
55	{
56		addAttr -m -ln "nw4cUserData" -dt "string" -h 1 $node;
57	}
58}
59
60global proc nw4cSetUserData_Set_UserDataValue(string $node, int $index, string $val)
61{
62	nw4cSetUserData_Add_UserDataValue($node);
63	setAttr -typ "string" ($node + ".nw4cUserData[" + $index + "]") $val;
64	//trace ("set: " + $node + ".data[" + $index + "] = " + $val);
65}
66
67global proc int nw4cSetUserData_Get_AllUserDataValue(string $values[], string $node)
68{
69	clear($values);
70	int $size = nw4cSetUserData_Get_UserDataSize($node);
71	for ($index = 0; $index < $size; ++$index)
72	{
73		$values[$index] = nw4cSetUserData_Get_UserDataValue($node, $index);
74	}
75	return $size; // return user data size
76}
77
78/******************************************************************************
79	is user data name is unique
80******************************************************************************/
81proc int IsUserDataNameIsUnique(string $dataValues[], string $checkName,
82	int $editIndex)
83{
84	int $dataSize = size($dataValues);
85	int $index;
86	for ($index = 0; $index < $dataSize; ++$index)
87	{
88		if ($index == $editIndex)
89		{
90			continue;
91		}
92		string $name = match("[^\"]*\"", $dataValues[$index]);
93		if (size($name) >= 2)
94		{
95			if (substring($name, 1, size($name) - 1) == $checkName)
96			{
97				return false;
98			}
99		}
100	}
101	return true;
102}
103
104/******************************************************************************
105	decode user data value
106
107		$words[0]: name
108		$words[1]: type (0, 1, 2)
109		$words[2]: size
110		$words[3]: value
111******************************************************************************/
112proc DecodeUserDataValue(string $words[], string $userData)
113{
114	string $name = match("[^\"]*\"", $userData);
115	string $typeStr = "0";
116	string $sizeStr = "0";
117	string $valStr = "";
118
119	int $nameSize = size($name);
120	if ($nameSize <= 1)
121	{
122		$name = "error";
123	}
124	else
125	{
126		$name = substring($name, 1, $nameSize - 1);
127		$userData = substring($userData, $nameSize + 1, size($userData));
128		if (size(match("^i", $userData)) > 0)
129		{
130			$typeStr = "1";
131		}
132		else if (size(match("^f", $userData)) > 0)
133		{
134			$typeStr = "2";
135		}
136		$userData = substring($userData, 3, size($userData));
137		$sizeStr = match("[0-9]+", $userData);
138		$valStr = substring($userData, size($sizeStr) + 2, size($userData));
139	}
140
141	$words[0] = $name;
142	$words[1] = $typeStr;
143	$words[2] = $sizeStr;
144	$words[3] = $valStr;
145}
146
147/******************************************************************************
148	get list string from user data value
149******************************************************************************/
150proc string GetListStringFromUserDataValue(string $userData)
151{
152	//-----------------------------------------------------------------------------
153	// decode
154	string $words[4];
155	DecodeUserDataValue($words, $userData);
156	string $name    = $words[0];
157	int $type       = (int)$words[1];
158	string $sizeStr = $words[2];
159	string $valStr  = $words[3];
160
161	//-----------------------------------------------------------------------------
162	// format
163	int $nameSize = size($name);
164	if ($nameSize < 16)
165	{
166		$name += substring("                ", 1, 16 - $nameSize);
167	}
168	else if ($nameSize > 16)
169	{
170		$name = substring($name, 1, 16 - 3) + "...";
171	}
172
173	if (size($sizeStr) < 4)
174	{
175		$sizeStr = substring("    ", 1, 4 - size($sizeStr)) + $sizeStr;
176	}
177
178	if (size($valStr) > 24)
179	{
180		$valStr = substring($valStr, 1, 24 - 3) + "...";
181	}
182
183	string $typeNames[3] = { "(String) ", "(Integer)", "(Float)  " };
184	return ($name + "  " + $typeNames[$type] + "  [" + $sizeStr + "]  \"" + $valStr + "\"");
185}
186
187/******************************************************************************
188	get selected SG
189
190		return SG size
191******************************************************************************/
192proc int GetSelectedSG(string $sgs[])
193{
194	$sgs = `ls -sl -typ shadingEngine`;
195	if (size($sgs) == 0)
196	{
197		// get SG from selected material
198		string $mats[] = `ls -sl -mat`;
199		for ($mat in $mats)
200		{
201			if (!`attributeQuery -n $mat -ex "oc"`)
202			{
203				continue;
204			}
205			string $connectedSgs[] =
206				`listConnections -s 0 -d 1 -type shadingEngine ($mat + ".oc")`;
207			for ($sg in $connectedSgs)
208			{
209				if ($sg != "initialParticleSE" &&
210					$sg != "swatchShadingGroup")
211				{
212					$sgs[size($sgs)] = $sg;
213				}
214			}
215		}
216	}
217	return size($sgs);
218}
219
220/******************************************************************************
221	is valid transform
222******************************************************************************/
223proc int IsValidTransform(string $node)
224{
225	string $childs[] = `listRelatives -pa -s $node`;
226	if (size(`ls
227		-typ ambientLight
228		-typ areaLight
229		-typ volumeLight
230		-typ environmentFog
231		$childs`) > 0)
232	{
233		return false;
234	}
235	else
236	{
237		return true;
238	}
239}
240
241/******************************************************************************
242	get selected transform & SG
243
244		return node size
245******************************************************************************/
246proc int GetSelectedXformAndSG(string $nodes[])
247{
248	clear($nodes);
249
250	//-----------------------------------------------------------------------------
251	// transform
252	string $xforms[] = `ls -sl -typ transform`;
253	for ($node in $xforms)
254	{
255		if (IsValidTransform($node))
256		{
257			$nodes[size($nodes)] =$node;
258		}
259	}
260
261	//-----------------------------------------------------------------------------
262	// SG
263	string $sgs[];
264	if (GetSelectedSG($sgs) > 0)
265	{
266		for ($node in $sgs)
267		{
268			$nodes[size($nodes)] =$node;
269		}
270	}
271
272	return size($nodes);
273}
274
275/******************************************************************************
276	enable main window
277******************************************************************************/
278global proc nw4cSetUserData_EnableMainWindow(int $enableFlag)
279{
280	if (`window -ex nw4cSetUserData_Win`)
281	{
282		control -e -en $enableFlag nw4cSetUserData_MoveUpBtn;
283		control -e -en $enableFlag nw4cSetUserData_MoveDownBtn;
284		control -e -en $enableFlag nw4cSetUserData_AddBtn;
285		control -e -en $enableFlag nw4cSetUserData_DeleteBtn;
286		control -e -en $enableFlag nw4cSetUserData_EditBtn;
287		control -e -en $enableFlag nw4cSetUserData_List;
288		control -e -en $enableFlag nw4cSetUserData_CloseBtn;
289	}
290}
291
292/******************************************************************************
293	input apply callback
294******************************************************************************/
295global proc nw4cSetUserData_InputApplyCB(string $node,
296	int $curIndex, int $addFlag)
297{
298	//-----------------------------------------------------------------------------
299	// check node exist
300	if (!`objExists $node`)
301	{
302		warning ("Node does not exist: " + $node);
303		return;
304	}
305
306	//-----------------------------------------------------------------------------
307	// get all data
308	string $dataValues[];
309	int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node);
310
311	//-----------------------------------------------------------------------------
312	// get control value
313	string $name = `textField -q -tx nw4cSetUserData_DataName`;
314	$name = strip($name);
315	int $type = `radioButtonGrp -q -sl nw4cSetUserData_DataType` - 1;
316	string $strVal = `textField -q -tx nw4cSetUserData_StringValue`;
317	string $numVal = `scrollField -q -tx nw4cSetUserData_NumberValue`;
318
319	//-----------------------------------------------------------------------------
320	// check name
321	int $intNums[];
322	float $floatNums[];
323	if (size($name) == 0)
324	{
325		error "Name is empty";
326	}
327	if (size(match("[^-_.0-9A-Za-z]", $name)) > 0)
328	{
329		error "Name is wrong (please use only [alphabetic/numeric character] [-] [_] [.])";
330	}
331	int $editIndex = ($addFlag) ? -1 : $curIndex;
332	if (!IsUserDataNameIsUnique($dataValues, $name, $editIndex))
333	{
334		error "Name is already used";
335	}
336
337	//-----------------------------------------------------------------------------
338	// check value
339	if ($type == 0)	// string
340	{
341		if (size($strVal) == 0)
342		{
343			error "String is empty";
344		}
345		if (size(match("[<>&'\"]", $strVal)) > 0)
346		{
347			error "String is wrong (please don't use [<] [>] [&] ['] [double quote])";
348		}
349	}
350	else			// int / float
351	{
352		if (size($numVal) == 0)
353		{
354			error "Number is empty";
355		}
356		int $validFlag = 1;
357		string $lines[];
358		tokenize($numVal, "\n", $lines);
359		for ($line in $lines)
360		{
361			$line = strip($line);
362			//print ("[" + $line + "]\n");
363			if (size($line) == 0)
364			{
365				continue;
366			}
367
368			string $words[];
369			if (tokenize($line, " ", $words) != 1 || // multi value per line
370				size(match("[^eE][+-]", $line)) > 0) // +/- is not at top or after E
371			{
372				$validFlag = 0;
373				break;
374			}
375
376			if ($type == 1)	// int
377			{
378				if (size(match("[^+-0123456789]", $line)) > 0)
379				{
380					$validFlag = 0;
381					break;
382				}
383				$intNums[size($intNums)] = (int)$line;
384			}
385			else			// float
386			{
387				if (size(match("[^+-0123456789eE.]", $line)) > 0)
388				{
389					$validFlag = 0;
390					break;
391				}
392				$floatNums[size($floatNums)] = (float)$line;
393			}
394		}
395
396		if ($type == 1)
397		{
398			if (!$validFlag || size($intNums) == 0)
399			{
400				error "Please input integer number";
401			}
402		}
403		else
404		{
405			if (!$validFlag || size($floatNums) == 0)
406			{
407				error "Please input float number";
408			}
409		}
410	}
411
412	//-----------------------------------------------------------------------------
413	// create data string
414	string $dataStr = $name + "\"";
415	if ($type == 0)
416	{
417		$dataStr += "s " + size($strVal) + " " + $strVal;
418	}
419	else if ($type == 1)
420	{
421		$dataStr += "i " + size($intNums);
422		int $intVal;
423		for ($intVal in $intNums)
424		{
425			$dataStr += " " + $intVal;
426		}
427	}
428	else
429	{
430		$dataStr += "f " + size($floatNums);
431		float $floatVal;
432		for ($floatVal in $floatNums)
433		{
434			$dataStr += " " + $floatVal;
435		}
436	}
437
438	//-----------------------------------------------------------------------------
439	// add or edit
440	if ($addFlag)
441	{
442		//-----------------------------------------------------------------------------
443		// add
444		if ($curIndex > $dataSize)
445		{
446			$curIndex = $dataSize;
447		}
448		if ($dataSize > 0)
449		{
450			// shift
451			for ($idx = $dataSize; $idx > $curIndex; --$idx)
452			{
453				nw4cSetUserData_Set_UserDataValue($node, $idx, $dataValues[$idx - 1]);
454			}
455		}
456		nw4cSetUserData_Set_UserDataValue($node, $curIndex, $dataStr);
457		nw4cSetUserData_Set_UserDataSize($node, $dataSize + 1);
458	}
459	else
460	{
461		//-----------------------------------------------------------------------------
462		// edit
463		if ($dataSize == 0)
464		{
465			$curIndex = 0;
466			nw4cSetUserData_Set_UserDataSize($node, 1);
467		}
468		else if ($curIndex >= $dataSize)
469		{
470			$curIndex = $dataSize - 1;
471		}
472		nw4cSetUserData_Set_UserDataValue($node, $curIndex, $dataStr);
473	}
474}
475
476/******************************************************************************
477	data type callback
478******************************************************************************/
479global proc nw4cSetUserData_DataTypeCB()
480{
481	int $type = `radioButtonGrp -q -sl nw4cSetUserData_DataType` - 1;
482	int $strFlag = ($type == 0);
483
484	control -e -en $strFlag nw4cSetUserData_StringLabel;
485	control -e -en $strFlag nw4cSetUserData_StringValue;
486	control -e -en (!$strFlag) nw4cSetUserData_NumberLabel;
487	control -e -en (!$strFlag) nw4cSetUserData_NumberValue;
488}
489
490/******************************************************************************
491	open input window
492******************************************************************************/
493proc OpenInputWindow(string $node, int $curIndex, int $addFlag)
494{
495	//-----------------------------------------------------------------------------
496	// get current value
497	string $name = "";
498	int $type = 0;
499	string $strVal = "";
500	string $numVal = "";
501	int $dataSize = nw4cSetUserData_Get_UserDataSize($node);
502	if (!$addFlag)
503	{
504		string $userData = nw4cSetUserData_Get_UserDataValue($node, $curIndex);
505		string $words[4];
506		DecodeUserDataValue($words, $userData);
507		$name = $words[0];
508		$type = (int)$words[1];
509		string $valStr = $words[3];
510		if ($type == 0)
511		{
512			$strVal = $valStr;
513		}
514		else
515		{
516			string $nums[];
517			tokenize($valStr, " ", $nums);
518			for ($num in $nums)
519			{
520				$numVal += ("" + $num + "\r\n");
521			}
522		}
523	}
524
525	//-----------------------------------------------------------------------------
526	// set command
527	string $applyCmd = ("nw4cSetUserData_InputApplyCB "
528		+ $node + " " + $curIndex + " " + $addFlag + ";");
529	int $closeSelIndex = ($addFlag && $curIndex >= $dataSize) ? -1 : $curIndex;
530	int $closeShowIndex = ($addFlag && $curIndex >= $dataSize) ? $curIndex : -1;
531	string $closeCmd = "deleteUI nw4cSetUserData_InputWin; "
532		+ "nw4cSetUserData_UpdateWindow " + $closeSelIndex + " " + $closeShowIndex + "; ";
533
534	//-----------------------------------------------------------------------------
535	// create window
536	int $wd = 320;
537	int $ht = 370;
538	if (`window -ex nw4cSetUserData_InputWin`)
539	{
540		deleteUI nw4cSetUserData_InputWin;
541	}
542	window -t ("Input User Data   ---   " + $node) -wh $wd $ht -mxb 0 -tbm 0
543		nw4cSetUserData_InputWin;
544	//columnLayout -adj 1 -cat "both" 8 -cal "center" -rs 8;
545	string $form = `formLayout -nd 100`;
546
547	//-----------------------------------------------------------------------------
548	// attr
549	string $nameLabel = `text -l "Name" -al "right"`;
550	textField -tx $name
551		-ec ($applyCmd + $closeCmd)
552		nw4cSetUserData_DataName;
553
554	radioButtonGrp -l "Type" -nrb 3 -cw4 60 70 70 70
555		-la3 "String" "Integer" "Float"
556		-sl ($type + 1)
557		-cc "nw4cSetUserData_DataTypeCB"
558		nw4cSetUserData_DataType;
559
560	text -l "String :" -al "left" -fn "boldLabelFont"
561		nw4cSetUserData_StringLabel;
562	textField -tx $strVal
563		-ec ($applyCmd + $closeCmd)
564		nw4cSetUserData_StringValue;
565
566	text -l "Number : (One value per line)" -al "left" -fn "boldLabelFont"
567		nw4cSetUserData_NumberLabel;
568	scrollField -ww 0 -tx $numVal
569		-ec "scrollField -e -it \"\\r\\n\" nw4cSetUserData_NumberValue"
570		nw4cSetUserData_NumberValue;
571
572	//-----------------------------------------------------------------------------
573	// OK & Cancel button
574	string $okBtn     = `button -w 100 -h 26 -l "OK"
575		-c ($applyCmd + $closeCmd)`;
576	string $cancelBtn = `button -w 100 -h 26 -l "Cancel"
577		-c ($closeCmd)`;
578
579	formLayout -e
580		-af $nameLabel "top" 8
581		-an $nameLabel "left"
582		-an $nameLabel "bottom"
583		-ac $nameLabel "right" 10 nw4cSetUserData_DataName
584
585		-af nw4cSetUserData_DataName "top" 8
586		-af nw4cSetUserData_DataName "left" 68
587		-an nw4cSetUserData_DataName "bottom"
588		-af nw4cSetUserData_DataName "right" 8
589
590		-ac nw4cSetUserData_DataType "top" 16 $nameLabel
591		-af nw4cSetUserData_DataType "left" 8
592		-an nw4cSetUserData_DataType "bottom"
593		-an nw4cSetUserData_DataType "right"
594
595		-ac nw4cSetUserData_StringLabel "top" 12 nw4cSetUserData_DataType
596		-af nw4cSetUserData_StringLabel "left" 8
597		-an nw4cSetUserData_StringLabel "bottom"
598		-af nw4cSetUserData_StringLabel "right" 8
599
600		-ac nw4cSetUserData_StringValue "top" 0 nw4cSetUserData_StringLabel
601		-af nw4cSetUserData_StringValue "left" 8
602		-an nw4cSetUserData_StringValue "bottom"
603		-af nw4cSetUserData_StringValue "right" 8
604
605		-ac nw4cSetUserData_NumberLabel "top" 12 nw4cSetUserData_StringValue
606		-af nw4cSetUserData_NumberLabel "left" 8
607		-an nw4cSetUserData_NumberLabel "bottom"
608		-af nw4cSetUserData_NumberLabel "right" 8
609
610		-ac nw4cSetUserData_NumberValue "top" 0 nw4cSetUserData_NumberLabel
611		-af nw4cSetUserData_NumberValue "left" 8
612		-af nw4cSetUserData_NumberValue "bottom" 48
613		-af nw4cSetUserData_NumberValue "right" 8
614
615		-an $okBtn "top"
616		-an $okBtn "left"
617		-af $okBtn "bottom" 8
618		-ac $okBtn "right" 8 $cancelBtn
619
620		-an $cancelBtn "top"
621		-an $cancelBtn "left"
622		-af $cancelBtn "bottom" 8
623		-af $cancelBtn "right" 16
624		$form;
625
626	setParent ..; // formLayout
627
628	//setParent ..; // columnLayout
629
630	if ($addFlag)
631	{
632		setFocus nw4cSetUserData_DataName;
633	}
634	else
635	{
636		if ($type == 0)
637		{
638			setFocus nw4cSetUserData_StringValue;
639		}
640		else
641		{
642			setFocus nw4cSetUserData_NumberValue;
643		}
644	}
645
646	if (`window -q -w nw4cSetUserData_InputWin` < $wd)
647	{
648		window -e -w $wd nw4cSetUserData_InputWin;
649	}
650	if (`window -q -h nw4cSetUserData_InputWin` < $ht)
651	{
652		window -e -h $ht nw4cSetUserData_InputWin;
653	}
654	//window -e -wh $wd $ht nw4cSetUserData_InputWin;
655
656	//-----------------------------------------------------------------------------
657	// update window
658	nw4cSetUserData_DataTypeCB();
659
660	//-----------------------------------------------------------------------------
661	// show window
662	showWindow nw4cSetUserData_InputWin;
663
664	//-----------------------------------------------------------------------------
665	// disable main window
666	nw4cSetUserData_EnableMainWindow(0);
667}
668
669/******************************************************************************
670	get selected item index
671
672		return -1 if not selected
673******************************************************************************/
674proc int GetSelectedItemIndex()
675{
676	int $selIndexes[] = `textScrollList -q -sii nw4cSetUserData_List`;
677	if (size($selIndexes) == 0)
678	{
679		return -1;
680	}
681	else
682	{
683		return ($selIndexes[0] - 1);
684	}
685}
686
687/******************************************************************************
688	select list callback
689******************************************************************************/
690global proc nw4cSetUserData_SelectListCB(string $node)
691{
692	int $index = GetSelectedItemIndex();
693	int $dataSize = nw4cSetUserData_Get_UserDataSize($node);
694
695	int $selOK = ($index >= 0 && $index < $dataSize);
696
697	if ($index >= $dataSize)
698	{
699		textScrollList -e -da nw4cSetUserData_List;
700	}
701
702	control -e -en ($selOK && $index > 0)
703		nw4cSetUserData_MoveUpBtn;
704	control -e -en ($selOK && $index < $dataSize - 1)
705		nw4cSetUserData_MoveDownBtn;
706	control -e -en 1 nw4cSetUserData_AddBtn; // always enable
707	control -e -en $selOK nw4cSetUserData_DeleteBtn;
708	control -e -en $selOK nw4cSetUserData_EditBtn;
709}
710
711/******************************************************************************
712	move up button callback
713******************************************************************************/
714global proc nw4cSetUserData_MoveUpBtnCB(string $node)
715{
716	int $index = GetSelectedItemIndex();
717	int $dataSize = nw4cSetUserData_Get_UserDataSize($node);
718	if ($index > 0 && $index < $dataSize)
719	{
720		string $selVal = nw4cSetUserData_Get_UserDataValue($node, $index);
721		string $upVal  = nw4cSetUserData_Get_UserDataValue($node, $index - 1);
722		nw4cSetUserData_Set_UserDataValue($node, $index, $upVal);
723		nw4cSetUserData_Set_UserDataValue($node, $index - 1, $selVal);
724		nw4cSetUserData_UpdateWindow($index - 1, -1);
725	}
726}
727
728/******************************************************************************
729	move down button callback
730******************************************************************************/
731global proc nw4cSetUserData_MoveDownBtnCB(string $node)
732{
733	int $index = GetSelectedItemIndex();
734	int $dataSize = nw4cSetUserData_Get_UserDataSize($node);
735	if ($index >= 0 && $index < $dataSize - 1)
736	{
737		string $selVal  = nw4cSetUserData_Get_UserDataValue($node, $index);
738		string $downVal = nw4cSetUserData_Get_UserDataValue($node, $index + 1);
739		nw4cSetUserData_Set_UserDataValue($node, $index, $downVal);
740		nw4cSetUserData_Set_UserDataValue($node, $index + 1, $selVal);
741		nw4cSetUserData_UpdateWindow($index + 1, -1);
742	}
743}
744
745/******************************************************************************
746	add button callback
747******************************************************************************/
748global proc nw4cSetUserData_AddBtnCB(string $node)
749{
750	int $index = GetSelectedItemIndex();
751	if ($index == -1)
752	{
753		$index = nw4cSetUserData_Get_UserDataSize($node);
754	}
755	OpenInputWindow($node, $index, 1);
756}
757
758/******************************************************************************
759	edit button callback
760******************************************************************************/
761global proc nw4cSetUserData_EditBtnCB(string $node)
762{
763	int $index = GetSelectedItemIndex();
764	if ($index == -1 || $index >= nw4cSetUserData_Get_UserDataSize($node))
765	{
766		return;
767	}
768	OpenInputWindow($node, $index, 0);
769}
770
771/******************************************************************************
772	delete button callback
773******************************************************************************/
774global proc nw4cSetUserData_DeleteBtnCB(string $node)
775{
776	//-----------------------------------------------------------------------------
777	// check node exist
778	if (!`objExists $node`)
779	{
780		warning ("Node does not exist: " + $node);
781		return;
782	}
783
784	//-----------------------------------------------------------------------------
785	// get all item
786	string $dataValues[];
787	int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node);
788
789	//-----------------------------------------------------------------------------
790	// check selected item
791	int $delIndex = GetSelectedItemIndex();
792	if ($delIndex == -1 || $delIndex >= $dataSize)
793	{
794		return;
795	}
796
797	//-----------------------------------------------------------------------------
798	// delete
799	int $idx;
800	for ($idx = $delIndex; $idx < $dataSize - 1; ++$idx)
801	{
802		nw4cSetUserData_Set_UserDataValue($node, $idx, $dataValues[$idx + 1]); // shift
803	}
804	nw4cSetUserData_Set_UserDataValue($node, $dataSize - 1, ""); // set empty to deleted item
805	--$dataSize;
806	nw4cSetUserData_Set_UserDataSize($node, $dataSize); // decrement size
807
808	//-----------------------------------------------------------------------------
809	// update window
810	int $selIndex = -1;
811	if ($delIndex < $dataSize)
812	{
813		$selIndex = $delIndex;
814	}
815	else if ($dataSize > 0)
816	{
817		$selIndex = $dataSize - 1;
818	}
819	nw4cSetUserData_UpdateWindow($selIndex, -1);
820}
821
822/******************************************************************************
823	get SG name with material
824******************************************************************************/
825proc string GetSGNameWithMat(string $sg)
826{
827	string $ins[] = `listConnections -s 1 -d 0 ($sg + ".ss")`;
828	if (size($ins))
829	{
830		$sg += " ( " + $ins[0] + " )";
831	}
832	return $sg;
833}
834
835/******************************************************************************
836	update window (UpdateWindowT)
837******************************************************************************/
838global proc nw4cSetUserData_UpdateWindow(int $selIndex, int $showIndex)
839{
840	//-----------------------------------------------------------------------------
841	// get selection
842	string $nodes[];
843	GetSelectedXformAndSG($nodes);
844	int $enableFlag = (size($nodes) == 1);
845
846	//-----------------------------------------------------------------------------
847	// set node name
848	string $nodeName;
849	if ($enableFlag)
850	{
851		if (nodeType($nodes[0]) == "shadingEngine")
852		{
853			$nodeName = GetSGNameWithMat($nodes[0]);
854		}
855		else
856		{
857			$nodeName = $nodes[0];
858		}
859	}
860	else if (size($nodes) > 1)
861	{
862		$nodeName = "(Multi node is selected)";
863	}
864	else
865	{
866		$nodeName = "(None)";
867	}
868	text -e -l $nodeName nw4cSetUserData_NodeName;
869
870	//-----------------------------------------------------------------------------
871	// set current attr & change command
872	textScrollList -e -ra nw4cSetUserData_List;
873	if ($enableFlag)
874	{
875		string $node = $nodes[0];
876		button -e -c ("nw4cSetUserData_MoveUpBtnCB " + $node)
877			nw4cSetUserData_MoveUpBtn;
878		button -e -c ("nw4cSetUserData_MoveDownBtnCB " + $node)
879			nw4cSetUserData_MoveDownBtn;
880		button -e -c ("nw4cSetUserData_AddBtnCB " + $node)
881			nw4cSetUserData_AddBtn;
882		button -e -c ("nw4cSetUserData_DeleteBtnCB " + $node)
883			nw4cSetUserData_DeleteBtn;
884		button -e -c ("nw4cSetUserData_EditBtnCB " + $node)
885			nw4cSetUserData_EditBtn;
886
887		string $dataValues[];
888		int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node);
889		for ($index = 0; $index < $dataSize; ++$index)
890		{
891			string $listStr = GetListStringFromUserDataValue($dataValues[$index]);
892			textScrollList -e -a $listStr nw4cSetUserData_List;
893		}
894		if ($selIndex != -1 && $selIndex < $dataSize)
895		{
896			textScrollList -e -sii ($selIndex + 1) nw4cSetUserData_List;
897		}
898		if ($showIndex != -1 && $showIndex < $dataSize)
899		{
900			textScrollList -e -shi ($showIndex + 1) nw4cSetUserData_List;
901		}
902
903		textScrollList -e
904			-sc ("nw4cSetUserData_SelectListCB " + $node)
905			-dcc ("nw4cSetUserData_EditBtnCB " + $node)
906			nw4cSetUserData_List;
907
908		nw4cSetUserData_SelectListCB($nodes[0]);
909	}
910	textScrollList -e -a "-----" nw4cSetUserData_List; // for add last
911
912	//-----------------------------------------------------------------------------
913	// set enable state
914	if (`window -ex nw4cSetUserData_InputWin`)
915	{
916		nw4cSetUserData_EnableMainWindow(0);
917	}
918	else
919	{
920		if (!$enableFlag)
921		{
922			control -e -en $enableFlag nw4cSetUserData_MoveUpBtn;
923			control -e -en $enableFlag nw4cSetUserData_MoveDownBtn;
924			control -e -en $enableFlag nw4cSetUserData_AddBtn;
925			control -e -en $enableFlag nw4cSetUserData_DeleteBtn;
926			control -e -en $enableFlag nw4cSetUserData_EditBtn;
927		}
928		control -e -en $enableFlag nw4cSetUserData_List;
929		control -e -en 1 nw4cSetUserData_CloseBtn;
930	}
931}
932
933/******************************************************************************
934	main
935******************************************************************************/
936global proc NW4C_SetUserData()
937{
938	//-----------------------------------------------------------------------------
939	// create window
940	int $wd = 505;
941	int $ht = 420;
942	if (!`window -ex nw4cSetUserData_Win`)
943	{
944		window -t "NW4C Set User Data" -wh $wd $ht -mxb 0 -mb 1
945			nw4cSetUserData_Win;
946		menu -l "Help";
947		menuItem -l ("Help on " + `window -q -t nw4cSetUserData_Win` + "...")
948			-c "NW4C_ShowHelp \"html/data_plugins.html\" \"user_data\"";
949
950		string $form1 = `formLayout -nd 100`;
951
952		//-----------------------------------------------------------------------------
953		// node name
954		string $nameFrame = `frameLayout -l "Selected Transform Node or Shading Group" -cll 0 -cl 0 -bv 1 -bs "etchedIn"`;
955			columnLayout -adj 1 -cal "center" -rs 8;
956
957			text -l "" nw4cSetUserData_NodeName;
958
959			setParent ..; // columnLayout
960		setParent ..; // formLayout
961
962		//-----------------------------------------------------------------------------
963		// list
964		string $listFrame = `frameLayout -l "" -cll 0 -cl 0 -bv 1 -bs "etchedIn"`;
965			string $form2 = `formLayout -nd 100`;
966
967			// buttons
968			string $listBtnRow = `rowColumnLayout -nc 5
969				-cw 1 80 -cw 2 80 -cw 3 80 -cw 4 80 -cw 5 80
970				-cs 1  1 -cs 2  8 -cs 3 22 -cs 4  8 -cs 5 22`;
971				button -l "Move Up" -h 24
972					nw4cSetUserData_MoveUpBtn;
973				button -l "Move Down" -h 24
974					nw4cSetUserData_MoveDownBtn;
975				button -l "Add..." -h 24
976					nw4cSetUserData_AddBtn;
977				button -l "Delete" -h 24
978					nw4cSetUserData_DeleteBtn;
979				button -l "Edit..." -h 24
980					nw4cSetUserData_EditBtn;
981			setParent ..; // rowColumnLayout
982
983			// list
984			string $listText = `text -l "Name               Type       Size    Value"
985				-al "left" -fn "smallFixedWidthFont"`;
986			textScrollList -nr 15 -ams 0 -fn "smallFixedWidthFont"
987				nw4cSetUserData_List;
988
989			setParent ..; // formLayout
990
991			formLayout -e
992				-af $listBtnRow "top" 8
993				-af $listBtnRow "left" 8
994				-an $listBtnRow "bottom"
995				-af $listBtnRow "right" 8
996
997				-ac $listText "top" 8 $listBtnRow
998				-af $listText "left" 8
999				-an $listText "bottom"
1000				-af $listText "right" 8
1001
1002				-ac nw4cSetUserData_List "top" 0 $listText
1003				-af nw4cSetUserData_List "left" 8
1004				-af nw4cSetUserData_List "bottom" 8
1005				-af nw4cSetUserData_List "right" 8
1006				$form2;
1007
1008		setParent ..; // frameLayout
1009
1010		//-----------------------------------------------------------------------------
1011		// close button
1012		string $closeCmd = "deleteUI nw4cSetUserData_Win; ";
1013
1014		button -h 26 -l "Close" -c $closeCmd
1015			nw4cSetUserData_CloseBtn;
1016
1017		formLayout -e
1018			-af $nameFrame "top" 4
1019			-af $nameFrame "left" 4
1020			-an $nameFrame "bottom"
1021			-af $nameFrame "right" 4
1022
1023			-ac $listFrame "top" 4 $nameFrame
1024			-af $listFrame "left" 4
1025			-ac $listFrame "bottom" 4 nw4cSetUserData_CloseBtn
1026			-af $listFrame "right" 4
1027
1028			-an nw4cSetUserData_CloseBtn "top"
1029			-af nw4cSetUserData_CloseBtn "left" 4
1030			-af nw4cSetUserData_CloseBtn "bottom" 8
1031			-af nw4cSetUserData_CloseBtn "right" 4
1032			$form1;
1033
1034		setParent ..; // formLayout
1035
1036		setFocus nw4cSetUserData_CloseBtn;
1037
1038		//-----------------------------------------------------------------------------
1039		// set selection change job
1040		scriptJob -p nw4cSetUserData_Win
1041			-e "SelectionChanged" "nw4cSetUserData_UpdateWindow -1 -1";
1042
1043		//-----------------------------------------------------------------------------
1044		// set undo / redo job
1045		scriptJob -p nw4cSetUserData_Win
1046			-e "Undo" "nw4cSetUserData_UpdateWindow -1 -1";
1047		scriptJob -p nw4cSetUserData_Win
1048			-e "Redo" "nw4cSetUserData_UpdateWindow -1 -1";
1049	}
1050	if (`window -q -w nw4cSetUserData_Win` < $wd)
1051	{
1052		window -e -w $wd nw4cSetUserData_Win;
1053	}
1054	if (`window -q -h nw4cSetUserData_Win` < $ht)
1055	{
1056		window -e -h $ht nw4cSetUserData_Win;
1057	}
1058	//window -e -wh $wd $ht nw4cSetUserData_Win;
1059
1060	//-----------------------------------------------------------------------------
1061	// update window
1062	nw4cSetUserData_UpdateWindow(-1, -1);
1063
1064	//-----------------------------------------------------------------------------
1065	// show window
1066	showWindow nw4cSetUserData_Win;
1067	if (`window -ex nw4cSetUserData_InputWin`)
1068	{
1069		showWindow nw4cSetUserData_InputWin;
1070	}
1071}
1072