sign.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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="$t('tagging.posTabs.type')"
  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. {{ $t("tagging.posTabs.typeVal0") }}
  19. </RadioButton>
  20. <RadioButton
  21. style="width: 50%; text-align: center"
  22. :value="TaggingPositionType['3d']"
  23. size="middle"
  24. >
  25. {{ $t("tagging.posTabs.typeVal1") }}
  26. </RadioButton>
  27. </RadioGroup>
  28. </SignItem>
  29. <SignItem
  30. :label="$t('tagging.posTabs.scale')"
  31. class="item"
  32. @apply-global="$emit('applyGlobal', ['mat', 'scale'])"
  33. >
  34. <Slider v-model:value="position.mat.scale" :min="0.5" :max="5" :step="0.1" />
  35. </SignItem>
  36. <SignItem
  37. :label="$t('tagging.posTabs.rotation')"
  38. class="item"
  39. v-if="TaggingPositionType['2d'] !== position.type"
  40. @apply-global="$emit('applyGlobal', ['mat', 'rotation'])"
  41. >
  42. <Slider v-model:value="position.mat.rotation" :min="0" :max="360" :step="0.1" />
  43. </SignItem>
  44. <SignItem
  45. :label="$t('tagging.posTabs.fontSize')"
  46. class="item"
  47. @apply-global="$emit('applyGlobal', 'fontSize')"
  48. >
  49. <Slider v-model:value="position.fontSize" :min="12" :max="60" :step="0.1" />
  50. </SignItem>
  51. <SignItem
  52. :label="$t('tagging.posTabs.lineHeight')"
  53. class="item"
  54. @apply-global="$emit('applyGlobal', 'lineHeight')"
  55. >
  56. <Slider v-model:value="position.lineHeight" :min="0" :max="5" :step="0.1" />
  57. </SignItem>
  58. <SignItem
  59. :label="$t('tagging.posTabs.visibilityRange')"
  60. class="item"
  61. v-if="!position.globalVisibility"
  62. @apply-global="$emit('applyGlobal', 'visibilityRange')"
  63. >
  64. <Slider
  65. v-model:value="position.visibilityRange"
  66. :min="1"
  67. :max="1000"
  68. :step="0.1"
  69. />
  70. </SignItem>
  71. <SignItem class="item" @apply-global="$emit('applyGlobal', 'globalVisibility')">
  72. <template v-slot:label>
  73. <ui-input
  74. type="checkbox"
  75. :label="$t('tagging.posTabs.globalVisibility')"
  76. :modelValue="!!position.globalVisibility"
  77. @update:modelValue="(v: boolean) => position.globalVisibility = v"
  78. />
  79. </template>
  80. </SignItem>
  81. <Button block type="primary" danger ghost size="large" @click="$emit('delete')">
  82. {{ $t("sys.del") }}
  83. </Button>
  84. </div>
  85. </CollapsePanel>
  86. </template>
  87. <script setup lang="ts">
  88. import { CollapsePanel, Button, RadioGroup, Slider, RadioButton } from "ant-design-vue";
  89. import SignItem from "./sign-item.vue";
  90. import type { TaggingPosition } from "@/store";
  91. import { TaggingPositionType } from "@/api";
  92. import { computed, watchEffect } from "vue";
  93. import { getTaggingPosNode } from "@/sdk";
  94. const props = defineProps<{ position: TaggingPosition; title: string }>();
  95. const emit = defineEmits<{
  96. (e: "applyGlobal", k: string | string[]): void;
  97. (e: "delete"): void;
  98. (e: "show"): void;
  99. }>();
  100. const node = computed(() => {
  101. return getTaggingPosNode(props.position);
  102. });
  103. watchEffect((onCleanup) => {
  104. if (!node.value) return;
  105. const $node = node.value;
  106. const clickHandler = () => {
  107. emit("show");
  108. };
  109. $node.bus.on("click", clickHandler);
  110. onCleanup(() => {
  111. $node.bus.off("click", clickHandler);
  112. });
  113. });
  114. </script>
  115. <style lang="scss" scoped src="./style.scss"></style>
  116. <style lang="scss">
  117. .tag-pos-content-item {
  118. border-bottom: 1px solid var(--colors-border-color) !important;
  119. .ant-collapse-header {
  120. padding-left: 0 !important;
  121. padding-right: 0 !important;
  122. }
  123. .ant-collapse-content-box {
  124. margin-left: -20px;
  125. margin-right: -20px;
  126. padding: 20px !important;
  127. background: rgba(0, 0, 0, 0.3);
  128. }
  129. }
  130. </style>