Toolbar.vue 4.55 KB
<template>
  <div class="toolbar-container">
    <VaButtonGroup class="toolbar-group">
      <VaButton 
        :color="mode === 'select' ? 'primary' : 'secondary'"
        @click="$emit('setMode', 'select')"
        icon="touch_app"
        size="small"
        title="选择"
      />
      <VaButton 
        :color="mode === 'pan' ? 'primary' : 'secondary'"
        @click="$emit('setMode', 'pan')"
        icon="pan_tool"
        size="small"
        title="平移"
      />
      <VaButton 
        :color="mode === 'addNode' ? 'primary' : 'secondary'"
        @click="$emit('setMode', 'addNode')"
        icon="add_circle"
        size="small"
        title="加点"
      />
      <VaButton 
        :color="mode === 'connect' ? 'primary' : 'secondary'"
        @click="$emit('setMode', 'connect')"
        icon="link"
        size="small"
        title="连线"
      />
      <VaButton 
        :color="mode === 'arc' ? 'primary' : 'secondary'"
        @click="$emit('setMode', 'arc')"
        icon="architecture"
        size="small"
        title="圆弧"
      />
      <VaButton 
        color="secondary"
        @click="$emit('batchArc')"
        :disabled="selectedStraightEdgeCount < 2"
        icon="compass_calibration"
        size="small"
        title="批量切线圆弧"
      />
      <VaButton 
        color="secondary"
        @click="$emit('fourWay')"
        :disabled="!hasEdgeSelection"
        icon="shuffle"
        size="small"
        title="四向连线"
      />
      <VaButton 
        color="secondary"
        @click="$emit('connectX')"
        :disabled="!hasNodeSelection"
        icon="swap_horiz"
        size="small"
        title="X方向连线"
      />
      <VaButton 
        color="secondary"
        @click="$emit('connectY')"
        :disabled="!hasNodeSelection"
        icon="swap_vert"
        size="small"
        title="Y方向连线"
      />
      <VaButton 
        color="secondary"
        @click="$emit('batchEdit')"
        :disabled="!hasNodeSelection"
        icon="edit"
        size="small"
        title="批量修改"
      />
      <VaButton 
        color="secondary"
        @click="$emit('copy')"
        :disabled="!hasNodeSelection"
        icon="content_copy"
        size="small"
        title="复制"
      />
      <VaButton 
        color="secondary"
        @click="$emit('move')"
        :disabled="!hasNodeSelection"
        icon="open_with"
        size="small"
        title="平移"
      />
    </VaButtonGroup>

    <VaButtonGroup class="toolbar-group">
      <VaButton 
        color="secondary"
        @click="$emit('importBg')"
        icon="add_photo_alternate"
        size="small"
        title="导入背景图"
      />
      <VaButton 
        color="secondary"
        @click="$emit('openBgSettings')"
        :disabled="!bgImageUrl"
        icon="settings"
        size="small"
        title="背景图设置"
      />
      <VaButton 
        color="secondary"
        @click="$emit('clearBg')"
        :disabled="!bgImageUrl"
        icon="delete"
        size="small"
        title="清除背景图"
      />
    </VaButtonGroup>

    <VaButtonGroup class="toolbar-group">
      <VaButton 
        color="secondary"
        @click="$emit('undo')"
        :disabled="!canUndo"
        icon="undo"
        size="small"
        title="撤销"
      />
      <VaButton 
        color="secondary"
        @click="$emit('zoomIn')"
        icon="zoom_in"
        size="small"
        title="放大"
      />
      <VaButton 
        color="secondary"
        @click="$emit('zoomOut')"
        icon="zoom_out"
        size="small"
        title="缩小"
      />
      <VaButton 
        color="secondary"
        @click="$emit('resetView')"
        icon="history"
        size="small"
        title="重置视图"
      />
    </VaButtonGroup>

    <div class="stats-text">节点: {{ nodeCount }} / 连线: {{ edgeCount }}</div>
  </div>
</template>

<script setup>
defineProps({
  mode: String,
  canUndo: Boolean,
  nodeCount: Number,
  edgeCount: Number,
  bgImageUrl: String,
  selectedStraightEdgeCount: Number,
  hasEdgeSelection: Boolean,
  hasNodeSelection: Boolean
})

defineEmits([
  'setMode',
  'undo',
  'zoomIn',
  'zoomOut',
  'resetView',
  'importBg',
  'openBgSettings',
  'clearBg',
  'batchArc',
  'fourWay',
  'connectX',
  'connectY',
  'batchEdit',
  'copy',
  'move'
])
</script>

<style scoped>
.toolbar-container {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  align-items: center;
}

.toolbar-group {
  flex-shrink: 0;
}

.stats-text {
  color: var(--va-text-secondary);
  font-size: 0.875rem;
  margin-left: auto;
}
</style>