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

<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>