2023-06-28 00:47:44 +08:00
|
|
|
<script setup>
|
2023-07-01 02:05:30 +08:00
|
|
|
import ContentPane from './components/content/ContentPane.vue'
|
2023-07-03 23:48:41 +08:00
|
|
|
import BrowserPane from './components/sidebar/BrowserPane.vue'
|
2023-06-28 00:47:44 +08:00
|
|
|
import { computed, nextTick, onMounted, provide, reactive, ref } from 'vue'
|
|
|
|
import { useI18n } from 'vue-i18n'
|
|
|
|
import { GetPreferences } from '../wailsjs/go/storage/PreferencesStorage.js'
|
|
|
|
import { get } from 'lodash'
|
|
|
|
import { useThemeVars } from 'naive-ui'
|
2023-07-03 23:48:41 +08:00
|
|
|
import NavMenu from './components/sidebar/NavMenu.vue'
|
2023-07-01 02:05:30 +08:00
|
|
|
import ConnectionPane from './components/sidebar/ConnectionPane.vue'
|
|
|
|
import ContentServerPane from './components/content/ContentServerPane.vue'
|
|
|
|
import useTabStore from './stores/tab.js'
|
2023-06-28 00:47:44 +08:00
|
|
|
|
|
|
|
const themeVars = useThemeVars()
|
|
|
|
|
|
|
|
const data = reactive({
|
2023-07-01 02:05:30 +08:00
|
|
|
navMenuWidth: 60,
|
2023-06-28 00:47:44 +08:00
|
|
|
hoverResize: false,
|
|
|
|
resizing: false,
|
|
|
|
})
|
|
|
|
|
2023-07-01 02:05:30 +08:00
|
|
|
const tabStore = useTabStore()
|
2023-06-28 00:47:44 +08:00
|
|
|
const preferences = ref({})
|
|
|
|
provide('preferences', preferences)
|
|
|
|
const i18n = useI18n()
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
preferences.value = await GetPreferences()
|
|
|
|
await nextTick(() => {
|
|
|
|
i18n.locale.value = get(preferences.value, 'general.language', 'en')
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
// TODO: apply font size to all elements
|
|
|
|
const getFontSize = computed(() => {
|
|
|
|
return get(preferences.value, 'general.font_size', 'en')
|
|
|
|
})
|
|
|
|
|
|
|
|
const handleResize = (evt) => {
|
|
|
|
if (data.resizing) {
|
2023-07-01 02:05:30 +08:00
|
|
|
tabStore.asideWidth = Math.max(evt.clientX - data.navMenuWidth, 300)
|
2023-06-28 00:47:44 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const stopResize = () => {
|
|
|
|
data.resizing = false
|
|
|
|
document.removeEventListener('mousemove', handleResize)
|
|
|
|
document.removeEventListener('mouseup', stopResize)
|
|
|
|
// TODO: Save sidebar x-position
|
|
|
|
}
|
|
|
|
|
|
|
|
const startResize = () => {
|
|
|
|
data.resizing = true
|
|
|
|
document.addEventListener('mousemove', handleResize)
|
|
|
|
document.addEventListener('mouseup', stopResize)
|
|
|
|
}
|
|
|
|
|
|
|
|
const asideWidthVal = computed(() => {
|
2023-07-01 02:05:30 +08:00
|
|
|
return tabStore.asideWidth + 'px'
|
2023-06-28 00:47:44 +08:00
|
|
|
})
|
|
|
|
|
|
|
|
const dragging = computed(() => {
|
|
|
|
return data.hoverResize || data.resizing
|
|
|
|
})
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<!-- app content-->
|
2023-07-01 02:05:30 +08:00
|
|
|
<div id="app-container" :class="{ dragging }" class="flex-box-h">
|
|
|
|
<nav-menu v-model:value="tabStore.nav" :width="data.navMenuWidth" />
|
|
|
|
<!-- structure page-->
|
|
|
|
<div v-show="tabStore.nav === 'structure'" class="flex-box-h flex-item-expand">
|
|
|
|
<div id="app-side" :style="{ width: asideWidthVal }" class="flex-box-h flex-item">
|
2023-07-03 23:48:41 +08:00
|
|
|
<browser-pane
|
2023-07-01 02:05:30 +08:00
|
|
|
v-for="t in tabStore.tabs"
|
|
|
|
v-show="get(tabStore.currentTab, 'name') === t.name"
|
|
|
|
:key="t.name"
|
|
|
|
class="flex-item-expand"
|
|
|
|
/>
|
|
|
|
<div
|
|
|
|
:class="{
|
|
|
|
'resize-divider-hover': data.hoverResize,
|
|
|
|
'resize-divider-drag': data.resizing,
|
|
|
|
}"
|
|
|
|
class="resize-divider"
|
|
|
|
@mousedown="startResize"
|
|
|
|
@mouseout="data.hoverResize = false"
|
|
|
|
@mouseover="data.hoverResize = true"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<content-pane class="flex-item-expand" />
|
2023-06-28 00:47:44 +08:00
|
|
|
</div>
|
2023-07-01 02:05:30 +08:00
|
|
|
|
|
|
|
<!-- server list page -->
|
|
|
|
<div v-show="tabStore.nav === 'server'" class="flex-box-h flex-item-expand">
|
|
|
|
<div id="app-side" :style="{ width: asideWidthVal }" class="flex-box-h flex-item">
|
|
|
|
<connection-pane class="flex-item-expand" />
|
|
|
|
<div
|
|
|
|
:class="{
|
|
|
|
'resize-divider-hover': data.hoverResize,
|
|
|
|
'resize-divider-drag': data.resizing,
|
|
|
|
}"
|
|
|
|
class="resize-divider"
|
|
|
|
@mousedown="startResize"
|
|
|
|
@mouseout="data.hoverResize = false"
|
|
|
|
@mouseover="data.hoverResize = true"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<content-server-pane class="flex-item-expand" />
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<!-- log page -->
|
|
|
|
<div v-show="tabStore.nav === 'log'">display log</div>
|
2023-06-28 00:47:44 +08:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
#app-container {
|
|
|
|
height: 100%;
|
|
|
|
overflow: hidden;
|
|
|
|
border-top: var(--border-color) 1px solid;
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
|
|
#app-toolbar {
|
|
|
|
height: 40px;
|
|
|
|
border-bottom: var(--border-color) 1px solid;
|
|
|
|
}
|
|
|
|
|
|
|
|
#app-side {
|
|
|
|
//overflow: hidden;
|
|
|
|
height: 100%;
|
|
|
|
|
|
|
|
.resize-divider {
|
|
|
|
//height: 100%;
|
|
|
|
width: 2px;
|
|
|
|
border-left-width: 5px;
|
|
|
|
background-color: var(--border-color);
|
|
|
|
}
|
|
|
|
|
|
|
|
.resize-divider-hover {
|
|
|
|
width: 5px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.resize-divider-drag {
|
|
|
|
//background-color: rgb(0, 105, 218);
|
|
|
|
width: 5px;
|
|
|
|
//background-color: var(--el-color-primary);
|
|
|
|
background-color: v-bind('themeVars.primaryColor');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.dragging {
|
|
|
|
cursor: col-resize !important;
|
|
|
|
}
|
|
|
|
</style>
|