web-map/src/components/color-config-panel.vue

389 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="color-config-panel">
<h3>编辑器颜色配置</h3>
<!-- 点位颜色配置 -->
<div class="color-section">
<h4>小点位颜色</h4>
<div class="color-group">
<label>普通点填充</label>
<ColorPickerWithAlpha
:modelValue="config.point.small.fill[1]"
@update:modelValue="(value) => updateColor('point.small.fill.1', { target: { value } })"
/>
</div>
<div class="color-group">
<label>等待点填充</label>
<ColorPickerWithAlpha
:modelValue="config.point.small.fill[2]"
@update:modelValue="(value) => updateColor('point.small.fill.2', { target: { value } })"
/>
</div>
<div class="color-group">
<label>避让点填充</label>
<ColorPickerWithAlpha
:modelValue="config.point.small.fill[3]"
@update:modelValue="(value) => updateColor('point.small.fill.3', { target: { value } })"
/>
</div>
<div class="color-group">
<label>临时避让点填充</label>
<ColorPickerWithAlpha
:modelValue="config.point.small.fill[4]"
@update:modelValue="(value) => updateColor('point.small.fill.4', { target: { value } })"
/>
</div>
<div class="color-group">
<label>库区点填充</label>
<ColorPickerWithAlpha
:modelValue="config.point.small.fill[5]"
@update:modelValue="(value) => updateColor('point.small.fill.5', { target: { value } })"
/>
</div>
</div>
<!-- 路线颜色配置 -->
<div class="color-section">
<h4>路线颜色</h4>
<div class="color-group">
<label>可通行路线</label>
<ColorPickerWithAlpha
:modelValue="config.route.stroke[1]"
@update:modelValue="(value) => updateColor('route.stroke.1', { target: { value } })"
/>
</div>
<div class="color-group">
<label>双向路线</label>
<ColorPickerWithAlpha
:modelValue="config.route.stroke[2]"
@update:modelValue="(value) => updateColor('route.stroke.2', { target: { value } })"
/>
</div>
<div class="color-group">
<label>禁行路线</label>
<ColorPickerWithAlpha
:modelValue="config.route.stroke[10]"
@update:modelValue="(value) => updateColor('route.stroke.10', { target: { value } })"
/>
</div>
</div>
<!-- 区域颜色配置 -->
<div class="color-section">
<h4>区域颜色</h4>
<div class="color-group">
<label>库区填充</label>
<ColorPickerWithAlpha
:modelValue="config.area.fill[1]"
@update:modelValue="(value) => updateColor('area.fill.1', { target: { value } })"
/>
</div>
<div class="color-group">
<label>互斥区填充</label>
<ColorPickerWithAlpha
:modelValue="config.area.fill[11]"
@update:modelValue="(value) => updateColor('area.fill.11', { target: { value } })"
/>
</div>
<div class="color-group">
<label>非互斥区填充</label>
<ColorPickerWithAlpha
:modelValue="config.area.fill[12]"
@update:modelValue="(value) => updateColor('area.fill.12', { target: { value } })"
/>
</div>
<div class="color-group">
<label>约束区填充</label>
<ColorPickerWithAlpha
:modelValue="config.area.fill[13]"
@update:modelValue="(value) => updateColor('area.fill.13', { target: { value } })"
/>
</div>
<div class="color-group">
<label>描述区填充</label>
<ColorPickerWithAlpha
:modelValue="config.area.fill[14]"
@update:modelValue="(value) => updateColor('area.fill.14', { target: { value } })"
/>
</div>
</div>
<!-- 路线颜色配置 -->
<div class="color-section">
<h4>路线颜色</h4>
<div class="color-group">
<label>空载路线</label>
<ColorPickerWithAlpha
:modelValue="config.route.strokeEmpty"
@update:modelValue="(value) => updateColor('route.strokeEmpty', { target: { value } })"
/>
</div>
<div class="color-group">
<label>载货路线</label>
<ColorPickerWithAlpha
:modelValue="config.route.strokeLoaded"
@update:modelValue="(value) => updateColor('route.strokeLoaded', { target: { value } })"
/>
</div>
</div>
<!-- 机器人颜色配置 -->
<div class="color-section">
<h4>机器人颜色</h4>
<div class="color-group">
<label>正常状态填充</label>
<ColorPickerWithAlpha
:modelValue="config.robot.fillNormal"
@update:modelValue="(value) => updateColor('robot.fillNormal', { target: { value } })"
/>
</div>
<div class="color-group">
<label>告警状态填充</label>
<ColorPickerWithAlpha
:modelValue="config.robot.fillWarning"
@update:modelValue="(value) => updateColor('robot.fillWarning', { target: { value } })"
/>
</div>
<div class="color-group">
<label>故障状态填充</label>
<ColorPickerWithAlpha
:modelValue="config.robot.fillFault"
@update:modelValue="(value) => updateColor('robot.fillFault', { target: { value } })"
/>
</div>
<div class="color-group">
<label>路径线条</label>
<ColorPickerWithAlpha
:modelValue="config.robot.line"
@update:modelValue="(value) => updateColor('robot.line', { target: { value } })"
/>
</div>
</div>
<!-- 库位颜色配置 -->
<div class="color-section">
<h4>库位颜色</h4>
<div class="color-group">
<label>占用状态</label>
<ColorPickerWithAlpha
:modelValue="config.storage.occupied"
@update:modelValue="(value) => updateColor('storage.occupied', { target: { value } })"
/>
</div>
<div class="color-group">
<label>可用状态</label>
<ColorPickerWithAlpha
:modelValue="config.storage.available"
@update:modelValue="(value) => updateColor('storage.available', { target: { value } })"
/>
</div>
<div class="color-group">
<label>默认状态</label>
<ColorPickerWithAlpha
:modelValue="config.storage.default"
@update:modelValue="(value) => updateColor('storage.default', { target: { value } })"
/>
</div>
<div class="color-group">
<label>锁定状态</label>
<ColorPickerWithAlpha
:modelValue="config.storage.locked"
@update:modelValue="(value) => updateColor('storage.locked', { target: { value } })"
/>
</div>
<div class="color-group">
<label>更多按钮背景</label>
<ColorPickerWithAlpha
:modelValue="config.storage.moreButton.background"
@update:modelValue="(value) => updateColor('storage.moreButton.background', { target: { value } })"
/>
</div>
<div class="color-group">
<label>更多按钮边框</label>
<ColorPickerWithAlpha
:modelValue="config.storage.moreButton.border"
@update:modelValue="(value) => updateColor('storage.moreButton.border', { target: { value } })"
/>
</div>
<div class="color-group">
<label>更多按钮文字</label>
<ColorPickerWithAlpha
:modelValue="config.storage.moreButton.text"
@update:modelValue="(value) => updateColor('storage.moreButton.text', { target: { value } })"
/>
</div>
</div>
<div class="actions">
<button @click="resetToDefault" class="btn-reset">重置为默认</button>
</div>
</div>
</template>
<script setup lang="ts">
import { computed, defineAsyncComponent } from 'vue';
import colorConfig from '../services/color-config.service';
// 动态导入颜色选择器组件
const ColorPickerWithAlpha = defineAsyncComponent(() => import('./color-picker-with-alpha.vue'));
// 定义组件名称
defineOptions({
name: 'ColorConfigPanel'
});
const config = computed(() => colorConfig.currentConfig);
const updateColor = (path: string, event: Event | { target: { value: string } }) => {
const target = event.target as HTMLInputElement;
if (target) {
colorConfig.setColor(path, target.value);
}
};
const resetToDefault = () => {
colorConfig.resetToDefault();
};
</script>
<style scoped>
.color-config-panel {
padding: 20px;
max-width: 800px;
max-height: 80vh;
overflow-y: auto;
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.color-config-panel h3 {
margin: 0 0 20px 0;
color: #333;
font-size: 18px;
font-weight: 600;
border-bottom: 2px solid #f0f0f0;
padding-bottom: 10px;
}
.color-section {
margin-bottom: 24px;
padding: 16px;
border: 1px solid #e8e8e8;
border-radius: 6px;
background: #fafafa;
}
.color-section h4 {
margin: 0 0 16px 0;
color: #555;
font-size: 16px;
font-weight: 600;
}
.color-subsection {
margin-bottom: 16px;
padding: 12px;
background: #fff;
border-radius: 4px;
border: 1px solid #e0e0e0;
}
.color-subsection h5 {
margin: 0 0 12px 0;
color: #666;
font-size: 14px;
font-weight: 500;
}
.color-group {
display: flex;
align-items: center;
margin-bottom: 12px;
gap: 12px;
}
.color-group label {
min-width: 120px;
font-size: 14px;
color: #666;
font-weight: 500;
}
.color-group input[type="color"] {
width: 60px;
height: 36px;
border: 2px solid #d9d9d9;
border-radius: 6px;
cursor: pointer;
transition: border-color 0.2s;
}
.color-group input[type="color"]:hover {
border-color: #40a9ff;
}
.color-group input[type="color"]:focus {
border-color: #1890ff;
outline: none;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.actions {
display: flex;
gap: 12px;
margin-top: 24px;
padding-top: 20px;
border-top: 1px solid #e8e8e8;
}
.actions button {
padding: 10px 20px;
border: 1px solid #d9d9d9;
border-radius: 6px;
background: white;
cursor: pointer;
font-size: 14px;
font-weight: 500;
transition: all 0.2s;
}
.btn-reset {
color: #ff4d4f;
border-color: #ff4d4f;
}
.btn-reset:hover {
background: #fff2f0;
border-color: #ff7875;
}
.actions button:hover {
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* 滚动条样式 */
.color-config-panel::-webkit-scrollbar {
width: 6px;
}
.color-config-panel::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
.color-config-panel::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 3px;
}
.color-config-panel::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
</style>