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.
 
 
 
 
 

398 lines
10 KiB

<template>
<div class="diagram-panel">
<div class="setting-block">
<div>快捷样式</div>
<div class="short-styles">
<div
v-for="(item, index) in shortStyles"
:key="index"
:style="{
backgroundColor: item.backgroundColor,
borderColor: item.borderColor,
borderWidth: item.borderWidth,
}"
@click="setStyle(item)"
></div>
</div>
</div>
<div class="setting-block">
<div class="setting-item">
<span>背景色</span>
<el-popover
placement="top-start"
title="填充样式"
width="220"
trigger="click"
>
<sketch-picker
:value="style.backgroundColor"
@input="(c) => $_changeColorProperty(c, 'backgroundColor')"
/>
<div
class="border-color"
:style="{ backgroundColor: style.backgroundColor }"
slot="reference"
></div>
</el-popover>
<span>背景渐变色</span>
<el-popover
placement="top-start"
title="填充样式"
width="220"
trigger="click"
>
<sketch-picker
:value="style.gradientColor"
@input="(c) => $_changeColorProperty(c, 'gradientColor')"
/>
<div
class="border-color"
:style="{ backgroundColor: style.gradientColor }"
slot="reference"
></div>
</el-popover>
</div>
<div class="setting-item">
<span>线条样式</span>
<el-select
v-model="style.borderStyle"
size="small"
@change="$_selectBorder"
>
<el-option value="hidden" label="不显示"></el-option>
<el-option
v-for="(border, index) in borderStyles"
:value="border.value"
:key="index"
>
<div
class="border-style"
:style="{ borderBottomStyle: border.value }"
></div>
</el-option>
</el-select>
</div>
<div class="setting-item">
<span>线条颜色</span>
<el-popover
placement="top-start"
title="填充样式"
width="220"
trigger="click"
>
<sketch-picker
:value="style.borderColor"
@input="(c) => $_changeColorProperty(c, 'borderColor')"
/>
<div
class="border-color"
:style="{ backgroundColor: style.borderColor }"
slot="reference"
></div>
</el-popover>
</div>
<div class="setting-item">
<span>线条宽度</span>
<el-select v-model="style.borderWidth" @change="$_changeBorderWidth">
<el-option
v-for="item in borderWidthOptions"
:key="item"
:label="`${item}px`"
:value="item"
></el-option>
</el-select>
</div>
<div class="setting-item">
<span>文本颜色</span>
<el-popover
placement="top-start"
title="填充样式"
width="220"
trigger="click"
>
<sketch-picker
:value="style.fontColor"
@input="(c) => $_changeColorProperty(c, 'fontColor')"
/>
<div
class="border-color"
:style="{ backgroundColor: style.fontColor }"
slot="reference"
></div>
</el-popover>
</div>
<div class="setting-item">
<span>文本大小</span>
<el-input-number
v-model="style.fontSize"
controls-position="right"
size="mini"
@change="$_changeFontSize"
:min="12"
:max="30"
>
</el-input-number>
<span>px</span>
</div>
<div class="setting-item">
<span>文本字体</span>
<el-select
v-model="style.fontFamily"
size="small"
@change="$_changeFontFamily"
>
<el-option
v-for="(fontFamily, index) in fontFamilies"
:value="fontFamily.value"
:key="index"
></el-option>
</el-select>
</div>
<div class="setting-item">
<span>行高</span>
<el-select
v-model="style.lineHeight"
size="small"
@change="$_changeLineHeight"
>
<el-option
v-for="(item, index) in lineHeightOptions"
:key="index"
:label="`${item}`"
:value="item"
></el-option>
</el-select>
</div>
<div class="setting-item">
<span>对齐</span>
<el-radio-group
v-model="style.textAlign"
size="small"
@change="$_changeTextAlign"
>
<el-radio-button label="left">左对齐</el-radio-button>
<el-radio-button label="center">居中</el-radio-button>
<el-radio-button label="right">右对齐</el-radio-button>
</el-radio-group>
</div>
<div class="setting-item">
<span>文本样式</span>
<el-button size="small" @click="$_changeFontWeight">B</el-button>
<el-button size="small" @click="$_changeTextDecoration">U</el-button>
<el-button size="small" @click="$_changeFontStyle">I</el-button>
</div>
<div class="setting-item">
<span>设备id</span>
<el-input
v-model="style.deviceID"
controls-position="right"
size="mini"
@input="$_changeDeviceID"
>
</el-input>
<span>监控项id</span>
<el-input
v-model="style.itemID"
controls-position="right"
size="mini"
@input="$_changeItemID"
>
</el-input>
</div>
<div>
<el-button @click="$emit('setZIndex', 'top')">置为顶部</el-button>
<el-button @click="$emit('setZIndex', 'bottom')">置为底部</el-button>
</div>
</div>
</div>
</template>
<script>
import { Sketch } from "vue-color";
import { shortStyles, borderStyles, fontFamilies } from "./constant";
export default {
props: {
elementsStyle: Object,
onlyEdge: Boolean, // 是否是只设置边的属性,当只设置边的属性时,隐藏快捷样式和背景色设置
},
data() {
return {
shortStyles,
borderStyles,
fontFamilies,
style: {
backgroundColor: "", // 填充色
gradientColor: "", // 渐变色
borderType: 0, // 线条类型
borderColor: "", // 填充颜色
borderWidth: 1, // 线条宽度
borderStyle: "", // 线条类型
fontSize: 12, // 文本大小
fontColor: "", // 文本颜色
fontWeight: "", // 文本加粗
fontFamily: "", // 文本样式
lineHeight: "", // 行高
textAlign: "", // 对齐
deviceID:"" // 设备id
},
borderWidthOptions: Array(11)
.fill()
.map((_, i) => i),
SketchPicker: Sketch,
fontWeight: "", // 文本加粗
lineHeightOptions: Array(5)
.fill(1)
.map((_, i) => _ + i * 0.5),
};
},
watch: {
elementsStyle: {
handler(val) {
this.style = { ...this.$options.data().style, ...val };
},
immediate: true,
deep: true,
},
},
methods: {
setStyle(item) {
this.$emit("setStyle", item);
},
$_selectBorder(val) {
this.$emit("setStyle", {
borderStyle: val,
});
},
$_changeColorProperty({ rgba: { r, g, b, a } }, type) {
const color = `rgba(${r},${g},${b},${a})`;
this[type] = color;
this.$emit("setStyle", {
[type]: color,
});
},
$_changeFontSize(val) {
this.$emit("setStyle", {
fontSize: val,
});
},
$_changeBorderWidth(val) {
this.$emit("setStyle", {
borderWidth: val,
});
},
$_changeFontFamily(val) {
this.$emit("setStyle", {
fontFamily: val,
});
},
$_changeLineHeight(val) {
this.$emit("setStyle", {
lineHeight: val,
});
},
$_changeFontWeight() {
if (this.style.fontWeight === "bold") {
this.$emit("setStyle", {
fontWeight: "normal",
});
} else {
this.$emit("setStyle", {
fontWeight: "bold",
});
}
},
$_changeTextDecoration() {
if (this.style.textDecoration === "underline") {
this.$emit("setStyle", {
textDecoration: "none",
});
} else {
this.$emit("setStyle", {
textDecoration: "underline",
});
}
},
$_changeDeviceID(val){
this.$emit("setStyle", {
deviceID: val,
});
},
$_changeItemID(val){
this.$emit("setStyle", {
itemID: val,
});
},
$_changeFontStyle() {
if (this.style.fontStyle === "italic") {
this.$emit("setStyle", {
fontStyle: "normal",
});
} else {
this.$emit("setStyle", {
fontStyle: "italic",
});
}
},
$_changeTextAlign(val) {
this.$emit("setStyle", {
textAlign: val,
});
},
},
components: {
SketchPicker: Sketch,
},
};
</script>
<style scoped>
.diagram-panel {
padding: 20px;
}
.short-styles {
width: 240px;
}
.short-styles > div {
width: 20px;
height: 20px;
margin: 0 10px 5px 0;
box-sizing: border-box;
float: left;
border: 1px solid #fff;
cursor: pointer;
}
.border-style {
width: 150px;
height: 0px;
margin-top: 18px;
border-bottom-width: 1px;
border-bottom-color: black;
}
.setting-block {
overflow: hidden;
}
.setting-item {
line-height: 12px;
font-size: 12px;
display: flex;
vertical-align: middle;
align-items: center;
margin-top: 10px;
}
.setting-item > span {
width: 50px;
margin-right: 10px;
text-align: right;
flex-shrink: 0;
flex-grow: 0;
}
.border-color {
width: 40px;
height: 30px;
display: inline-block;
border: 1px solid #eaeaeb;
}
</style>