|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import {
- AViewerPlugin,
- AViewerPluginSync,
- Class,
- createDiv,
- createStyles,
- FullScreenPlugin,
- safeSetProperty,
- ThreeViewer,
- } from 'threepipe'
- import {setupFullscreenButton, setupUtilButtonsBar} from './util-buttons'
- import {setupWebGiLogo} from './logo'
- import styles from './TweakpaneEditorPlugin.css'
- import tippy from 'tippy.js'
- import tippyStyles from 'tippy.js/dist/tippy.css'
- import {TweakpaneUiPlugin} from '@threepipe/plugin-tweakpane'
-
- export class TweakpaneEditorPlugin extends AViewerPluginSync<string> {
- public static readonly PluginType: string = 'TweakpaneEditorPlugin'
- enabled = true
-
- dependencies = [TweakpaneUiPlugin, FullScreenPlugin]
-
- constructor() {
- super()
- }
- onAdded(viewer: ThreeViewer) {
- super.onAdded(viewer)
- createStyles(styles)
- createStyles(tippyStyles)
-
- tippy.setDefaultProps({
- theme: 'editor',
- duration: 300,
- arrow: true,
- appendTo: () => viewer.container, // for fullscreen
- })
-
- setupWebGiLogo(viewer)
- setupFullscreenButton(viewer)
- }
-
- private _selectedMode = 0
- modeKeys: string[] = []
- modePlugins: Class<AViewerPlugin>[][] = []
- modeDivs: (HTMLDivElement | undefined)[] = []
- // picking?: PickingPlugin
- uiPlugin?: TweakpaneUiPlugin
-
- loadPlugins(plugins: Record<string, Class<AViewerPlugin<any>>[]> = {}) {
- if (!this._viewer) throw new Error('Plugin not added to viewer.')
- setupUtilButtonsBar(this._viewer, Object.values(plugins).flat())
-
- // this.picking = viewer.getPlugin(PickingPlugin)
- this.uiPlugin = this._viewer.getPlugin(TweakpaneUiPlugin)!
-
- // Modes UI
- const buttonsContainer = createDiv({
- classList: ['mode-buttons-container', 'button-bar'],
- addToBody: true,
- })
-
- this.modeKeys = Object.keys(plugins)
- this.modePlugins = this.modeKeys.map(key => plugins[key])
- this.modeDivs = this.modeKeys.map((key, i) => {
- const d = createDiv({
- innerHTML: key, classList: ['mode-button', 'button-bar-button'],
- })
- d.onclick = () => this.setSelectedMode(i)
- buttonsContainer.appendChild(d)
- return d
- })
-
- // picking?.addEventListener('selectedObjectChanged', () => {
- // if (picking?.getSelectedObject() && !['Picking', 'Modifiers', 'Configurators'].includes(this.modeKeys[_selectedMode])) {
- // setSelectedMode(modePlugins.findIndex(o=>o.includes(PickingPlugin)))
- // }
- // })
-
- this.setSelectedMode(0)
-
- }
-
- setSelectedMode(mode: number) {
- this._selectedMode = mode
-
- // if (picking) picking.enabled = true
-
- for (let i = 0; i < this.modePlugins.length; i++) {
- const plugins = this.modePlugins[i].map(p => this._viewer?.getPlugin(p))
- const visible = i === mode
- for (const plugin of plugins) {
- if (!plugin?.uiConfig) continue
- if (!plugin.uiConfig.uiRef) this.uiPlugin?.setupPluginUi(plugin)
- safeSetProperty(plugin.uiConfig, 'hidden', !visible, true)
- }
- }
-
- for (let i = 0; i < this.modeKeys.length; i++) {
- this.modeDivs[i]?.classList[this._selectedMode !== i ? 'remove' : 'add']('mode-button-selected', 'button-bar-selected')
- }
- // this._viewer.setDirty()
- this.uiPlugin?.refreshPluginsEnabled()
-
- // todo: expand the ui if collapsed
- }
- }
|