functional-toolbar.vue 3.9 KB
<template>
    <section class="functional-toolbar">
        <span
            :class="identFunctionalButtonClass(item.enabled, item.selected)"
            v-for="item in items"
            :key="item.key"
            @click="onClickToolbar(item.key)"
        >
            <div class="img-wrapper" :id="item.key">
                <img :src="item.icon" alt="" />
            </div>
            <span
                v-text="
                    item.key === 'orientBottom' || item.key === 'basicObjects'
                        ? $t(`${item.key}Short`)
                        : $t(`${item.key}`)
                "
            />
        </span>
    </section>
    <Popover :title="$t(itemSelectedKey)" :isVisible="itemSelectedKey.length > 0" :arrowTop="calTop()">
        <template v-slot:popover-content>
            <component :is="itemSelectedComponent" />
        </template>
    </Popover>
</template>
<script setup>
import { ref, markRaw, watch } from 'vue';
import { storeToRefs } from 'pinia';
import { useFunctionalToolbarStore } from '@/views/stores/useFunctionalToolbarStore';

import Popover from '@/views/viewer/components/common/popover.vue';
import TransformComponent from '@/views/viewer/components/transform-modal.vue';
import OrientBottomComponent from '@/views/viewer/components/orientbottom-modal.vue';
import MeasureComponent from './measure-modal.vue';
import BasicObjectsComponent from './objects3d-modal.vue';
import CopyMirrorComponent from './copymirror-modal.vue';
import TrimEditComponent from './trimedit-modal.vue';
import MeshEditComponent from './meshedit-modal.vue';
import SectionViewComponent from './sectionView-modal.vue';

const store = useFunctionalToolbarStore();
const { items, itemSelectedKey } = storeToRefs(store);
const { setSelectedItem } = store;

const itemSelectedComponent = ref(null);

const onClickToolbar = (key) => {
    const object = items.value.find((el) => el.key === key);
    if (object && object.enabled) {
        setSelectedItem(key, !object.selected);
    }
};

const calTop = () => {
    const el = document.getElementById(itemSelectedKey.value);
    if (el) {
        const rect = el.getBoundingClientRect();
        if (rect) {
            const center = rect.height * 0.5;
            return center;
        }
    }
    return 16.75;
};

const identFunctionalButtonClass = (enabled, selected) => {
    if (enabled) {
        return selected ? 'functional-toolbar-button selected' : 'functional-toolbar-button';
    }
    return 'functional-toolbar-button disabled';
};

watch(
    () => itemSelectedKey.value,
    () => {
        const key = itemSelectedKey.value;
        const lookup = {
            TransformComponent,
            OrientBottomComponent,
            MeasureComponent,
            CopyMirrorComponent,
            BasicObjectsComponent,
            TrimEditComponent,
            MeshEditComponent,
            SectionViewComponent
        };
        itemSelectedComponent.value =
            key.length > 0 ? markRaw(lookup[`${key.replace(/^./, key[0].toUpperCase())}Component`]) : null;
    }
);
</script>
<style lang="less">
.functional-toolbar {
    display: flex;
    flex-direction: column;
    gap: 10px;
    -webkit-box-align: center;
    align-items: center;
    margin-right: 10px;
    pointer-events: none;
    .img-wrapper {
        display: inline-block;
        overflow: hidden;
        width: 36px;
        height: 36px !important;
    }
    .functional-toolbar-button {
        &.selected {
            img {
                transform: translateX(-100%);
                filter: drop-shadow(36px 0 @color-button-main-selected-border) !important;
            }
        }
        &.disabled {
            img {
                transform: translateX(-100%);
                filter: drop-shadow(36px 0 @color-button-disabled) !important;
            }
            cursor: default;
        }
        &:hover {
            background-color: @color-button-hover-background;
        }
    }
}
</style>