17 changed files with 185 additions and 18 deletions
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,4 @@ |
|||||||
|
export const title = '系统设置'; |
||||||
|
export const action = ['保存设置', '取消']; |
||||||
|
export const music = ['背景音乐', '完全关闭', '最小音量', '正常音量']; |
||||||
|
export const battle = ['战斗日志', '显示', '隐藏']; |
@ -0,0 +1,134 @@ |
|||||||
|
<template> |
||||||
|
<Tooltip :infos="[t('title')]" width="10rem"> |
||||||
|
<img class="menu-img" :src="menu_icons.settings" @click="showMenu"> |
||||||
|
</Tooltip> |
||||||
|
|
||||||
|
<Dialog :title="t('title')" v-model="show" top="4rem" :left="state.mobile ? '4%' : '8%'" padding="0.7rem" :z="49" |
||||||
|
@close="state.curMenu = null"> |
||||||
|
<div class="setting"> |
||||||
|
<div class="item"> |
||||||
|
<div class="label">{{ t('music.0') }}:</div> |
||||||
|
<div class="options"> |
||||||
|
<input type="radio" id="none" :value="0" v-model="settings.music"> {{ t('music.1') }} |
||||||
|
<input type="radio" id="min" :value="0.01" v-model="settings.music"> {{ t('music.2') }} |
||||||
|
<input type="radio" id="normal" :value="0.2" v-model="settings.music"> {{ t('music.3') }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="item"> |
||||||
|
<div class="label">{{ t('battle.0') }}:</div> |
||||||
|
<div class="options"> |
||||||
|
<input type="radio" :value="1" v-model="settings.battle"> {{ t('battle.1') }} |
||||||
|
<input type="radio" :value="0" v-model="settings.battle"> {{ t('battle.2') }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="footer"> |
||||||
|
<button class="button" @click="saveSettings">{{ t('action.0') }}</button> |
||||||
|
<button class="button" @click="showMenu">{{ t('action.1') }}</button> |
||||||
|
</div> |
||||||
|
</Dialog> |
||||||
|
|
||||||
|
</template> |
||||||
|
|
||||||
|
<script lang="ts" setup> |
||||||
|
import { useStore } from "vuex"; |
||||||
|
import { computed, onBeforeUnmount, onMounted, reactive, ref } from "vue"; |
||||||
|
import { Tooltip, Dialog } from "@/components" |
||||||
|
import { menu_icons } from "@/config"; |
||||||
|
import { createt } from "@/config/i18n"; |
||||||
|
import { store_name_config, key_name_config, getFromStore, insertToStore } from "@/tool"; |
||||||
|
|
||||||
|
const t = createt('setting.'); |
||||||
|
const { state, commit, dispatch } = useStore(); |
||||||
|
const show = computed(() => { |
||||||
|
return state.curMenu == 'setting'; |
||||||
|
}); |
||||||
|
const settings = ref({ |
||||||
|
type: 'setting', |
||||||
|
music: 0.01, |
||||||
|
battle: 1 |
||||||
|
}) |
||||||
|
|
||||||
|
const saveSettings = () => { |
||||||
|
insertToStore(store_name_config, settings.value); |
||||||
|
set(); |
||||||
|
showMenu(); |
||||||
|
} |
||||||
|
|
||||||
|
const set = () => { |
||||||
|
dispatch('set_music_volume', settings.value.music); |
||||||
|
state.battleLog = settings.value.battle; |
||||||
|
} |
||||||
|
|
||||||
|
const readSetting = () => { |
||||||
|
getFromStore(store_name_config, settings.value.type).then((rsp: any) => { |
||||||
|
if (rsp) { |
||||||
|
settings.value = rsp |
||||||
|
set(); |
||||||
|
}; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
const showMenu = () => { |
||||||
|
state.curMenu = show.value ? null : 'setting'; |
||||||
|
} |
||||||
|
|
||||||
|
const keydown = (e) => { |
||||||
|
if (state.curMenu != null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
if (e.keyCode == 27 && !e.ctrlKey) { |
||||||
|
setTimeout(() => { |
||||||
|
showMenu(); |
||||||
|
}, 50); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
onMounted(() => { |
||||||
|
document.addEventListener('keydown', keydown, true) |
||||||
|
readSetting(); |
||||||
|
}); |
||||||
|
onBeforeUnmount(() => { |
||||||
|
document.removeEventListener('keydown', keydown) |
||||||
|
}) |
||||||
|
|
||||||
|
</script> |
||||||
|
<style lang="scss" scoped> |
||||||
|
.setting { |
||||||
|
width: 32rem; |
||||||
|
font-size: 1rem; |
||||||
|
padding-top: 1rem; |
||||||
|
|
||||||
|
.label { |
||||||
|
float: left; |
||||||
|
width: 20%; |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
|
||||||
|
.options { |
||||||
|
float: right; |
||||||
|
width: 78%; |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
|
||||||
|
.item { |
||||||
|
height: 2rem; |
||||||
|
} |
||||||
|
|
||||||
|
.footer { |
||||||
|
padding-top: 1rem; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@media only screen and (max-width: 768px) { |
||||||
|
.setting { |
||||||
|
width: 23.5rem; |
||||||
|
margin-top: 0.5rem; |
||||||
|
|
||||||
|
.footer { |
||||||
|
margin-top: 0.5rem; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
Loading…
Reference in new issue