Commit 291c0f5a authored by 张晨辰's avatar 张晨辰

Merge branch 'dev' into feature/20190923-feature

parents 16b753e0 54d0f5fe
...@@ -54,9 +54,12 @@ function execute(document) { ...@@ -54,9 +54,12 @@ function execute(document) {
var newName = layer.name.replace(mergeFlagReg, ''); var newName = layer.name.replace(mergeFlagReg, '');
layer.name = newName; layer.name = newName;
mergeLayers.push(newName); try {
layer.merge();
mergeLayers.push(newName);
}catch (e) {
layer.merge(); }
return 1; return 1;
} else if (layer.name.match(excludeFlagReg)) { } else if (layer.name.match(excludeFlagReg)) {
layer.remove(); layer.remove();
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
"Still Close": "Still Close", "Still Close": "Still Close",
"Save": "Save", "Save": "Save",
"Save And Preview": "Save And Preview", "Save And Preview": "Save And Preview",
"Save And Close": "Save And Close",
"Reset": "Reset", "Reset": "Reset",
"Copy": "Copy", "Copy": "Copy",
"Exit": "Exit", "Exit": "Exit",
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
"Still Close": "仍然关闭", "Still Close": "仍然关闭",
"Save": "保存", "Save": "保存",
"Save And Preview": "保存并预览", "Save And Preview": "保存并预览",
"Save And Close": "保存并关闭",
"Reset": "重置", "Reset": "重置",
"Copy": "复制", "Copy": "复制",
"Exit": "退出", "Exit": "退出",
......
...@@ -32,6 +32,7 @@ export default new Vuex.Store({ ...@@ -32,6 +32,7 @@ export default new Vuex.Store({
'modifyProject', 'modifyProject',
'addNode', 'addNode',
'deleteNode', 'deleteNode',
'copyNode',
'addAsset', 'addAsset',
'deleteAsset', 'deleteAsset',
'deleteAllAssets', 'deleteAllAssets',
......
...@@ -17,6 +17,7 @@ export const behaviorStore = { ...@@ -17,6 +17,7 @@ export const behaviorStore = {
originData: null, originData: null,
originBehaviors: null, originBehaviors: null,
behaviors: null, behaviors: null,
currentProcess: null,
processStack: [], processStack: [],
editable: false, editable: false,
...@@ -96,14 +97,18 @@ export const behaviorStore = { ...@@ -96,14 +97,18 @@ export const behaviorStore = {
clearProcessStack(state) { clearProcessStack(state) {
state.processStack.splice(0); state.processStack.splice(0);
updatePropsEditable(state); updatePropsEditable(state);
state.currentProcess = null;
}, },
pushProcessStack(state, process) { pushProcessStack(state, process) {
state.processStack.push(process); state.processStack.push(process);
updatePropsEditable(state); updatePropsEditable(state);
state.currentProcess = process;
console.log(state.currentProcess);
}, },
popProcessStack(state, index) { popProcessStack(state, index) {
state.processStack.splice(index); state.processStack.splice(index);
updatePropsEditable(state); updatePropsEditable(state);
state.currentProcess = state.processStack[state.processStack.length - 1];
}, },
setScale(state, value) { setScale(state, value) {
let scale = state.drawState.boardScale; let scale = state.drawState.boardScale;
...@@ -173,7 +178,7 @@ export const behaviorStore = { ...@@ -173,7 +178,7 @@ export const behaviorStore = {
addProcessMeta(commit, isInline, masterProcess, meta); addProcessMeta(commit, isInline, masterProcess, meta);
return meta; return meta;
}, },
addProcessFromPrefab({commit, state}, {masterProcess, isInline, meta: pMeta}){ addProcessFromPrefab({commit, state}, {masterProcess, isInline, meta: pMeta}) {
let meta = clonePureObj(pMeta); let meta = clonePureObj(pMeta);
meta.id = generateUUID(); meta.id = generateUUID();
meta.isInline = isInline; meta.isInline = isInline;
...@@ -189,7 +194,7 @@ function updatePropsEditable(state) { ...@@ -189,7 +194,7 @@ function updatePropsEditable(state) {
state.editable = state.processStack.filter(item => item.meta.type === 'builtin') <= 0; state.editable = state.processStack.filter(item => item.meta.type === 'builtin') <= 0;
} }
function addProcessMeta(commit, isInline, masterProcess, meta){ function addProcessMeta(commit, isInline, masterProcess, meta) {
if (isInline) { if (isInline) {
if (!masterProcess.meta.metas) { if (!masterProcess.meta.metas) {
Vue.set(masterProcess.meta, 'metas', []); Vue.set(masterProcess.meta, 'metas', []);
......
...@@ -35,8 +35,14 @@ export const envStore = { ...@@ -35,8 +35,14 @@ export const envStore = {
return groupProcesses(state.processes, process => process.isPrefab); return groupProcesses(state.processes, process => process.isPrefab);
}, },
builtinProcessTree: state => { builtinProcessTree: state => {
const tree = groupProcesses(state.processes, process => !process.isPrefab); const builtin = groupProcesses(state.processes, process => !process.isPrefab);
let tree = [
{
name: 'builtin',
children: builtin,
}
];
const dividerProcess = { const dividerProcess = {
id: 'divider', id: 'divider',
name: i18n.t('Divider'), name: i18n.t('Divider'),
......
...@@ -280,6 +280,27 @@ export const projectStore = { ...@@ -280,6 +280,27 @@ export const projectStore = {
const index = parentChildren.indexOf(node); const index = parentChildren.indexOf(node);
parentChildren.splice(index, 1); parentChildren.splice(index, 1);
}, },
copyNode(state, {node, parentNode}) {
// const parentChildren = parentNode.children || parentNode;
// const index = parentChildren.indexOf(node);
// parentNode.children.push(node);
// parentChildren.push(parentChildren[index]);
const child = {
name:node.name,
type:node.type,
properties: node.properties,
events: node.events,
uuid: generateUUID(),
};
if (parentNode) {
if (!parentNode.children) {
Vue.set(parentNode, 'children', []);
}
parentNode.children.push(child);
} else {
state.data.views.push(child);
}
},
importAssets(state, assets) { importAssets(state, assets) {
state.data.assets.push(...assets); state.data.assets.push(...assets);
}, },
......
...@@ -36,6 +36,13 @@ $dock-pin-width: 9px; ...@@ -36,6 +36,13 @@ $dock-pin-width: 9px;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
font-size: 14px; font-size: 14px;
.current-node{
background-color: $--color-text-secondary;
color: $--color-white;
border-radius: 5px;
padding: 0 2px;
}
} }
.edit-button { .edit-button {
......
...@@ -121,4 +121,7 @@ ...@@ -121,4 +121,7 @@
} }
} }
} }
.full-scrollbar{
height: 68vh;
}
} }
...@@ -47,13 +47,13 @@ export default { ...@@ -47,13 +47,13 @@ export default {
title: '水平偏移', title: '水平偏移',
type: 'inputNumber', type: 'inputNumber',
value: undefined, value: undefined,
desc: '相对于父元素中心点的水平偏移,0为正中心' //desc: '相对于父元素中心点的水平偏移,0为正中心'
}, },
verticalCenter: { verticalCenter: {
title: '垂直偏移', title: '垂直偏移',
type: 'inputNumber', type: 'inputNumber',
value: undefined, value: undefined,
desc: '相对于父元素中心点的垂直偏移,0为正中心' //desc: '相对于父元素中心点的垂直偏移,0为正中心'
}, },
rotation: { rotation: {
title: '旋转', title: '旋转',
...@@ -266,13 +266,14 @@ export default { ...@@ -266,13 +266,14 @@ export default {
}, },
scrollView: { scrollView: {
groupName: '滚动视图', groupName: '滚动视图',
isVertical: { direction: {
title: '纵向锁定', title: '滚动方向',
type: 'switch', type: 'select',
props: { options: [
width: 40 { label: '纵向', value: 'vertical' },
}, { label: '横向', value: 'horizontal' }
value: true, ],
value: 'vertical',
}, },
isSpringBack: { isSpringBack: {
title: '回弹效果', title: '回弹效果',
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
<el-link icon="el-icon-more" :underline="false" @click.stop/> <el-link icon="el-icon-more" :underline="false" @click.stop/>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item command="delete">{{$t('Delete')}}</el-dropdown-item> <el-dropdown-item command="delete">{{$t('Delete')}}</el-dropdown-item>
<el-dropdown-item command="copy">{{$t('Copy')}}</el-dropdown-item>
<el-dropdown-item command="export" divided v-if="!node.parent.parent">{{$t('Export')}} <el-dropdown-item command="export" divided v-if="!node.parent.parent">{{$t('Export')}}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item v-for="(type, key, index) in $t('view_node_menu')" <el-dropdown-item v-for="(type, key, index) in $t('view_node_menu')"
...@@ -140,6 +141,12 @@ ...@@ -140,6 +141,12 @@
parentNode: node.parent.data parentNode: node.parent.data
}); });
break; break;
case 'copy':
this.copyNode({
node: data,
parentNode: node.parent.data
});
break;
case 'export': case 'export':
this.exportView(data); this.exportView(data);
break; break;
...@@ -155,7 +162,7 @@ ...@@ -155,7 +162,7 @@
break; break;
} }
}, },
...mapMutations(['deleteNode', 'addNode']), ...mapMutations(['copyNode','deleteNode', 'addNode']),
...mapActions(['exportView', 'importView']) ...mapActions(['exportView', 'importView'])
} }
}; };
......
...@@ -4,20 +4,20 @@ ...@@ -4,20 +4,20 @@
<split-panes splitpanes-min="10" :splitpanes-size="10" horizontal> <split-panes splitpanes-min="10" :splitpanes-size="10" horizontal>
<process-list @edit-meta="onEditMeta" @delete-meta="onDeleteMeta" :data="prefabProcessTree" <process-list @edit-meta="onEditMeta" @delete-meta="onDeleteMeta" :data="prefabProcessTree"
class="background full-size" splitpanes-min="20" class="background full-size" splitpanes-min="20"
:splitpanes-size="30"/> :splitpanes-size="20"/>
<process-list @edit-meta="onEditMeta" @delete-meta="onDeleteMeta" :data="normalProcessTree" <process-list @edit-meta="onEditMeta" @delete-meta="onDeleteMeta" :data="normalProcessTree"
class="background full-size" splitpanes-min="20" class="background full-size" splitpanes-min="20"
:splitpanes-size="70"/> :splitpanes-size="80"/>
</split-panes> </split-panes>
<div class="center full-size background" splitpanes-min="20" :splitpanes-size="70"> <div class="center full-size background" splitpanes-min="20" :splitpanes-size="70">
<edit-path :processStack="processStack" @pop="onPop"/> <edit-path :processStack="processStack" @pop="onPop"/>
<div class="operate-bar"> <!--<div class="operate-bar">
<!--<el-button-group> <el-button-group>
<el-button size="mini" icon="el-icon-zoom-out" @click="setScale(-0.1)"/> <el-button size="mini" icon="el-icon-zoom-out" @click="setScale(-0.1)"/>
<el-button size="mini" @click="setScale(0)">1:1</el-button> <el-button size="mini" @click="setScale(0)">1:1</el-button>
<el-button size="mini" icon="el-icon-zoom-in" @click="setScale(0.1)"/> <el-button size="mini" icon="el-icon-zoom-in" @click="setScale(0.1)"/>
</el-button-group>--> </el-button-group>
</div> </div>-->
<board ref="board" @select-process-node="onSelectProcessNode" @edit-process="editProcess" @edit-meta="onEditMeta"/> <board ref="board" @select-process-node="onSelectProcessNode" @edit-process="editProcess" @edit-meta="onEditMeta"/>
</div> </div>
<div class="properties background full-size" splitpanes-min="20" :splitpanes-size="20"> <div class="properties background full-size" splitpanes-min="20" :splitpanes-size="20">
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
</el-button-group> </el-button-group>
<el-button size="mini" plain @click="cancel">{{$t('Cancel')}}</el-button> <el-button size="mini" plain @click="cancel">{{$t('Cancel')}}</el-button>
<el-button size="mini" plain @click="save(true)">{{$t('Save And Preview')}}</el-button> <el-button size="mini" plain @click="save(true)">{{$t('Save And Preview')}}</el-button>
<el-button size="mini" plain @click="save(false)">{{$t('Save')}}</el-button> <el-button size="mini" type="primary" plain @click="save(false)">{{$t('Save')}}</el-button>
</div> </div>
</div> </div>
<props-editor-dialog ref="propsEditorDialog"/> <props-editor-dialog ref="propsEditorDialog"/>
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
> >
<div slot-scope="{ node, data }" class="process-tree-node"> <div slot-scope="{ node, data }" class="process-tree-node">
<div class="node-name"> <div class="node-name">
<span :draggable="draggable(data)" @dragstart.stop="dragProcessStart(data, $event)">{{data.name}}</span> <span :class="{'current-node': isCurrentProcess(data)}" :draggable="draggable(data)" @dragstart.stop="dragProcessStart(data, $event)">{{data.name}}</span>
</div> </div>
<el-dropdown v-if="nodeMenu(data)" class="more-button" size="mini" trigger="click" <el-dropdown v-if="nodeMenu(data)" class="more-button" size="mini" trigger="click"
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
</template> </template>
<script> <script>
import {mapState} from 'vuex'
const editableIds = ['custom', 'divider']; const editableIds = ['custom', 'divider'];
export default { export default {
...@@ -59,6 +61,13 @@ ...@@ -59,6 +61,13 @@
deep: true deep: true
} }
}, },
computed: {
...mapState({
currentProcess(state){
return state.behavior.currentProcess;
}
}),
},
methods: { methods: {
updateFilter(){ updateFilter(){
if(this.$refs.tree){ if(this.$refs.tree){
...@@ -99,6 +108,13 @@ ...@@ -99,6 +108,13 @@
let filterDivider = data.isDivider !== true; let filterDivider = data.isDivider !== true;
if (!value) return filterDivider; if (!value) return filterDivider;
return filterDivider && !data.hasOwnProperty('children') && data.name.toUpperCase().indexOf(value.toUpperCase()) >= 0; return filterDivider && !data.hasOwnProperty('children') && data.name.toUpperCase().indexOf(value.toUpperCase()) >= 0;
},
isCurrentProcess(data){
let yes= this.currentProcess && this.currentProcess.meta && data.id && data.id === this.currentProcess.meta.id;
if(yes){
console.log();
}
return yes;
} }
}, },
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
</el-input> </el-input>
<el-scrollbar class="scrollbar" wrap-class="wrap-x-hidden" <el-scrollbar class="scrollbar" wrap-class="wrap-x-hidden"
view-class="scrollbar-view"> view-class="scrollbar-view">
<el-form v-model="process" size="mini" label-width="80px" label-position="left" @submit.native.prevent> <el-form v-model="process" size="mini" label-width="150px" label-position="left" @submit.native.prevent>
<component v-for="(property, key) in process.meta.props" <component v-for="(property, key) in process.meta.props"
:is="getInput(property)" :is="getInput(property)"
v-model="process.data.props[key]" v-model="process.data.props[key]"
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
:append-to-body="true" custom-class="behavior-editor-dialog"> :append-to-body="true" custom-class="behavior-editor-dialog">
<behavior-editor v-if="editorReady" ref="behaviorEditor" class="full-size"></behavior-editor> <behavior-editor v-if="editorReady" ref="behaviorEditor" class="full-size"></behavior-editor>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" @click="onSave(false)">{{$t('Save')}}</el-button> <el-button size="mini" @click="onSave(true)">{{$t('Save And Preview')}}</el-button>
<el-button size="mini" type="primary" @click="onSave(true)">{{$t('Save And Preview')}}</el-button> <el-button size="mini" type="primary" @click="onSave(false)">{{$t('Save And Close')}}</el-button>
</div> </div>
</el-dialog> </el-dialog>
</template> </template>
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
import BehaviorEditor from "../behavior-editor/BehaviorEditor"; import BehaviorEditor from "../behavior-editor/BehaviorEditor";
import events from "@/global-events.js" import events from "@/global-events.js"
export default { export default {
name: "BehaviorEditorDialog", name: "BehaviorEditorDialog",
components: {BehaviorEditor}, components: {BehaviorEditor},
...@@ -31,8 +30,8 @@ ...@@ -31,8 +30,8 @@
}), }),
}, },
created(){ created() {
events.$on('behaviorSave',(isPreview)=>{ events.$on('behaviorSave', (isPreview) => {
this.onSave(isPreview) this.onSave(isPreview)
}); });
}, },
...@@ -48,7 +47,10 @@ ...@@ -48,7 +47,10 @@
}, },
onSave(isPreview) { onSave(isPreview) {
this.behavior_save(); this.behavior_save();
this.$emit('change',isPreview); this.$emit('change', isPreview);
if(!isPreview){
this.visible = false;
}
}, },
beforeClose(done) { beforeClose(done) {
this.$confirm(this.$t('Save this behavior before'), this.$t('Alert'), { this.$confirm(this.$t('Save this behavior before'), this.$t('Alert'), {
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
:close-on-click-modal="false" :close-on-click-modal="false"
:append-to-body="true" :append-to-body="true"
:show-close="false" :show-close="false"
fullscreen
custom-class="details-dialog" custom-class="details-dialog"
> >
<el-tabs v-model="activeName"> <el-tabs v-model="activeName">
......
<template> <template>
<div> <div>
<el-scrollbar class="scrollbar" wrap-class="wrap-x-hidden" view-class="view"> <el-scrollbar class="scrollbar full-scrollbar" wrap-class="wrap-x-hidden" view-class="view">
<el-form @submit.native.prevent ref="form" :model="options" size="mini" label-position="right" <el-form @submit.native.prevent ref="form" :model="options" size="mini" label-position="right"
label-width="150px"> label-width="150px">
<el-form-item prop="pageTitle" :label="$t('Page title')"> <el-form-item prop="pageTitle" :label="$t('Page title')">
...@@ -46,7 +46,13 @@ ...@@ -46,7 +46,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="tpl" :label="$t('Template')"> <el-form-item prop="tpl" :label="$t('Template')">
<el-input type="textarea" v-model="options.tpl" :rows="10"/> <!-- <el-input type="textarea" v-model="options.tpl" :rows="10"/> -->
<codemirror ref="codeEditor"
v-model="options.tpl"
:options="cmOptions"
@cursorActivity="onCodeChange"
>
</codemirror>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-scrollbar> </el-scrollbar>
...@@ -59,10 +65,18 @@ ...@@ -59,10 +65,18 @@
<script> <script>
import {mapState, mapGetters, mapMutations} from 'vuex'; import {mapState, mapGetters, mapMutations} from 'vuex';
import {codemirror} from "vue-codemirror";
import 'codemirror/mode/javascript/javascript.js'
import 'codemirror/lib/codemirror.css'
import 'codemirror/theme/monokai.css'
import 'codemirror/addon/edit/closebrackets.js'
import 'codemirror/addon/hint/show-hint.js'
import 'codemirror/addon/hint/show-hint.css'
import 'codemirror/addon/hint/javascript-hint.js'
export default { export default {
name: "ProjectEditor", name: "ProjectEditor",
components: {}, components: {codemirror},
data() { data() {
const scaleMode = this.$t('scaleMode'); const scaleMode = this.$t('scaleMode');
const rendererType = this.$t('rendererType'); const rendererType = this.$t('rendererType');
...@@ -70,6 +84,16 @@ ...@@ -70,6 +84,16 @@
visible: false, visible: false,
scaleMode, scaleMode,
rendererType, rendererType,
cmOptions: {
tabSize: 2,
mode: 'text/javascript',
styleActiveLine: true,
theme: 'default',
lineNumbers: true,
line: true,
matchBrackets: true,
autoCloseBrackets: true,
}
} }
}, },
computed: { computed: {
...@@ -90,6 +114,10 @@ ...@@ -90,6 +114,10 @@
onSave() { onSave() {
this.modifyProject(); this.modifyProject();
}, },
onCodeChange(codemirror){
//codemirror.showHint();
//console.log(code);
}
} }
} }
</script> </script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment