materialSelector.ed.gui 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003
  1. new GuiControl(MaterialSelectorOverlay, EditorGuiGroup) {
  2. canSaveDynamicFields = "0";
  3. Profile = "GuiOverlayProfile";
  4. Enabled = "1";
  5. isContainer = "1";
  6. HorizSizing = "right";
  7. VertSizing = "bottom";
  8. Position = "0 0";
  9. Extent = "1024 768";
  10. MinExtent = "8 2";
  11. canSave = "1";
  12. Visible = "1";
  13. hovertime = "1000";
  14. new GuiWindowCtrl(MaterialSelector){
  15. profile = "ToolsGuiWindowProfile";
  16. HorizSizing = "center";
  17. VertSizing = "center";
  18. resizeWidth = "1";
  19. resizeHeight = "1";
  20. canClose = "1";
  21. canMinimize = "0";
  22. canMaximize = "0";
  23. position = "72 98";
  24. extent =" 766 550";
  25. MinExtent = "383 274";
  26. text = "Material Selector";
  27. closeCommand = "MaterialSelector::hideDialog();";
  28. EdgeSnap = "0";
  29. canCollapse = "0";
  30. visible = "0";
  31. new GuiContainer(){
  32. isContainer = "1";
  33. HorizSizing = "right";
  34. VertSizing = "bottom";
  35. Position = "4 22";
  36. Extent = "120 31";
  37. Profile = "inspectorStyleRolloutDarkProfile";
  38. };
  39. new GuiTextCtrl(){
  40. Profile = "ToolsGuiDefaultProfile";
  41. HorizSizing = "right";
  42. VertSizing = "bottom";
  43. position = "10 23";
  44. extent = "30 16";
  45. text = "Filters";
  46. };
  47. new GuiContainer(){
  48. profile = "ToolsGuiDefaultProfile";
  49. Position = "4 39";
  50. Extent = "120 507";
  51. HorizSizing = "right";
  52. VertSizing = "height";
  53. isContainer = "1";
  54. new GuiScrollCtrl() {
  55. canSaveDynamicFields = "0";
  56. Enabled = "1";
  57. isContainer = "1";
  58. Profile = "GuiEditorScrollProfile";
  59. HorizSizing = "width";
  60. VertSizing = "height";
  61. Position = "0 0";
  62. Extent = "128 355";
  63. MinExtent = "8 8";
  64. canSave = "1";
  65. isDecoy = "0";
  66. Visible = "1";
  67. tooltipprofile = "ToolsGuiDefaultProfile";
  68. hovertime = "1000";
  69. Docking = "Client";
  70. Margin = "0 0 0 0";
  71. Padding = "0 0 0 0";
  72. AnchorTop = "1";
  73. AnchorBottom = "0";
  74. AnchorLeft = "1";
  75. AnchorRight = "0";
  76. willFirstRespond = "1";
  77. hScrollBar = "alwaysOff";
  78. vScrollBar = "dynamic";
  79. lockHorizScroll = true;
  80. lockVertScroll = "false";
  81. constantThumbHeight = "0";
  82. childMargin = "0 0";
  83. mouseWheelScrollSpeed = "-1";
  84. new GuiDynamicCtrlArrayControl() {
  85. canSaveDynamicFields = "0";
  86. internalName = "filterArray";
  87. Enabled = "1";
  88. isContainer = "1";
  89. Profile = "ToolsGuiDefaultProfile";
  90. HorizSizing = "width";
  91. VertSizing = "bottom";
  92. Position = "18 0";
  93. Extent = "128 195";
  94. MinExtent = "8 8";
  95. dynamicSize = "1";
  96. rowSpacing = "2";
  97. colSize = "128";
  98. rowSize = "18";
  99. };
  100. };
  101. };
  102. new GuiContainer(){
  103. Profile = "inspectorStyleRolloutDarkProfile";
  104. Position = "128 22";
  105. Extent = "480 31";
  106. HorizSizing = "width";
  107. VertSizing = "bottom";
  108. isContainer = "1";
  109. };
  110. new GuiTextCtrl(){
  111. profile = "ToolsGuiDefaultProfile";
  112. HorizSizing = "right";
  113. VertSizing = "bottom";
  114. position = "133 23";
  115. extent = "53 16";
  116. text = "Materials";
  117. };
  118. // Create New Material
  119. new GuiBitmapButtonCtrl() {
  120. canSaveDynamicFields = "0";
  121. Enabled = "1";
  122. isContainer = "0";
  123. Profile = "ToolsGuiDefaultProfile";
  124. HorizSizing = "left";
  125. VertSizing = "bottom";
  126. position = "594 24";
  127. Extent = "15 15";
  128. MinExtent = "8 2";
  129. canSave = "1";
  130. Visible = "1";
  131. Command = "MaterialSelector.createNewMaterial();";
  132. hovertime = "1000";
  133. tooltip = "Create New Unmapped Material";
  134. bitmap = "tools/gui/images/new";
  135. groupNum = "-1";
  136. buttonType = "PushButton";
  137. useMouseEvents = "0";
  138. };
  139. new GuiBitmapButtonCtrl() {
  140. canSaveDynamicFields = "0";
  141. Enabled = "1";
  142. isContainer = "0";
  143. Profile = "ToolsGuiDefaultProfile";
  144. HorizSizing = "left";
  145. VertSizing = "bottom";
  146. position = "578 24";
  147. Extent = "15 15";
  148. MinExtent = "8 2";
  149. canSave = "1";
  150. Visible = "1";
  151. Command = "MaterialSelector.showDeleteDialog();";
  152. hovertime = "1000";
  153. tooltip = "Delete Material";
  154. bitmap = "tools/gui/images/delete";
  155. groupNum = "-1";
  156. buttonType = "PushButton";
  157. useMouseEvents = "0";
  158. };
  159. new GuiContainer(){ // Materials
  160. profile = "ToolsGuiDefaultProfile";
  161. Position = "128 39";
  162. Extent = "480 507";
  163. HorizSizing = "width";
  164. VertSizing = "height";
  165. isContainer = "1";
  166. new GuiScrollCtrl() {
  167. canSaveDynamicFields = "0";
  168. Enabled = "1";
  169. isContainer = "1";
  170. Profile = "GuiEditorScrollProfile";
  171. HorizSizing = "width";
  172. VertSizing = "height";
  173. Position = "0 0";
  174. Extent = "480 507";
  175. MinExtent = "8 8";
  176. canSave = "1";
  177. isDecoy = "0";
  178. Visible = "1";
  179. tooltipprofile = "ToolsGuiDefaultProfile";
  180. hovertime = "1000";
  181. Docking = "Client";
  182. Margin = "0 0 0 0";
  183. Padding = "0 0 0 0";
  184. AnchorTop = "1";
  185. AnchorBottom = "0";
  186. AnchorLeft = "1";
  187. AnchorRight = "0";
  188. willFirstRespond = "1";
  189. hScrollBar = "alwaysOff";
  190. vScrollBar = "dynamic";
  191. lockHorizScroll = "true";
  192. lockVertScroll = "false";
  193. constantThumbHeight = "0";
  194. childMargin = "0 0";
  195. mouseWheelScrollSpeed = "-1";
  196. new GuiStackControl(){
  197. HorizSizing = "width";
  198. VertSizing = "bottom";
  199. Position = "0 0";
  200. Extent = "128 0";
  201. changeChildPosition = 0;
  202. changeChildSizeToFit = 1;
  203. new GuiControl(){
  204. Extent = "0 4";
  205. };
  206. new GuiDynamicCtrlArrayControl() {
  207. canSaveDynamicFields = "0";
  208. internalName = "materialSelection";
  209. Enabled = "1";
  210. isContainer = "1";
  211. Profile = "ToolsGuiDefaultProfile";
  212. HorizSizing = "width";
  213. VertSizing = "bottom";
  214. Position = "3 0";
  215. Extent = "128 0";
  216. MinExtent = "8 8";
  217. dynamicSize = "1";
  218. autoCellSize = "1";
  219. rowSpacing = "2";
  220. colSpacing = "2";
  221. margin = "2";
  222. };
  223. };
  224. };
  225. new GuiContainer(){
  226. internalName = "materialPreviewControlContainer";
  227. profile = "ToolsGuiDefaultProfile";
  228. Position = "0 0";
  229. Extent = "480 20";
  230. HorizSizing = "width";
  231. VertSizing = "height";
  232. isContainer = "1";
  233. Docking = "Bottom";
  234. new GuiTextCtrl(){
  235. profile = "ToolsGuiDefaultProfile";
  236. HorizSizing = "right";
  237. VertSizing = "bottom";
  238. position = "0 2";
  239. extent = "100 16";
  240. text = "Thumbnails per Page:";
  241. };
  242. new GuiPopupMenuCtrlEx(){
  243. internalName = "materialPreviewCountPopup";
  244. Profile = "ToolsGuiPopUpMenuProfile";
  245. Position = "104 2";
  246. Extent = "40 18";
  247. HorizSizing = "right";
  248. VertSizing = "bottom";
  249. Command = "MaterialSelector.thumbnailCountUpdate();";
  250. reverseTextList = "0";
  251. Text = "16";
  252. };
  253. new GuiStackControl(){
  254. internalName = "materialPreviewButtonStack";
  255. HorizSizing = "left";
  256. VertSizing = "bottom";
  257. Position = "480 2";
  258. Extent = "0 16";
  259. dynamic = 1;
  260. dynamicPos = 1;
  261. stackingType = "Horizontal";
  262. changeChildPosition = 1;
  263. changeChildSizeToFit = 1;
  264. padding = 2;
  265. new GuiButtonCtrl() {
  266. canSaveDynamicFields = "0";
  267. Enabled = "1";
  268. isContainer = "0";
  269. Profile = "ToolsGuiButtonProfile";
  270. HorizSizing = "right";
  271. VertSizing = "bottom";
  272. Position = "0 0";
  273. Extent = "20 16";
  274. MinExtent = "8 8";
  275. canSave = "1";
  276. isDecoy = "0";
  277. Visible = "1";
  278. Command = "MaterialSelector::firstPage();";
  279. tooltipprofile = "ToolsGuiToolTipProfile";
  280. tooltip = "First";
  281. hovertime = "1000";
  282. text = "|<";
  283. groupNum = "-1";
  284. buttonType = "PushButton";
  285. useMouseEvents = "1";
  286. };
  287. new GuiButtonCtrl() {
  288. canSaveDynamicFields = "0";
  289. Enabled = "1";
  290. isContainer = "0";
  291. Profile = "ToolsGuiButtonProfile";
  292. HorizSizing = "right";
  293. VertSizing = "bottom";
  294. Position = "0 0";
  295. Extent = "20 16";
  296. MinExtent = "8 8";
  297. canSave = "1";
  298. isDecoy = "0";
  299. Visible = "1";
  300. Command = "MaterialSelector::previousPage();";
  301. tooltipprofile = "ToolsGuiToolTipProfile";
  302. tooltip = "Previous";
  303. hovertime = "1000";
  304. text = "<";
  305. groupNum = "-1";
  306. buttonType = "PushButton";
  307. useMouseEvents = "1";
  308. };
  309. new GuiStackControl(){
  310. internalName = "materialPreviewPagesStack";
  311. HorizSizing = "right";
  312. VertSizing = "bottom";
  313. Position = "0 0";
  314. Extent = "0 16";
  315. dynamic = 1;
  316. stackingType = "Horizontal";
  317. changeChildPosition = 1;
  318. changeChildSizeToFit = 1;
  319. padding = 2;
  320. };
  321. new GuiButtonCtrl() {
  322. canSaveDynamicFields = "0";
  323. Enabled = "1";
  324. isContainer = "0";
  325. Profile = "ToolsGuiButtonProfile";
  326. HorizSizing = "right";
  327. VertSizing = "bottom";
  328. Position = "0 0";
  329. Extent = "20 16";
  330. MinExtent = "8 8";
  331. canSave = "1";
  332. isDecoy = "0";
  333. Visible = "1";
  334. Command = "MaterialSelector::nextPage();";
  335. tooltipprofile = "ToolsGuiToolTipProfile";
  336. tooltip = "Next";
  337. hovertime = "1000";
  338. text = ">";
  339. groupNum = "-1";
  340. buttonType = "PushButton";
  341. useMouseEvents = "1";
  342. };
  343. new GuiButtonCtrl() {
  344. canSaveDynamicFields = "0";
  345. Enabled = "1";
  346. isContainer = "0";
  347. Profile = "ToolsGuiButtonProfile";
  348. HorizSizing = "right";
  349. VertSizing = "bottom";
  350. Position = "0 0";
  351. Extent = "20 16";
  352. MinExtent = "8 8";
  353. canSave = "1";
  354. isDecoy = "0";
  355. Visible = "1";
  356. Command = "MaterialSelector::lastPage();";
  357. tooltipprofile = "ToolsGuiToolTipProfile";
  358. tooltip = "Last";
  359. hovertime = "1000";
  360. text = ">|";
  361. groupNum = "-1";
  362. buttonType = "PushButton";
  363. useMouseEvents = "1";
  364. };
  365. };
  366. };
  367. };
  368. new GuiContainer(){
  369. Profile = "inspectorStyleRolloutDarkProfile";
  370. Position = "612 206";
  371. Extent = "150 31";
  372. HorizSizing = "left";
  373. VertSizing = "bottom";
  374. isContainer = "1";
  375. };
  376. new GuiTextCtrl(){
  377. profile = "ToolsGuiDefaultProfile";
  378. HorizSizing = "left";
  379. VertSizing = "bottom";
  380. position = "618 207";
  381. extent = "84 16";
  382. text = "Material Tags";
  383. };
  384. new GuiContainer(){ // Filter Selection
  385. profile = "ToolsGuiDefaultProfile";
  386. Position = "612 223";
  387. Extent = "150 295";
  388. HorizSizing = "left";
  389. VertSizing = "height";
  390. isContainer = "1";
  391. new GuiScrollCtrl() {
  392. canSaveDynamicFields = "0";
  393. Enabled = "1";
  394. isContainer = "1";
  395. Profile = "GuiEditorScrollProfile";
  396. HorizSizing = "width";
  397. VertSizing = "height";
  398. Position = "0 0";
  399. Extent = "128 195";
  400. MinExtent = "8 8";
  401. canSave = "1";
  402. isDecoy = "0";
  403. Visible = "1";
  404. tooltipprofile = "ToolsGuiDefaultProfile";
  405. hovertime = "1000";
  406. Docking = "Client";
  407. Margin = "0 0 0 0";
  408. Padding = "0 0 0 0";
  409. AnchorTop = "1";
  410. AnchorBottom = "0";
  411. AnchorLeft = "1";
  412. AnchorRight = "0";
  413. willFirstRespond = "1";
  414. hScrollBar = "alwaysOff";
  415. vScrollBar = "dynamic";
  416. lockHorizScroll = "true";
  417. lockVertScroll = "false";
  418. constantThumbHeight = "0";
  419. childMargin = "0 0";
  420. mouseWheelScrollSpeed = "-1";
  421. new GuiDynamicCtrlArrayControl() {
  422. canSaveDynamicFields = "0";
  423. internalName = "materialCategories";
  424. Enabled = "1";
  425. isContainer = "1";
  426. Profile = "ToolsGuiDefaultProfile";
  427. HorizSizing = "width";
  428. VertSizing = "bottom";
  429. Position = "0 0";
  430. Extent = "128 195";
  431. MinExtent = "8 8";
  432. dynamicSize = "1";
  433. rowSpacing = "2";
  434. colSize = "128";
  435. rowSize = "18";
  436. };
  437. };
  438. };
  439. new GuiContainer(){
  440. Profile = "inspectorStyleRolloutDarkProfile";
  441. Position = "612 22";
  442. Extent = "150 167";
  443. HorizSizing = "left";
  444. VertSizing = "bottom";
  445. isContainer = "1";
  446. new GuiBitmapCtrl(){
  447. internalName = "previewSelection";
  448. HorizSizing = "left";
  449. VertSizing = "bottom";
  450. profile = "ToolsGuiDefaultProfile";
  451. position = "1 18";
  452. extent = "148 148";
  453. bitmap = "";
  454. };
  455. };
  456. new GuiTextCtrl(){
  457. profile = "ToolsGuiDefaultProfile";
  458. HorizSizing = "left";
  459. VertSizing = "bottom";
  460. position = "618 23";
  461. extent = "84 16";
  462. text = "Diffuse Preview";
  463. };
  464. new GuiBitmapCtrl(){
  465. HorizSizing = "left";
  466. VertSizing = "bottom";
  467. profile = "ToolsGuiDefaultProfile";
  468. position = "612 39";
  469. extent = "150 150";
  470. bitmap = "tools/worldEditor/images/terrainpainter/terrain-painter-border-large";
  471. visible = false;
  472. };
  473. new GuiTextCtrl(){
  474. internalName = "previewSelectionText";
  475. HorizSizing = "left";
  476. VertSizing = "bottom";
  477. profile = "ToolsGuiTextProfile";
  478. position = "613 189";
  479. extent = "149 16";
  480. text = "";
  481. };
  482. new GuiButtonCtrl(){
  483. internalName = "SelectButton";
  484. HorizSizing = "left";
  485. VertSizing = "top";
  486. profile = "ToolsGuiButtonProfile";
  487. position = "612 522";
  488. extent = "94 24";
  489. text = "Select";
  490. command = "MaterialSelector.selectMaterial( MaterialSelector.selectedMaterial );";
  491. };
  492. new GuiButtonCtrl(){
  493. HorizSizing = "left";
  494. VertSizing = "top";
  495. profile = "ToolsGuiButtonProfile";
  496. position = "710 522";
  497. extent = "52 24";
  498. text = "Cancel";
  499. command = "MaterialSelector.hideDialog();";
  500. };
  501. };
  502. new GuiWindowCtrl(MaterialSelector_addFilterWindow) {
  503. canSaveDynamicFields = "0";
  504. isContainer = "1";
  505. Profile = "ToolsGuiWindowProfile";
  506. HorizSizing = "center";
  507. VertSizing = "center";
  508. position = "362 333";
  509. Extent = "272 99";
  510. MinExtent = "48 92";
  511. canSave = "1";
  512. Visible = "0";
  513. tooltipprofile = "ToolsGuiToolTipProfile";
  514. hovertime = "1000";
  515. Margin = "0 0 0 0";
  516. Padding = "0 0 0 0";
  517. AnchorTop = "1";
  518. AnchorBottom = "0";
  519. AnchorLeft = "1";
  520. AnchorRight = "0";
  521. resizeWidth = "1";
  522. resizeHeight = "1";
  523. canMove = "1";
  524. canClose = "0";
  525. canMinimize = "0";
  526. canMaximize = "0";
  527. minSize = "50 50";
  528. EdgeSnap = "1";
  529. text = "Create New Tag";
  530. new GuiTextEditCtrl() {
  531. canSaveDynamicFields = "0";
  532. internalName = "tagName";
  533. isContainer = "0";
  534. Profile = "ToolsGuiTextEditProfile";
  535. HorizSizing = "right";
  536. VertSizing = "bottom";
  537. position = "64 35";
  538. Extent = "196 18";
  539. MinExtent = "8 2";
  540. canSave = "1";
  541. Visible = "1";
  542. tooltipprofile = "ToolsGuiToolTipProfile";
  543. hovertime = "1000";
  544. Margin = "0 0 0 0";
  545. Padding = "0 0 0 0";
  546. AnchorTop = "1";
  547. AnchorBottom = "0";
  548. AnchorLeft = "1";
  549. AnchorRight = "0";
  550. maxLength = "1024";
  551. historySize = "0";
  552. password = "0";
  553. tabComplete = "0";
  554. sinkAllKeyEvents = "0";
  555. passwordMask = "*";
  556. };
  557. new GuiTextCtrl() {
  558. canSaveDynamicFields = "0";
  559. isContainer = "0";
  560. Profile = "ToolsGuiTextProfile";
  561. HorizSizing = "right";
  562. VertSizing = "bottom";
  563. position = "12 35";
  564. Extent = "52 16";
  565. MinExtent = "8 2";
  566. canSave = "1";
  567. Visible = "1";
  568. tooltipprofile = "ToolsGuiToolTipProfile";
  569. hovertime = "1000";
  570. Margin = "0 0 0 0";
  571. Padding = "0 0 0 0";
  572. AnchorTop = "1";
  573. AnchorBottom = "0";
  574. AnchorLeft = "1";
  575. AnchorRight = "0";
  576. maxLength = "1024";
  577. text = "Tag Name";
  578. };
  579. new GuiButtonCtrl() {
  580. canSaveDynamicFields = "0";
  581. isContainer = "0";
  582. Profile = "ToolsGuiButtonProfile";
  583. HorizSizing = "right";
  584. VertSizing = "bottom";
  585. position = "64 68";
  586. Extent = "126 22";
  587. MinExtent = "8 2";
  588. canSave = "1";
  589. Visible = "1";
  590. tooltipprofile = "ToolsGuiToolTipProfile";
  591. hovertime = "1000";
  592. groupNum = "-1";
  593. buttonType = "PushButton";
  594. useMouseEvents = "0";
  595. text = "Create";
  596. Command = "MaterialSelector.createFilter( MaterialSelector_addFilterWindow-->tagName.getText() );MaterialSelector_addFilterWindow.setVisible(0);";
  597. };
  598. new GuiButtonCtrl() {
  599. canSaveDynamicFields = "0";
  600. isContainer = "0";
  601. Profile = "ToolsGuiButtonProfile";
  602. HorizSizing = "right";
  603. VertSizing = "bottom";
  604. position = "196 68";
  605. Extent = "64 22";
  606. MinExtent = "8 2";
  607. canSave = "1";
  608. Visible = "1";
  609. tooltipprofile = "ToolsGuiToolTipProfile";
  610. hovertime = "1000";
  611. groupNum = "-1";
  612. buttonType = "PushButton";
  613. useMouseEvents = "0";
  614. text = "Cancel";
  615. Command = "MaterialSelector_addFilterWindow.setVisible(0);";
  616. };
  617. };
  618. };
  619. $Pref::MaterialSelector::CurrentStaticFilter = "MaterialFilterAllArray";
  620. $Pref::MaterialSelector::CurrentFilter = ""; //ALL
  621. $Pref::MaterialSelector::ThumbnailCountIndex = 0;
  622. new PersistenceManager(MaterialSelectorPerMan);
  623. new ArrayObject(UnlistedMaterials);
  624. UnlistedMaterials.add( "unlistedMaterials", WarningMaterial );
  625. UnlistedMaterials.add( "unlistedMaterials", materialEd_previewMaterial );
  626. UnlistedMaterials.add( "unlistedMaterials", notDirtyMaterial );
  627. UnlistedMaterials.add( "unlistedMaterials", materialEd_cubemapEd_cubeMapPreview );
  628. UnlistedMaterials.add( "unlistedMaterials", matEdCubeMapPreviewMat );
  629. UnlistedMaterials.add( "unlistedMaterials", materialEd_justAlphaMaterial );
  630. UnlistedMaterials.add( "unlistedMaterials", materialEd_justAlphaShader );
  631. function MaterialSelector::selectMaterial( %this, %material )
  632. {
  633. %name = "";
  634. if( MaterialSelector.terrainMaterials )
  635. {
  636. %name = %material;
  637. %material = TerrainMaterialSet.findObjectByInternalName( %material );
  638. }
  639. else
  640. {
  641. %name = %material.getName();
  642. }
  643. // The callback function should be ready to intake the returned material
  644. //eval("materialEd_previewMaterial." @ %propertyField @ " = " @ %value @ ";");
  645. if( MaterialSelector.returnType $= "name" )
  646. eval( "" @ MaterialSelector.selectCallback @ "(" @ %name @ ");");
  647. else if( MaterialSelector.returnType $= "index" )
  648. {
  649. %index = -1;
  650. if( MaterialSelector.terrainMaterials )
  651. {
  652. // Obtain the index into the terrain's material list
  653. %mats = ETerrainEditor.getMaterials();
  654. for(%i = 0; %i < getRecordCount( %mats ); %i++)
  655. {
  656. %matInternalName = getRecord( %mats, %i );
  657. if( %matInternalName $= %name )
  658. {
  659. %index = %i;
  660. break;
  661. }
  662. }
  663. }
  664. else
  665. {
  666. // Obtain the index into the material set
  667. for(%i = 0; %i < materialSet.getCount(); %i++)
  668. {
  669. %obj = materialSet.getObject(%i);
  670. if( %obj.getName() $= %name )
  671. {
  672. %index = %i;
  673. break;
  674. }
  675. }
  676. }
  677. eval( "" @ MaterialSelector.selectCallback @ "(" @ %index @ ");");
  678. }
  679. else
  680. eval( "" @ MaterialSelector.selectCallback @ "(" @ %material.getId() @ ");");
  681. MaterialSelector.hideDialog();
  682. }
  683. function MaterialSelector::showDialog( %this, %selectCallback, %returnType)
  684. {
  685. if( MaterialSelector.isVisible() )
  686. return;
  687. %this.showDialogBase(%selectCallback, %returnType, false);
  688. }
  689. function MaterialSelector::showTerrainDialog( %this, %selectCallback, %returnType)
  690. {
  691. %this.showDialogBase(%selectCallback, %returnType, true);
  692. }
  693. function MaterialSelector::showDialogBase( %this, %selectCallback, %returnType, %useTerrainMaterials)
  694. {
  695. // Set the select callback
  696. MaterialSelector.selectCallback = %selectCallback;
  697. MaterialSelector.returnType = %returnType;
  698. MaterialSelector.currentStaticFilter = $Pref::MaterialSelector::CurrentStaticFilter;
  699. MaterialSelector.currentFilter = $Pref::MaterialSelector::CurrentFilter;
  700. MaterialSelector.terrainMaterials = %useTerrainMaterials;
  701. MaterialSelector-->materialPreviewCountPopup.clear();
  702. MaterialSelector-->materialPreviewCountPopup.add( "10", 0 );
  703. MaterialSelector-->materialPreviewCountPopup.add( "15", 1 );
  704. MaterialSelector-->materialPreviewCountPopup.add( "25", 2 );
  705. MaterialSelector-->materialPreviewCountPopup.add( "50", 3 );
  706. MaterialSelector-->materialPreviewCountPopup.add( "75", 4 );
  707. MaterialSelector-->materialPreviewCountPopup.add( "100", 5 );
  708. MaterialSelector-->materialPreviewCountPopup.setSelected( $Pref::MaterialSelector::ThumbnailCountIndex );
  709. Canvas.pushDialog(MaterialSelectorOverlay);
  710. MaterialSelector.setVisible(1);
  711. MaterialSelector.buildStaticFilters();
  712. MaterialSelector.selectedMaterial = "";
  713. MaterialSelector.loadMaterialFilters();
  714. }
  715. function MaterialSelector::hideDialog( %this )
  716. {
  717. MaterialSelector.breakdown();
  718. MaterialSelector.setVisible(0);
  719. Canvas.popDialog(MaterialSelectorOverlay);
  720. }
  721. function MaterialSelector::breakdown( %this )
  722. {
  723. $Pref::MaterialSelector::CurrentStaticFilter = MaterialSelector.currentStaticFilter;
  724. $Pref::MaterialSelector::CurrentFilter = MaterialSelector.currentFilter;
  725. MaterialSelector-->filterArray.deleteAllObjects();
  726. MaterialSelector-->materialSelection.deleteAllObjects();
  727. MatEdPreviewArray.delete();
  728. MaterialSelector-->materialCategories.deleteAllObjects();
  729. MaterialFilterAllArray.delete();
  730. MaterialFilterMappedArray.delete();
  731. MaterialFilterUnmappedArray.delete();
  732. }
  733. function MaterialSelector::buildStaticFilters( %this )
  734. {
  735. // if you want to add any more containers to staticFilterObjects, here's
  736. // where to do it
  737. %staticFilterContainer = new GuiControl (){
  738. new GuiContainer(){
  739. profile = "ToolsGuiDefaultProfile";
  740. Position = "0 0";
  741. Extent = "128 18";
  742. HorizSizing = "right";
  743. VertSizing = "bottom";
  744. isContainer = "1";
  745. parentGroup = %filterArray;
  746. new GuiContainer(){
  747. profile = "inspectorStyleRolloutDarkProfile";
  748. Position = "-1 0";
  749. Extent = "128 32";
  750. HorizSizing = "right";
  751. VertSizing = "bottom";
  752. isContainer = "1";
  753. };
  754. new GuiTextCtrl(){
  755. Profile = "EditorTextProfile";
  756. position = "5 0";
  757. Extent = "118 18";
  758. text = "Types";
  759. };
  760. };
  761. new GuiContainer(){ // All
  762. profile = "ToolsGuiDefaultProfile";
  763. Position = "415 191";
  764. Extent = "128 18";
  765. HorizSizing = "right";
  766. VertSizing = "bottom";
  767. isContainer = "1";
  768. parentGroup = %filterArray;
  769. new GuiCheckBoxCtrl(MaterialFilterAllArrayCheckbox){
  770. Profile = "ToolsGuiCheckBoxListProfile";
  771. position = "5 2";
  772. Extent = "118 18";
  773. text = "All";
  774. Command = "MaterialSelector.switchStaticFilters(\"MaterialFilterAllArray\");";
  775. };
  776. };
  777. new GuiContainer(){ // Mapped
  778. profile = "ToolsGuiDefaultProfile";
  779. Position = "415 191";
  780. Extent = "128 18";
  781. HorizSizing = "right";
  782. VertSizing = "bottom";
  783. isContainer = "1";
  784. parentGroup = %filterArray;
  785. new GuiCheckBoxCtrl(MaterialFilterMappedArrayCheckbox){
  786. Profile = "ToolsGuiCheckBoxListProfile";
  787. position = "5 2";
  788. Extent = "118 18";
  789. text = "Mapped";
  790. Command = "MaterialSelector.switchStaticFilters(\"MaterialFilterMappedArray\");";
  791. };
  792. };
  793. new GuiContainer(){ // Unmapped
  794. profile = "ToolsGuiDefaultProfile";
  795. Position = "415 191";
  796. Extent = "128 18";
  797. HorizSizing = "right";
  798. VertSizing = "bottom";
  799. isContainer = "1";
  800. parentGroup = %filterArray;
  801. new GuiCheckBoxCtrl(MaterialFilterUnmappedArrayCheckbox){
  802. Profile = "ToolsGuiCheckBoxListProfile";
  803. position = "5 2";
  804. Extent = "118 18";
  805. text = "Unmapped";
  806. Command = "MaterialSelector.switchStaticFilters(\"MaterialFilterUnmappedArray\");";
  807. };
  808. };
  809. new GuiContainer(){
  810. profile = "ToolsGuiDefaultProfile";
  811. Position = "0 0";
  812. Extent = "128 18";
  813. HorizSizing = "right";
  814. VertSizing = "bottom";
  815. isContainer = "1";
  816. parentGroup = %filterArray;
  817. new GuiContainer(){
  818. profile = "inspectorStyleRolloutDarkProfile";
  819. Position = "-1 0";
  820. Extent = "128 32";
  821. HorizSizing = "right";
  822. VertSizing = "bottom";
  823. isContainer = "1";
  824. };
  825. new GuiTextCtrl(){
  826. Profile = "EditorTextProfile";
  827. position = "5 0";
  828. Extent = "118 18";
  829. text = "Tags";
  830. };
  831. // Create New Tag
  832. new GuiBitmapButtonCtrl() {
  833. canSaveDynamicFields = "0";
  834. Enabled = "1";
  835. isContainer = "0";
  836. Profile = "ToolsGuiDefaultProfile";
  837. HorizSizing = "left";
  838. VertSizing = "bottom";
  839. position = "105 2";
  840. Extent = "15 15";
  841. MinExtent = "8 2";
  842. canSave = "1";
  843. Visible = "1";
  844. Command = "MaterialSelector_addFilterWindow.setVisible(1); MaterialSelectorOverlay.pushToBack(MaterialSelector_addFilterWindow);";
  845. hovertime = "1000";
  846. tooltip = "Create New Tag";
  847. bitmap = "tools/gui/images/new";
  848. groupNum = "-1";
  849. buttonType = "PushButton";
  850. useMouseEvents = "0";
  851. };
  852. new GuiBitmapButtonCtrl() {
  853. canSaveDynamicFields = "0";
  854. Enabled = "1";
  855. isContainer = "0";
  856. Profile = "ToolsGuiDefaultProfile";
  857. HorizSizing = "left";
  858. VertSizing = "bottom";
  859. position = "89 2";
  860. Extent = "13 13";
  861. MinExtent = "8 2";
  862. canSave = "1";
  863. Visible = "1";
  864. Command = "MaterialSelector.clearMaterialFilters();";
  865. hovertime = "1000";
  866. tooltip = "Clear Selected Tag";
  867. bitmap = "tools/gui/images/clear-btn";
  868. groupNum = "-1";
  869. buttonType = "PushButton";
  870. useMouseEvents = "0";
  871. };
  872. };
  873. };
  874. %i = %staticFilterContainer.getCount();
  875. for( ; %i != 0; %i--)
  876. MaterialSelector-->filterArray.addGuiControl(%staticFilterContainer.getObject(0));
  877. MaterialSelector.staticFilterObjects = MaterialSelector-->filterArray.getCount();
  878. %staticFilterContainer.delete();
  879. // Create our category array used in the selector, this code should be taken out
  880. // in order to make the material selector agnostic
  881. new ArrayObject(MaterialFilterAllArray);
  882. new ArrayObject(MaterialFilterMappedArray);
  883. new ArrayObject(MaterialFilterUnmappedArray);
  884. %mats = "";
  885. %count = 0;
  886. if( MaterialSelector.terrainMaterials )
  887. {
  888. %mats = ETerrainEditor.getTerrainBlocksMaterialList();
  889. %count = getRecordCount( %mats );
  890. }
  891. else
  892. {
  893. %count = materialSet.getCount();
  894. }
  895. for(%i = 0; %i < %count; %i++)
  896. {
  897. // Process terrain materials
  898. if( MaterialSelector.terrainMaterials )
  899. {
  900. %matInternalName = getRecord( %mats, %i );
  901. %material = TerrainMaterialSet.findObjectByInternalName( %matInternalName );
  902. // Is there no material info for this slot?
  903. if ( !isObject( %material ) )
  904. continue;
  905. // Add to the appropriate filters
  906. MaterialFilterMappedArray.add( "", %material );
  907. MaterialFilterAllArray.add( "", %material );
  908. continue;
  909. }
  910. // Process regular materials here
  911. %material = materialSet.getObject(%i);
  912. for( %k = 0; %k < UnlistedMaterials.count(); %k++ )
  913. {
  914. %unlistedFound = 0;
  915. if( UnlistedMaterials.getValue(%k) $= %material.name )
  916. {
  917. %unlistedFound = 1;
  918. break;
  919. }
  920. }
  921. if( %unlistedFound )
  922. continue;
  923. if( %material.mapTo $= "" || %material.mapTo $= "unmapped_mat" )
  924. {
  925. MaterialFilterUnmappedArray.add( "", %material.name );
  926. //running through the existing tag names
  927. for( %j = 0; %material.getFieldValue("materialTag" @ %j) !$= ""; %j++ )
  928. MaterialFilterUnmappedArray.add( %material.getFieldValue("materialTag" @ %j), %material.name );
  929. }
  930. else
  931. {
  932. MaterialFilterMappedArray.add( "", %material.name );
  933. for( %j = 0; %material.getFieldValue("materialTag" @ %j) !$= ""; %j++ )
  934. MaterialFilterMappedArray.add( %material.getFieldValue("materialTag" @ %j), %material.name );
  935. }
  936. MaterialFilterAllArray.add( "", %material.name );
  937. for( %j = 0; %material.getFieldValue("materialTag" @ %j) !$= ""; %j++ )
  938. MaterialFilterAllArray.add( %material.getFieldValue("materialTag" @ %j), %material.name );
  939. }
  940. MaterialFilterAllArrayCheckbox.setText("All ( " @ MaterialFilterAllArray.count() @" ) ");
  941. MaterialFilterMappedArrayCheckbox.setText("Mapped ( " @ MaterialFilterMappedArray.count() @" ) ");
  942. MaterialFilterUnmappedArrayCheckbox.setText("Unmapped ( " @ MaterialFilterUnmappedArray.count() @" ) ");
  943. }
  944. function MaterialSelector::preloadFilter( %this )
  945. {
  946. %selectedFilter = "";
  947. for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount(); %i++ )
  948. {
  949. if( MaterialSelector-->filterArray.getObject(%i).getObject(0).getValue() == 1 )
  950. {
  951. if( %selectedFilter $= "" )
  952. %selectedFilter = MaterialSelector-->filterArray.getObject(%i).getObject(0).filter;
  953. else
  954. %selectedFilter = %selectedFilter @ " " @ MaterialSelector-->filterArray.getObject(%i).getObject(0).filter;
  955. }
  956. }
  957. MaterialSelector.loadFilter( %selectedFilter );
  958. }
  959. function MaterialSelector::loadFilter( %this, %selectedFilter, %staticFilter )
  960. {
  961. // manage schedule array properly
  962. if(!isObject(MatEdScheduleArray))
  963. new ArrayObject(MatEdScheduleArray);
  964. // if we select another list... delete all schedules that were created by
  965. // previous load
  966. for( %i = 0; %i < MatEdScheduleArray.count(); %i++ )
  967. cancel(MatEdScheduleArray.getKey(%i));
  968. // we have to empty out the list; so when we create new schedules, these dont linger
  969. MatEdScheduleArray.empty();
  970. // manage preview array
  971. if(!isObject(MatEdPreviewArray))
  972. new ArrayObject(MatEdPreviewArray);
  973. // we have to empty out the list; so when we create new guicontrols, these dont linger
  974. MatEdPreviewArray.empty();
  975. MaterialSelector-->materialSelection.deleteAllObjects();
  976. MaterialSelector-->materialPreviewPagesStack.deleteAllObjects();
  977. // changed to accomadate tagging. dig through the array for each tag name,
  978. // call unique value, sort, and we have a perfect set of materials
  979. if( %staticFilter !$= "" )
  980. MaterialSelector.currentStaticFilter = %staticFilter;
  981. MaterialSelector.currentFilter = %selectedFilter;
  982. %filteredObjectsArray = new ArrayObject();
  983. %previewsPerPage = MaterialSelector-->materialPreviewCountPopup.getTextById( MaterialSelector-->materialPreviewCountPopup.getSelected() );
  984. %tagCount = getWordCount( MaterialSelector.currentFilter );
  985. if( %tagCount != 0 )
  986. {
  987. for( %j = 0; %j < %tagCount; %j++ )
  988. {
  989. for( %i = 0; %i < MaterialSelector.currentStaticFilter.count(); %i++ )
  990. {
  991. %currentTag = getWord( MaterialSelector.currentFilter, %j );
  992. if( MaterialSelector.currentStaticFilter.getKey(%i) $= %currentTag)
  993. %filteredObjectsArray.add( MaterialSelector.currentStaticFilter.getKey(%i), MaterialSelector.currentStaticFilter.getValue(%i) );
  994. }
  995. }
  996. %filteredObjectsArray.uniqueValue();
  997. %filteredObjectsArray.sortd();
  998. MaterialSelector.totalPages = mCeil( %filteredObjectsArray.count() / %previewsPerPage );
  999. //Can we maintain the current preview page, or should we go to page 1?
  1000. if( (MaterialSelector.currentPreviewPage * %previewsPerPage) >= %filteredObjectsArray.count() )
  1001. MaterialSelector.currentPreviewPage = 0;
  1002. // Build out the pages buttons
  1003. MaterialSelector.buildPagesButtons( MaterialSelector.currentPreviewPage, MaterialSelector.totalPages );
  1004. %previewCount = %previewsPerPage;
  1005. %possiblePreviewCount = %filteredObjectsArray.count() - MaterialSelector.currentPreviewPage * %previewsPerPage;
  1006. if( %possiblePreviewCount < %previewCount )
  1007. %previewCount = %possiblePreviewCount;
  1008. %start = MaterialSelector.currentPreviewPage * %previewsPerPage;
  1009. for( %i = %start; %i < %start + %previewCount; %i++ )
  1010. MaterialSelector.buildPreviewArray( %filteredObjectsArray.getValue(%i) );
  1011. %filteredObjectsArray.delete();
  1012. }
  1013. else
  1014. {
  1015. MaterialSelector.currentStaticFilter.sortd();
  1016. // Rebuild the static filter list without tagged materials
  1017. %noTagArray = new ArrayObject();
  1018. for( %i = 0; %i < MaterialSelector.currentStaticFilter.count(); %i++ )
  1019. {
  1020. if( MaterialSelector.currentStaticFilter.getKey(%i) !$= "")
  1021. continue;
  1022. %material = MaterialSelector.currentStaticFilter.getValue(%i);
  1023. // CustomMaterials are not available for selection
  1024. if ( !isObject( %material ) || %material.isMemberOfClass( "CustomMaterial" ) )
  1025. continue;
  1026. %noTagArray.add( "", %material );
  1027. }
  1028. MaterialSelector.totalPages = mCeil( %noTagArray.count() / %previewsPerPage );
  1029. //Can we maintain the current preview page, or should we go to page 1?
  1030. if( (MaterialSelector.currentPreviewPage * %previewsPerPage) >= %noTagArray.count() )
  1031. MaterialSelector.currentPreviewPage = 0;
  1032. // Build out the pages buttons
  1033. MaterialSelector.buildPagesButtons( MaterialSelector.currentPreviewPage, MaterialSelector.totalPages );
  1034. %previewCount = %previewsPerPage;
  1035. %possiblePreviewCount = %noTagArray.count() - MaterialSelector.currentPreviewPage * %previewsPerPage;
  1036. if( %possiblePreviewCount < %previewCount )
  1037. %previewCount = %possiblePreviewCount;
  1038. %start = MaterialSelector.currentPreviewPage * %previewsPerPage;
  1039. for( %i = %start; %i < %start + %previewCount; %i++ )
  1040. {
  1041. MaterialSelector.buildPreviewArray( %noTagArray.getValue(%i) );
  1042. }
  1043. }
  1044. MaterialSelector.loadImages( 0 );
  1045. }
  1046. function MaterialSelector::buildPreviewArray( %this, %material )
  1047. {
  1048. %matName = "";
  1049. // CustomMaterials are not available for selection
  1050. if ( !isObject( %material ) || %material.isMemberOfClass( "CustomMaterial" ) )
  1051. return;
  1052. if( %material.isMemberOfClass("TerrainMaterial") )
  1053. {
  1054. %matName = %material.getInternalName();
  1055. if( %material.diffuseMap $= "")
  1056. %previewImage = "core/art/warnmat";
  1057. else
  1058. %previewImage = %material.diffuseMap;
  1059. }
  1060. else if( %material.toneMap[0] $= "" && %material.diffuseMap[0] $= "" && !isObject(%material.cubemap) )
  1061. {
  1062. %matName = %material.name;
  1063. %previewImage = "core/art/warnmat";
  1064. }
  1065. else
  1066. {
  1067. %matName = %material.name;
  1068. if( %material.toneMap[0] !$= "" )
  1069. %previewImage = %material.toneMap[0];
  1070. else if( %material.diffuseMap[0] !$= "" )
  1071. %previewImage = %material.diffuseMap[0];
  1072. else if( %material.cubemap.cubeFace[0] !$= "" )
  1073. %previewImage = %material.cubemap.cubeFace[0];
  1074. //%previewImage = MaterialEditorGui.searchForTexture( %material, %previewImage );
  1075. // were going to use a couple of string commands in order to properly
  1076. // find out what the img src path is
  1077. // **NEW** this needs to be updated with the above, but has some timing issues
  1078. %materialDiffuse = %previewImage;
  1079. %materialPath = %material.getFilename();
  1080. if( strchr( %materialDiffuse, "/") $= "" )
  1081. {
  1082. %k = 0;
  1083. while( strpos( %materialPath, "/", %k ) != -1 )
  1084. {
  1085. %foo = strpos( %materialPath, "/", %k );
  1086. %k = %foo + 1;
  1087. }
  1088. %foobar = getSubStr( %materialPath , %k , 99 );
  1089. %previewImage = strreplace( %materialPath, %foobar, %previewImage );
  1090. }
  1091. else
  1092. %previewImage = strreplace( %materialPath, %materialPath, %previewImage );
  1093. }
  1094. // it may seem goofy why the checkbox can't be instanciated inside the container
  1095. // reason being its because we need to store the checkbox ctrl in order to make changes
  1096. // on it later in the function.
  1097. %container = new GuiControl(){
  1098. profile = "ToolsGuiDefaultProfile";
  1099. Position = "0 0";
  1100. Extent = "74 87";
  1101. HorizSizing = "right";
  1102. VertSizing = "bottom";
  1103. isContainer = "1";
  1104. new GuiTextCtrl(){
  1105. position = "7 71";
  1106. profile = "ToolsGuiTextCenterProfile";
  1107. extent = "64 16";
  1108. text = %matName;
  1109. };
  1110. };
  1111. %previewButton = new GuiBitmapButtonCtrl(){
  1112. internalName = %matName;
  1113. HorizSizing = "right";
  1114. VertSizing = "bottom";
  1115. profile = "ToolsGuiButtonProfile";
  1116. position = "7 4";
  1117. extent = "64 64";
  1118. buttonType = "PushButton";
  1119. bitmap = "";
  1120. Command = "";
  1121. text = "Loading...";
  1122. useStates = false;
  1123. new GuiBitmapButtonCtrl(){
  1124. HorizSizing = "right";
  1125. VertSizing = "bottom";
  1126. profile = "ToolsGuiButtonProfile";
  1127. position = "0 0";
  1128. extent = "64 64";
  1129. Variable = "";
  1130. buttonType = "toggleButton";
  1131. bitmap = "tools/materialEditor/gui/cubemapBtnBorder";
  1132. groupNum = "0";
  1133. text = "";
  1134. };
  1135. };
  1136. %previewBorder = new GuiButtonCtrl(){
  1137. internalName = %matName@"Border";
  1138. HorizSizing = "right";
  1139. VertSizing = "bottom";
  1140. profile = "ToolsGuiThumbHighlightButtonProfile";
  1141. position = "3 0";
  1142. extent = "72 88";
  1143. Variable = "";
  1144. buttonType = "toggleButton";
  1145. tooltip = %matName;
  1146. Command = "MaterialSelector.updateSelection( $ThisControl.getParent().getObject(1).internalName, $ThisControl.getParent().getObject(1).bitmap );";
  1147. groupNum = "0";
  1148. text = "";
  1149. };
  1150. %container.add(%previewButton);
  1151. %container.add(%previewBorder);
  1152. // add to the gui control array
  1153. MaterialSelector-->materialSelection.add(%container);
  1154. // add to the array object for reference later
  1155. MatEdPreviewArray.add( %previewButton, %previewImage );
  1156. }
  1157. function MaterialSelector::loadImages( %this, %materialNum )
  1158. {
  1159. // this will save us from spinning our wheels in case we don't exist
  1160. if( !MaterialSelector.visible )
  1161. return;
  1162. // this schedule is here to dynamically load images
  1163. %previewButton = MatEdPreviewArray.getKey(%materialNum);
  1164. %previewImage = MatEdPreviewArray.getValue(%materialNum);
  1165. %previewButton.setBitmap(%previewImage);
  1166. %previewButton.setText("");
  1167. %materialNum++;
  1168. if( %materialNum < MatEdPreviewArray.count() )
  1169. {
  1170. %tempSchedule = %this.schedule(64, "loadImages", %materialNum);
  1171. MatEdScheduleArray.add( %tempSchedule, %materialNum );
  1172. }
  1173. }
  1174. function MaterialSelector::clearMaterialFilters( %this )
  1175. {
  1176. for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount(); %i++ )
  1177. MaterialSelector-->filterArray.getObject(%i).getObject(0).setStateOn(0);
  1178. MaterialSelector.loadFilter( "", "" );
  1179. }
  1180. function MaterialSelector::loadMaterialFilters( %this )
  1181. {
  1182. %filteredTypesArray = new ArrayObject();
  1183. %filteredTypesArray.duplicate( MaterialFilterAllArray );
  1184. %filteredTypesArray.uniqueKey();
  1185. // sort the the keys before we do anything
  1186. %filteredTypesArray.sortkd();
  1187. eval( MaterialSelector.currentStaticFilter @ "Checkbox.setStateOn(1);" );
  1188. // it may seem goofy why the checkbox can't be instanciated inside the container
  1189. // reason being its because we need to store the checkbox ctrl in order to make changes
  1190. // on it later in the function.
  1191. %selectedFilter = "";
  1192. for( %i = 0; %i < %filteredTypesArray.count(); %i++ )
  1193. {
  1194. %filter = %filteredTypesArray.getKey(%i);
  1195. if(%filter $= "")
  1196. continue;
  1197. %container = new GuiControl(){
  1198. profile = "ToolsGuiDefaultProfile";
  1199. Position = "0 0";
  1200. Extent = "128 18";
  1201. HorizSizing = "right";
  1202. VertSizing = "bottom";
  1203. isContainer = "1";
  1204. };
  1205. %checkbox = new GuiCheckBoxCtrl(){
  1206. Profile = "ToolsGuiCheckBoxListProfile";
  1207. position = "5 1";
  1208. Extent = "118 18";
  1209. Command = "";
  1210. groupNum = "0";
  1211. buttonType = "ToggleButton";
  1212. text = %filter @ " ( " @ MaterialFilterAllArray.countKey(%filter) @ " )";
  1213. filter = %filter;
  1214. Command = "MaterialSelector.preloadFilter();";
  1215. };
  1216. %container.add( %checkbox );
  1217. MaterialSelector-->filterArray.add( %container );
  1218. %tagCount = getWordCount( MaterialSelector.currentFilter );
  1219. for( %j = 0; %j < %tagCount; %j++ )
  1220. {
  1221. if( %filter $= getWord( MaterialSelector.currentFilter, %j ) )
  1222. {
  1223. if( %selectedFilter $= "" )
  1224. %selectedFilter = %filter;
  1225. else
  1226. %selectedFilter = %selectedFilter @ " " @ %filter;
  1227. %checkbox.setStateOn(1);
  1228. }
  1229. }
  1230. }
  1231. MaterialSelector.loadFilter( %selectedFilter );
  1232. %filteredTypesArray.delete();
  1233. }
  1234. // create category and update current material if there is one
  1235. function MaterialSelector::createFilter( %this, %filter )
  1236. {
  1237. if( %filter $= %existingFilters )
  1238. {
  1239. MessageBoxOK( "Error", "Can not create blank filter.");
  1240. return;
  1241. }
  1242. for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount() ; %i++ )
  1243. {
  1244. %existingFilters = MaterialSelector-->filterArray.getObject(%i).getObject(0).filter;
  1245. if( %filter $= %existingFilters )
  1246. {
  1247. MessageBoxOK( "Error", "Can not create two filters of the same name.");
  1248. return;
  1249. }
  1250. }
  1251. %container = new GuiControl(){
  1252. profile = "ToolsGuiDefaultProfile";
  1253. Position = "0 0";
  1254. Extent = "128 18";
  1255. HorizSizing = "right";
  1256. VertSizing = "bottom";
  1257. isContainer = "1";
  1258. new GuiCheckBoxCtrl(){
  1259. Profile = "ToolsGuiCheckBoxListProfile";
  1260. position = "5 1";
  1261. Extent = "118 18";
  1262. Command = "";
  1263. groupNum = "0";
  1264. buttonType = "ToggleButton";
  1265. text = %filter @ " ( " @ MaterialFilterAllArray.countKey(%filter) @ " )";
  1266. filter = %filter;
  1267. Command = "MaterialSelector.preloadFilter();";
  1268. };
  1269. };
  1270. MaterialSelector-->filterArray.add( %container );
  1271. // if selection exists, lets reselect it to refresh it
  1272. if( isObject(MaterialSelector.selectedMaterial) )
  1273. MaterialSelector.updateSelection( MaterialSelector.selectedMaterial, MaterialSelector.selectedPreviewImagePath );
  1274. // material category text field to blank
  1275. MaterialSelector_addFilterWindow-->tagName.setText("");
  1276. }
  1277. function MaterialSelector::updateSelection( %this, %material, %previewImagePath )
  1278. {
  1279. // the material selector will visually update per material information
  1280. // after we move away from the material. eg: if we remove a field from the material,
  1281. // the empty checkbox will still be there until you move fro and to the material again
  1282. %isMaterialBorder = 0;
  1283. eval("%isMaterialBorder = isObject(MaterialSelector-->"@%material@"Border);");
  1284. if( %isMaterialBorder )
  1285. {
  1286. eval( "MaterialSelector-->"@%material@"Border.setStateOn(1);");
  1287. }
  1288. %isMaterialBorderPrevious = 0;
  1289. eval("%isMaterialBorderPrevious = isObject(MaterialSelector-->"@$prevSelectedMaterialHL@"Border);");
  1290. if( %isMaterialBorderPrevious )
  1291. {
  1292. eval( "MaterialSelector-->"@$prevSelectedMaterialHL@"Border.setStateOn(0);");
  1293. }
  1294. MaterialSelector-->materialCategories.deleteAllObjects();
  1295. MaterialSelector.selectedMaterial = %material;
  1296. MaterialSelector.selectedPreviewImagePath = %previewImagePath;
  1297. MaterialSelector-->previewSelectionText.setText( %material );
  1298. MaterialSelector-->previewSelection.setBitmap( %previewImagePath );
  1299. // running through the existing list of categorynames in the left, so yes
  1300. // some might exist on the left only temporary if not given a home
  1301. for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount() ; %i++ )
  1302. {
  1303. %filter = MaterialSelector-->filterArray.getObject(%i).getObject(0).filter;
  1304. %checkbox = new GuiCheckBoxCtrl(){
  1305. materialName = %material.name;
  1306. Profile = "ToolsGuiCheckBoxListProfile";
  1307. position = "5 2";
  1308. Extent = "118 18";
  1309. Command = "MaterialSelector.updateMaterialTags( $ThisControl.materialName, $ThisControl.getText(), $ThisControl.getValue() );";
  1310. text = %filter;
  1311. };
  1312. MaterialSelector-->materialCategories.add( %checkbox );
  1313. // crawl through material for categories in order to check or not
  1314. %filterFound = 0;
  1315. for( %j = 0; %material.getFieldValue("materialTag" @ %j) !$= ""; %j++ )
  1316. {
  1317. %tag = %material.getFieldValue("materialTag" @ %j);
  1318. if( %tag $= %filter )
  1319. {
  1320. %filterFound = 1;
  1321. break;
  1322. }
  1323. }
  1324. if( %filterFound )
  1325. %checkbox.setStateOn(1);
  1326. else
  1327. %checkbox.setStateOn(0);
  1328. }
  1329. $prevSelectedMaterialHL = %material;
  1330. }
  1331. function MaterialSelector::updateMaterialTags( %this, %material, %tag, %tagValue )
  1332. {
  1333. if( %tagValue == 1 )
  1334. {
  1335. MaterialFilterAllArray.add( %tag, %material );
  1336. if( %material.mapTo $= "" || %material.mapTo $= "unmapped_mat" )
  1337. %secondStaticFilter = MaterialFilterUnmappedArray;
  1338. else
  1339. %secondStaticFilter = MaterialFilterMappedArray;
  1340. %secondStaticFilter.add( %tag, %material );
  1341. %createdTag = 0;
  1342. for( %i = 0; %createdTag == 0; %i++ )
  1343. {
  1344. %materialTag = %material.getFieldValue("materialTag" @ %i);
  1345. if( %materialTag $= "" )
  1346. {
  1347. eval( %material @ ".materialTag" @ %i @ "=" @ %tag @ ";" );
  1348. %createdTag = 1;
  1349. for( %j = MaterialSelector.staticFilterObjects; %j < MaterialSelector-->filterArray.getCount() ; %j++ )
  1350. {
  1351. if( %tag $= MaterialSelector-->filterArray.getObject(%j).getObject(0).filter )
  1352. {
  1353. %count = getWord( MaterialSelector-->filterArray.getObject(%j).getObject(0).getText(), 2 );
  1354. %count++;
  1355. MaterialSelector-->filterArray.getObject(%j).getObject(0).setText( %tag @ " ( "@ %count @ " )");
  1356. }
  1357. }
  1358. break;
  1359. }
  1360. }
  1361. }
  1362. else
  1363. {
  1364. // Remove the material from the "all" category
  1365. for( %i = 0; %i < MaterialFilterAllArray.count(); %i++ )
  1366. {
  1367. if( MaterialFilterAllArray.getKey(%i) $= %tag )
  1368. {
  1369. if( MaterialFilterAllArray.getValue(%i) $= %material )
  1370. {
  1371. MaterialFilterAllArray.erase(%i);
  1372. break;
  1373. }
  1374. }
  1375. }
  1376. // Figure out what the material's other category is
  1377. if( %material.mapTo $= "" || %material.mapTo $= "unmapped_mat" )
  1378. %secondStaticFilter = MaterialFilterUnmappedArray;
  1379. else
  1380. %secondStaticFilter = MaterialFilterMappedArray;
  1381. // Remove the material from its other category
  1382. for( %i = 0; %i < %secondStaticFilter.count(); %i++ )
  1383. {
  1384. if( %secondStaticFilter.getKey(%i) $= %tag )
  1385. {
  1386. if( %secondStaticFilter.getValue(%i) $= %material )
  1387. {
  1388. %secondStaticFilter.erase( %i );
  1389. break;
  1390. }
  1391. }
  1392. }
  1393. MaterialSelector.updateFilterCount( %tag, false );
  1394. %tagField = MaterialSelector.getTagField( %material, %tag );
  1395. %lastTagField = MaterialSelector.getLastTagField( %material );
  1396. %lastValidTagField = MaterialSelector.getLastValidTagField( %material, %tag );
  1397. if( %tagField $= %lastValidTagField || %lastValidTagField $= "" )
  1398. {
  1399. MaterialSelectorPerMan.removeField( %material, %tagField );
  1400. }
  1401. else
  1402. {
  1403. // Replace the current tagFieldValue with the last tagFieldValue
  1404. %lastValidTag = %material.getFieldValue( %lastValidTagField );
  1405. %material.setFieldValue( %tagField, %lastValidTag );
  1406. // Remove the last tagFieldValue
  1407. MaterialSelectorPerMan.removeField( %material, %lastTagField );
  1408. }
  1409. }
  1410. // so were not going to save materials that dont current exist...
  1411. // technically all the data is stored in dynamic fields if the user feels like saving
  1412. // their auto-generated or new material
  1413. if( %material.getFilename() !$= "" &&
  1414. %material.getFilename() !$= "tools/gui/MaterialSelector.ed.gui" &&
  1415. %material.getFilename() !$= "tools/materialEditor/scripts/materialEditor.ed.cs" )
  1416. {
  1417. MaterialSelectorPerMan.setDirty( %material );
  1418. MaterialSelectorPerMan.saveDirty();
  1419. MaterialSelectorPerMan.removeDirty( %material );
  1420. if(!%tagValue)
  1421. %material.setFieldValue( %lastTagField, "" );
  1422. }
  1423. }
  1424. function MaterialSelector::updateFilterCount( %this, %tag, %add )
  1425. {
  1426. for( %i = MaterialSelector.staticFilterObjects; %i < MaterialSelector-->filterArray.getCount() ; %i++ )
  1427. {
  1428. if( %tag $= MaterialSelector-->filterArray.getObject(%i).getObject(0).filter )
  1429. {
  1430. // Get the filter count and apply the operation
  1431. %idx = getWord( MaterialSelector-->filterArray.getObject(%i).getObject(0).getText(), 2 );
  1432. if( %add )
  1433. %idx++;
  1434. else
  1435. %idx--;
  1436. MaterialSelector-->filterArray.getObject(%i).getObject(0).setText( %tag @ " ( "@ %idx @ " )");
  1437. }
  1438. }
  1439. }
  1440. // this should create a new material pretty nicely
  1441. function MaterialSelector::createNewMaterial( %this )
  1442. {
  1443. // look for a newMaterial name to grab
  1444. %material = getUniqueName( "newMaterial" );
  1445. new Material(%material)
  1446. {
  1447. diffuseMap[0] = "core/art/warnMat";
  1448. mapTo = "unmapped_mat";
  1449. parentGroup = RootGroup;
  1450. };
  1451. // add one to All filter
  1452. MaterialFilterAllArray.add( "", %material.name );
  1453. MaterialFilterAllArrayCheckbox.setText("All ( " @ MaterialFilterAllArray.count() + 1 @ " ) ");
  1454. MaterialFilterUnmappedArray.add( "", %material.name );
  1455. MaterialFilterUnmappedArrayCheckbox.setText("Unmapped ( " @ MaterialFilterUnmappedArray.count() + 1 @ " ) ");
  1456. if( MaterialSelector.currentStaticFilter !$= "MaterialFilterMappedArray" )
  1457. {
  1458. // create the new material gui
  1459. %container = new GuiControl(){
  1460. profile = "ToolsGuiDefaultProfile";
  1461. Position = "0 0";
  1462. Extent = "74 85";
  1463. HorizSizing = "right";
  1464. VertSizing = "bottom";
  1465. isContainer = "1";
  1466. new GuiTextCtrl(){
  1467. position = "10 70";
  1468. profile = "ToolsGuiTextCenterProfile";
  1469. extent = "64 16";
  1470. text = %material.name;
  1471. };
  1472. };
  1473. %previewButton = new GuiBitmapButtonCtrl(){
  1474. internalName = %material.name;
  1475. HorizSizing = "right";
  1476. VertSizing = "bottom";
  1477. profile = "ToolsGuiButtonProfile";
  1478. position = "7 4";
  1479. extent = "64 64";
  1480. buttonType = "PushButton";
  1481. bitmap = "core/art/warnMat";
  1482. Command = "";
  1483. text = "Loading...";
  1484. useStates = false;
  1485. new GuiBitmapButtonCtrl(){
  1486. HorizSizing = "right";
  1487. VertSizing = "bottom";
  1488. profile = "ToolsGuiButtonProfile";
  1489. position = "0 0";
  1490. extent = "64 64";
  1491. Variable = "";
  1492. buttonType = "toggleButton";
  1493. bitmap = "tools/materialEditor/gui/cubemapBtnBorder";
  1494. groupNum = "0";
  1495. text = "";
  1496. };
  1497. };
  1498. %previewBorder = new GuiButtonCtrl(){
  1499. internalName = %material.name@"Border";
  1500. HorizSizing = "right";
  1501. VertSizing = "bottom";
  1502. profile = "ToolsGuiThumbHighlightButtonProfile";
  1503. position = "3 0";
  1504. extent = "72 88";
  1505. Variable = "";
  1506. buttonType = "toggleButton";
  1507. tooltip = %material.name;
  1508. Command = "MaterialSelector.updateSelection( $ThisControl.getParent().getObject(1).internalName, $ThisControl.getParent().getObject(1).bitmap );";
  1509. groupNum = "0";
  1510. text = "";
  1511. };
  1512. %container.add(%previewButton);
  1513. %container.add(%previewBorder);
  1514. // add to the gui control array
  1515. MaterialSelector-->materialSelection.add(%container);
  1516. }
  1517. // select me
  1518. MaterialSelector.updateSelection( %material, "core/art/warnMat.png" );
  1519. }
  1520. //needs to be deleted with the persistence manager and needs to be blanked out of the matmanager
  1521. //also need to update instances... i guess which is the tricky part....
  1522. function MaterialSelector::showDeleteDialog( %this )
  1523. {
  1524. %material = MaterialSelector.selectedMaterial;
  1525. %secondFilter = "MaterialFilterMappedArray";
  1526. %secondFilterName = "Mapped";
  1527. for( %i = 0; %i < MaterialFilterUnmappedArray.count(); %i++ )
  1528. {
  1529. if( MaterialFilterUnmappedArray.getValue(%i) $= %material )
  1530. {
  1531. %secondFilter = "MaterialFilterUnmappedArray";
  1532. %secondFilterName = "Unmapped";
  1533. break;
  1534. }
  1535. }
  1536. if( isObject( %material ) )
  1537. {
  1538. MessageBoxYesNoCancel("Delete Material?",
  1539. "Are you sure you want to delete<br><br>" @ %material.getName() @ "<br><br> Material deletion won't take affect until the engine is quit.",
  1540. "MaterialSelector.deleteMaterial( " @ %material @ ", " @ %secondFilter @ ", " @ %secondFilterName @" );",
  1541. "",
  1542. "" );
  1543. }
  1544. }
  1545. function MaterialSelector::deleteMaterial( %this, %materialName, %secondFilter, %secondFilterName )
  1546. {
  1547. if( !isObject( %materialName ) )
  1548. return;
  1549. for( %i = 0; %i <= MaterialFilterAllArray.countValue( %materialName ); %i++)
  1550. {
  1551. %index = MaterialFilterAllArray.getIndexFromValue( %materialName );
  1552. MaterialFilterAllArray.erase( %index );
  1553. }
  1554. MaterialFilterAllArrayCheckbox.setText("All ( " @ MaterialFilterAllArray.count() - 1 @ " ) ");
  1555. %checkbox = %secondFilter @ "Checkbox";
  1556. for( %k = 0; %k <= %secondFilter.countValue( %materialName ); %k++)
  1557. {
  1558. %index = %secondFilter.getIndexFromValue( %materialName );
  1559. %secondFilter.erase( %index );
  1560. }
  1561. %checkbox.setText( %secondFilterName @ " ( " @ %secondFilter.count() - 1 @ " ) ");
  1562. for( %i = 0; %materialName.getFieldValue("materialTag" @ %i) !$= ""; %i++ )
  1563. {
  1564. %materialTag = %materialName.getFieldValue("materialTag" @ %i);
  1565. for( %j = MaterialSelector.staticFilterObjects; %j < MaterialSelector-->filterArray.getCount() ; %j++ )
  1566. {
  1567. if( %materialTag $= MaterialSelector-->filterArray.getObject(%j).getObject(0).filter )
  1568. {
  1569. %count = getWord( MaterialSelector-->filterArray.getObject(%j).getObject(0).getText(), 2 );
  1570. %count--;
  1571. MaterialSelector-->filterArray.getObject(%j).getObject(0).setText( %materialTag @ " ( "@ %count @ " )");
  1572. }
  1573. }
  1574. }
  1575. UnlistedMaterials.add( "unlistedMaterials", %materialName );
  1576. if( %materialName.getFilename() !$= "" &&
  1577. %materialName.getFilename() !$= "tools/gui/MaterialSelector.ed.gui" &&
  1578. %materialName.getFilename() !$= "tools/materialEditor/scripts/materialEditor.ed.cs" )
  1579. {
  1580. MaterialSelectorPerMan.removeObjectFromFile(%materialName);
  1581. MaterialSelectorPerMan.saveDirty();
  1582. }
  1583. MaterialSelector.preloadFilter();
  1584. //MaterialSelector.selectMaterial( "WarningMaterial" );
  1585. }
  1586. function MaterialSelector::switchStaticFilters( %this, %staticFilter)
  1587. {
  1588. switch$(%staticFilter)
  1589. {
  1590. case "MaterialFilterAllArray":
  1591. MaterialFilterAllArrayCheckbox.setStateOn(1);
  1592. MaterialFilterMappedArrayCheckbox.setStateOn(0);
  1593. MaterialFilterUnmappedArrayCheckbox.setStateOn(0);
  1594. case "MaterialFilterMappedArray":
  1595. MaterialFilterMappedArrayCheckbox.setStateOn(1);
  1596. MaterialFilterAllArrayCheckbox.setStateOn(0);
  1597. MaterialFilterUnmappedArrayCheckbox.setStateOn(0);
  1598. case "MaterialFilterUnmappedArray":
  1599. MaterialFilterUnmappedArrayCheckbox.setStateOn(1);
  1600. MaterialFilterAllArrayCheckbox.setStateOn(0);
  1601. MaterialFilterMappedArrayCheckbox.setStateOn(0);
  1602. }
  1603. // kinda goofy were passing a class variable... we can't do an empty check right now
  1604. // on load filter because we actually pass "" as a filter...
  1605. MaterialSelector.loadFilter( MaterialSelector.currentFilter, %staticFilter );
  1606. }
  1607. // Tagging Functionality
  1608. function MaterialSelector::getTagField( %this, %material, %tag )
  1609. {
  1610. for( %i = 0; %material.getFieldValue("materialTag" @ %i) !$= ""; %i++ )
  1611. {
  1612. %loopTag = %material.getFieldValue("materialTag" @ %i);
  1613. if( %tag $= %loopTag )
  1614. {
  1615. %tagField = "materialTag" @ %i;
  1616. break;
  1617. }
  1618. }
  1619. return %tagField;
  1620. }
  1621. function MaterialSelector::getLastTagField( %this, %material )
  1622. {
  1623. for( %i = 0; %material.getFieldValue("materialTag" @ %i) !$= ""; %i++ )
  1624. {
  1625. %tagField = "materialTag" @ %i;
  1626. }
  1627. return %tagField;
  1628. }
  1629. function MaterialSelector::getLastValidTagField( %this, %material, %invalidTag )
  1630. {
  1631. for( %i = 0; %material.getFieldValue("materialTag" @ %i) !$= ""; %i++ )
  1632. {
  1633. %tag = %material.getFieldValue("materialTag" @ %i);
  1634. // Can't equal our invalid tag
  1635. if( %tag $= %invalidTag )
  1636. continue;
  1637. // Set our last found tag
  1638. %tagField = "materialTag" @ %i;
  1639. }
  1640. return %tagField;
  1641. }
  1642. // Preview Page Navigation
  1643. function MaterialSelector::firstPage(%this)
  1644. {
  1645. MaterialSelector.currentPreviewPage = 0;
  1646. MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter );
  1647. }
  1648. function MaterialSelector::previousPage(%this)
  1649. {
  1650. MaterialSelector.currentPreviewPage--;
  1651. if( MaterialSelector.currentPreviewPage < 0)
  1652. MaterialSelector.currentPreviewPage = 0;
  1653. MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter );
  1654. }
  1655. function MaterialSelector::nextPage(%this)
  1656. {
  1657. MaterialSelector.currentPreviewPage++;
  1658. if( MaterialSelector.currentPreviewPage >= MaterialSelector.totalPages)
  1659. MaterialSelector.currentPreviewPage = MaterialSelector.totalPages - 1;
  1660. if( MaterialSelector.currentPreviewPage < 0)
  1661. MaterialSelector.currentPreviewPage = 0;
  1662. MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter );
  1663. }
  1664. function MaterialSelector::lastPage(%this)
  1665. {
  1666. MaterialSelector.currentPreviewPage = MaterialSelector.totalPages - 1;
  1667. if( MaterialSelector.currentPreviewPage < 0)
  1668. MaterialSelector.currentPreviewPage = 0;
  1669. MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter );
  1670. }
  1671. function MaterialSelector::selectPage(%this, %page)
  1672. {
  1673. MaterialSelector.currentPreviewPage = %page;
  1674. MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter );
  1675. }
  1676. function MaterialSelector::thumbnailCountUpdate(%this)
  1677. {
  1678. $Pref::MaterialSelector::ThumbnailCountIndex = MaterialSelector-->materialPreviewCountPopup.getSelected();
  1679. MaterialSelector.LoadFilter( MaterialSelector.currentFilter, MaterialSelector.currentStaticFilter );
  1680. }
  1681. function MaterialSelector::buildPagesButtons(%this, %currentPage, %totalPages)
  1682. {
  1683. // We don't want any more than 8 pages at a time.
  1684. if( %totalPages > 8 )
  1685. {
  1686. // We attempt to display up to 2 pages before the current page
  1687. %start = %currentPage - 2;
  1688. if( %start <= 0 )
  1689. {
  1690. %start = 0;
  1691. %startbracket = false;
  1692. }
  1693. else
  1694. {
  1695. %startbracket = true;
  1696. }
  1697. if( (%totalPages - %start) < 8 )
  1698. {
  1699. // Move %start closer to the beginning to maintain 8 pages
  1700. %start = %totalPages - 8;
  1701. }
  1702. %end = %start + 8;
  1703. if( %end >= %totalPages )
  1704. {
  1705. %end = %totalPages;
  1706. %endbracket = false;
  1707. }
  1708. else
  1709. {
  1710. %endbracket = true;
  1711. }
  1712. }
  1713. else
  1714. {
  1715. %start = 0;
  1716. %end = %totalPages;
  1717. %startbracket = false;
  1718. %endbracket = false;
  1719. }
  1720. if( %startbracket )
  1721. {
  1722. %control = new GuiTextCtrl(){
  1723. profile = "ToolsGuiTextCenterProfile";
  1724. HorizSizing = "right";
  1725. VertSizing = "bottom";
  1726. position = "0 2";
  1727. extent = "14 16";
  1728. MinExtent = "8 8";
  1729. text = "...";
  1730. };
  1731. MaterialSelector-->materialPreviewPagesStack.add( %control );
  1732. }
  1733. for( %i = %start; %i < %end; %i++ )
  1734. {
  1735. if( %i != %currentPage )
  1736. {
  1737. %control = new GuiButtonCtrl() {
  1738. canSaveDynamicFields = "0";
  1739. Enabled = "1";
  1740. isContainer = "0";
  1741. Profile = "ToolsGuiTextCenterProfile";
  1742. HorizSizing = "right";
  1743. VertSizing = "bottom";
  1744. Position = "0 0";
  1745. Extent = "14 16";
  1746. MinExtent = "8 8";
  1747. canSave = "1";
  1748. isDecoy = "0";
  1749. Visible = "1";
  1750. Command = "MaterialSelector.schedule(0, selectPage, " @ %i @ ");";
  1751. tooltipprofile = "ToolsGuiToolTipProfile";
  1752. hovertime = "1000";
  1753. text = %i+1;
  1754. groupNum = "-1";
  1755. buttonType = "PushButton";
  1756. useMouseEvents = "1";
  1757. };
  1758. }
  1759. else
  1760. {
  1761. %control = new GuiTextCtrl(){
  1762. profile = "ToolsGuiTextBoldCenterProfile";
  1763. HorizSizing = "right";
  1764. VertSizing = "bottom";
  1765. position = "0 2";
  1766. extent = "14 16";
  1767. MinExtent = "8 8";
  1768. text = %i+1;
  1769. };
  1770. }
  1771. MaterialSelector-->materialPreviewPagesStack.add( %control );
  1772. }
  1773. if( %endbracket )
  1774. {
  1775. %control = new GuiTextCtrl(){
  1776. profile = "ToolsGuiTextCenterProfile";
  1777. HorizSizing = "right";
  1778. VertSizing = "bottom";
  1779. position = "0 2";
  1780. extent = "14 16";
  1781. MinExtent = "8 8";
  1782. text = "...";
  1783. };
  1784. MaterialSelector-->materialPreviewPagesStack.add( %control );
  1785. }
  1786. }