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