lx-music-desktop/src/renderer/views/Setting/index.vue
2022-12-26 17:39:27 +08:00

313 lines
7.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div :class="$style.main">
<div class="scroll" :class="$style.toc">
<ul :class="$style.tocList" role="toolbar">
<li v-for="h2 in tocList" :key="h2.id" :class="$style.tocListItem" role="presentation">
<h2
:class="[$style.tocH2, {[$style.active]: avtiveComponentName == h2.id }]"
role="tab" :aria-selected="avtiveComponentName == h2.id"
:aria-label="h2.title" ignore-tip @click="toggleTab(h2.id)"
>
<transition name="list-active">
<svg-icon v-if="avtiveComponentName == h2.id" name="angle-right-solid" :class="$style.activeIcon" />
</transition>
{{ h2.title }}
</h2>
<!-- <ul v-if="h2.children.length" :class="$style.tocList">
<li v-for="h3 in h2.children" :key="h3.id" :class="$style.tocSubListItem">
<h3 :class="[$style.tocH3, toc.activeId == h3.id ? $style.active : null]" :aria-label="h3.title">
<a :href="'#' + h3.id" @click.stop="toc.activeId = h3.id">{{ h3.title }}</a>
</h3>
</li>
</ul> -->
</li>
</ul>
</div>
<div ref="dom_content_ref" class="scroll" :class="$style.setting">
<dl>
<component :is="avtiveComponentName" />
<!-- <SettingBasic />
<SettingPlay />
<SettingPlayDetail />
<SettingDesktopLyric />
<SettingSearch />
<SettingList />
<SettingDownload />
<SettingSync />
<SettingHotKey />
<SettingNetwork />
<SettingOdc />
<SettingBackup />
<SettingOther />
<SettingUpdate />
<SettingAbout /> -->
</dl>
</div>
</div>
</template>
<script>
import { ref, computed, nextTick } from '@common/utils/vueTools'
// import { currentStting } from './setting'
import { useI18n } from '@renderer/plugins/i18n'
import { useRoute } from '@common/utils/vueRouter'
import SettingBasic from './components/SettingBasic'
import SettingPlay from './components/SettingPlay'
import SettingPlayDetail from './components/SettingPlayDetail'
import SettingDesktopLyric from './components/SettingDesktopLyric'
import SettingSearch from './components/SettingSearch'
import SettingList from './components/SettingList'
import SettingDownload from './components/SettingDownload'
// import SettingSync from './components/SettingSync'
import SettingHotKey from './components/SettingHotKey'
import SettingNetwork from './components/SettingNetwork'
import SettingOdc from './components/SettingOdc'
import SettingBackup from './components/SettingBackup'
import SettingOther from './components/SettingOther'
import SettingUpdate from './components/SettingUpdate'
import SettingAbout from './components/SettingAbout'
export default {
name: 'Setting',
components: {
SettingBasic,
SettingPlay,
SettingPlayDetail,
SettingDesktopLyric,
SettingSearch,
SettingList,
SettingDownload,
// SettingSync,
SettingHotKey,
SettingNetwork,
SettingOdc,
SettingBackup,
SettingOther,
SettingUpdate,
SettingAbout,
},
setup() {
const t = useI18n()
const route = useRoute()
const dom_content_ref = ref(null)
const tocList = computed(() => {
return [
{ id: 'SettingBasic', title: t('setting__basic') },
{ id: 'SettingPlay', title: t('setting__play') },
{ id: 'SettingPlayDetail', title: t('setting__play_detail') },
{ id: 'SettingDesktopLyric', title: t('setting__desktop_lyric') },
{ id: 'SettingSearch', title: t('setting__search') },
{ id: 'SettingList', title: t('setting__list') },
{ id: 'SettingDownload', title: t('setting__download') },
// { id: 'SettingSync', title: t('setting__sync') },
{ id: 'SettingHotKey', title: t('setting__hot_key') },
{ id: 'SettingNetwork', title: t('setting__network') },
{ id: 'SettingOdc', title: t('setting__odc') },
{ id: 'SettingBackup', title: t('setting__backup') },
{ id: 'SettingOther', title: t('setting__other') },
{ id: 'SettingUpdate', title: t('setting__update') },
{ id: 'SettingAbout', title: t('setting__about') },
]
})
const avtiveComponentName = ref(route.query.name && tocList.value.some(t => t.id == route.query.name)
? route.query.name
: tocList.value[0].id)
const toggleTab = id => {
avtiveComponentName.value = id
nextTick(() => {
dom_content_ref.value?.scrollTo({
top: 0,
behavior: 'smooth',
})
})
}
return {
tocList,
avtiveComponentName,
dom_content_ref,
toggleTab,
}
},
// mounted() {
// this.initTOC()
// },
// methods: {
// initTOC() {
// const list = this.$refs.dom_setting_list.children
// const toc = []
// let prevTitle
// for (const item of list) {
// if (item.tagName == 'DT') {
// prevTitle = {
// title: item.innerText.replace(/[(].+?[)]/, ''),
// id: item.getAttribute('id'),
// dom: item,
// children: [],
// }
// toc.push(prevTitle)
// continue
// }
// const h3 = item.querySelector('h3')
// if (h3) {
// prevTitle.children.push({
// title: h3.innerText.replace(/[(].+?[)]/, ''),
// id: h3.getAttribute('id'),
// dom: h3,
// })
// }
// }
// console.log(toc)
// this.toc.list = toc
// },
// handleListScroll(event) {
// // console.log(event.target.scrollTop)
// },
// },
}
</script>
<style lang="less" module>
@import '@renderer/assets/styles/layout.less';
.main {
display: flex;
flex-flow: row nowrap;
height: 100%;
border-top: var(--color-list-header-border-bottom);
}
.toc {
flex: 0 0 16%;
overflow-y: scroll;
}
.tocH2 {
line-height: 1.5;
.mixin-ellipsis-1;
font-size: 13px;
color: var(--color-font);
padding: 8px 10px;
transition: @transition-fast;
transition-property: background-color, color;
&:not(.active) {
cursor: pointer;
&:hover {
background-color: var(--color-button-background-hover);
}
}
&.active {
color: var(--color-primary);
}
}
.activeIcon {
height: .9em;
width: .9em;
margin-left: -0.45em;
vertical-align: -0.05em;
}
// .tocH3 {
// font-size: 13px;
// opacity: .8;
// }
// .tocList {
// .tocList {
// // padding-left: 15px;
// }
// }
// .tocSubListItem {
// padding-top: 10px;
// }
.setting {
padding: 0 15px 15px;
font-size: 14px;
box-sizing: border-box;
overflow-y: auto;
height: 100%;
position: relative;
width: 100%;
:global {
dt {
border-left: 5px solid var(--color-primary-alpha-700);
padding: 3px 7px;
margin: 15px 0;
+ dd h3 {
margin-top: 0;
}
}
dd {
// margin-left: 15px;
// font-size: 13px;
> div {
padding: 0 15px;
}
}
h3 {
font-size: 12px;
margin: 25px 0 15px;
}
p {
padding: 3px 0;
line-height: 1.3;
.btn {
+ .btn {
margin-left: 10px;
}
}
}
.help-btn {
padding: 0;
margin: 0 0.4em;
border: none;
background: none;
color: var(--color-button-font);
cursor: pointer;
transition: opacity 0.2s ease;
&:hover {
opacity: 0.7;
}
}
.help-icon {
margin: 0 0.4em;
}
}
}
// .btn-content {
// display: inline-block;
// transition: @transition-theme;
// transition-property: opacity, transform;
// opacity: 1;
// transform: scale(1);
// &.hide {
// opacity: 0;
// transform: scale(0);
// }
// }
// :global(dt):target, :global(h3):target {
// animation: highlight 1s ease;
// }
// @keyframes highlight {
// from { background: yellow; }
// to { background: transparent; }
// }
</style>