You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
5.0 KiB
208 lines
5.0 KiB
<template>
|
|
<div>
|
|
<div class="toolbar-item" :class="{ 'selection-active': selectionOpened }" @click="$_selectionSelect()">
|
|
<area-select size="18" />
|
|
</div>
|
|
<!-- <div class="toolbar-item toolbar-color-picker">
|
|
<el-popover
|
|
placement="top-start"
|
|
title="填充样式"
|
|
width="220"
|
|
trigger="click"
|
|
>
|
|
<sketch-picker :value="fillColor" @input="$_changeFillColor"/>
|
|
<color-fill size="24" slot="reference" />
|
|
</el-popover>
|
|
</div> -->
|
|
<!-- <div class="toolbar-item">
|
|
<color-text size="20" />
|
|
</div>
|
|
<div class="toolbar-item">
|
|
<icon-font size="18" />
|
|
</div>
|
|
<div class="toolbar-item">
|
|
<icon-blod size="18" />
|
|
</div>
|
|
<div class="toolbar-item">
|
|
<icon-line size="18" />
|
|
</div> -->
|
|
<div class="toolbar-item" @click="$_zoomIn()">
|
|
<zoom-in size="18" />
|
|
</div>
|
|
<div class="toolbar-item" @click="$_zoomOut()">
|
|
<zoom-out size="18" />
|
|
</div>
|
|
<div class="toolbar-item" :class="{ disabled: !undoAble }" @click="$_undo()">
|
|
<step-back size="18" />
|
|
</div>
|
|
<div class="toolbar-item" :class="{ disabled: !redoAble }" @click="$_redo()">
|
|
<step-foward size="18" />
|
|
</div>
|
|
<div class="toolbar-item" @click="$import">导入</div>
|
|
|
|
<div class="toolbar-item" @click="$_saveGraph">导出</div>
|
|
<div>
|
|
<el-select v-model="linetype" size="mini" @change="$_changeLineType">
|
|
<el-option v-for="item in lineOptions" :key="item.value" :value="item.value" :label="item.label"></el-option>
|
|
</el-select>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
// import { Sketch } from 'vue-color'
|
|
// import ColorFill from './icon/ColorFill.vue'
|
|
// import ColorText from './icon/ColorText.vue'
|
|
// import IconFont from './icon/Font.vue'
|
|
// import IconBlod from './icon/Blod.vue'
|
|
// import IconLine from './icon/Line.vue'
|
|
import ZoomIn from "./icon/ZoomIn.vue";
|
|
import ZoomOut from "./icon/ZoomOut.vue";
|
|
import StepBack from "./icon/StepBack.vue";
|
|
import StepFoward from "./icon/StepFoward.vue";
|
|
import AreaSelect from "./icon/AreaSelect.vue";
|
|
|
|
let fileHandle;
|
|
|
|
async function getFile() {
|
|
[fileHandle] = await window.showOpenFilePicker();
|
|
console.log("fileHandle", fileHandle);
|
|
}
|
|
|
|
async function getText() {
|
|
const file = await fileHandle.getFile();
|
|
const text = await file.text();
|
|
console.log(text);
|
|
return text;
|
|
}
|
|
|
|
async function writeFile() {
|
|
const writable = await fileHandle.createWritable();
|
|
await writable.write("测试一下");
|
|
await writable.close();
|
|
}
|
|
|
|
export default {
|
|
props: {
|
|
lf: Object,
|
|
activeEdges: Array,
|
|
fillColor: {
|
|
type: String,
|
|
default: "",
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
selectionOpened: false,
|
|
undoAble: false,
|
|
redoAble: false,
|
|
colors: "#345678",
|
|
linetype: "pro-polyline",
|
|
lineOptions: [
|
|
{
|
|
value: "pro-polyline",
|
|
label: "折线",
|
|
},
|
|
{
|
|
value: "pro-line",
|
|
label: "直线",
|
|
},
|
|
{
|
|
value: "pro-bezier",
|
|
label: "曲线",
|
|
},
|
|
],
|
|
};
|
|
},
|
|
mounted() {
|
|
this.$props.lf.on("history:change", ({ data: { undoAble, redoAble } }) => {
|
|
this.$data.redoAble = redoAble;
|
|
this.$data.undoAble = undoAble;
|
|
});
|
|
},
|
|
methods: {
|
|
async $import() {
|
|
try {
|
|
await getFile();
|
|
let text = await getText();
|
|
if(JSON.parse(text)){
|
|
this.$emit("importData",JSON.parse(text));
|
|
}
|
|
} catch (error) {
|
|
this.$message.error("文件读取错误");
|
|
}
|
|
},
|
|
$_changeFillColor(val) {
|
|
this.$emit("changeNodeFillColor", val.hex);
|
|
},
|
|
$_saveGraph() {
|
|
this.$emit("saveGraph");
|
|
},
|
|
$_zoomIn() {
|
|
this.$props.lf.zoom(true);
|
|
},
|
|
$_zoomOut() {
|
|
this.$props.lf.zoom(false);
|
|
},
|
|
$_undo() {
|
|
if (this.$data.undoAble) {
|
|
this.$props.lf.undo();
|
|
}
|
|
},
|
|
$_redo() {
|
|
if (this.$data.redoAble) {
|
|
this.$props.lf.redo();
|
|
}
|
|
},
|
|
$_selectionSelect() {
|
|
this.selectionOpened = !this.selectionOpened;
|
|
if (this.selectionOpened) {
|
|
this.lf.extension.selectionSelect.openSelectionSelect();
|
|
} else {
|
|
this.lf.extension.selectionSelect.closeSelectionSelect();
|
|
}
|
|
},
|
|
$_changeLineType(value) {
|
|
const { lf, activeEdges } = this.$props;
|
|
const { graphModel } = lf;
|
|
lf.setDefaultEdgeType(value);
|
|
if (activeEdges && activeEdges.length > 0) {
|
|
activeEdges.forEach((edge) => {
|
|
graphModel.changeEdgeType(edge.id, value);
|
|
});
|
|
}
|
|
},
|
|
},
|
|
components: {
|
|
// ColorFill,
|
|
// ColorText,
|
|
// IconFont,
|
|
// IconBlod,
|
|
// IconLine,
|
|
ZoomIn,
|
|
ZoomOut,
|
|
StepBack,
|
|
StepFoward,
|
|
AreaSelect,
|
|
// SketchPicker: Sketch
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
.toolbar-item {
|
|
/* width: 18px;
|
|
height: 18px; */
|
|
float: left;
|
|
margin: 12px 6px;
|
|
cursor: pointer;
|
|
}
|
|
.toolbar-color-picker {
|
|
width: 24px;
|
|
height: 24px;
|
|
margin: 8px 4px;
|
|
}
|
|
.selection-active {
|
|
background: #33a3dc;
|
|
}
|
|
</style>
|
|
|