|
@@ -84,70 +84,89 @@
|
|
|
<div class="sand-tool-item" :style="{'color':canUndo?'#000000':'#999999'}" @click="toolClickOptions('undo')">撤销</div>
|
|
|
<div class="sand-tool-item" :style="{'color':canRedo?'#000000':'#999999'}" @click="toolClickOptions('redo')">恢复</div>
|
|
|
<div class="sand-tool-item" id="sand-tool-fontSize">
|
|
|
- <el-select v-model="styleOptions.fontF" placeholder="字体" @change="(e)=>toolClickOptions('changeFamily',e)">
|
|
|
+ <el-select v-model="styleOptions.fontF" placeholder="字体" @change="(e)=>toolClickOptions('changeFamily',e)"
|
|
|
+ :disabled="toolStatus.nodeDisabled && toolStatus.textDisabled">
|
|
|
<el-option :label="f.name" :value="f.value" v-for="f in familyOptions" :key="f.name"></el-option>
|
|
|
</el-select>
|
|
|
</div>
|
|
|
<div class="sand-tool-item">
|
|
|
- <el-select v-model="styleOptions.fontS" placeholder="字号">
|
|
|
+ <el-select v-model="styleOptions.fontS" placeholder="字号" @change="(e)=>toolClickOptions('changeSize',e)">
|
|
|
<el-option :label="s.name" :value="s.value" v-for="s in fontSizeOptions" :key="s.name"></el-option>
|
|
|
</el-select>
|
|
|
</div>
|
|
|
- <div class="sand-tool-item">B</div>
|
|
|
- <div class="sand-tool-item">I</div>
|
|
|
- <div class="sand-tool-item">下划线</div>
|
|
|
+ <div class="sand-tool-item" @click="(e)=>toolClickOptions('changeWeight')">B</div>
|
|
|
+ <div class="sand-tool-item" @click="(e)=>toolClickOptions('changeFontStyle')">I</div>
|
|
|
+ <div class="sand-tool-item" @click="(e)=>toolClickOptions('changeDecoration')">下划线</div>
|
|
|
<div class="sand-tool-item">
|
|
|
<el-color-picker
|
|
|
+ key="textColor"
|
|
|
v-model="styleOptions.color"
|
|
|
size="mini"
|
|
|
:predefine="colorsOptions"
|
|
|
+ @change="(e)=>toolClickOptions('changeColor',e)"
|
|
|
/>
|
|
|
</div>
|
|
|
<div class="sand-tool-item">
|
|
|
- <el-select v-model="styleOptions.lineHeight" placeholder="行高">
|
|
|
+ <el-select v-model="styleOptions.lineHeight" placeholder="行高" @change="(e)=>toolClickOptions('changeLineHeight',e)">
|
|
|
<el-option :label="lh.name" :value="lh.value" v-for="lh in lineHeightOptions" :key="lh.name"></el-option>
|
|
|
</el-select>
|
|
|
</div>
|
|
|
<div class="sand-tool-item">
|
|
|
- <el-dropdown trigger="click" @command="setGraphStyle">
|
|
|
+ <el-dropdown trigger="click" @command="(e)=>toolClickOptions('changeTextAlign',e)">
|
|
|
<div class="el-dropdown-link">
|
|
|
<img src="~@/assets/icons/line.svg" width="20" height="20" style="vertical-align: middle;">
|
|
|
<i class="el-icon-arrow-down" style="font-size:12px;"></i>
|
|
|
</div>
|
|
|
<el-dropdown-menu slot="dropdown">
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: '4 4'}" :class="styleOptions.textAlign=='center'?'style-acitve':''">
|
|
|
+ <el-dropdown-item command="middle" :class="styleOptions.textAlign=='middle'?'style-acitve':''">
|
|
|
<!-- <i class="iconfont icon--xuxian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
居中
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
+ <el-dropdown-item command="start">
|
|
|
居左
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
+ <el-dropdown-item command="end">
|
|
|
居右
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
|
</el-dropdown-menu>
|
|
|
</el-dropdown>
|
|
|
</div>
|
|
|
- <div class="sand-tool-item">填充色</div>
|
|
|
- <div class="sand-tool-item">线条颜色</div>
|
|
|
<div class="sand-tool-item">
|
|
|
- <el-dropdown trigger="click" @command="setGraphStyle">
|
|
|
+ <el-color-picker
|
|
|
+ key="backgroundColor"
|
|
|
+ v-model="styleOptions.backgroundColor"
|
|
|
+ size="mini"
|
|
|
+ :predefine="colorsOptions"
|
|
|
+ @change="(e)=>toolClickOptions('changeBackgroundColor',e)"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="sand-tool-item">
|
|
|
+ <el-color-picker
|
|
|
+ key="lineColor"
|
|
|
+ v-model="styleOptions.lineColor"
|
|
|
+ size="mini"
|
|
|
+ :predefine="colorsOptions"
|
|
|
+ @change="(e)=>toolClickOptions('changeLineColor',e)"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="sand-tool-item">
|
|
|
+ <el-dropdown trigger="click" @command="(e)=>toolClickOptions('changeLineWidth',e)">
|
|
|
<div class="el-dropdown-link">
|
|
|
<img src="~@/assets/icons/line.svg" width="20" height="20" style="vertical-align: middle;">
|
|
|
<i class="el-icon-arrow-down" style="font-size:12px;"></i>
|
|
|
</div>
|
|
|
<el-dropdown-menu slot="dropdown">
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: '4 4'}" :class="styleOptions.lineWidth=='cu'?'style-acitve':''">
|
|
|
+ <el-dropdown-item :command="3" :class="styleOptions.lineWidth=='cu'?'style-acitve':''">
|
|
|
<!-- <i class="iconfont icon--xuxian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
粗
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
+ <el-dropdown-item :command="2">
|
|
|
细
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
+ <el-dropdown-item :command="1">
|
|
|
很细
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
@@ -155,17 +174,17 @@
|
|
|
</el-dropdown>
|
|
|
</div>
|
|
|
<div class="sand-tool-item">
|
|
|
- <el-dropdown trigger="click" @command="setGraphStyle">
|
|
|
+ <el-dropdown trigger="click" @command="(e)=>toolClickOptions('changeStrokeDasharray',e)">
|
|
|
<div class="el-dropdown-link">
|
|
|
<img src="~@/assets/icons/line.svg" width="20" height="20" style="vertical-align: middle;">
|
|
|
<i class="el-icon-arrow-down" style="font-size:12px;"></i>
|
|
|
</div>
|
|
|
<el-dropdown-menu slot="dropdown">
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: '4 4'}" :class="styleOptions.lineStyle=='xu'?'style-acitve':''">
|
|
|
+ <el-dropdown-item command="4 4" :class="styleOptions.lineStyle=='xu'?'style-acitve':''">
|
|
|
<!-- <i class="iconfont icon--xuxian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
虚线
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
+ <el-dropdown-item :command="null">
|
|
|
实线
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
@@ -173,39 +192,39 @@
|
|
|
</el-dropdown>
|
|
|
</div>
|
|
|
<div class="sand-tool-item">
|
|
|
- <el-dropdown trigger="click" @command="setGraphStyle">
|
|
|
+ <el-dropdown trigger="click" @command="(e)=>toolClickOptions('changeRouter',e)">
|
|
|
<div class="el-dropdown-link">
|
|
|
<img src="~@/assets/icons/line.svg" width="20" height="20" style="vertical-align: middle;">
|
|
|
<i class="el-icon-arrow-down" style="font-size:12px;"></i>
|
|
|
</div>
|
|
|
<el-dropdown-menu slot="dropdown">
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: '4 4'}" :class="styleOptions.connectStyle=='1'?'style-acitve':''">
|
|
|
+ <el-dropdown-item :command="1" :class="styleOptions.connectStyle==1?'style-acitve':''">
|
|
|
<!-- <i class="iconfont icon--xuxian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
- 直线
|
|
|
+ 直线{{ styleOptions.connectStyle }}
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
- 弯折线
|
|
|
+ <el-dropdown-item :command="2" :class="styleOptions.connectStyle==2?'style-acitve':''">
|
|
|
+ 弯折线{{ styleOptions.connectStyle }}
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
- 圆角弯折线
|
|
|
+ <el-dropdown-item :command="3" :class="styleOptions.connectStyle==3?'style-acitve':''">
|
|
|
+ 圆角弯折线{{ styleOptions.connectStyle }}
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
|
</el-dropdown-menu>
|
|
|
</el-dropdown>
|
|
|
</div>
|
|
|
<div class="sand-tool-item">
|
|
|
- <el-dropdown trigger="click" @command="setGraphStyle">
|
|
|
+ <el-dropdown trigger="click" @command="(e)=>toolClickOptions('changeSourceMarker',e)">
|
|
|
<div class="el-dropdown-link">
|
|
|
<img src="~@/assets/icons/line.svg" width="20" height="20" style="vertical-align: middle;">
|
|
|
<i class="el-icon-arrow-down" style="font-size:12px;"></i>
|
|
|
</div>
|
|
|
<el-dropdown-menu slot="dropdown">
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: '4 4'}" :class="styleOptions.startArrow=='1'?'style-acitve':''">
|
|
|
+ <el-dropdown-item command="classic" :class="styleOptions.startArrow=='1'?'style-acitve':''">
|
|
|
<!-- <i class="iconfont icon--xuxian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
有
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
+ <el-dropdown-item :command="null">
|
|
|
无
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
@@ -213,17 +232,17 @@
|
|
|
</el-dropdown>
|
|
|
</div>
|
|
|
<div class="sand-tool-item">
|
|
|
- <el-dropdown trigger="click" @command="setGraphStyle">
|
|
|
+ <el-dropdown trigger="click" @command="(e)=>toolClickOptions('changeTargetMarker',e)">
|
|
|
<div class="el-dropdown-link">
|
|
|
<img src="~@/assets/icons/line.svg" width="20" height="20" style="vertical-align: middle;">
|
|
|
<i class="el-icon-arrow-down" style="font-size:12px;"></i>
|
|
|
</div>
|
|
|
<el-dropdown-menu slot="dropdown">
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: '4 4'}" :class="styleOptions.endArrow=='1'?'style-acitve':''">
|
|
|
+ <el-dropdown-item command="classic" :class="styleOptions.endArrow=='1'?'style-acitve':''">
|
|
|
<!-- <i class="iconfont icon--xuxian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
有
|
|
|
</el-dropdown-item>
|
|
|
- <el-dropdown-item :command="{attr:'line/strokeDasharray',val: null}">
|
|
|
+ <el-dropdown-item :command="null">
|
|
|
无
|
|
|
<!-- <i class="iconfont icon--shixian" style="color:'#000';fontSize:30px"></i> -->
|
|
|
</el-dropdown-item>
|
|
@@ -272,6 +291,7 @@ import {styleSettings,familyOptions,fontSizeOptions,colorsOptions,lineHeightOpti
|
|
|
import { ElDropdownMenu as DropdownMenu } from 'element-ui';
|
|
|
import { contextMenuOption } from '../common/options';
|
|
|
import { contextEvent } from '../common/events';
|
|
|
+import { mapState } from 'vuex'
|
|
|
|
|
|
const { line} = configOpt;
|
|
|
export default {
|
|
@@ -288,20 +308,24 @@ const { line} = configOpt;
|
|
|
addEdgeType:"",
|
|
|
styleActive:1,
|
|
|
// 当前的样式配置
|
|
|
- styleOptions:{
|
|
|
- fontF:"微软雅黑",
|
|
|
- fontS:14,
|
|
|
- color:'#000000',
|
|
|
- lineHeight:1,
|
|
|
- textAlign:'center',
|
|
|
- lineStyle:"xu",
|
|
|
- lineWidth:'cu',
|
|
|
- connectStyle:'1',
|
|
|
- startArrow:'1',
|
|
|
- endArrow:'1'
|
|
|
- },
|
|
|
+ // styleOptions:{
|
|
|
+ // fontF:"微软雅黑",
|
|
|
+ // fontS:14,
|
|
|
+ // color:'#000000',
|
|
|
+ // lineHeight:1,
|
|
|
+ // textAlign:'start',
|
|
|
+ // backgroundColor:'#DAE8FF',
|
|
|
+ // lineColor:'#0052D9',
|
|
|
+ // lineStyle:"xu",
|
|
|
+ // lineWidth:'cu',
|
|
|
+ // connectStyle:'1',
|
|
|
+ // startArrow:'1',
|
|
|
+ // endArrow:'1'
|
|
|
+ // },
|
|
|
+ // toolStatus:{
|
|
|
canUndo:false,
|
|
|
canRedo:false,
|
|
|
+ // },
|
|
|
mindMapData:{
|
|
|
id: "1",
|
|
|
type: 'topic',
|
|
@@ -374,7 +398,12 @@ const { line} = configOpt;
|
|
|
},
|
|
|
lineHeightOptions(){
|
|
|
return lineHeightOptions
|
|
|
- }
|
|
|
+ },
|
|
|
+ ...mapState({
|
|
|
+ selectCells: state => state.sand.selectCells,
|
|
|
+ styleOptions: state => state.sand.styleOptions,
|
|
|
+ toolStatus:state => state.sand.toolStatus,
|
|
|
+ })
|
|
|
},
|
|
|
mounted(){
|
|
|
this.init()
|
|
@@ -394,7 +423,7 @@ const { line} = configOpt;
|
|
|
console.log(args);
|
|
|
this.canUndo = graph.canUndo()
|
|
|
this.canRedo = graph.canRedo()
|
|
|
- console.log(this.canUndo,this.canRedo);
|
|
|
+ // console.log(this.canUndo,this.canRedo);
|
|
|
})
|
|
|
this.graph = graph;
|
|
|
this.dnd = new Addon.Dnd({
|
|
@@ -511,11 +540,8 @@ const { line} = configOpt;
|
|
|
saveChart(){
|
|
|
console.log(this.mindMapData,'this.mindMapData');
|
|
|
},
|
|
|
- setGraphStyle(){
|
|
|
- console.log("修改样式")
|
|
|
- },
|
|
|
toolClickOptions(type){
|
|
|
- console.log(arguments);
|
|
|
+ let value = arguments[1]
|
|
|
switch (type) {
|
|
|
case 'undo':
|
|
|
this.graph.undo()
|
|
@@ -523,10 +549,135 @@ const { line} = configOpt;
|
|
|
case 'redo':
|
|
|
this.graph.redo()
|
|
|
break;
|
|
|
+ case 'changeFamily':
|
|
|
+ this.setGraphStyle('text/fontFamily',value)
|
|
|
+ break;
|
|
|
+ case 'changeSize':
|
|
|
+ this.setGraphStyle('text/fontSize',value)
|
|
|
+ break;
|
|
|
+ case 'changeWeight':
|
|
|
+ this.setGraphStyle('text/fontWeight')
|
|
|
+ break;
|
|
|
+ case 'changeFontStyle':
|
|
|
+ this.setGraphStyle('text/fontStyle')
|
|
|
+ break;
|
|
|
+ case 'changeDecoration':
|
|
|
+ this.setGraphStyle('text/textDecoration')
|
|
|
+ break;
|
|
|
+ case 'changeColor':
|
|
|
+ this.setGraphStyle('text/fill',value)
|
|
|
+ break;
|
|
|
+ case 'changeLineHeight':
|
|
|
+ this.setGraphStyle('text/lineHeight',value)
|
|
|
+ break;
|
|
|
+ case 'changeTextAlign':
|
|
|
+ this.setGraphStyle('text/textAnchor',value)
|
|
|
+ break;
|
|
|
+ case 'changeBackgroundColor':
|
|
|
+ this.setGraphStyle('body/fill',value)
|
|
|
+ break;
|
|
|
+ case 'changeLineColor':
|
|
|
+ this.setGraphStyle('body/stroke',value)
|
|
|
+ break;
|
|
|
+ case 'changeLineWidth':
|
|
|
+ this.setGraphStyle('body/strokeWidth',value)
|
|
|
+ break;
|
|
|
+ case 'changeStrokeDasharray':
|
|
|
+ this.setGraphStyle('body/strokeDasharray',value)
|
|
|
+ break;
|
|
|
+ case 'changeRouter':
|
|
|
+ this.setGraphStyle('router/name',value)
|
|
|
+ break;
|
|
|
+ case 'changeSourceMarker':
|
|
|
+ this.setGraphStyle('line/sourceMarker',value)
|
|
|
+ break;
|
|
|
+ case 'changeTargetMarker':
|
|
|
+ this.setGraphStyle('line/targetMarker',value)
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
- }
|
|
|
+ },
|
|
|
+ setGraphStyle(attr,value){
|
|
|
+ // console.log(attr,value);
|
|
|
+ let styleValue = value
|
|
|
+ let refXValue;
|
|
|
+ let currentAttr= this.selectCells[0].getAttrs()
|
|
|
+ if(attr.indexOf('fontWeight')!=-1){
|
|
|
+ styleValue = currentAttr.text.fontWeight == "normal"?'bold':'normal'
|
|
|
+ }else if(attr.indexOf('fontStyle')!=-1){
|
|
|
+ styleValue = currentAttr.text.fontStyle ?
|
|
|
+ currentAttr.text.fontStyle == "normal"?'italic':'normal'
|
|
|
+ :'italic'
|
|
|
+ }else if(attr.indexOf('textDecoration')!=-1){
|
|
|
+ styleValue = currentAttr.text.textDecoration ?
|
|
|
+ currentAttr.text.textDecoration == "none"?'underline':'none'
|
|
|
+ :'underline'
|
|
|
+ }else if(attr.indexOf('textAnchor')!=-1){
|
|
|
+ //需要特殊设置
|
|
|
+ if(styleValue=='start'){
|
|
|
+ refXValue='0%'
|
|
|
+ }else if(styleValue=='middle'){
|
|
|
+ refXValue=0.5
|
|
|
+ }else{
|
|
|
+ refXValue='100%'
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.selectCells.map(cell=>{
|
|
|
+ // lineHeight和fontsize 是一个倍数关系,每一个都可能不一样。
|
|
|
+ if(attr.indexOf('lineHeight')!=-1){
|
|
|
+ let fontSizeCurrent = cell.getAttrs().text.fontSize
|
|
|
+ cell.setAttrs({
|
|
|
+ text:{
|
|
|
+ relativeLineHeight:styleValue
|
|
|
+ }
|
|
|
+ })
|
|
|
+ cell.attr(attr,styleValue*fontSizeCurrent)
|
|
|
+ }else if(attr.indexOf('fontSize')!=-1){
|
|
|
+ let relativeLineHeightCurrent = cell.getAttrs().text.relativeLineHeight || 1.3
|
|
|
+ cell.attr(attr,styleValue)
|
|
|
+ // 设置对应行高
|
|
|
+ cell.attr('text/lineHeight',styleValue*relativeLineHeightCurrent)
|
|
|
+ }else if(attr=='body/stroke'){
|
|
|
+ // 线条颜色和边框颜色
|
|
|
+ let attrReal = cell.shape.indexOf('edge')!=-1?"line/stroke":attr
|
|
|
+ cell.attr(attrReal,styleValue)
|
|
|
+ }else if(attr=='body/strokeWidth'){
|
|
|
+ // 线条粗细和边框粗细
|
|
|
+ let attrReal = cell.shape.indexOf('edge')!=-1?"line/strokeWidth":attr
|
|
|
+ cell.attr(attrReal,styleValue)
|
|
|
+ }else if(attr=='body/strokeDasharray'){
|
|
|
+ // 线条样式和边框样式
|
|
|
+ let attrReal = cell.shape.indexOf('edge')!=-1?"line/strokeDasharray":attr
|
|
|
+ cell.attr(attrReal,styleValue)
|
|
|
+ }else if(attr=='router/name'){
|
|
|
+ // 1-直线 2-弯折线 3-圆角弯折线
|
|
|
+ let routerName=styleValue==1?'normal':'manhattan'
|
|
|
+ let connectorName=styleValue==3?'rounded':'normal'
|
|
|
+ if(routerName=='normal'){
|
|
|
+ // 变成直线,清除路径点
|
|
|
+ cell.setVertices([])
|
|
|
+ }else{
|
|
|
+ // 变弯折线 添加路径点
|
|
|
+ let sourcePoint = cell.getSourcePoint() //起始点
|
|
|
+ let targetPoint = cell.getTargetPoint() //终止点
|
|
|
+ let fisrtPoint = {x:(sourcePoint.x+targetPoint.x)/2,y:sourcePoint.y}
|
|
|
+ let secondPoint = {x:(sourcePoint.x+targetPoint.x)/2,y:targetPoint.y}
|
|
|
+ cell.setVertices([fisrtPoint,secondPoint])
|
|
|
+ }
|
|
|
+ cell.setRouter({name:routerName,args: {padding: {left: 10}}})
|
|
|
+ cell.setConnector({name:connectorName,args: { radius: 8 }})
|
|
|
+ }else{
|
|
|
+ cell.attr(attr,styleValue)
|
|
|
+ }
|
|
|
+ /*额外设置的属性*/
|
|
|
+ // 居左居中居右额外设置
|
|
|
+ if(attr.indexOf('textAnchor')!=-1){
|
|
|
+ cell.attr('text/refX',refXValue)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
},
|
|
|
}
|
|
|
</script>
|