feat(settingmodal): perfect setting

This commit is contained in:
zyronon
2023-09-13 14:01:28 +08:00
parent bcbb499554
commit 75635ec22c
9 changed files with 169 additions and 52 deletions

View File

@@ -5,6 +5,7 @@ import {Icon} from "@iconify/vue";
defineProps<{
keyboard?: string,
active?: boolean
size?: string
}>()
defineEmits(['click'])
@@ -15,7 +16,10 @@ defineEmits(['click'])
<Tooltip :disabled="!keyboard" :title="`快捷键: ${keyboard}`">
<div class="my-button hvr-grow"
@click="$emit('click')"
:class="active && 'active'">
:class="[
active && 'active',
size,
]">
<span><slot></slot></span>
<div class="key-notice" v-if="keyboard">
<Icon icon="bi:keyboard" width="14" color="#ffffff"/>
@@ -43,6 +47,14 @@ defineEmits(['click'])
height: 40rem;
line-height: 1;
&.small {
height: 30rem;
& > span {
font-size: 13rem;
}
}
& > span {
font-size: 16rem;
color: white;

View File

@@ -240,7 +240,14 @@ function onKeyDown(e: KeyboardEvent) {
let key = currentWord.name[stringIndex]
console.log('key', key,)
if (key === letter) {
let isWrong = false
if (store.setting.ignoreCase) {
isWrong = key.toLowerCase() === letter.toLowerCase()
} else {
isWrong = key === letter
}
if (isWrong) {
input += letter
wrong = ''
// console.log('匹配上了')
@@ -299,9 +306,11 @@ function onKeyDown(e: KeyboardEvent) {
break
case ShortKeyMap.Show:
hoverIndex = {
sectionIndex: sectionIndex,
sentenceIndex: sentenceIndex,
if (store.setting.allowWordTip) {
hoverIndex = {
sectionIndex: sectionIndex,
sentenceIndex: sentenceIndex,
}
}
break
}
@@ -396,7 +405,7 @@ function otherWord(word: ArticleWord, i: number, i2: number, i3: number) {
sectionIndex === indexI && sentenceIndex === indexJ && store.setting.dictation
?'dictation':''
]"
@mouseenter="hoverIndex = {sectionIndex : indexI,sentenceIndex :indexJ}"
@mouseenter="store.setting.allowWordTip && (hoverIndex = {sectionIndex : indexI,sentenceIndex :indexJ})"
@mouseleave="hoverIndex = {sectionIndex : -1,sentenceIndex :-1}"
@click="playAudio(sentence.sentence)"
v-for="(sentence,indexJ) in section">
@@ -494,13 +503,13 @@ function otherWord(word: ArticleWord, i: number, i2: number, i3: number) {
font-size: 36rem;
font-weight: 500;
word-spacing: 3rem;
//opacity: 0;
opacity: 0;
}
}
.article-content {
position: relative;
//opacity: 0;
opacity: 0;
}
article {

View File

@@ -129,7 +129,13 @@ async function onKeyDown(e: KeyboardEvent) {
//TODO 还有横杠
if ((e.keyCode >= 65 && e.keyCode <= 90) || e.code === 'Space') {
let letter = e.key
if ((input + letter).toLowerCase() === word.name.toLowerCase().slice(0, input.length + 1)) {
let isWrong = false
if (store.setting.ignoreCase) {
isWrong = (input + letter).toLowerCase() === word.name.toLowerCase().slice(0, input.length + 1)
} else {
isWrong = (input + letter) === word.name.slice(0, input.length + 1)
}
if (isWrong) {
input += letter
wrong = ''
playKeySound()
@@ -152,7 +158,7 @@ async function onKeyDown(e: KeyboardEvent) {
}
if (input.toLowerCase() === word.name.toLowerCase()) {
playCorrect()
setTimeout(next, 300)
setTimeout(next, store.setting.waitTimeForChangeWord)
}
} else {
// console.log('e', e)
@@ -187,7 +193,9 @@ async function onKeyDown(e: KeyboardEvent) {
next()
break
case ShortKeyMap.Show:
showFullWord = true
if (store.setting.allowWordTip) {
showFullWord = true
}
break
}
setTimeout(() => {
@@ -199,14 +207,22 @@ async function onKeyDown(e: KeyboardEvent) {
<template>
<div class="type-word">
<div class="translate">{{ word.trans.join('') }}</div>
<div class="translate"
:style="{fontSize: store.setting.foreignLanguageFontSize +'rem'}"
>{{ word.trans.join('') }}
</div>
<div class="word-wrapper">
<div class="word" :class="wrong && 'is-wrong'">
<div class="word"
:class="wrong && 'is-wrong'"
:style="{fontSize: store.setting.translateLanguageFontSize +'rem'}"
>
<span class="input" v-if="input">{{ input }}</span>
<span class="wrong" v-if="wrong">{{ wrong }}</span>
<template v-if="store.setting.dictation">
<span class="letter" v-if="!showFullWord"
@mouseenter="showFullWord = true">{{ resetWord.split('').map(v => '_').join('') }}</span>
@mouseenter="store.setting.allowWordTip && (showFullWord = true)">{{
resetWord.split('').map(v => '_').join('')
}}</span>
<span class="letter" v-else @mouseleave="showFullWord = false">{{ resetWord }}</span>
</template>
<span class="letter" v-else>{{ resetWord }}</span>

View File

@@ -2,6 +2,7 @@
import Modal from "@/components/Modal/Modal.vue"
import {useBaseStore} from "@/stores/base.ts"
import {Icon} from '@iconify/vue';
import {watch, ref} from "vue";
const tabIndex = $ref(0)
const store = useBaseStore()
@@ -17,6 +18,30 @@ const props = withDefaults(defineProps<IProps>(), {
const emit = defineEmits([
'update:modelValue',
])
let allSound = $ref<boolean>(true)
watch([
() => store.setting.wordSound,
() => store.setting.keyboardSound,
() => store.setting.translateSound,
() => store.setting.effectSound,
], (n) => {
if (n.some(v => v)) {
allSound = true
} else {
allSound = false
}
})
function changAllSound(e: boolean) {
allSound = e
store.setting.wordSound = e
store.setting.keyboardSound = e
store.setting.translateSound = e
store.setting.effectSound = e
}
</script>
<template>
@@ -40,7 +65,8 @@ const emit = defineEmits([
<div class="row">
<label class="main-title">所有音效</label>
<div class="wrapper">
<el-switch v-model="store.setting.value1"
<el-switch v-model="allSound"
@change="changAllSound"
inline-prompt
active-text=""
inactive-text=""
@@ -51,7 +77,7 @@ const emit = defineEmits([
<div class="row">
<label class="item-title">单词发音</label>
<div class="wrapper">
<el-switch v-model="store.setting.value1"
<el-switch v-model="store.setting.wordSound"
inline-prompt
active-text=""
inactive-text=""
@@ -61,22 +87,22 @@ const emit = defineEmits([
<div class="row">
<label class="sub-title">音量</label>
<div class="wrapper">
<el-slider v-model="store.setting.value2"/>
<span>{{ store.setting.value2 }}%</span>
<el-slider v-model="store.setting.wordSoundVolume"/>
<span>{{ store.setting.wordSoundVolume }}%</span>
</div>
</div>
<div class="row">
<label class="sub-title">音量</label>
<label class="sub-title">倍速</label>
<div class="wrapper">
<el-slider v-model="store.setting.value3" :step="0.1" :max="4"/>
<span>{{ store.setting.value3 }}</span>
<el-slider v-model="store.setting.wordSoundSpeed" :step="0.1" :min="1" :max="4"/>
<span>{{ store.setting.wordSoundSpeed }}</span>
</div>
</div>
<div class="line"></div>
<div class="row">
<label class="item-title">按键音</label>
<div class="wrapper">
<el-switch v-model="store.setting.value1"
<el-switch v-model="store.setting.keyboardSound"
inline-prompt
active-text=""
inactive-text=""
@@ -86,15 +112,15 @@ const emit = defineEmits([
<div class="row">
<label class="sub-title">音量</label>
<div class="wrapper">
<el-slider v-model="store.setting.value2"/>
<span>{{ store.setting.value2 }}%</span>
<el-slider v-model="store.setting.keyboardSoundVolume"/>
<span>{{ store.setting.keyboardSoundVolume }}%</span>
</div>
</div>
<div class="line"></div>
<div class="row">
<label class="item-title">释义发音</label>
<div class="wrapper">
<el-switch v-model="store.setting.value1"
<el-switch v-model="store.setting.translateSound"
inline-prompt
active-text=""
inactive-text=""
@@ -104,15 +130,15 @@ const emit = defineEmits([
<div class="row">
<label class="sub-title">音量</label>
<div class="wrapper">
<el-slider v-model="store.setting.value2"/>
<span>{{ store.setting.value2 }}%</span>
<el-slider v-model="store.setting.translateSoundVolume"/>
<span>{{ store.setting.translateSoundVolume }}%</span>
</div>
</div>
<div class="line"></div>
<div class="row">
<label class="item-title">效果音章节结算页烟花音效</label>
<div class="wrapper">
<el-switch v-model="store.setting.value1"
<el-switch v-model="store.setting.effectSound"
inline-prompt
active-text=""
inactive-text=""
@@ -122,8 +148,8 @@ const emit = defineEmits([
<div class="row">
<label class="sub-title">音量</label>
<div class="wrapper">
<el-slider v-model="store.setting.value2"/>
<span>{{ store.setting.value2 }}%</span>
<el-slider v-model="store.setting.effectSoundVolume"/>
<span>{{ store.setting.effectSoundVolume }}%</span>
</div>
</div>
</div>
@@ -145,7 +171,7 @@ const emit = defineEmits([
<div class="row">
<label class="item-title">练习时展示上一个/下一个单词</label>
<div class="wrapper">
<el-switch v-model="store.setting.value1"
<el-switch v-model="store.setting.showNearWord"
inline-prompt
active-text=""
inactive-text=""
@@ -159,7 +185,7 @@ const emit = defineEmits([
<div class="row">
<label class="item-title">是否忽略大小写</label>
<div class="wrapper">
<el-switch v-model="store.setting.value1"
<el-switch v-model="store.setting.ignoreCase"
inline-prompt
active-text=""
inactive-text=""
@@ -173,7 +199,7 @@ const emit = defineEmits([
<div class="row">
<label class="item-title">是否允许默写模式下显示提示</label>
<div class="wrapper">
<el-switch v-model="store.setting.value1"
<el-switch v-model="store.setting.allowWordTip"
inline-prompt
active-text=""
inactive-text=""
@@ -181,7 +207,7 @@ const emit = defineEmits([
</div>
</div>
<div class="desc">
开启后可以通过鼠标 hover 单词显示正确答案
开启后可以通过鼠标 hover 单词或者按 Esc键 显示正确答案
</div>
<div class="line"></div>
<div class="row">
@@ -190,15 +216,21 @@ const emit = defineEmits([
<div class="row">
<label class="sut-title">外语字体</label>
<div class="wrapper">
<el-slider v-model="store.setting.value2"/>
<span>{{ store.setting.value2 }}px</span>
<el-slider
:min="10"
:max="100"
v-model="store.setting.foreignLanguageFontSize"/>
<span>{{ store.setting.foreignLanguageFontSize }}</span>
</div>
</div>
<div class="row">
<label class="sut-title">中文字体</label>
<div class="wrapper">
<el-slider v-model="store.setting.value2"/>
<span>{{ store.setting.value2 }}px</span>
<el-slider
:min="10"
:max="100"
v-model="store.setting.translateLanguageFontSize"/>
<span>{{ store.setting.translateLanguageFontSize }}</span>
</div>
</div>
@@ -209,7 +241,12 @@ const emit = defineEmits([
<div class="row">
<label class="sut-title">切换下一个单词时间</label>
<div class="wrapper">
<span>{{ store.setting.value2 }}毫秒</span>
<el-input-number v-model="store.setting.waitTimeForChangeWord"
:min="6"
:max="100"
type="number"
/>
<span>毫秒</span>
</div>
</div>
</div>

View File

@@ -25,6 +25,10 @@ const TranslateEngine = [
{value: 'baidu', label: '百度'},
{value: 'youdao', label: '有道'},
]
function save(){
}
</script>
<template>
@@ -55,11 +59,11 @@ const TranslateEngine = [
<div class="mini-row">
<label class="item-title">翻译类型</label>
<el-radio-group v-model="translateType" size="small">
<el-radio-button :label="0">本地翻译</el-radio-button>
<el-radio-button :label="1">网络翻译</el-radio-button>
<el-radio-button :label="1">本地翻译</el-radio-button>
<el-radio-button :label="0">网络翻译</el-radio-button>
</el-radio-group>
</div>
<div class="mini-row">
<div class="mini-row" v-if="translateType">
<label class="item-title">本地翻译</label>
<div class="wrapper">
<Icon icon="mingcute:edit-line"
@@ -67,7 +71,7 @@ const TranslateEngine = [
/>
</div>
</div>
<div class="mini-row">
<div class="mini-row" v-else>
<label class="item-title">网络翻译</label>
<div class="wrapper">
<el-select v-model="networkTranslateEngine" class="m-2" placeholder="Select" size="small">
@@ -81,8 +85,8 @@ const TranslateEngine = [
</div>
</div>
<div class="footer">
<BaseButton>取消</BaseButton>
<BaseButton>确定</BaseButton>
<BaseButton size="small" @click="show = false">取消</BaseButton>
<BaseButton size="small" @click="save">确定</BaseButton>
</div>
</MiniModal>
</div>
@@ -99,5 +103,6 @@ const TranslateEngine = [
margin-top: 10rem;
display: flex;
justify-content: flex-end;
gap: 10rem;
}
</style>

View File

@@ -30,9 +30,9 @@ function toggle() {
</Tooltip>
<MiniModal v-model="show">
<div class="mini-row">
<label class="item-title">按键</label>
<label class="item-title">单词发</label>
<div class="wrapper">
<el-switch v-model="store.setting.keybroadVolume"
<el-switch v-model="store.setting.wordSound"
inline-prompt
active-text=""
inactive-text=""
@@ -42,7 +42,17 @@ function toggle() {
<div class="mini-row">
<label class="item-title">按键音</label>
<div class="wrapper">
<el-switch v-model="store.setting.effectVolume"
<el-switch v-model="store.setting.keyboardSound"
inline-prompt
active-text=""
inactive-text=""
/>
</div>
</div>
<div class="mini-row">
<label class="item-title">效果音</label>
<div class="wrapper">
<el-switch v-model="store.setting.effectSound"
inline-prompt
active-text=""
inactive-text=""