diff options
| author | Alex Yatskov <alex@foosoft.net> | 2019-10-10 19:50:30 -0700 | 
|---|---|---|
| committer | Alex Yatskov <alex@foosoft.net> | 2019-10-10 19:50:30 -0700 | 
| commit | 06d7713189be9eb51669d3842b78278371e6cfa4 (patch) | |
| tree | e98640dc323c486fb1190280502acbf2fe9d8187 /ext/bg/js/audio-ui.js | |
| parent | 499239ce94e0480783af93f813c2b4096b495808 (diff) | |
| parent | 55b2c1d8f51c658b0457ae8329fb1b0e52f5f799 (diff) | |
Merge branch 'master' into testing
Diffstat (limited to 'ext/bg/js/audio-ui.js')
| -rw-r--r-- | ext/bg/js/audio-ui.js | 131 | 
1 files changed, 131 insertions, 0 deletions
| diff --git a/ext/bg/js/audio-ui.js b/ext/bg/js/audio-ui.js new file mode 100644 index 00000000..381129ac --- /dev/null +++ b/ext/bg/js/audio-ui.js @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2019  Alex Yatskov <alex@foosoft.net> + * Author: Alex Yatskov <alex@foosoft.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + + +class AudioSourceUI { +    static instantiateTemplate(templateSelector) { +        const template = document.querySelector(templateSelector); +        const content = document.importNode(template.content, true); +        return $(content.firstChild); +    } +} + +AudioSourceUI.Container = class Container { +    constructor(audioSources, container, addButton) { +        this.audioSources = audioSources; +        this.container = container; +        this.addButton = addButton; +        this.children = []; + +        this.container.empty(); + +        for (const audioSource of toIterable(audioSources)) { +            this.children.push(new AudioSourceUI.AudioSource(this, audioSource, this.children.length)); +        } + +        this.addButton.on('click', () => this.onAddAudioSource()); +    } + +    cleanup() { +        for (const child of this.children) { +            child.cleanup(); +        } + +        this.addButton.off('click'); +        this.container.empty(); +    } + +    save() { +        // Override +    } + +    remove(child) { +        const index = this.children.indexOf(child); +        if (index < 0) { +            return; +        } + +        child.cleanup(); +        this.children.splice(index, 1); +        this.audioSources.splice(index, 1); + +        for (let i = index; i < this.children.length; ++i) { +            this.children[i].index = i; +        } +    } + +    onAddAudioSource() { +        const audioSource = this.getUnusedAudioSource(); +        this.audioSources.push(audioSource); +        this.save(); +        this.children.push(new AudioSourceUI.AudioSource(this, audioSource, this.children.length)); +    } + +    getUnusedAudioSource() { +        const audioSourcesAvailable = [ +            'jpod101', +            'jpod101-alternate', +            'jisho', +            'custom' +        ]; +        for (const source of audioSourcesAvailable) { +            if (this.audioSources.indexOf(source) < 0) { +                return source; +            } +        } +        return audioSourcesAvailable[0]; +    } +}; + +AudioSourceUI.AudioSource = class AudioSource { +    constructor(parent, audioSource, index) { +        this.parent = parent; +        this.audioSource = audioSource; +        this.index = index; + +        this.container = AudioSourceUI.instantiateTemplate('#audio-source-template').appendTo(parent.container); +        this.select = this.container.find('.audio-source-select'); +        this.removeButton = this.container.find('.audio-source-remove'); + +        this.select.val(audioSource); + +        this.select.on('change', () => this.onSelectChanged()); +        this.removeButton.on('click', () => this.onRemoveClicked()); +    } + +    cleanup() { +        this.select.off('change'); +        this.removeButton.off('click'); +        this.container.remove(); +    } + +    save() { +        this.parent.save(); +    } + +    onSelectChanged() { +        this.audioSource = this.select.val(); +        this.parent.audioSources[this.index] = this.audioSource; +        this.save(); +    } + +    onRemoveClicked() { +        this.parent.remove(this); +        this.save(); +    } +}; |