187 lines
3.9 KiB
Vue
187 lines
3.9 KiB
Vue
<template>
|
|
<div class="main-panel-container">
|
|
<div class="tabs-container">
|
|
<el-scrollbar>
|
|
<div class="scroll-tabs-container">
|
|
<span
|
|
class="tab"
|
|
v-for="(tab, index) of tabs.content"
|
|
:key="tab.id"
|
|
:class="{ 'active-tab': tabs.activeIndex === index }"
|
|
@click="setActiveTab(index)"
|
|
>
|
|
<span>
|
|
<span :class="`iconfont ${tab.icon}`"></span>
|
|
<span class="tab-name">{{ tab.name }}</span>
|
|
</span>
|
|
<span
|
|
class="iconfont icon-close"
|
|
@click.stop="closeTab(index)"
|
|
></span>
|
|
</span>
|
|
</div>
|
|
</el-scrollbar>
|
|
|
|
<span
|
|
class="add-button iconfont icon-add"
|
|
@click="pageAddNewTab"
|
|
>
|
|
</span>
|
|
</div>
|
|
|
|
|
|
<div class="main-panel">
|
|
<router-view />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { defineComponent } from 'vue';
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
import { addNewTab, tabs, closeTab } from './panel';
|
|
import { panelLoaded } from '@/hook/panel';
|
|
|
|
defineComponent({ name: 'main-panel' });
|
|
|
|
const route = useRoute();
|
|
const router = useRouter();
|
|
|
|
function pageAddNewTab() {
|
|
addNewTab();
|
|
|
|
// 如果当前不在 debug 路由,则切换到 debug 路由
|
|
if (route.name !== 'debug') {
|
|
router.replace('/debug');
|
|
}
|
|
}
|
|
|
|
function setActiveTab(index: number) {
|
|
if (index >= 0 && index < tabs.content.length) {
|
|
tabs.activeIndex = index;
|
|
// 如果不在 debug 路由,则进入
|
|
if (route.name !== 'debug') {
|
|
router.replace('/debug');
|
|
}
|
|
}
|
|
}
|
|
|
|
</script>
|
|
|
|
<style>
|
|
.main-panel-container {
|
|
justify-content: center;
|
|
flex-direction: column;
|
|
width: 100%;
|
|
min-width: 800px;
|
|
height: 100%;
|
|
margin-left: 5px;
|
|
}
|
|
|
|
.main-panel {
|
|
background-color: var(--sidebar);
|
|
border-radius: 1.2em;
|
|
width: 100%;
|
|
height: calc(100% - 35px);
|
|
}
|
|
|
|
.scroll-tabs-container {
|
|
width: fit-content;
|
|
display: flex;
|
|
}
|
|
|
|
.tabs-container {
|
|
height: 30px;
|
|
width: 90%;
|
|
background-color: var(--background);
|
|
display: flex;
|
|
align-items: center;
|
|
user-select: none;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.tabs-container .el-scrollbar {
|
|
height: fit-content;
|
|
}
|
|
|
|
.tabs-container .tab {
|
|
white-space: nowrap;
|
|
margin-right: 5px;
|
|
font-size: 12px;
|
|
width: 120px;
|
|
border-radius: .5em;
|
|
background-color: var(--sidebar);
|
|
padding: 3px 10px;
|
|
display: flex;
|
|
align-items: center;
|
|
transition: var(--animation-3s);
|
|
justify-content: space-between;
|
|
position: relative;
|
|
}
|
|
|
|
.tabs-container .tab > span:first-child {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.tabs-container .tab .tab-name {
|
|
max-width: 70px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.tabs-container .tab:hover {
|
|
background-color: var(--input-active-background);
|
|
}
|
|
|
|
.tabs-container .tab.active-tab {
|
|
background-color: var(--main-color);
|
|
color: white;
|
|
}
|
|
|
|
.tabs-container .tab .iconfont {
|
|
margin-right: 10px;
|
|
}
|
|
|
|
.tabs-container .icon-close {
|
|
margin-left: 10px;
|
|
margin-right: 0 !important;
|
|
border-radius: .5em;
|
|
cursor: pointer;
|
|
padding: 3px;
|
|
transition: var(--animation-3s);
|
|
}
|
|
|
|
.tabs-container .icon-close:hover {
|
|
background-color: var(--main-light-color);
|
|
transition: var(--animation-3s);
|
|
}
|
|
|
|
.tabs-container .add-button {
|
|
cursor: pointer;
|
|
font-size: 15px;
|
|
margin-left: 5px;
|
|
border-radius: .5em;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
transition: var(--animation-3s);
|
|
}
|
|
|
|
.tabs-container .add-button:hover {
|
|
color: var(--main-color);
|
|
background-color: var(--sidebar);
|
|
transition: var(--animation-3s);
|
|
}
|
|
|
|
.close-icon {
|
|
margin-left: 8px;
|
|
font-size: 14px;
|
|
padding: 2px;
|
|
border-radius: 50%;
|
|
}
|
|
|
|
.close-icon:hover {
|
|
background-color: rgba(255, 255, 255, 0.2);
|
|
}
|
|
</style> |