Merge pull request #1691 from ethereum/swapit_mainView
Move tab logic outside of editor panelpull/1/head
commit
838135a75c
@ -1,182 +0,0 @@ |
|||||||
const yo = require('yo-yo') |
|
||||||
const csjs = require('csjs-inject') |
|
||||||
const remixLib = require('remix-lib') |
|
||||||
|
|
||||||
var globalRegistry = require('../../global/registry') |
|
||||||
|
|
||||||
const styleguide = require('../ui/styles-guide/theme-chooser') |
|
||||||
const styles = styleguide.chooser() |
|
||||||
// const PluginManager = require('../plugin/pluginManager')
|
|
||||||
// const TabbedMenu = require('../tabs/tabbed-menu')
|
|
||||||
// const CompileTab = require('../tabs/compile-tab')
|
|
||||||
// const SettingsTab = require('../tabs/settings-tab')
|
|
||||||
// const AnalysisTab = require('../tabs/analysis-tab')
|
|
||||||
// const DebuggerTab = require('../tabs/debugger-tab')
|
|
||||||
// const SupportTab = require('../tabs/support-tab')
|
|
||||||
// const PluginTab = require('../tabs/plugin-tab')
|
|
||||||
// const TestTab = require('../tabs/test-tab')
|
|
||||||
// const RunTab = require('../tabs/run-tab')
|
|
||||||
// const DraggableContent = require('../ui/draggableContent')
|
|
||||||
|
|
||||||
const EventManager = remixLib.EventManager |
|
||||||
|
|
||||||
// var async = require('async')
|
|
||||||
|
|
||||||
// var tooltip = require('../ui/tooltip')
|
|
||||||
|
|
||||||
// var styleGuide = require('../ui/styles-guide/theme-chooser')
|
|
||||||
|
|
||||||
// var css = require('./styles/file-panel-styles')
|
|
||||||
|
|
||||||
// var canUpload = window.File || window.FileReader || window.FileList || window.Blob
|
|
||||||
// var ghostbar = yo`<div class=${css.ghostbar}></div>`
|
|
||||||
|
|
||||||
/* |
|
||||||
Overview of APIs: |
|
||||||
* fileManager: @args fileProviders (browser, shared-folder, swarm, github, etc ...) & config & editor |
|
||||||
- listen on browser & localhost file provider (`fileRenamed` & `fileRemoved`) |
|
||||||
- update the tabs, switchFile |
|
||||||
- trigger `currentFileChanged` |
|
||||||
- set the current file in the config |
|
||||||
* fileProvider: currently browser, swarm, localhost, github, gist |
|
||||||
- link to backend |
|
||||||
- provide properties `type`, `readonly` |
|
||||||
- provide API `resolveDirectory`, `remove`, `exists`, `rename`, `get`, `set` |
|
||||||
- trigger `fileExternallyChanged`, `fileRemoved`, `fileRenamed`, `fileRenamedError`, `fileAdded` |
|
||||||
* file-explorer: treeview @args fileProvider |
|
||||||
- listen on events triggered by fileProvider |
|
||||||
- call fileProvider API |
|
||||||
*/ |
|
||||||
|
|
||||||
module.exports = class LeftIconPanel { |
|
||||||
constructor (localRegistry) { |
|
||||||
const self = this |
|
||||||
self._components = {} |
|
||||||
self._components.registry = localRegistry || globalRegistry |
|
||||||
|
|
||||||
self._components.registry.put({api: this, name: 'lefticonpanel'}) |
|
||||||
self.event = new EventManager() |
|
||||||
self._view = { |
|
||||||
element: null, |
|
||||||
tabbedMenu: null, |
|
||||||
tabbedMenuViewport: null, |
|
||||||
dragbar: null |
|
||||||
} |
|
||||||
|
|
||||||
self.plugins = [ |
|
||||||
{type: 'fileManager', displayName: 'File Manger', icon: 'fa fa-files-o fa-2x'}, |
|
||||||
{type: 'pluginManager', displayName: 'Plugin Manger', icon: 'fa fa-puzzle-piece fa-2x'}, |
|
||||||
{type: 'settings', displayName: 'setting', icon: 'fa fa-cog fa-2x'} |
|
||||||
] |
|
||||||
} |
|
||||||
|
|
||||||
swapPlugin (name) { |
|
||||||
console.log(name) |
|
||||||
} |
|
||||||
|
|
||||||
render () { |
|
||||||
const self = this |
|
||||||
// if (self._view.element) return self._view.element
|
|
||||||
// return self._view.element
|
|
||||||
return yo` |
|
||||||
<div class=${css.container}> |
|
||||||
<ul> |
|
||||||
${self.plugins.map(function (pi) { |
|
||||||
return yo`<li>
|
|
||||||
<i onclick=${() => { self.swapPlugin(pi.type) }} style="size: 24px;" class="${pi.icon} ${css.plugin}"></i> |
|
||||||
</li>` |
|
||||||
}) |
|
||||||
} |
|
||||||
</ul> |
|
||||||
</div> |
|
||||||
` |
|
||||||
} |
|
||||||
|
|
||||||
init () { |
|
||||||
// @TODO: init is for resizable drag bar only and should be refactored in the future
|
|
||||||
const self = this |
|
||||||
const limit = 60 |
|
||||||
self._view.dragbar.addEventListener('mousedown', mousedown) |
|
||||||
const ghostbar = yo`<div class=${css.ghostbar}></div>` |
|
||||||
function mousedown (event) { |
|
||||||
event.preventDefault() |
|
||||||
if (event.which === 1) { |
|
||||||
moveGhostbar(event) |
|
||||||
document.body.appendChild(ghostbar) |
|
||||||
document.addEventListener('mousemove', moveGhostbar) |
|
||||||
document.addEventListener('mouseup', removeGhostbar) |
|
||||||
document.addEventListener('keydown', cancelGhostbar) |
|
||||||
} |
|
||||||
} |
|
||||||
function cancelGhostbar (event) { |
|
||||||
if (event.keyCode === 27) { |
|
||||||
document.body.removeChild(ghostbar) |
|
||||||
document.removeEventListener('mousemove', moveGhostbar) |
|
||||||
document.removeEventListener('mouseup', removeGhostbar) |
|
||||||
document.removeEventListener('keydown', cancelGhostbar) |
|
||||||
} |
|
||||||
} |
|
||||||
function getPosition (event) { |
|
||||||
const lhp = window['filepanel'].offsetWidth |
|
||||||
const max = document.body.offsetWidth - limit |
|
||||||
var newpos = (event.pageX > max) ? max : event.pageX |
|
||||||
newpos = (newpos > (lhp + limit)) ? newpos : lhp + limit |
|
||||||
return newpos |
|
||||||
} |
|
||||||
function moveGhostbar (event) { // @NOTE VERTICAL ghostbar
|
|
||||||
ghostbar.style.left = getPosition(event) + 'px' |
|
||||||
} |
|
||||||
function removeGhostbar (event) { |
|
||||||
document.body.removeChild(ghostbar) |
|
||||||
document.removeEventListener('mousemove', moveGhostbar) |
|
||||||
document.removeEventListener('mouseup', removeGhostbar) |
|
||||||
document.removeEventListener('keydown', cancelGhostbar) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
const css = csjs` |
|
||||||
.lefticonpanel { |
|
||||||
display : flex; |
|
||||||
flex-direction : column; |
|
||||||
top : 0; |
|
||||||
right : 0; |
|
||||||
bottom : 0; |
|
||||||
box-sizing : border-box; |
|
||||||
overflow : hidden; |
|
||||||
height : 100%; |
|
||||||
} |
|
||||||
.header { |
|
||||||
height : 100%; |
|
||||||
} |
|
||||||
.dragbar { |
|
||||||
position : absolute; |
|
||||||
width : ${styles.rightPanel.dragbarWidth}; |
|
||||||
top : 3em; |
|
||||||
bottom : 0; |
|
||||||
cursor : col-resize; |
|
||||||
background-color : ${styles.rightPanel.dragbarBackgroundColor}; |
|
||||||
z-index : 999; |
|
||||||
border-left : 2px solid ${styles.rightPanel.bar_Dragging}; |
|
||||||
} |
|
||||||
.ghostbar { |
|
||||||
width : 3px; |
|
||||||
background-color : ${styles.rightPanel.bar_Ghost}; |
|
||||||
opacity : 0.5; |
|
||||||
position : absolute; |
|
||||||
cursor : col-resize; |
|
||||||
z-index : 9999; |
|
||||||
top : 0; |
|
||||||
bottom : 0; |
|
||||||
} |
|
||||||
i.plugin { |
|
||||||
cursor : pointer; |
|
||||||
} |
|
||||||
.container ul { |
|
||||||
margin-top : 10px; |
|
||||||
} |
|
||||||
.container ul li { |
|
||||||
text-align : center; |
|
||||||
margin-top : 10px; |
|
||||||
} |
|
||||||
` |
|
@ -0,0 +1,176 @@ |
|||||||
|
var yo = require('yo-yo') |
||||||
|
var $ = require('jquery') |
||||||
|
|
||||||
|
var styles = require('./styles/editor-panel-styles') |
||||||
|
var css = styles.css |
||||||
|
|
||||||
|
export class TabProxy { |
||||||
|
constructor (fileManager, editor) { |
||||||
|
this.fileManager = fileManager |
||||||
|
this.editor = editor |
||||||
|
this.activeEntity |
||||||
|
this.entities = {} |
||||||
|
this.data = {} |
||||||
|
this._view = {} |
||||||
|
|
||||||
|
fileManager.event.register('fileRemoved', (name) => { |
||||||
|
const filesEl = document.querySelector('#files') |
||||||
|
var file = filesEl.querySelector(`li[path="${name}"]`) |
||||||
|
if (file) { |
||||||
|
filesEl.removeChild(file) |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
fileManager.event.register('fileClosed', (name) => { |
||||||
|
const filesEl = document.querySelector('#files') |
||||||
|
var file = filesEl.querySelector(`li[path="${name}"]`) |
||||||
|
if (file) { |
||||||
|
filesEl.removeChild(file) |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
fileManager.event.register('currentFileChanged', (file) => { |
||||||
|
const filesEl = document.querySelector('#files') |
||||||
|
if (!filesEl.querySelector(`li[path="${file}"]`)) { |
||||||
|
filesEl.appendChild(yo`<li class="file" path="${file}" ><span class="name">${file}</span><span class="remove"><i class="fa fa-close"></i></span></li>`) |
||||||
|
} |
||||||
|
this.active(file) |
||||||
|
}) |
||||||
|
|
||||||
|
fileManager.event.register('fileRenamed', (oldName, newName) => { |
||||||
|
const filesEl = document.querySelector('#files') |
||||||
|
var file = filesEl.querySelector(`li[path="${oldName}"]`) |
||||||
|
if (file) { |
||||||
|
filesEl.setAttribute('path', file) |
||||||
|
file.querySelector(`.name`).innerHTML = newName |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
active (name) { |
||||||
|
var filesEl = document.querySelector('#files') |
||||||
|
let file = filesEl.querySelector(`li[path="${this.activeEntity}"]`) |
||||||
|
if (file) $(file).removeClass('active') |
||||||
|
if (name) { |
||||||
|
let active = filesEl.querySelector(`li[path="${name}"]`) |
||||||
|
if (active) { |
||||||
|
$(active).addClass('active') |
||||||
|
this.activeEntity = name |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
addHandler (type, fn) { |
||||||
|
this.handlers[type] = fn |
||||||
|
} |
||||||
|
|
||||||
|
renderTabsbar () { |
||||||
|
this._view.filetabs = yo`<ul id="files" class="${css.files} nav nav-tabs"></ul>` |
||||||
|
|
||||||
|
this._view.tabs = yo` |
||||||
|
<div class=${css.tabs} onmouseenter=${toggleScrollers} onmouseleave=${toggleScrollers}> |
||||||
|
<div onclick=${scrollLeft} class="${css.scroller} ${css.hide} ${css.scrollerleft}"> |
||||||
|
<i class="fa fa-chevron-left "></i> |
||||||
|
</div> |
||||||
|
${this._view.filetabs} |
||||||
|
<div onclick=${scrollRight} class="${css.scroller} ${css.hide} ${css.scrollerright}"> |
||||||
|
<i class="fa fa-chevron-right "></i> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
` |
||||||
|
let tabsbar = yo` |
||||||
|
<div class=${css.tabsbar}> |
||||||
|
<div class=${css.buttons}> |
||||||
|
<span class=${css.changeeditorfontsize} > |
||||||
|
<i class="increditorsize fa fa-plus" onclick=${increase} aria-hidden="true" title="increase editor font size"></i> |
||||||
|
<i class="decreditorsize fa fa-minus" onclick=${decrease} aria-hidden="true" title="decrease editor font size"></i> |
||||||
|
</span> |
||||||
|
</div> |
||||||
|
${this._view.tabs} |
||||||
|
</div> |
||||||
|
` |
||||||
|
|
||||||
|
// tabs
|
||||||
|
var $filesEl = $(this._view.filetabs) |
||||||
|
|
||||||
|
// Switch tab
|
||||||
|
var self = this |
||||||
|
$filesEl.on('click', '.file:not(.active)', function (ev) { |
||||||
|
ev.preventDefault() |
||||||
|
self.fileManager.switchFile($(this).find('.name').text()) |
||||||
|
return false |
||||||
|
}) |
||||||
|
|
||||||
|
// Remove current tab
|
||||||
|
$filesEl.on('click', '.file .remove', function (ev) { |
||||||
|
ev.preventDefault() |
||||||
|
var name = $(this).parent().find('.name').text() |
||||||
|
self.fileManager.closeFile(name) |
||||||
|
return false |
||||||
|
}) |
||||||
|
|
||||||
|
function toggleScrollers (event = {}) { |
||||||
|
if (event.type) self.data._focus = event.type |
||||||
|
var isMouseEnter = self.data._focus === 'mouseenter' |
||||||
|
var leftArrow = this.children[0] |
||||||
|
var rightArrow = this.children[2] |
||||||
|
if (isMouseEnter && this.children[1].offsetWidth > this.offsetWidth) { |
||||||
|
var hiddenLength = self._view.filetabs.offsetWidth - self._view.tabs.offsetWidth |
||||||
|
var currentLeft = self._view.filetabs.offsetLeft || 0 |
||||||
|
var hiddenRight = hiddenLength + currentLeft |
||||||
|
if (currentLeft < 0) { |
||||||
|
leftArrow.classList.add(css.show) |
||||||
|
leftArrow.classList.remove(css.hide) |
||||||
|
} |
||||||
|
if (hiddenRight > 0) { |
||||||
|
rightArrow.classList.add(css.show) |
||||||
|
rightArrow.classList.remove(css.hide) |
||||||
|
} |
||||||
|
} else { |
||||||
|
leftArrow.classList.remove(css.show) |
||||||
|
leftArrow.classList.add(css.hide) |
||||||
|
rightArrow.classList.remove(css.show) |
||||||
|
rightArrow.classList.add(css.hide) |
||||||
|
} |
||||||
|
} |
||||||
|
function increase () { self.editor.editorFontSize(1) } |
||||||
|
function decrease () { self.editor.editorFontSize(-1) } |
||||||
|
function scrollLeft (event) { |
||||||
|
var leftArrow = this |
||||||
|
var rightArrow = this.nextElementSibling.nextElementSibling |
||||||
|
var currentLeft = self._view.filetabs.offsetLeft || 0 |
||||||
|
if (currentLeft < 0) { |
||||||
|
rightArrow.classList.add(css.show) |
||||||
|
rightArrow.classList.remove(css.hide) |
||||||
|
if (currentLeft < -self.data._FILE_SCROLL_DELTA) { |
||||||
|
self._view.filetabs.style.left = `${currentLeft + self.data._FILE_SCROLL_DELTA}px` |
||||||
|
} else { |
||||||
|
self._view.filetabs.style.left = `${currentLeft - currentLeft}px` |
||||||
|
leftArrow.classList.remove(css.show) |
||||||
|
leftArrow.classList.add(css.hide) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function scrollRight (event) { |
||||||
|
var rightArrow = this |
||||||
|
var leftArrow = this.previousElementSibling.previousElementSibling |
||||||
|
var hiddenLength = self._view.filetabs.offsetWidth - self._view.tabs.offsetWidth |
||||||
|
var currentLeft = self._view.filetabs.offsetLeft || 0 |
||||||
|
var hiddenRight = hiddenLength + currentLeft |
||||||
|
if (hiddenRight > 0) { |
||||||
|
leftArrow.classList.add(css.show) |
||||||
|
leftArrow.classList.remove(css.hide) |
||||||
|
if (hiddenRight > self.data._FILE_SCROLL_DELTA) { |
||||||
|
self._view.filetabs.style.left = `${currentLeft - self.data._FILE_SCROLL_DELTA}px` |
||||||
|
} else { |
||||||
|
self._view.filetabs.style.left = `${currentLeft - hiddenRight}px` |
||||||
|
rightArrow.classList.remove(css.show) |
||||||
|
rightArrow.classList.add(css.hide) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return tabsbar |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue