pull/1/head
yann300 6 years ago
parent f451c80c64
commit 16e389dafd
  1. 59
      src/app/components/vertical-icons-component.js
  2. 3
      src/app/editor/contextualListener.js
  3. 1
      src/app/staticanalysis/staticAnalysisView.js
  4. 9
      src/app/tabs/analysis-tab.js
  5. 4
      src/app/tabs/compile-tab.js

@ -11,33 +11,72 @@ class VerticalIconComponent {
this.events = new EventEmitter() this.events = new EventEmitter()
this.icons = {} this.icons = {}
this.iconKind = {} this.iconKind = {}
this.iconStatus = {}
this.name = name this.name = name
this.store.event.on('activate', (name) => { this.store.event.on('activate', (name) => {
const { profile } = this.store.getOne(name) const api = this.store.getOne(name)
if (!profile.icon) return if (!api.profile.icon) return
if (profile.location === this.name || !profile.location) { if (api.profile.location === this.name || !api.profile.location) {
this.addIcon(profile) this.addIcon(api.profile)
this.listenOnStatus(api)
} }
}) })
this.store.event.on('deactivate', (name) => { this.store.event.on('deactivate', (name) => {
const api = this.store.getOne(name) const api = this.store.getOne(name)
if (api && this.icons[name]) this.removeIcon(api.profile) if (api && this.icons[name]) {
this.removeIcon(api.profile)
this.stopListenOnStatus(api)
}
}) })
this.store.event.on('add', (api) => { }) this.store.event.on('add', (api) => { })
this.store.event.on('remove', (api) => { }) this.store.event.on('remove', (api) => { })
} }
stopListenOnStatus (api) {
if (!api.events) return
let fn = this.iconStatus[api.profile.name]
if (fn) {
api.events.unregister('setStatus', fn)
delete this.iconStatus[api.profile.name]
}
}
listenOnStatus (api) {
if (!api.events) return
const fn = (status) => {
this.setIconStatus(api.profile.name, status)
}
this.iconStatus[api.profile.name] = fn
api.events.on('setStatus', this.iconStatus[api.profile.name])
}
/** /**
* Add an icon to the map * Add an icon to the map
* @param {ModuleProfile} profile The profile of the module * @param {ModuleProfile} profile The profile of the module
*/ */
addIcon ({kind, name, icon}) { addIcon ({kind, name, icon}) {
this.icons[name] = yo`<div class="${css.icon}" onclick="${(e) => { this._iconClick(name) }}" title="${name}" ><img src="${icon}" alt="${name}" /></div>` this.icons[name] = yo`<div class="${css.icon}" onclick="${(e) => { this._iconClick(name) }}" title="${name}" ><img src="${icon}" alt="${name}" /></div>`
this.iconKind[kind || 'other'].appendChild(this.icons[name]) this.iconKind[kind || 'other'].appendChild(this.icons[name])
} }
/**
* Set a new status for the @arg name
* @param {name}
* @param {status}
*/
setIconStatus (name, status) {
const el = this.icons[name]
if (!el) return
let statusEl = el.querySelector('i')
if (statusEl) {
el.removeChild(statusEl)
}
if (status.key) {
el.appendChild(yo`<i title="${status.title}" class="fa fa-${status.key} ${css.status} font-weight-bold text-${status.type}" aria-hidden="true"></i>`)
}
}
/** /**
* Remove an icon from the map * Remove an icon from the map
* @param {ModuleProfile} profile The profile of the module * @param {ModuleProfile} profile The profile of the module
@ -136,6 +175,7 @@ const css = csjs`
width: 36px; width: 36px;
height: 36px; height: 36px;
padding: 3px; padding: 3px;
position: relative;
} }
.icon img { .icon img {
width: 28px; width: 28px;
@ -152,9 +192,14 @@ const css = csjs`
border-radius: 8px; border-radius: 8px;
padding-top: 1px; padding-top: 1px;
padding-left: 1px; padding-left: 1px;
} }
.icon[title='settings'] { .icon[title='settings'] {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
} }
.status {
position: absolute;
bottom: 0;
right: 0;
}
` `

@ -69,6 +69,7 @@ class ContextualListener {
this.currentPosition = cursorPosition this.currentPosition = cursorPosition
return return
} }
this._stopHighlighting()
this.currentPosition = cursorPosition this.currentPosition = cursorPosition
this.currentFile = file this.currentFile = file
if (compilationResult && compilationResult.data && compilationResult.data.sources[file]) { if (compilationResult && compilationResult.data && compilationResult.data.sources[file]) {
@ -78,7 +79,7 @@ class ContextualListener {
this._highlightExpressions(nodes[nodes.length - 1], compilationResult) this._highlightExpressions(nodes[nodes.length - 1], compilationResult)
} }
this.event.trigger('contextChanged', [nodes]) this.event.trigger('contextChanged', [nodes])
} else this._stopHighlighting() }
} }
_buildIndex (compilationResult, source) { _buildIndex (compilationResult, source) {

@ -125,6 +125,7 @@ staticAnalysisView.prototype.run = function () {
}) })
} else { } else {
warningContainer.html('No compiled AST available') warningContainer.html('No compiled AST available')
self.event.trigger('staticAnaysisWarning', [0])
} }
} }

@ -4,12 +4,14 @@ var EventManager = require('../../lib/events')
var css = require('./styles/analysis-tab-styles') var css = require('./styles/analysis-tab-styles')
import { ApiFactory } from 'remix-plugin' import { ApiFactory } from 'remix-plugin'
import { EventEmitter } from 'events'
class AnalysisTab extends ApiFactory { class AnalysisTab extends ApiFactory {
constructor (registry) { constructor (registry) {
super() super()
this.event = new EventManager() this.event = new EventManager()
this.events = new EventEmitter()
this.registry = registry this.registry = registry
} }
@ -27,6 +29,13 @@ class AnalysisTab extends ApiFactory {
render () { render () {
var staticanalysis = new StaticAnalysis() var staticanalysis = new StaticAnalysis()
staticanalysis.event.register('staticAnaysisWarning', (count) => {
if (count) {
this.events.emit('setStatus', {key: 'exclamation-triangle', title: count + ' warnings', type: 'warning'})
} else {
this.events.emit('setStatus', {key: 'check', title: 'no warning', type: 'success'})
}
})
this.registry.put({api: staticanalysis, name: 'staticanalysis'}) this.registry.put({api: staticanalysis, name: 'staticanalysis'})
if (this.el) return this.el if (this.el) return this.el

@ -79,6 +79,7 @@ class CompileTab extends ApiFactory {
if (this._view.errorContainer) { if (this._view.errorContainer) {
this._view.errorContainer.innerHTML = '' this._view.errorContainer.innerHTML = ''
} }
this.events.emit('setStatus', {key: 'spinner', title: 'compiling...', type: 'info'})
}) })
this.fileManager.events.on('currentFileChanged', (name) => { this.fileManager.events.on('currentFileChanged', (name) => {
@ -88,6 +89,7 @@ class CompileTab extends ApiFactory {
if (success) { if (success) {
// forwarding the event to the appManager infra // forwarding the event to the appManager infra
this.events.emit('compilationFinished', source.target, source, 'soljson', data) this.events.emit('compilationFinished', source.target, source, 'soljson', data)
this.events.emit('setStatus', {key: 'check', title: 'compilation successful', type: 'success'})
// Store the contracts // Store the contracts
this.data.contractsDetails = {} this.data.contractsDetails = {}
this.compiler.visitContracts((contract) => { this.compiler.visitContracts((contract) => {
@ -97,6 +99,8 @@ class CompileTab extends ApiFactory {
this.compiler.getSource(contract.file) this.compiler.getSource(contract.file)
) )
}) })
} else {
this.events.emit('setStatus', {key: 'exclamation', title: 'compilation failed', type: 'danger'})
} }
// Update contract Selection // Update contract Selection
let contractMap = {} let contractMap = {}

Loading…
Cancel
Save