imp: add split editor mode to playground

This commit is contained in:
Géry Debongnie
2019-03-31 22:37:04 +02:00
parent cc33c9f5cf
commit 14a8110b5d
2 changed files with 42 additions and 8 deletions
+18
View File
@@ -28,6 +28,10 @@ body {
background-color: #2f3129; background-color: #2f3129;
} }
.left-bar.split {
grid-template-rows: 50px auto 23px auto;
}
.menubar { .menubar {
background-color: #1c2128; background-color: #1c2128;
color: white; color: white;
@@ -52,6 +56,20 @@ body {
border-bottom: 2px solid gray; border-bottom: 2px solid gray;
} }
.layout-selector {
font-size: 33px;
padding: 0px 3px;
margin-right: 17px;
cursor: pointer;
margin: 8px;
color: #cccccc;
transform: rotate(90deg);
}
.layout-selector.active {
font-weight: bold;
color: white;
}
/* TABBED EDITOR ****************************************/ /* TABBED EDITOR ****************************************/
.tabBar { .tabBar {
+24 -8
View File
@@ -17,9 +17,9 @@ const DEFAULT_XML = `<templates>
const EDITOR_TEMPLATE = ` const EDITOR_TEMPLATE = `
<div class="tabbed-editor"> <div class="tabbed-editor">
<div class="tabBar"> <div class="tabBar">
<a class="tab" t-att-class="{active: state.currentTab==='js'}" t-on-click="setTab('js')">JS</a> <a t-if="tabs.js" class="tab" t-att-class="{active: state.currentTab==='js'}" t-on-click="setTab('js')">JS</a>
<a class="tab" t-att-class="{active: state.currentTab==='xml'}" t-on-click="setTab('xml')">XML</a> <a t-if="tabs.xml" class="tab" t-att-class="{active: state.currentTab==='xml'}" t-on-click="setTab('xml')">XML</a>
<a class="tab" t-att-class="{active: state.currentTab==='css'}" t-on-click="setTab('css')">CSS</a> <a t-if="tabs.css" class="tab" t-att-class="{active: state.currentTab==='css'}" t-on-click="setTab('css')">CSS</a>
</div> </div>
<div class="code-editor" t-ref="editor"></div> <div class="code-editor" t-ref="editor"></div>
</div>`; </div>`;
@@ -29,7 +29,12 @@ class TabbedEditor extends Component {
super(...arguments); super(...arguments);
this.inlineTemplate = EDITOR_TEMPLATE; this.inlineTemplate = EDITOR_TEMPLATE;
this.state = { this.state = {
currentTab: "js" currentTab: this.props.display.split("|")[0]
};
this.tabs = {
js: this.props.display.includes("js"),
xml: this.props.display.includes("xml"),
css: this.props.display.includes("css")
}; };
} }
@@ -38,7 +43,7 @@ class TabbedEditor extends Component {
// remove this for xml/css (?) // remove this for xml/css (?)
this.editor.session.setOption("useWorker", false); this.editor.session.setOption("useWorker", false);
this.editor.setValue(this.props.js, -1); this.editor.setValue(this.props[this.state.currentTab], -1);
this.editor.setFontSize("14px"); this.editor.setFontSize("14px");
this.editor.setTheme("ace/theme/monokai"); this.editor.setTheme("ace/theme/monokai");
this.editor.session.setMode("ace/mode/javascript"); this.editor.session.setMode("ace/mode/javascript");
@@ -82,7 +87,7 @@ class TabbedEditor extends Component {
const TEMPLATE = ` const TEMPLATE = `
<div class="playground"> <div class="playground">
<div class="left-bar" t-att-style="leftPaneStyle"> <div class="left-bar" t-att-style="leftPaneStyle" t-att-class="{split: state.splitLayout}">
<div class="menubar"> <div class="menubar">
<a class="btn run-code" t-on-click="runCode">▶ Run</a> <a class="btn run-code" t-on-click="runCode">▶ Run</a>
<select t-on-change="setSample"> <select t-on-change="setSample">
@@ -90,8 +95,16 @@ const TEMPLATE = `
<t t-esc="sample.description"/> <t t-esc="sample.description"/>
</option> </option>
</select> </select>
<div class="layout-selector" t-att-class="{active:state.splitLayout}" t-on-click="toggleLayout">◫</div>
</div> </div>
<t t-widget="TabbedEditor" t-props="{js:state.js, css:state.css, xml: state.xml}" t-on-updateCode="updateCode"/> <t t-if="!state.splitLayout">
<t t-widget="TabbedEditor" t-props="{js:state.js, css:state.css, xml: state.xml, display: 'js|xml|css'}" t-on-updateCode="updateCode"/>
</t>
<t t-else="1">
<t t-widget="TabbedEditor" t-props="{js:state.js, css:state.css, xml: state.xml, display: 'js'}" t-on-updateCode="updateCode"/>
<div class="separator vertical"/>
<t t-widget="TabbedEditor" t-props="{js:state.js, css:state.css, xml: state.xml, display: 'xml|css'}" t-on-updateCode="updateCode"/>
</t>
</div> </div>
<div class="separator horizontal" t-on-mousedown="onMouseDown"/> <div class="separator horizontal" t-on-mousedown="onMouseDown"/>
<div class="right-pane" t-att-style="rightPaneStyle"> <div class="right-pane" t-att-style="rightPaneStyle">
@@ -117,12 +130,12 @@ class App extends Component {
this.widgets = { TabbedEditor }; this.widgets = { TabbedEditor };
this.state = { this.state = {
currentTab: "js",
js: SAMPLES[0].code, js: SAMPLES[0].code,
css: SAMPLES[0].css || "", css: SAMPLES[0].css || "",
xml: SAMPLES[0].xml || DEFAULT_XML, xml: SAMPLES[0].xml || DEFAULT_XML,
error: false, error: false,
displayWelcome: true, displayWelcome: true,
splitLayout: false,
leftPaneWidth: Math.ceil(window.innerWidth / 2) leftPaneWidth: Math.ceil(window.innerWidth / 2)
}; };
} }
@@ -209,6 +222,9 @@ class App extends Component {
updateCode(ev) { updateCode(ev) {
this.state[ev.type] = ev.value; this.state[ev.type] = ev.value;
} }
toggleLayout() {
this.updateState({ splitLayout: !this.state.splitLayout });
}
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------