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.
167 lines
4.2 KiB
167 lines
4.2 KiB
<template>
|
|
<div class="drawing-toolbar" v-if="drawDomClick">
|
|
<div class="toolbar-icons">
|
|
<div
|
|
v-for="item in toolbarItems"
|
|
:key="item.id"
|
|
class="toolbar-item"
|
|
:class="{ active: drawingMode === item.id }"
|
|
@click="handleItemClick(item)"
|
|
:title="item.name"
|
|
>
|
|
<svg-icon v-if="isSvgIcon(item.icon)" :icon-class="item.icon" class="toolbar-svg-icon" />
|
|
<i v-else :class="item.icon"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'DrawingToolbar',
|
|
props: {
|
|
drawDomClick: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
drawingMode: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
hasEntities: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
toolMode: {
|
|
type: String,
|
|
default: 'airspace' // 'airspace' or 'ranging'
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
// 完整工具列表(空域模式,移除点和线)
|
|
allToolbarItems: [
|
|
{ id: 'mouse', name: '鼠标', icon: 'cursor' },
|
|
{ id: 'polygon', name: '多边形空域', icon: 'el-icon-house' },
|
|
{ id: 'rectangle', name: '矩形空域', icon: 'jx' },
|
|
{ id: 'circle', name: '圆形空域', icon: 'circle' },
|
|
{ id: 'sector', name: '扇形空域', icon: 'sx' },
|
|
{ id: 'arrow', name: '箭头', icon: 'el-icon-right' },
|
|
{ id: 'text', name: '文本', icon: 'el-icon-document' },
|
|
{ id: 'image', name: '图片', icon: 'el-icon-picture-outline' },
|
|
{ id: 'locate', name: '定位', icon: 'el-icon-aim' },
|
|
{ id: 'clear', name: '清除', icon: 'el-icon-delete' },
|
|
{ id: 'import', name: '导入', icon: 'el-icon-upload' },
|
|
{ id: 'export', name: '导出', icon: 'el-icon-download' }
|
|
],
|
|
// 测距模式工具列表
|
|
rangingToolbarItems: [
|
|
{ id: 'mouse', name: '鼠标', icon: 'cursor' },
|
|
{ id: 'point', name: '点', icon: 'el-icon-location' },
|
|
{ id: 'line', name: '线', icon: 'el-icon-edit-outline' },
|
|
{ id: 'clear', name: '清除', icon: 'el-icon-delete' }
|
|
]
|
|
}
|
|
},
|
|
computed: {
|
|
toolbarItems() {
|
|
if (this.toolMode === 'ranging') {
|
|
return this.rangingToolbarItems;
|
|
} else {
|
|
return this.allToolbarItems;
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
/** 判断是否为本地 SVG 图标(非 Element 的 el-icon-* 类名) */
|
|
isSvgIcon(icon) {
|
|
return icon && typeof icon === 'string' && !icon.startsWith('el-icon-')
|
|
},
|
|
|
|
handleItemClick(item) {
|
|
if (item.id === 'clear') {
|
|
this.$emit('clear-all')
|
|
} else if (item.id === 'export') {
|
|
this.$emit('export-data')
|
|
} else if (item.id === 'import') {
|
|
this.$emit('import-data')
|
|
} else if (item.id === 'locate') {
|
|
this.$emit('locate')
|
|
} else if (item.id === 'mouse') {
|
|
this.$emit('toggle-drawing', null)
|
|
} else {
|
|
this.$emit('toggle-drawing', item.id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.drawing-toolbar {
|
|
position: absolute;
|
|
top: 70px;
|
|
right: 20px;
|
|
width: 36px;
|
|
background: rgba(255, 255, 255, 0.3);
|
|
backdrop-filter: blur(10px);
|
|
border: 1px solid rgba(0, 138, 255, 0.1);
|
|
border-radius: 8px;
|
|
z-index: 90;
|
|
box-shadow: 0 4px 12px rgba(0, 138, 255, 0.2);
|
|
padding: 12px 2px;
|
|
transition: all 0.3s ease;
|
|
overflow: hidden;
|
|
opacity: 1;
|
|
transform: translateX(0);
|
|
}
|
|
|
|
.toolbar-icons {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
margin-top: 30px;
|
|
}
|
|
|
|
.toolbar-item {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
width: 32px;
|
|
height: 32px;
|
|
cursor: pointer;
|
|
color: #555;
|
|
font-size: 16px;
|
|
position: relative;
|
|
transition: all 0.3s;
|
|
border-radius: 4px;
|
|
padding: 0;
|
|
background: rgba(255, 255, 255, 0.8);
|
|
backdrop-filter: blur(5px);
|
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.toolbar-item:hover {
|
|
background: rgba(0, 138, 255, 0.1);
|
|
color: #008aff;
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 4px 10px rgba(0, 138, 255, 0.2);
|
|
}
|
|
|
|
.toolbar-item.active {
|
|
background: rgba(0, 138, 255, 0.15);
|
|
color: #008aff;
|
|
box-shadow: 0 2px 8px rgba(0, 138, 255, 0.3);
|
|
}
|
|
|
|
.toolbar-item .toolbar-svg-icon {
|
|
width: 1em;
|
|
height: 1em;
|
|
font-size: 16px;
|
|
}
|
|
|
|
.toolbar-item:disabled {
|
|
opacity: 0.5;
|
|
cursor: not-allowed;
|
|
}
|
|
</style>
|
|
|