sprite-frame.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. 'use strict';
  2. const { updateElementReadonly, updateElementInvalid } = require('../utils/assets');
  3. exports.template = /* html */`
  4. <div class="asset-sprite-frame">
  5. <div class="content">
  6. <ui-prop>
  7. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.packable" tooltip="i18n:ENGINE.assets.spriteFrame.packableTip"></ui-label>
  8. <ui-checkbox slot="content" class="packable-checkbox"></ui-checkbox>
  9. </ui-prop>
  10. <ui-prop>
  11. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.rotated" tooltip="i18n:ENGINE.assets.spriteFrame.rotatedTip"></ui-label>
  12. <ui-checkbox slot="content" disabled class="rotated-checkbox"></ui-checkbox>
  13. </ui-prop>
  14. <ui-prop>
  15. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.offsetX" tooltip="i18n:ENGINE.assets.spriteFrame.offsetXTip"></ui-label>
  16. <ui-num-input slot="content" disabled class="offsetX-input" step="1"></ui-num-input>
  17. </ui-prop>
  18. <ui-prop>
  19. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.offsetY" tooltip="i18n:ENGINE.assets.spriteFrame.offsetYTip"></ui-label>
  20. <ui-num-input slot="content" disabled class="offsetY-input"></ui-num-input>
  21. </ui-prop>
  22. <ui-prop>
  23. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.trimType" tooltip="i18n:ENGINE.assets.spriteFrame.trimTypeTip"></ui-label>
  24. <ui-select slot="content" class="trimType-select"></ui-select>
  25. </ui-prop>
  26. <ui-prop>
  27. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.trimThreshold" tooltip="i18n:ENGINE.assets.spriteFrame.trimThresholdTip"></ui-label>
  28. <ui-num-input slot="content" class="trimThreshold-input" step="1"></ui-num-input>
  29. </ui-prop>
  30. <ui-prop>
  31. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.trimX" tooltip="i18n:ENGINE.assets.spriteFrame.trimXTip"></ui-label>
  32. <ui-num-input slot="content" class="trimX-input" step="1"></ui-num-input>
  33. </ui-prop>
  34. <ui-prop>
  35. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.trimY" tooltip="i18n:ENGINE.assets.spriteFrame.trimYTip"></ui-label>
  36. <ui-num-input slot="content" class="trimY-input"></ui-num-input>
  37. </ui-prop>
  38. <ui-prop>
  39. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.width" tooltip="i18n:ENGINE.assets.spriteFrame.widthTip"></ui-label>
  40. <ui-num-input slot="content" class="width-input" step="1"></ui-num-input>
  41. </ui-prop>
  42. <ui-prop>
  43. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.height" tooltip="i18n:ENGINE.assets.spriteFrame.heightTip"></ui-label>
  44. <ui-num-input slot="content" class="height-input"step="1"></ui-num-input>
  45. </ui-prop>
  46. <ui-section expand>
  47. <ui-label slot="header" value="Mesh Options"></ui-label>
  48. <div class="mesh">
  49. <ui-prop>
  50. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.meshType" tooltip="i18n:ENGINE.assets.spriteFrame.meshTypeTip"></ui-label>
  51. <ui-select slot="content" class="meshType-select"></ui-select>
  52. </ui-prop>
  53. <ui-prop>
  54. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.pixelsToUnit" tooltip="i18n:ENGINE.assets.spriteFrame.pixelsToUnitTip"></ui-label>
  55. <ui-num-input slot="content" class="pixelsToUnit-input" min="0" step="1"></ui-num-input>
  56. </ui-prop>
  57. <ui-prop>
  58. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.pivotX" tooltip="i18n:ENGINE.assets.spriteFrame.pivotXTip"></ui-label>
  59. <ui-num-input slot="content" class="pivotX-input"></ui-num-input>
  60. </ui-prop>
  61. <ui-prop>
  62. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.pivotY" tooltip="i18n:ENGINE.assets.spriteFrame.pivotYTip"></ui-label>
  63. <ui-num-input slot="content" class="pivotY-input"></ui-num-input>
  64. </ui-prop>
  65. </div>
  66. </ui-section>
  67. <ui-prop>
  68. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.borderTop" tooltip="i18n:ENGINE.assets.spriteFrame.borderTopTip"></ui-label>
  69. <ui-num-input slot="content" class="borderTop-input" min="0" step="1"></ui-num-input>
  70. </ui-prop>
  71. <ui-prop>
  72. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.borderBottom" tooltip="i18n:ENGINE.assets.spriteFrame.borderBottomTip"></ui-label>
  73. <ui-num-input slot="content" class="borderBottom-input" min="0"step="1"></ui-num-input>
  74. </ui-prop>
  75. <ui-prop>
  76. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.borderLeft" tooltip="i18n:ENGINE.assets.spriteFrame.borderLeftTip"></ui-label>
  77. <ui-num-input slot="content" class="borderLeft-input" min="0" step="1"></ui-num-input>
  78. </ui-prop>
  79. <ui-prop>
  80. <ui-label slot="label" value="i18n:ENGINE.assets.spriteFrame.borderRight" tooltip="i18n:ENGINE.assets.spriteFrame.borderRightTip"></ui-label>
  81. <ui-num-input slot="content" class="borderRight-input" min="0" step="1"></ui-num-input>
  82. </ui-prop>
  83. <div class="edit-row">
  84. <ui-button tabindex="0" class="edit-button" size="medium">
  85. <ui-label value="i18n:ENGINE.assets.spriteFrame.edit"></ui-label>
  86. </ui-button>
  87. </div>
  88. </div>
  89. </div>
  90. `;
  91. exports.style = /* css */`
  92. .asset-sprite-frame {
  93. display: flex;
  94. flex: 1;
  95. flex-direction: column;
  96. padding-right: 4px;
  97. }
  98. .asset-sprite-frame > .content {
  99. flex: 1;
  100. }
  101. .asset-sprite-frame > .content > .edit-row {
  102. text-align: center;
  103. margin-top: 16px;
  104. margin-bottom: 16px;
  105. }
  106. .asset-sprite-frame > .content > .edit-row > .edit-button {
  107. padding: 0 24px;
  108. }
  109. `;
  110. exports.$ = {
  111. container: '.asset-sprite-frame',
  112. packableCheckbox: '.packable-checkbox',
  113. rotatedCheckbox: '.rotated-checkbox',
  114. offsetXInput: '.offsetX-input',
  115. offsetYInput: '.offsetY-input',
  116. trimTypeSelect: '.trimType-select',
  117. trimThresholdInput: '.trimThreshold-input',
  118. trimXInput: '.trimX-input',
  119. trimYInput: '.trimY-input',
  120. widthInput: '.width-input',
  121. heightInput: '.height-input',
  122. borderTopInput: '.borderTop-input',
  123. borderBottomInput: '.borderBottom-input',
  124. borderLeftInput: '.borderLeft-input',
  125. borderRightInput: '.borderRight-input',
  126. editButton: '.edit-button',
  127. pixelsToUnitInput: '.pixelsToUnit-input',
  128. pivotXInput: '.pivotX-input',
  129. pivotYInput: '.pivotY-input',
  130. meshTypeSelect: '.meshType-select',
  131. };
  132. const Elements = {
  133. packable: {
  134. ready() {
  135. const panel = this;
  136. panel.$.packableCheckbox.addEventListener('change', (event) => {
  137. panel.metaList.forEach((meta) => {
  138. meta.userData.packable = event.target.value;
  139. });
  140. panel.dispatch('change');
  141. });
  142. panel.$.packableCheckbox.addEventListener('confirm', () => {
  143. panel.dispatch('snapshot');
  144. });
  145. },
  146. update() {
  147. const panel = this;
  148. panel.$.packableCheckbox.value = panel.meta.userData.packable;
  149. updateElementInvalid.call(panel, panel.$.packableCheckbox, 'packable');
  150. updateElementReadonly.call(panel, panel.$.packableCheckbox);
  151. },
  152. },
  153. rotated: {
  154. ready() {
  155. const panel = this;
  156. panel.$.rotatedCheckbox.addEventListener('change', (event) => {
  157. panel.metaList.forEach((meta) => {
  158. meta.userData.rotated = event.target.value;
  159. });
  160. panel.dispatch('change');
  161. });
  162. panel.$.rotatedCheckbox.addEventListener('confirm', () => {
  163. panel.dispatch('snapshot');
  164. });
  165. },
  166. update() {
  167. const panel = this;
  168. panel.$.rotatedCheckbox.value = panel.meta.userData.rotated;
  169. updateElementInvalid.call(panel, panel.$.rotatedCheckbox, 'rotated');
  170. updateElementReadonly.call(panel, panel.$.rotatedCheckbox);
  171. },
  172. },
  173. offsetX: {
  174. ready() {
  175. const panel = this;
  176. panel.$.offsetXInput.addEventListener('change', (event) => {
  177. panel.metaList.forEach((meta) => {
  178. meta.userData.offsetX = event.target.value;
  179. });
  180. panel.dispatch('change');
  181. });
  182. panel.$.offsetXInput.addEventListener('confirm', () => {
  183. panel.dispatch('snapshot');
  184. });
  185. },
  186. update() {
  187. const panel = this;
  188. panel.$.offsetXInput.value = panel.meta.userData.offsetX;
  189. updateElementInvalid.call(panel, panel.$.offsetXInput, 'offsetX');
  190. updateElementReadonly.call(panel, panel.$.offsetXInput);
  191. },
  192. },
  193. offsetY: {
  194. ready() {
  195. const panel = this;
  196. panel.$.offsetYInput.addEventListener('change', (event) => {
  197. panel.metaList.forEach((meta) => {
  198. meta.userData.offsetY = event.target.value;
  199. });
  200. panel.dispatch('change');
  201. });
  202. panel.$.offsetYInput.addEventListener('confirm', () => {
  203. panel.dispatch('snapshot');
  204. });
  205. },
  206. update() {
  207. const panel = this;
  208. panel.$.offsetYInput.value = panel.meta.userData.offsetY;
  209. updateElementInvalid.call(panel, panel.$.offsetYInput, 'offsetY');
  210. updateElementReadonly.call(panel, panel.$.offsetYInput);
  211. },
  212. },
  213. trimType: {
  214. ready() {
  215. const panel = this;
  216. panel.$.trimTypeSelect.addEventListener('change', (event) => {
  217. panel.metaList.forEach((meta) => {
  218. meta.userData.trimType = event.target.value;
  219. });
  220. panel.dispatch('change');
  221. // Other items have a large number of updates that depend on it, so the whole update is used once
  222. for (const prop in Elements) {
  223. const element = Elements[prop];
  224. if (element.update) {
  225. element.update.call(this);
  226. }
  227. }
  228. });
  229. panel.$.trimTypeSelect.addEventListener('confirm', () => {
  230. panel.dispatch('snapshot');
  231. });
  232. },
  233. update() {
  234. const panel = this;
  235. let optionsHtml = '';
  236. const types = ['auto', 'custom', 'none'];
  237. types.forEach((type) => {
  238. optionsHtml += `<option value="${type}">${type}</option>`;
  239. });
  240. panel.$.trimTypeSelect.innerHTML = optionsHtml;
  241. panel.$.trimTypeSelect.value = panel.meta.userData.trimType;
  242. updateElementInvalid.call(panel, panel.$.trimTypeSelect, 'trimType');
  243. updateElementReadonly.call(panel, panel.$.trimTypeSelect);
  244. },
  245. },
  246. trimThreshold: {
  247. ready() {
  248. const panel = this;
  249. panel.$.trimThresholdInput.addEventListener('change', (event) => {
  250. panel.metaList.forEach((meta) => {
  251. meta.userData.trimThreshold = event.target.value;
  252. });
  253. panel.dispatch('change');
  254. });
  255. panel.$.trimThresholdInput.addEventListener('confirm', () => {
  256. panel.dispatch('snapshot');
  257. });
  258. },
  259. update() {
  260. const panel = this;
  261. panel.$.trimThresholdInput.value = panel.meta.userData.trimThreshold;
  262. updateElementInvalid.call(panel, panel.$.trimThresholdInput, 'trimThreshold');
  263. updateElementReadonly.call(panel, panel.$.trimThresholdInput);
  264. },
  265. },
  266. trimX: {
  267. ready() {
  268. const panel = this;
  269. panel.$.trimXInput.addEventListener('change', (event) => {
  270. panel.metaList.forEach((meta) => {
  271. meta.userData.trimX = event.target.value;
  272. });
  273. panel.dispatch('change');
  274. });
  275. panel.$.trimXInput.addEventListener('confirm', () => {
  276. panel.dispatch('snapshot');
  277. });
  278. },
  279. update() {
  280. const panel = this;
  281. panel.$.trimXInput.value = panel.meta.userData.trimX;
  282. updateElementInvalid.call(panel, panel.$.trimXInput, 'trimX');
  283. panel.updateReadonlyCustom(panel.$.trimXInput);
  284. },
  285. },
  286. trimY: {
  287. ready() {
  288. const panel = this;
  289. panel.$.trimYInput.addEventListener('change', (event) => {
  290. panel.metaList.forEach((meta) => {
  291. meta.userData.trimY = event.target.value;
  292. });
  293. panel.dispatch('change');
  294. });
  295. panel.$.trimYInput.addEventListener('confirm', () => {
  296. panel.dispatch('snapshot');
  297. });
  298. },
  299. update() {
  300. const panel = this;
  301. panel.$.trimYInput.value = panel.meta.userData.trimY;
  302. updateElementInvalid.call(panel, panel.$.trimYInput, 'trimY');
  303. panel.updateReadonlyCustom(panel.$.trimYInput);
  304. },
  305. },
  306. width: {
  307. ready() {
  308. const panel = this;
  309. panel.$.widthInput.addEventListener('change', (event) => {
  310. panel.metaList.forEach((meta) => {
  311. meta.userData.width = event.target.value;
  312. });
  313. panel.dispatch('change');
  314. });
  315. panel.$.widthInput.addEventListener('confirm', () => {
  316. panel.dispatch('snapshot');
  317. });
  318. },
  319. update() {
  320. const panel = this;
  321. panel.$.widthInput.value = panel.meta.userData.width;
  322. updateElementInvalid.call(panel, panel.$.widthInput, 'width');
  323. panel.updateReadonlyCustom(panel.$.widthInput);
  324. },
  325. },
  326. height: {
  327. ready() {
  328. const panel = this;
  329. panel.$.heightInput.addEventListener('change', (event) => {
  330. panel.metaList.forEach((meta) => {
  331. meta.userData.height = event.target.value;
  332. });
  333. panel.dispatch('change');
  334. });
  335. panel.$.heightInput.addEventListener('confirm', () => {
  336. panel.dispatch('snapshot');
  337. });
  338. },
  339. update() {
  340. const panel = this;
  341. panel.$.heightInput.value = panel.meta.userData.height;
  342. updateElementInvalid.call(panel, panel.$.heightInput, 'height');
  343. panel.updateReadonlyCustom(panel.$.heightInput);
  344. },
  345. },
  346. borderTop: {
  347. ready() {
  348. const panel = this;
  349. panel.$.borderTopInput.addEventListener('change', (event) => {
  350. panel.metaList.forEach((meta) => {
  351. meta.userData.borderTop = event.target.value;
  352. });
  353. panel.dispatch('change');
  354. Editor.Message.send('inspector', 'sprite-keys', panel.meta);
  355. });
  356. panel.$.borderTopInput.addEventListener('confirm', () => {
  357. panel.dispatch('snapshot');
  358. });
  359. },
  360. update() {
  361. const panel = this;
  362. panel.$.borderTopInput.value = panel.meta.userData.borderTop;
  363. updateElementInvalid.call(panel, panel.$.borderTopInput, 'borderTop');
  364. updateElementReadonly.call(panel, panel.$.borderTopInput);
  365. panel.$.borderTopInput.setAttribute('max', this.meta.userData.height - this.meta.userData.borderBottom);
  366. },
  367. },
  368. borderBottom: {
  369. ready() {
  370. const panel = this;
  371. panel.$.borderBottomInput.addEventListener('change', (event) => {
  372. panel.metaList.forEach((meta) => {
  373. meta.userData.borderBottom = event.target.value;
  374. });
  375. panel.dispatch('change');
  376. Editor.Message.send('inspector', 'sprite-keys', panel.meta);
  377. });
  378. panel.$.borderBottomInput.addEventListener('confirm', () => {
  379. panel.dispatch('snapshot');
  380. });
  381. },
  382. update() {
  383. const panel = this;
  384. panel.$.borderBottomInput.value = panel.meta.userData.borderBottom;
  385. updateElementInvalid.call(panel, panel.$.borderBottomInput, 'borderBottom');
  386. updateElementReadonly.call(panel, panel.$.borderBottomInput);
  387. panel.$.borderBottomInput.setAttribute('max', this.meta.userData.height - this.meta.userData.borderTop);
  388. },
  389. },
  390. borderLeft: {
  391. ready() {
  392. const panel = this;
  393. panel.$.borderLeftInput.addEventListener('change', (event) => {
  394. panel.metaList.forEach((meta) => {
  395. meta.userData.borderLeft = event.target.value;
  396. });
  397. panel.dispatch('change');
  398. Editor.Message.send('inspector', 'sprite-keys', panel.meta);
  399. });
  400. panel.$.borderLeftInput.addEventListener('confirm', () => {
  401. panel.dispatch('snapshot');
  402. });
  403. },
  404. update() {
  405. const panel = this;
  406. panel.$.borderLeftInput.value = panel.meta.userData.borderLeft;
  407. updateElementInvalid.call(panel, panel.$.borderLeftInput, 'borderLeft');
  408. updateElementReadonly.call(panel, panel.$.borderLeftInput);
  409. panel.$.borderLeftInput.setAttribute('max', this.meta.userData.width - this.meta.userData.borderRight);
  410. },
  411. },
  412. borderRight: {
  413. ready() {
  414. const panel = this;
  415. panel.$.borderRightInput.addEventListener('change', (event) => {
  416. panel.metaList.forEach((meta) => {
  417. meta.userData.borderRight = event.target.value;
  418. });
  419. panel.dispatch('change');
  420. Editor.Message.send('inspector', 'sprite-keys', panel.meta);
  421. });
  422. panel.$.borderRightInput.addEventListener('confirm', () => {
  423. panel.dispatch('snapshot');
  424. });
  425. },
  426. update() {
  427. const panel = this;
  428. panel.$.borderRightInput.value = panel.meta.userData.borderRight;
  429. updateElementInvalid.call(panel, panel.$.borderRightInput, 'borderRight');
  430. updateElementReadonly.call(panel, panel.$.borderRightInput);
  431. panel.$.borderRightInput.setAttribute('max', this.meta.userData.width - this.meta.userData.borderLeft);
  432. },
  433. },
  434. editButton: {
  435. ready() {
  436. const panel = this;
  437. panel.$.editButton.addEventListener('change', (event) => {
  438. event.stopPropagation();
  439. Editor.Panel.open('inspector.sprite-editor', {
  440. asset: panel.asset,
  441. meta: panel.meta,
  442. });
  443. });
  444. this.updateFromBroadcastBind = this.updateFromBroadcast.bind(panel);
  445. Editor.Message.addBroadcastListener('sprite-editor:changed', panel.updateFromBroadcastBind);
  446. },
  447. update() {
  448. const panel = this;
  449. updateElementReadonly.call(panel, panel.$.editButton);
  450. if (panel.assetList.length > 1) {
  451. panel.$.editButton.style.display = 'none';
  452. } else {
  453. panel.$.editButton.style.display = ''; // depends on component itself
  454. }
  455. if (panel.uuidInSpriteEditor !== panel.meta.uuid) {
  456. panel.uuidInSpriteEditor = panel.meta.uuid;
  457. Editor.Message.send('inspector', 'sprite-keys', panel.meta);
  458. }
  459. },
  460. close() {
  461. const panel = this;
  462. Editor.Message.removeBroadcastListener('sprite-editor:changed', panel.updateFromBroadcastBind);
  463. },
  464. },
  465. pixelsToUnit: {
  466. ready() {
  467. const panel = this;
  468. panel.$.pixelsToUnitInput.addEventListener('change', (event) => {
  469. panel.metaList.forEach((meta) => {
  470. meta.userData.pixelsToUnit = event.target.value;
  471. });
  472. panel.dispatch('change');
  473. Editor.Message.send('inspector', 'sprite-keys', panel.meta);
  474. });
  475. panel.$.pixelsToUnitInput.addEventListener('confirm', () => {
  476. panel.dispatch('snapshot');
  477. });
  478. },
  479. update() {
  480. const panel = this;
  481. panel.$.pixelsToUnitInput.value = panel.meta.userData.pixelsToUnit;
  482. updateElementInvalid.call(panel, panel.$.pixelsToUnitInput, 'pixelsToUnit');
  483. updateElementReadonly.call(panel, panel.$.pixelsToUnitInput);
  484. },
  485. },
  486. pivotX: {
  487. ready() {
  488. const panel = this;
  489. panel.$.pivotXInput.addEventListener('change', (event) => {
  490. panel.metaList.forEach((meta) => {
  491. meta.userData.pivotX = event.target.value;
  492. });
  493. panel.dispatch('change');
  494. });
  495. panel.$.pivotXInput.addEventListener('confirm', () => {
  496. panel.dispatch('snapshot');
  497. });
  498. },
  499. update() {
  500. const panel = this;
  501. panel.$.pivotXInput.value = panel.meta.userData.pivotX;
  502. updateElementInvalid.call(panel, panel.$.pivotXInput, 'pivotX');
  503. updateElementReadonly.call(panel, panel.$.pivotXInput);
  504. },
  505. },
  506. pivotY: {
  507. ready() {
  508. const panel = this;
  509. panel.$.pivotYInput.addEventListener('change', (event) => {
  510. panel.metaList.forEach((meta) => {
  511. meta.userData.pivotY = event.target.value;
  512. });
  513. panel.dispatch('change');
  514. });
  515. panel.$.pivotYInput.addEventListener('confirm', () => {
  516. panel.dispatch('snapshot');
  517. });
  518. },
  519. update() {
  520. const panel = this;
  521. panel.$.pivotYInput.value = panel.meta.userData.pivotY;
  522. updateElementInvalid.call(panel, panel.$.pivotYInput, 'pivotY');
  523. updateElementReadonly.call(panel, panel.$.pivotYInput);
  524. },
  525. },
  526. meshType: {
  527. ready() {
  528. const panel = this;
  529. panel.$.meshTypeSelect.addEventListener('change', (event) => {
  530. panel.metaList.forEach((meta) => {
  531. meta.userData.meshType = Number(event.target.value);
  532. });
  533. panel.dispatch('change');
  534. });
  535. panel.$.meshTypeSelect.addEventListener('confirm', () => {
  536. panel.dispatch('snapshot');
  537. });
  538. },
  539. update() {
  540. const panel = this;
  541. let optionsHtml = '';
  542. // const types = ['rect', 'polygon']; // polygon is not ready
  543. const types = ['rect'];
  544. types.forEach((name, index) => {
  545. optionsHtml += `<option value="${index}">${name}</option>`;
  546. });
  547. panel.$.meshTypeSelect.innerHTML = optionsHtml;
  548. panel.$.meshTypeSelect.value = panel.meta.userData.meshType;
  549. updateElementInvalid.call(panel, panel.$.meshTypeSelect, 'meshType');
  550. updateElementReadonly.call(panel, panel.$.meshTypeSelect);
  551. },
  552. },
  553. };
  554. exports.methods = {
  555. /**
  556. * Update the business-related read-only state
  557. */
  558. updateReadonlyCustom(element) {
  559. const isCustom = this.meta.userData.trimType === 'custom';
  560. updateElementReadonly.call(this, element, !isCustom || this.asset.readonly);
  561. },
  562. /**
  563. * Data updates from the Kyushu edit panel
  564. */
  565. updateFromBroadcast(data) {
  566. const panel = this;
  567. if (data.uuid === panel.meta.uuid) {
  568. for (const prop in data.userData) {
  569. panel.metaList.forEach((meta) => {
  570. meta.userData[prop] = data.userData[prop];
  571. });
  572. }
  573. panel.dispatch('change');
  574. panel.dispatch('snapshot');
  575. }
  576. for (const prop in Elements) {
  577. const element = Elements[prop];
  578. if (element.update) {
  579. element.update.bind(panel)();
  580. }
  581. }
  582. },
  583. };
  584. exports.ready = function() {
  585. for (const prop in Elements) {
  586. const element = Elements[prop];
  587. if (element.ready) {
  588. element.ready.call(this);
  589. }
  590. }
  591. };
  592. exports.update = function(assetList, metaList) {
  593. this.assetList = assetList;
  594. this.metaList = metaList;
  595. this.asset = assetList[0];
  596. this.meta = metaList[0];
  597. for (const prop in Elements) {
  598. const element = Elements[prop];
  599. if (element.update) {
  600. element.update.call(this);
  601. }
  602. }
  603. };
  604. exports.close = function() {
  605. for (const prop in Elements) {
  606. const element = Elements[prop];
  607. if (element.close) {
  608. element.close.call(this);
  609. }
  610. }
  611. };