OptionsTool.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /*
  2. * OptionsTool.js
  3. *
  4. * @author realor
  5. */
  6. import { Tool } from './Tool.js'
  7. import { Application } from '../ui/Application.js'
  8. import { Controls } from '../ui/Controls.js'
  9. import { I18N } from '../i18n/I18N.js'
  10. class OptionsTool extends Tool {
  11. constructor(application, options) {
  12. super(application)
  13. this.name = 'options'
  14. this.label = 'tool.options.label'
  15. this.help = 'tool.options.help'
  16. this.className = 'options'
  17. this.setOptions(options)
  18. this.createPanel()
  19. }
  20. createPanel() {
  21. const application = this.application
  22. this.panel = application.createPanel(this.label, 'left', 'panel_options')
  23. // Language
  24. // const i18n = this.application.i18n
  25. // this.languageSelect = Controls.addSelectField(this.panel.bodyElem, 'language', 'label.language')
  26. // this.languageSelect.parentElement.className = 'option_block inline'
  27. // this.languageSelect.addEventListener('change', () => {
  28. // let userLanguage = this.languageSelect.value
  29. // i18n.userLanguages = userLanguage
  30. // i18n.updateTree(this.application.element)
  31. // window.localStorage.setItem('bimrocket.language', userLanguage)
  32. // })
  33. // Units
  34. this.unitsSelect = Controls.addSelectField(this.panel.bodyElem, 'units', 'label.units', Application.UNITS)
  35. this.unitsSelect.parentElement.className = 'option_block inline'
  36. this.unitsSelect.addEventListener('change', () => (application.units = this.unitsSelect.value))
  37. // Decimals
  38. this.decimalsElem = Controls.addNumberField(this.panel.bodyElem, 'decimals', 'label.decimals')
  39. this.decimalsElem.parentElement.className = 'option_block inline'
  40. this.decimalsElem.min = 0
  41. this.decimalsElem.max = 15
  42. this.decimalsElem.addEventListener('change', () => (application.decimals = parseInt(this.decimalsElem.value)))
  43. // Frame rate divisor
  44. const frdElem = document.createElement('div')
  45. frdElem.className = 'option_block'
  46. this.panel.bodyElem.appendChild(frdElem)
  47. const frdValueDiv = document.createElement('div')
  48. frdElem.appendChild(frdValueDiv)
  49. const frdLabel = document.createElement('label')
  50. I18N.set(frdLabel, 'innerHTML', 'label.fr_divisor')
  51. frdLabel.htmlFor = 'frd_range'
  52. frdValueDiv.appendChild(frdLabel)
  53. this.frdValue = document.createElement('span')
  54. this.frdValue.innerHTML = ''
  55. this.frdValue.id = 'frd_value'
  56. this.frdValue.innerHTML = application.frameRateDivisor
  57. this.frdValue.style.marginLeft = '4px'
  58. frdValueDiv.appendChild(this.frdValue)
  59. this.frdRange = document.createElement('input')
  60. this.frdRange.id = 'frd_range'
  61. this.frdRange.type = 'range'
  62. this.frdRange.min = 1
  63. this.frdRange.max = 10
  64. this.frdRange.step = 1
  65. this.frdRange.style.display = 'inline-block'
  66. this.frdRange.style.width = '80%'
  67. this.frdRange.style.marginLeft = 'auto'
  68. this.frdRange.style.marginRight = 'auto'
  69. frdElem.appendChild(this.frdRange)
  70. this.frdRange.addEventListener('input', () => (this.frdValue.innerHTML = this.frdRange.value), false)
  71. this.frdRange.addEventListener('change', () => (application.frameRateDivisor = parseInt(this.frdRange.value)), false)
  72. // Selection Paint mode
  73. this.selPaintModeSelect = Controls.addSelectField(
  74. this.panel.bodyElem,
  75. 'selpaint_mode',
  76. 'label.sel_paint_mode',
  77. [
  78. [Application.EDGES_SELECTION, 'option.edges'],
  79. [Application.FACES_SELECTION, 'option.faces']
  80. ],
  81. null,
  82. 'option_block inline'
  83. )
  84. this.selPaintModeSelect.addEventListener('change', event => {
  85. application.selectionPaintMode = this.selPaintModeSelect.value
  86. application.updateSelection()
  87. })
  88. // Enable/disable deep selection visualization
  89. this.deepSelCheckBox = Controls.addCheckBoxField(this.panel.bodyElem, 'deep_sel', 'label.show_deep_sel', false, 'option_block')
  90. this.deepSelCheckBox.addEventListener('change', event => (application.showDeepSelection = this.deepSelCheckBox.checked))
  91. // Enable/disable local axes visualization
  92. this.localAxesCheckBox = Controls.addCheckBoxField(this.panel.bodyElem, 'local_axes', 'label.show_local_axes', false, 'option_block')
  93. this.localAxesCheckBox.addEventListener('change', event => (application.showLocalAxes = this.localAxesCheckBox.checked))
  94. // Enable/disable shadows
  95. this.shadowsCheckBox = Controls.addCheckBoxField(this.panel.bodyElem, 'shadows', 'label.cast_shadows', false, 'option_block')
  96. this.shadowsCheckBox.addEventListener('change', event => (application.shadowsEnabled = this.shadowsCheckBox.checked))
  97. // Background color
  98. this.backSelect = Controls.addSelectField(
  99. this.panel.bodyElem,
  100. 'backcolor_sel',
  101. 'label.background_color',
  102. [
  103. ['solid', 'option.solid'],
  104. ['gradient', 'option.gradient']
  105. ],
  106. null,
  107. 'option_block stack'
  108. )
  109. const backColorElem = this.backSelect.parentElement
  110. this.backSelect.addEventListener(
  111. 'change',
  112. event => {
  113. if (this.backSelect.value === 'solid') {
  114. this.backColorInput2.style.display = 'none'
  115. application.backgroundColor = this.backColorInput1.value
  116. } else {
  117. this.backColorInput2.style.display = ''
  118. application.backgroundColor1 = this.backColorInput1.value
  119. application.backgroundColor2 = this.backColorInput2.value
  120. }
  121. },
  122. false
  123. )
  124. this.backColorInput1 = document.createElement('input')
  125. this.backColorInput1.id = 'back_color1'
  126. this.backColorInput1.type = 'color'
  127. this.backColorInput1.className = 'back_color'
  128. backColorElem.appendChild(this.backColorInput1)
  129. this.backColorInput2 = document.createElement('input')
  130. this.backColorInput2.id = 'back_color2'
  131. this.backColorInput2.type = 'color'
  132. this.backColorInput2.className = 'back_color'
  133. backColorElem.appendChild(this.backColorInput2)
  134. this.backColorInput1.addEventListener(
  135. 'input',
  136. event => {
  137. if (this.backSelect.value === 'solid') {
  138. application.backgroundColor = this.backColorInput1.value
  139. } else {
  140. application.backgroundColor1 = this.backColorInput1.value
  141. }
  142. },
  143. false
  144. )
  145. this.backColorInput2.addEventListener('input', event => (application.backgroundColor2 = this.backColorInput2.value), false)
  146. this.panelOpacityRange = Controls.addInputField(this.panel.bodyElem, 'range', 'panelopac_range', 'label.panel_opacity', null, 'option_block stack')
  147. this.panelOpacityRange.min = 1
  148. this.panelOpacityRange.max = 100
  149. this.panelOpacityRange.step = 1
  150. this.panelOpacityRange.style.display = 'inline-block'
  151. this.panelOpacityRange.style.width = '80%'
  152. this.panelOpacityRange.style.marginLeft = 'auto'
  153. this.panelOpacityRange.style.marginRight = 'auto'
  154. this.panelOpacityRange.addEventListener('input', () => (application.panelOpacity = 0.01 * parseInt(this.panelOpacityRange.value)), false)
  155. }
  156. activate() {
  157. this.panel.visible = true
  158. const application = this.application
  159. this.backColorInput1.value = application.backgroundColor1
  160. this.backColorInput2.value = application.backgroundColor2
  161. if (application.backgroundColor1 === application.backgroundColor2) {
  162. this.backSelect.value = 'solid'
  163. this.backColorInput2.style.display = 'none'
  164. } else {
  165. this.backSelect.value = 'gradient'
  166. this.backColorInput2.style.display = ''
  167. }
  168. // const i18n = application.i18n
  169. // let supportedLanguages = Array.from(i18n.supportedLanguages)
  170. // let userLanguage = i18n.requestedLanguages[0]
  171. // let intl = new Intl.DisplayNames([userLanguage], { type: 'language' })
  172. // supportedLanguages = supportedLanguages.map(lang => [lang, intl.of(lang)])
  173. // Controls.setSelectOptions(this.languageSelect, supportedLanguages)
  174. // this.languageSelect.value = userLanguage
  175. this.unitsSelect.value = application.units
  176. this.decimalsElem.value = application.decimals
  177. this.frdValue.innerHTML = application.frameRateDivisor
  178. this.frdRange.value = application.frameRateDivisor
  179. this.selPaintModeSelect.value = application.selectionPaintMode
  180. this.deepSelCheckBox.checked = application.showDeepSelection
  181. this.localAxesCheckBox.checked = application.showLocalAxes
  182. this.shadowsCheckBox.checked = application.shadowsEnabled
  183. this.panelOpacityRange.value = 100 * application.panelOpacity
  184. }
  185. deactivate() {
  186. this.panel.visible = false
  187. }
  188. }
  189. export { OptionsTool }