|
@@ -3,56 +3,133 @@
|
|
|
<ui-group title="初始画面" borderBottom>
|
|
|
<ui-group-option>
|
|
|
<div class="init-pic" :class="{ disabled: isEdit }">
|
|
|
- <img :src="getFileUrl(setting!.cover)" class="init-puc-cover">
|
|
|
+ <img :src="getFileUrl(setting!.cover)" class="init-puc-cover" />
|
|
|
<div class="init-pic-set" @click="enterSetPic">设置</div>
|
|
|
</div>
|
|
|
</ui-group-option>
|
|
|
</ui-group>
|
|
|
|
|
|
- <ui-group title="设置天空">
|
|
|
+ <ui-group title="指北针">
|
|
|
+ <template #icon>
|
|
|
+ <ui-icon
|
|
|
+ ctrl
|
|
|
+ :type="setting?.openCompass ? 'eye-s' : 'eye-n'"
|
|
|
+ @click="changeBack(setting!.back, setting!.backType, !setting!.openCompass)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </ui-group>
|
|
|
+
|
|
|
+ <ui-group title="设置背景">
|
|
|
<ui-group-option>
|
|
|
<div class="back-layout">
|
|
|
- <div
|
|
|
- v-for="back in backs"
|
|
|
- :key="back.value"
|
|
|
- class="back-item"
|
|
|
- :class="{ [back.type]: true, active: setting!.back === back.value}"
|
|
|
- @click="setting!.back !== back.value && changeBack(back.value)"
|
|
|
+ <div
|
|
|
+ v-for="back in settingResources"
|
|
|
+ :key="back.resource"
|
|
|
+ class="back-item"
|
|
|
+ :class="{ [back.backType]: true, active: setting!.back === back.resource }"
|
|
|
+ @click="setting!.back !== back.resource && changeBack(back.resource, back.backType, setting!.openCompass)"
|
|
|
>
|
|
|
- <img :src="back.image" v-if="back.type === 'img'">
|
|
|
- <i class="iconfont" :class="back.image" v-else-if="back.type === 'icon'" />
|
|
|
- <span :style="{background: back.image}" v-else></span>
|
|
|
- <p class="back-item-desc">{{ back.label }}</p>
|
|
|
+ <img :src="back.resource" v-if="back.backType === 'img'" />
|
|
|
+ <i
|
|
|
+ class="iconfont"
|
|
|
+ :class="back.resource"
|
|
|
+ v-else-if="back.backType === 'icon'"
|
|
|
+ />
|
|
|
+ <span :style="{ background: back.resource }" v-else></span>
|
|
|
+ <p class="back-item-desc">
|
|
|
+ {{
|
|
|
+ (settingResourceTypeDesc[back.backType] &&
|
|
|
+ settingResourceTypeDesc[back.backType] + "-") + back.name
|
|
|
+ }}
|
|
|
+ </p>
|
|
|
</div>
|
|
|
+ <ui-input
|
|
|
+ class="input"
|
|
|
+ preview
|
|
|
+ accept=".jpg, .jpeg, .png"
|
|
|
+ @update:modelValue="iconUpload"
|
|
|
+ type="file"
|
|
|
+ >
|
|
|
+ <template v-slot:replace>
|
|
|
+ <div class="back-item icon">
|
|
|
+ <i class="iconfont icon-add" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </ui-input>
|
|
|
</div>
|
|
|
</ui-group-option>
|
|
|
</ui-group>
|
|
|
</RightFillPano>
|
|
|
+
|
|
|
+ <div class="edit-add-type" v-if="addTemp">
|
|
|
+ <div class="edit-hot-item">
|
|
|
+ <h3 class="edit-title">
|
|
|
+ 背景图
|
|
|
+ <ui-icon type="close" ctrl @click.stop="addTemp = undefined" class="edit-close" />
|
|
|
+ </h3>
|
|
|
+
|
|
|
+ <ui-input
|
|
|
+ require
|
|
|
+ class="input"
|
|
|
+ width="100%"
|
|
|
+ placeholder="请输入背景图名称标注"
|
|
|
+ type="text"
|
|
|
+ v-model="addTemp.name"
|
|
|
+ maxlength="15"
|
|
|
+ />
|
|
|
+ <ui-input
|
|
|
+ require
|
|
|
+ class="input"
|
|
|
+ width="100%"
|
|
|
+ placeholder="请输入背景图名称标注"
|
|
|
+ type="select"
|
|
|
+ :options="options"
|
|
|
+ v-model="addTemp.backType"
|
|
|
+ maxlength="15"
|
|
|
+ />
|
|
|
+ <div class="edit-hot">
|
|
|
+ <a
|
|
|
+ @click="
|
|
|
+ () => {
|
|
|
+ addSettingResource(addTemp!);
|
|
|
+ addTemp = undefined;
|
|
|
+ fetchSettingResources();
|
|
|
+ }
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <ui-icon type="nav-edit" />
|
|
|
+ 确定
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
-import { RightFillPano } from '@/layout'
|
|
|
-import { enterEdit, enterOld, setting, isEdit, updataSetting } from '@/store'
|
|
|
-import { reactive, ref, watchEffect } from 'vue'
|
|
|
-import { togetherCallback, getFileUrl, loadPack } from '@/utils'
|
|
|
-import { showRightPanoStack, showRightCtrlPanoStack } from '@/env'
|
|
|
-import { sdk } from '@/sdk'
|
|
|
-
|
|
|
-const backs = ref<{ label: string, type: string, image: string, value: string}[]>([])
|
|
|
-watchEffect(async () => {
|
|
|
- backs.value = [
|
|
|
- { label: '无', type: 'icon', image: 'icon-without', value: 'none' },
|
|
|
- { label: '蓝天白云', type: 'img', image: (await import("./images/pic_ltby@2x.png")).default, value: (await import("./images/蓝天白云.jpg")).default },
|
|
|
- { label: '乌云密布', type: 'img', image: (await import("./images/pic_wymb@2x.png")).default, value: (await import("./images/乌云密布.jpg")).default},
|
|
|
- { label: '夜空', type: 'img', image: (await import("./images/pic_yk@2x.png")).default, value: (await import("./images/夜空.jpg")).default },
|
|
|
- { label: '草地', type: 'img', image: (await import("./images/pic_cd@2x.png")).default, value: (await import("./images/草地.jpg")).default },
|
|
|
- { label: '道路', type: 'img', image: (await import("./images/pic_dl@2x.png")).default, value: (await import("./images/道路.jpg")).default },
|
|
|
- { label: '傍晚', type: 'img', image: (await import("./images/pic_bw@2x.png")).default, value: (await import("./images/傍晚.jpg")).default },
|
|
|
- { label: '灰色', type: 'color', image: '#333333', value: '#333' },
|
|
|
- { label: '黑色', type: 'color', image: '#000000', value: '#000' },
|
|
|
- { label: '白色', type: 'color', image: '#ffffff', value: '#fff' },
|
|
|
- ]
|
|
|
-})
|
|
|
+import { RightFillPano } from "@/layout";
|
|
|
+import {
|
|
|
+ enterEdit,
|
|
|
+ enterOld,
|
|
|
+ setting,
|
|
|
+ isEdit,
|
|
|
+ updataSetting,
|
|
|
+ caseProject,
|
|
|
+} from "@/store";
|
|
|
+import { ref } from "vue";
|
|
|
+import { togetherCallback, getFileUrl, loadPack } from "@/utils";
|
|
|
+import { showRightPanoStack, showRightCtrlPanoStack } from "@/env";
|
|
|
+import { sdk, setBackdrop } from "@/sdk";
|
|
|
+import {
|
|
|
+ fetchSettingResources,
|
|
|
+ settingResources,
|
|
|
+ settingResourceTypeDesc,
|
|
|
+} from "@/api/setting-resource";
|
|
|
+import { uploadFile } from "@/api";
|
|
|
+import { SettingResource, addSettingResource } from "@/api/setting-resource";
|
|
|
+import { SettingResourceType } from "@/api/setting-resource";
|
|
|
+import { Dialog } from "bill/index";
|
|
|
+
|
|
|
+fetchSettingResources();
|
|
|
|
|
|
const enterSetPic = () => {
|
|
|
enterEdit(
|
|
@@ -60,44 +137,90 @@ const enterSetPic = () => {
|
|
|
showRightPanoStack.push(ref(false)),
|
|
|
showRightCtrlPanoStack.push(ref(false)),
|
|
|
])
|
|
|
- )
|
|
|
+ );
|
|
|
enterOld(async () => {
|
|
|
- const dataURL = await sdk.screenshot(300, 150)
|
|
|
- const res = await fetch(dataURL)
|
|
|
- const blob = await res.blob()
|
|
|
+ const dataURL = await sdk.screenshot(300, 150);
|
|
|
+ const res = await fetch(dataURL);
|
|
|
+ const blob = await res.blob();
|
|
|
setting.value = {
|
|
|
...setting.value!,
|
|
|
cover: { url: dataURL, blob },
|
|
|
- pose: sdk.getPose()
|
|
|
- }
|
|
|
- await updataSetting()
|
|
|
- })
|
|
|
-}
|
|
|
+ pose: sdk.getPose(),
|
|
|
+ };
|
|
|
+ await updataSetting();
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const initBack = setting.value!.back;
|
|
|
+const initType = setting.value!.backType;
|
|
|
+const initOpenCompass = setting.value!.openCompass;
|
|
|
+let isFirst = true;
|
|
|
+const changeBack = (back: string, type: SettingResourceType, openCompass: boolean) => {
|
|
|
+ if (type === SettingResourceType.map && !caseProject.value!.tmProject?.latlng) {
|
|
|
+ Dialog.alert("当前案件没绑定经纬度,无法开启地图功能");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
-const initBack = setting.value!.back
|
|
|
-let isFirst = true
|
|
|
-const changeBack = (back: string) => {
|
|
|
- setting.value!.back = back
|
|
|
- sdk.setBackdrop(back)
|
|
|
+ setting.value!.back = back;
|
|
|
+ setting.value!.backType = type;
|
|
|
+ setting.value!.openCompass = openCompass;
|
|
|
+
|
|
|
+ setBackdrop(back, type);
|
|
|
+ (document.querySelector("#direction") as HTMLDivElement)!.style.display = openCompass
|
|
|
+ ? "block"
|
|
|
+ : "none";
|
|
|
|
|
|
if (isFirst) {
|
|
|
- let isSave = false
|
|
|
- isFirst = false
|
|
|
+ let isSave = false;
|
|
|
+ isFirst = false;
|
|
|
enterEdit(() => {
|
|
|
if (!isSave) {
|
|
|
- setting.value!.back = initBack
|
|
|
- sdk.setBackdrop(initBack)
|
|
|
+ setting.value!.back = initBack;
|
|
|
+ setting.value!.backType = initType;
|
|
|
+ setting.value!.openCompass = initOpenCompass;
|
|
|
+
|
|
|
+ setBackdrop(initBack, initType);
|
|
|
+ (document.querySelector(
|
|
|
+ "#direction"
|
|
|
+ ) as HTMLDivElement)!.style.display = initOpenCompass ? "block" : "none";
|
|
|
+
|
|
|
+ if (setting.value?.backType !== SettingResourceType.icon) {
|
|
|
+ setting.value?.back &&
|
|
|
+ sdk.setBackdrop(setting.value.back, setting.value.backType);
|
|
|
+ } else {
|
|
|
+ sdk.setBackdrop("none", setting.value.backType);
|
|
|
+ }
|
|
|
}
|
|
|
- isFirst = true
|
|
|
- })
|
|
|
+ isFirst = true;
|
|
|
+ });
|
|
|
enterOld(async () => {
|
|
|
- isSave = true
|
|
|
+ isSave = true;
|
|
|
|
|
|
- await loadPack(updataSetting())
|
|
|
- })
|
|
|
+ await loadPack(updataSetting());
|
|
|
+ });
|
|
|
}
|
|
|
-}
|
|
|
+};
|
|
|
+const options = [
|
|
|
+ {
|
|
|
+ value: SettingResourceType.envImage,
|
|
|
+ label: settingResourceTypeDesc[SettingResourceType.envImage],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: SettingResourceType.bottomImage,
|
|
|
+ label: settingResourceTypeDesc[SettingResourceType.bottomImage],
|
|
|
+ },
|
|
|
+];
|
|
|
+const addTemp = ref<Omit<SettingResource, "id">>();
|
|
|
+const iconUpload = async (data: any) => {
|
|
|
+ console.log(data);
|
|
|
+ addTemp.value = {
|
|
|
+ resource: await uploadFile({ blob: data.file as any, url: "" }),
|
|
|
+ name: "",
|
|
|
+ backType: SettingResourceType.envImage,
|
|
|
+ };
|
|
|
|
|
|
+ console.log(addTemp.value);
|
|
|
+};
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
@@ -111,8 +234,7 @@ const changeBack = (back: string) => {
|
|
|
.init-puc-cover {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
- object-fit: cover
|
|
|
-
|
|
|
+ object-fit: cover;
|
|
|
}
|
|
|
|
|
|
.init-pic-set {
|
|
@@ -120,7 +242,7 @@ const changeBack = (back: string) => {
|
|
|
bottom: 0;
|
|
|
left: 0;
|
|
|
right: 0;
|
|
|
- background-color: rgba(0,0,0,0.5);
|
|
|
+ background-color: rgba(0, 0, 0, 0.5);
|
|
|
font-size: 12px;
|
|
|
color: #fff;
|
|
|
line-height: 32px;
|
|
@@ -136,14 +258,19 @@ const changeBack = (back: string) => {
|
|
|
}
|
|
|
|
|
|
.back-item {
|
|
|
- > span, .iconfont, img {
|
|
|
+ > span,
|
|
|
+ .iconfont,
|
|
|
+ img {
|
|
|
display: block;
|
|
|
height: 88px;
|
|
|
cursor: pointer;
|
|
|
outline: 2px solid transparent;
|
|
|
- transition: all .3s;
|
|
|
+ transition: all 0.3s;
|
|
|
border-radius: 4px;
|
|
|
+ width: 88px;
|
|
|
+ object-fit: cover;
|
|
|
}
|
|
|
+
|
|
|
.iconfont {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
@@ -157,8 +284,10 @@ const changeBack = (back: string) => {
|
|
|
}
|
|
|
|
|
|
&.active {
|
|
|
- > span, .iconfont, img {
|
|
|
- outline-color: #00C8AF;
|
|
|
+ > span,
|
|
|
+ .iconfont,
|
|
|
+ img {
|
|
|
+ outline-color: #00c8af;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -169,4 +298,61 @@ const changeBack = (back: string) => {
|
|
|
margin-top: 10px;
|
|
|
text-align: center;
|
|
|
}
|
|
|
-</style>
|
|
|
+.edit-add-type {
|
|
|
+ position: fixed;
|
|
|
+ inset: 0;
|
|
|
+ background: rgba(0, 0, 0, 0.3);
|
|
|
+ backdrop-filter: blur(4px);
|
|
|
+ z-index: 2000;
|
|
|
+ padding: 20px;
|
|
|
+ overflow-y: auto;
|
|
|
+
|
|
|
+ .edit-hot-item {
|
|
|
+ margin: 100px auto 20px;
|
|
|
+ width: 400px;
|
|
|
+ padding: 20px;
|
|
|
+ background: rgba(27, 27, 28, 0.8);
|
|
|
+ box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.3);
|
|
|
+ border-radius: 4px;
|
|
|
+
|
|
|
+ .input {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.edit-hot {
|
|
|
+ margin-top: 20px;
|
|
|
+ text-align: right;
|
|
|
+
|
|
|
+ span {
|
|
|
+ font-size: 14px;
|
|
|
+ color: rgba(255, 255, 255, 0.6);
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.edit-close {
|
|
|
+ position: absolute;
|
|
|
+ cursor: pointer;
|
|
|
+ top: calc((100% - 18px) / 2);
|
|
|
+ right: 0;
|
|
|
+ transform: translateY(-50%);
|
|
|
+}
|
|
|
+
|
|
|
+.edit-title {
|
|
|
+ padding-bottom: 18px;
|
|
|
+ margin-bottom: 18px;
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ &::after {
|
|
|
+ content: "";
|
|
|
+ position: absolute;
|
|
|
+ left: -20px;
|
|
|
+ right: -20px;
|
|
|
+ height: 1px;
|
|
|
+ bottom: 0;
|
|
|
+ background-color: rgba(255, 255, 255, 0.16);
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|