diff --git a/src/app.js b/src/app.js index c8c1931f98..16f0836553 100644 --- a/src/app.js +++ b/src/app.js @@ -63,19 +63,12 @@ window.addEventListener('message', function (ev) { } }, false) -/* - trigger tabChanged -*/ var run = function () { var self = this this.event = new EventManager() var fileStorage = new Storage('sol:') var files = new Files(fileStorage) var config = new Config(fileStorage) - var uiStorage = new Storage('sol-ui:') - var ui = new Files(uiStorage) - - ui.set('currentFile', '') // return all the files, except the temporary/readonly ones function packageFiles () { @@ -184,56 +177,57 @@ var run = function () { var editor = new Editor(document.getElementById('input')) // ---------------- FilePanel -------------------- + // TODO: All FilePanel related CSS should move into file-panel.js + // app.js provides file-panel.js with a css selector or a DOM element + // and file-panel.js adds its elements (including css), see "Editor" above var css = csjs` .filepanel { display : flex; width : 200px; } ` - var filepanel = document.querySelector('#filepanel') - filepanel.className = css.filepanel + var filepanelContainer = document.querySelector('#filepanel') + filepanelContainer.className = css.filepanel var FilePanelAPI = { createName: createNonClashingName, switchToFile: switchToFile, event: this.event } - var el = new FilePanel(FilePanelAPI, files) - filepanel.appendChild(el) - var api = el.api + var filePanel = new FilePanel(FilePanelAPI, files) + // TODO this should happen inside file-panel.js + filepanelContainer.appendChild(filePanel) - api.register('ui', function changeLayout (data) { + filePanel.events.register('ui-hidden', function changeLayout (isHidden) { var value - if (data.type === 'minimize') { + if (isHidden) { value = -parseInt(window['filepanel'].style.width) value = (isNaN(value) ? -window['filepanel'].getBoundingClientRect().width : value) window['filepanel'].style.position = 'absolute' window['filepanel'].style.left = (value - 5) + 'px' window['filepanel'].style.width = -value + 'px' window['tabs-bar'].style.left = '45px' - } else if (data.type === 'maximize') { + } else { value = -parseInt(window['filepanel'].style.left) + 'px' window['filepanel'].style.position = 'static' window['filepanel'].style.width = value window['filepanel'].style.left = '' window['tabs-bar'].style.left = value - } else { - window['filepanel'].style.width = data.width + 'px' - window['tabs-bar'].style.left = data.width + 'px' } }) - api.register('focus', function (path) { - [...window.files.querySelectorAll('.file .name')].forEach(function (span) { - if (span.innerText === path) switchToFile(path) - }) + filePanel.events.register('ui-resize', function changeLayout (width) { + window['filepanel'].style.width = width + 'px' + window['tabs-bar'].style.left = width + 'px' }) files.event.register('fileRenamed', function (oldName, newName) { + // TODO please never use 'window' when it is possible to use a variable + // that references the DOM node [...window.files.querySelectorAll('.file .name')].forEach(function (span) { if (span.innerText === oldName) span.innerText = newName }) }) files.event.register('fileRemoved', function (path) { - if (path === ui.get('currentFile')) { - ui.set('currentFile', '') + if (path === config.get('currentFile')) { + config.set('currentFile', '') switchToNextFile() } editor.discard(path) @@ -338,7 +332,7 @@ var run = function () { if (!files.rename(originalName, newName)) { alert('Error while renaming file') } else { - ui.set('currentFile', '') + config.set('currentFile', '') switchToFile(newName) editor.discard(originalName) } @@ -368,7 +362,7 @@ var run = function () { function switchToFile (file) { editorSyncFile() - ui.set('currentFile', file) + config.set('currentFile', file) if (files.isReadOnly(file)) { editor.openReadOnly(file, files.get(file)) @@ -399,10 +393,10 @@ var run = function () { $filesEl.append($('
  • ' + name + '
  • ')) } - var currentFileOpen = !!ui.get('currentFile') + var currentFileOpen = !!config.get('currentFile') if (currentFileOpen) { - var active = $('#files .file').filter(function () { return $(this).find('.name').text() === ui.get('currentFile') }) + var active = $('#files .file').filter(function () { return $(this).find('.name').text() === config.get('currentFile') }) active.addClass('active') } $('#input').toggle(currentFileOpen) @@ -640,7 +634,7 @@ var run = function () { this.fullLineMarker = null if (lineColumnPos) { var source = compiler.lastCompilationResult.data.sourceList[location.file] // auto switch to that tab - if (ui.get('currentFile') !== source) { + if (config.get('currentFile') !== source) { switchToFile(source) } this.statementMarker = editor.addMarker(lineColumnPos, 'highlightcode') @@ -764,12 +758,12 @@ var run = function () { var rendererAPI = { error: (file, error) => { - if (file === ui.get('currentFile')) { + if (file === config.get('currentFile')) { editor.addAnnotation(error) } }, errorClick: (errFile, errLine, errCol) => { - if (errFile !== ui.get('currentFile') && files.exists(errFile)) { + if (errFile !== config.get('currentFile') && files.exists(errFile)) { switchToFile(errFile) } editor.gotoLine(errLine, errCol) @@ -821,7 +815,7 @@ var run = function () { if (transactionDebugger.isActive) return editorSyncFile() - var currentFile = ui.get('currentFile') + var currentFile = config.get('currentFile') if (currentFile) { var target = currentFile var sources = {} @@ -831,7 +825,7 @@ var run = function () { } function editorSyncFile () { - var currentFile = ui.get('currentFile') + var currentFile = config.get('currentFile') if (currentFile) { var input = editor.get(currentFile) files.set(currentFile, input) @@ -843,7 +837,7 @@ var run = function () { var saveTimeout = null function editorOnChange () { - var currentFile = ui.get('currentFile') + var currentFile = config.get('currentFile') if (!currentFile) { return } diff --git a/src/app/file-explorer.js b/src/app/file-explorer.js index 1d0c88a8c5..5d23e7b659 100755 --- a/src/app/file-explorer.js +++ b/src/app/file-explorer.js @@ -37,7 +37,7 @@ module.exports = fileExplorer function fileExplorer (appAPI, files) { var fileEvents = files.event - var tv = new Treeview({ + var treeView = new Treeview({ extractData: function (value, tree, key) { var newValue = {} // var isReadOnly = false @@ -86,10 +86,11 @@ function fileExplorer (appAPI, files) { var focusElement = null var textUnderEdit = null - var element = tv.render(files.listAsTree()) + var element = treeView.render(files.listAsTree()) element.className = css.fileexplorer - var api = new EventManager() + var events = new EventManager() + var api = {} api.addFile = function addFile (file) { var name = file.name if (!files.exists(name) || confirm('The file ' + name + ' already exists! Would you like to overwrite it?')) { @@ -97,7 +98,7 @@ function fileExplorer (appAPI, files) { fileReader.onload = function (event) { var success = files.set(name, event.target.result) if (!success) alert('Failed to create file ' + name) - else api.trigger('focus', [name]) + else events.trigger('focus', [name]) } fileReader.readAsText(file) } @@ -113,7 +114,7 @@ function fileExplorer (appAPI, files) { var label = getLabelFrom(li) var filepath = label.dataset.path var isFile = label.className.indexOf('file') === 0 - if (isFile) api.trigger('focus', [filepath]) + if (isFile) events.trigger('focus', [filepath]) } function hover (event) { @@ -247,12 +248,13 @@ function fileExplorer (appAPI, files) { } function fileAdded (filepath) { - var el = tv.render(files.listAsTree()) + var el = treeView.render(files.listAsTree()) el.className = css.fileexplorer element.parentElement.replaceChild(el, element) element = el } + element.events = events element.api = api return element } diff --git a/src/app/file-panel.js b/src/app/file-panel.js index 1e7f9da311..27ace314ab 100644 --- a/src/app/file-panel.js +++ b/src/app/file-panel.js @@ -106,11 +106,13 @@ function filepanel (appAPI, files) { ` } - var api = new EventManager() + var events = new EventManager() var element = template() - element.api = api - fileExplorer.api.register('focus', function (path) { - api.trigger('focus', [path]) + // TODO please do not add custom javascript objects, which have no + // relation to the DOM to DOM nodes + element.events = events + fileExplorer.events.register('focus', function (path) { + appAPI.switchToFile(path) }) return element @@ -120,10 +122,15 @@ function filepanel (appAPI, files) { this.classList.toggle(css.isVisible) this.children[0].classList.toggle('fa-angle-double-right') this.children[0].classList.toggle('fa-angle-double-left') - api.trigger('ui', [{ type: isHidden ? 'minimize' : 'maximize' }]) + events.trigger('ui-hidden', [isHidden]) } function uploadFile (event) { + // TODO This should not go to the file explorer. + // The file explorer is merely a view on the current state of + // the files module. Please ask the user here if they want to overwrite + // a file and then just use `files.add`. The file explorer will + // pick that up via the 'fileAdded' event from the files module. ;[...this.files].forEach(fileExplorer.api.addFile) } @@ -159,7 +166,8 @@ function filepanel (appAPI, files) { document.removeEventListener('keydown', cancelGhostbar) var width = (event.pageX < limit) ? limit : event.pageX element.style.width = width + 'px' - api.trigger('ui', [{ type: 'resize', width: width }]) + // Please change this to something like 'ui-resize' + events.trigger('ui-resize', [width]) } function createNewFile () {