sign.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <template>
  2. <CollapsePanel header="title" :key="position.id" class="tag-pos-content-item">
  3. <template v-slot:header>
  4. <p>{{ title }}</p>
  5. </template>
  6. <div class="sign-position">
  7. <SignItem
  8. label="图标放置方式"
  9. class="item"
  10. @apply-global="$emit('applyGlobal', 'type')"
  11. >
  12. <RadioGroup style="width: 100%" v-model:value="position.type">
  13. <RadioButton
  14. style="width: 50%; text-align: center"
  15. :value="TaggingPositionType['2d']"
  16. size="middle"
  17. >
  18. 悬浮
  19. </RadioButton>
  20. <RadioButton
  21. style="width: 50%; text-align: center"
  22. :value="TaggingPositionType['3d']"
  23. size="middle"
  24. >
  25. 贴地/墙
  26. </RadioButton>
  27. </RadioGroup>
  28. </SignItem>
  29. <SignItem
  30. label="图标大小"
  31. class="item"
  32. @apply-global="$emit('applyGlobal', ['mat', 'scale'])"
  33. >
  34. <Slider v-model:value="position.mat.scale" :min="0.1" :max="10" :step="0.1" />
  35. </SignItem>
  36. <SignItem
  37. label="图标角度"
  38. class="item"
  39. @apply-global="$emit('applyGlobal', ['mat', 'rotation'])"
  40. >
  41. <Slider v-model:value="position.mat.rotation" :min="0" :max="360" :step="0.1" />
  42. </SignItem>
  43. <SignItem
  44. label="文字大小"
  45. class="item"
  46. @apply-global="$emit('applyGlobal', 'fontSize')"
  47. >
  48. <Slider v-model:value="position.fontSize" :min="0" :max="360" :step="0.1" />
  49. </SignItem>
  50. <SignItem
  51. label="引线高度"
  52. class="item"
  53. @apply-global="$emit('applyGlobal', 'lineHeight')"
  54. >
  55. <Slider v-model:value="position.lineHeight" :min="0" :max="10" :step="0.1" />
  56. </SignItem>
  57. <SignItem class="item" @apply-global="$emit('applyGlobal', 'globalVisibility')">
  58. <template v-slot:label>
  59. <ui-input
  60. type="checkbox"
  61. label="全部范围可见"
  62. :modelValue="!!position.globalVisibility"
  63. @update:modelValue="(v: boolean) => position.globalVisibility = v"
  64. />
  65. </template>
  66. </SignItem>
  67. <SignItem
  68. label="可见范围"
  69. class="item"
  70. v-if="!position.globalVisibility"
  71. @apply-global="$emit('applyGlobal', 'visibilityRange')"
  72. >
  73. <Slider
  74. v-model:value="position.visibilityRange"
  75. :min="10"
  76. :max="1000"
  77. :step="0.1"
  78. />
  79. </SignItem>
  80. <Button block type="primary" danger ghost size="large" @click="$emit('delete')">
  81. 删除
  82. </Button>
  83. </div>
  84. </CollapsePanel>
  85. </template>
  86. <script setup lang="ts">
  87. import { CollapsePanel, Button, RadioGroup, Slider, RadioButton } from "ant-design-vue";
  88. import SignItem from "./sign-item.vue";
  89. import type { TaggingPosition } from "@/store";
  90. import { TaggingPositionType } from "@/api";
  91. defineProps<{ position: TaggingPosition; title: string }>();
  92. defineEmits<{
  93. (e: "applyGlobal", k: string | string[]): void;
  94. (e: "delete"): void;
  95. }>();
  96. </script>
  97. <style lang="scss" scoped src="./style.scss"></style>
  98. <style lang="scss">
  99. .tag-pos-content-item {
  100. border-bottom: 1px solid var(--colors-border-color) !important;
  101. .ant-collapse-header {
  102. padding-left: 0 !important;
  103. padding-right: 0 !important;
  104. }
  105. .ant-collapse-content-box {
  106. margin-left: -20px;
  107. margin-right: -20px;
  108. padding: 20px !important;
  109. background: rgba(0, 0, 0, 0.3);
  110. }
  111. }
  112. </style>