BuilderDialog.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * BuilderDialog.js
  3. *
  4. * @author realor
  5. */
  6. import { Dialog } from './Dialog.js'
  7. import { Controls } from './Controls.js'
  8. import { Solid } from '../core/Solid.js'
  9. import { Profile } from '../core/Profile.js'
  10. import { Cord } from '../core/Cord.js'
  11. import { ObjectBuilder } from '../builders/ObjectBuilder.js'
  12. import { SolidBuilder } from '../builders/SolidBuilder.js'
  13. import { ProfileBuilder } from '../builders/ProfileBuilder.js'
  14. import { CordBuilder } from '../builders/CordBuilder.js'
  15. import { I18N } from '../i18n/I18N.js'
  16. class BuilderDialog extends Dialog {
  17. constructor(application, object) {
  18. super('title.object_builder')
  19. this.application = application
  20. this.object = object
  21. this.setI18N(this.application.i18n)
  22. this.setSize(300, 400)
  23. const listElem = document.createElement('ul')
  24. this.listElem = listElem
  25. listElem.className = 'controller_list'
  26. this.bodyElem.appendChild(listElem)
  27. const classes = this.findBuilderClasses(this.object)
  28. let currentClassName = this.object.builder ? this.object.builder.constructor.name : ''
  29. let inputElem = this.addItem('None', listElem)
  30. inputElem.checked = true
  31. for (let builderClass of classes) {
  32. let inputElem = this.addItem(builderClass.name, listElem)
  33. if (currentClassName === builderClass.name) {
  34. inputElem.checked = true
  35. }
  36. }
  37. this.addButton('accept', 'button.accept', () => {
  38. this.onAccept()
  39. })
  40. this.addButton('cancel', 'button.cancel', () => {
  41. this.onCancel()
  42. })
  43. }
  44. addItem(className, listElem) {
  45. let id = Controls.getNextId()
  46. let itemElem = document.createElement('li')
  47. listElem.appendChild(itemElem)
  48. let labelElem = document.createElement('label')
  49. labelElem.htmlFor = id
  50. itemElem.appendChild(labelElem)
  51. let inputElem = document.createElement('input')
  52. inputElem.type = 'radio'
  53. inputElem.name = 'builderClass'
  54. inputElem.value = className
  55. inputElem.id = id
  56. labelElem.appendChild(inputElem)
  57. let nameSpanElem = document.createElement('span')
  58. nameSpanElem.className = 'type'
  59. nameSpanElem.innerHTML = className
  60. labelElem.appendChild(nameSpanElem)
  61. return inputElem
  62. }
  63. onAccept() {
  64. let className = this.listElem.querySelector('input[name="builderClass"]:checked').value
  65. let builderClass = ObjectBuilder.classes[className]
  66. if (builderClass) {
  67. let builder = new builderClass()
  68. this.object.builder = builder
  69. let name = builderClass.name
  70. if (name.endsWith('Builder')) {
  71. name = name.substring(0, name.length - 7)
  72. }
  73. this.object.name = name
  74. } else {
  75. this.object.builder = null
  76. }
  77. this.application.notifyObjectsChanged(this.object)
  78. this.hide()
  79. }
  80. onCancel() {
  81. this.hide()
  82. }
  83. findBuilderClasses(object) {
  84. const classes = []
  85. for (let className in ObjectBuilder.classes) {
  86. let cls = ObjectBuilder.classes[className]
  87. if (object instanceof Cord) {
  88. if (cls.prototype instanceof CordBuilder) {
  89. classes.push(cls)
  90. }
  91. } else if (object instanceof Profile) {
  92. if (cls.prototype instanceof ProfileBuilder) {
  93. classes.push(cls)
  94. }
  95. } else if (object instanceof Solid) {
  96. if (cls.prototype instanceof SolidBuilder) {
  97. classes.push(cls)
  98. }
  99. } else if (!(cls.prototype instanceof CordBuilder) && !(cls.prototype instanceof ProfileBuilder) && !(cls.prototype instanceof SolidBuilder)) {
  100. classes.push(cls)
  101. }
  102. }
  103. classes.sort((class1, class2) => {
  104. let name1 = class1.name
  105. let name2 = class2.name
  106. if (name1 < name2) return -1
  107. else if (name1 > name2) return 1
  108. else return 0
  109. })
  110. return classes
  111. }
  112. }
  113. export { BuilderDialog }