//import CoreSystem from 'core-system';
import ToolBox from './ToolBox';
import Keyboard from './keyboard';
import Mouse from './mouse';
import React from 'react';
import {Dimensions, StyleSheet, View, Text , Button, TouchableOpacity
} from 'react-native';
import { Icon } from 'react-native-elements'
import Library from 'trapilib/dist/lib';
import SideBar from './SideBar';
import MainBar from './MainBar';
import ModuleBar from './ModuleBar';
import { ViewNode, Node } from 'trapilib/dist/lib/systems/ViewSystem';
import Environment from './Environment';
import BaseSystem from './System';
let {
CoreSystem,
ViewSystem,
} = Library;
export default class Gui extends BaseSystem {
constructor() {
super();
this.phoneRef = React.createRef();
this.phone = this.phoneRef;
this.toolboxRef = React.createRef();
this.toolbox = this.toolboxRef;
this.CoreSystem = new CoreSystem(true);
this.CoreSystem.onUpdate(() => {
this.forceUpdate();
})
this.Keyboard = new Keyboard();
this.ToolBox = new ToolBox(this.CoreSystem);
this.MainBar = new MainBar(this.CoreSystem);
this.ModuleBar = new ModuleBar(this.CoreSystem); // Add CoreSystem deps
this.SideBar = new SideBar(this.CoreSystem, this.ToolBox);
this.Environment = new Environment(this.CoreSystem, this.ToolBox, this.phoneRef);
this.Environment.onUpdate(() => this.forceUpdate())
this.SideBar.onUpdate(() => this.forceUpdate())
this.ToolBox.onUpdate( () => {
this.SideBar.tool = this.ToolBox.activeTool;
this.forceUpdate();
});
this.MainBar.onUpdate(() => this.forceUpdate())
this.MainBar.onSave( () => {
this.saveEnv();
this.forceUpdate()
})
this.load();
// Setup mainContainer
let cview = this.CoreSystem.getCurrentView();
let container = cview.getDefaultContainer();
let mainContent = new ViewNode(Math.random(), 'BaseContainer', {width: 375, height: 667});
cview.setContent(mainContent, container);
}
onMount() {
this.forceUpdate();
if(this.phone){
// thats fine
this.ToolBoxMouse = new Mouse(this.toolbox.current);
this.phoneMouse = new Mouse(this.phone.current).droppable();
}
if(this.ToolBoxMouse !== undefined){
this.ToolBoxMouse.listen()
.on('LeftDown',(e) => this.ToolManagement(e))
this.phoneMouse.listen()
.on('LeftDown',(e) => this.ToolManagement(e))
.on('Drop', (e) => this.dropContent(e))
}
}
saveEnv(){
let env = this.CoreSystem.export();
localStorage.setItem('environment', JSON.stringify(env));
this.forceUpdate();
try{
this.CoreSystem.import(JSON.parse(js));
this.forceUpdate();
} catch(e) {
console.log(e);
}
}
ToolManagement(e){
if(this.ToolBox.activeTool !== null){
this.processElement(e)
}
}
load() {
try{
let env = localStorage.getItem('environment');
if( env === null){
// this.CoreSystem.import(JSON.parse(jsLoad));
this.CoreSystem.fresh();
}else{
this.CoreSystem.import(JSON.parse(env));
}
this.forceUpdate();
} catch(e) {
console.log(e);
}
}
processElement(event){
let Node = this.CoreSystem.ray({event});
let NewNode = this.ToolBox.editNode(Node);
this.forceUpdate();
}
dropContent({event, data}) {
data = JSON.parse(data);
let targetNode = this.CoreSystem.ray({event});
// targetNode.content
targetNode.props.selected = true;
let node = new ViewNode(Math.random(), data.ctor, {}, data.namespace);
let containerNode = new Node(Math.random(), {}, node);
let View = this.CoreSystem.getCurrentView();
View.addViewNode(containerNode, targetNode);
this.forceUpdate();
}
mobileRender(){
return this.Environment.render();
}
renderSideBar(){
return this.SideBar.render();
}
renderMainBar(){
return this.MainBar.render();
}
renderToolBox(){
return (
{this.ToolBox.render()}
)
}
renderModuleBar(){
return (
{this.ModuleBar.render()}
)
}
removeFrame(routeName) {
this.CoreSystem.removePage(routeName);
this.forceUpdate();
}
addFrame(routeName) {
if(!routeName)
routeName = "Page " + (Object.keys(this.CoreSystem.Routing.topology.nodes).length + 1);
let VS = new Library.View();
let container = VS.getDefaultContainer();
container.props.selected = true;
let mainContent = new ViewNode(Math.random(), 'BaseContainer', {width: 375, height: 667});
VS.setContent(mainContent, container);
this.CoreSystem.addPage(routeName,VS);
this.CoreSystem.goto(routeName);
this.forceUpdate()
}
renderPageBar(){
let currentView = this.CoreSystem.Routing.getCurrentView();
let pages = Object.keys(this.CoreSystem.Routing.topology.nodes).map((route,index) => {
let view = this.CoreSystem.Routing.getView(route)
let background = view === currentView ? PageButtons.activePage :(null)
let textColor = view === currentView ? PageButtons.selectedText :(null)
return (
{
console.log(e);
this.CoreSystem.goto(route);
this.forceUpdate()
}}>
{route}
{view !== currentView && {
this.removeFrame(route);
e.stopPropagation();
return false;
}}>X}
)
})
return (
}
/>
{pages}
this.addFrame()}>
Add new
);
}
}
const PageButtons = StyleSheet.create({
container:{
flex:1,
flexDirection:'row',
width:40
},
activePage:{
backgroundColor:"#36BBAD",
color:"white"
},
text:{
fontSize:14,
letterSpacing: 0,
color: '#D9D9D9',
opacity: 1,
fontFamily: 'light'
},
selectedText: {
color: "#FFFFFF"
},
page:{
borderRightWidth:"1px",
borderColor:"#B4b4b4",
backgroundColor:"#F8F8F8",
cursor:'pointer',
textAlign:"center",
overflow:'hidden',
width:160,
height:48,
},
addNew:{
backgroundColor:"#D6D6D6",
cursor:'pointer',
width:160,
height:48,
},
addNewContainer:{
flex:1,
flexDirection:'row',
justifyContent:"center",
alignItems:'center'
},
addNewText:{
fontSize:14,
letterSpacing: 0,
color: 'white',
opacity: 1,
fontFamily: 'thin'
}
})
//const jsLoad = '{"Routing":{"topology":{"nodes":{"test":{"id":"test","routeName":"test","uri":"test","view":"VS1","defaultLink":null},"sample":{"id":"sample","routeName":"sample","uri":"sample","view":"VS2","defaultLink":null}},"links":{"test":{"out":[],"in":[]},"sample":{"out":[],"in":[]}}},"home":"test"},"Views":{"views":{"VS1":{"tree":{"nodes":{"A":{"id":"A","depth":0,"value":"RootComp","namespace":"default","props":{}},"B":{"id":"B","depth":1,"value":"ViewComp","namespace":"default","props":{"text":"ASD LOOK AT ME LOOK OO O.O (O.O)"}},"C":{"id":"C","depth":1,"value":"ViewComp","namespace":"default","props":{}}},"links":{"A":{"out":[{"to":"B","from":"A"},{"to":"C","from":"A"}],"in":[]},"B":{"out":[],"in":[{"to":"B","from":"A"}]},"C":{"out":[],"in":[{"to":"C","from":"A"}]}},"levels":[["A"],["B","C"]],"rootId":"A"}},"VS2":{"tree":{"nodes":{"P":{"id":"P","depth":0,"value":"RootComp","namespace":"default","props":{}}},"links":{"P":{"out":[],"in":[]}},"levels":[["P"]],"rootId":"P"}}}}}';
//jsLoad Test
const jsLoad = ``;
const MudleBarStyle = StyleSheet.create({
container:{
backgroundColor:'red'
}
})
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'space-between',
flexDirection: 'row'
},
toolbarView: {
justifyContent: 'space-around',
alignItems: 'center',
padding: 16
},
mainView: {
backgroundColor: '#065b69',
alignSelf:'stretch',
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
mobileView: {
backgroundColor: 'white',
borderWidth: 4,
borderColor: 'orange',
flex:1,
alignSelf: 'stretch',
},
attributesView: {
width:256,
alignSelf: 'stretch',
flexDirection: 'column',
}
});