mind-map/web/src/pages/Edit/components/NavigatorToolbar.vue
2025-03-14 09:26:30 +08:00

277 lines
6.4 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="navigatorContainer customScrollbar" :class="{ isDark: isDark }">
<div class="item">
<el-select
v-model="lang"
size="small"
style="width: 100px"
@change="onLangChange"
>
<el-option
v-for="item in langList"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</div>
<div class="item">
<el-tooltip
effect="dark"
:content="$t('navigatorToolbar.backToRoot')"
placement="top"
>
<div class="btn iconfont icondingwei" @click="backToRoot"></div>
</el-tooltip>
</div>
<div class="item">
<div class="btn iconfont iconsousuo" @click="showSearch"></div>
</div>
<div class="item">
<MouseAction :isDark="isDark" :mindMap="mindMap"></MouseAction>
</div>
<div class="item">
<el-tooltip
effect="dark"
:content="
openMiniMap
? $t('navigatorToolbar.closeMiniMap')
: $t('navigatorToolbar.openMiniMap')
"
placement="top"
>
<div class="btn iconfont icondaohang1" @click="toggleMiniMap"></div>
</el-tooltip>
</div>
<div class="item">
<!-- <el-switch
v-model="isReadonly"
:active-text="$t('navigatorToolbar.readonly')"
:inactive-text="$t('navigatorToolbar.edit')"
@change="readonlyChange"
>
</el-switch> -->
<el-tooltip
effect="dark"
:content="
isReadonly
? $t('navigatorToolbar.edit')
: $t('navigatorToolbar.readonly')
"
placement="top"
>
<div
class="btn iconfont"
:class="[isReadonly ? 'iconyanjing' : 'iconbianji1']"
@click="readonlyChange"
></div>
</el-tooltip>
</div>
<div class="item">
<Fullscreen :isDark="isDark" :mindMap="mindMap"></Fullscreen>
</div>
<div class="item">
<Scale :isDark="isDark" :mindMap="mindMap"></Scale>
</div>
<div class="item">
<div
class="btn iconfont"
:class="[isDark ? 'iconmoon_line' : 'iconlieri']"
@click="toggleDark"
></div>
</div>
<div class="item">
<el-tooltip
effect="dark"
:content="$t('navigatorToolbar.changeSourceCodeEdit')"
placement="top"
>
<div class="btn iconfont iconyuanma" @click="openSourceCodeEdit"></div>
</el-tooltip>
</div>
<div class="item">
<Demonstrate :isDark="isDark" :mindMap="mindMap"></Demonstrate>
</div>
<div class="item">
<el-dropdown @command="handleCommand">
<div class="btn iconfont iconbangzhu"></div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="client">下载客户端</el-dropdown-item>
<el-dropdown-item command="github">Github</el-dropdown-item>
<el-dropdown-item command="site">官方网站</el-dropdown-item>
<el-dropdown-item command="issue">意见反馈</el-dropdown-item>
<el-dropdown-item disabled>当前v{{ version }}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import Scale from './Scale.vue'
import Fullscreen from './Fullscreen.vue'
import MouseAction from './MouseAction.vue'
import { langList } from '@/config'
import i18n from '@/i18n'
import { storeLang, getLang } from '@/api'
import { mapState, mapMutations } from 'vuex'
import pkg from 'simple-mind-map/package.json'
import Demonstrate from './Demonstrate.vue'
// 导航器工具栏
export default {
components: {
Scale,
Fullscreen,
MouseAction,
Demonstrate
},
props: {
mindMap: {
type: Object
}
},
data() {
return {
version: pkg.version,
langList,
lang: '',
openMiniMap: false
}
},
computed: {
...mapState({
isReadonly: state => state.isReadonly,
isDark: state => state.localConfig.isDark
})
},
created() {
this.lang = getLang()
},
methods: {
...mapMutations(['setLocalConfig', 'setIsReadonly', 'setIsSourceCodeEdit']),
readonlyChange() {
this.setIsReadonly(!this.isReadonly)
this.mindMap.setMode(this.isReadonly ? 'readonly' : 'edit')
},
toggleMiniMap() {
this.openMiniMap = !this.openMiniMap
this.$bus.$emit('toggle_mini_map', this.openMiniMap)
},
onLangChange(lang) {
i18n.locale = lang
storeLang(lang)
this.$bus.$emit('lang_change')
},
showSearch() {
this.$bus.$emit('show_search')
},
toggleDark() {
this.setLocalConfig({
isDark: !this.isDark
})
},
handleCommand(command) {
let url = ''
switch (command) {
case 'github':
url = 'https://github.com/wanglin2/mind-map'
break
case 'helpDoc':
url = 'https://wanglin2.github.io/mind-map-docs/help/help1.html'
break
case 'devDoc':
url =
'https://wanglin2.github.io/mind-map-docs/start/introduction.html'
break
case 'site':
url = 'https://wanglin2.github.io/mind-map-docs/'
break
case 'issue':
url = 'https://github.com/wanglin2/mind-map/issues/new'
break
case 'client':
url = 'https://pan.baidu.com/s/1huasEbKsGNH2Af68dvWiOg?pwd=3bp3'
default:
break
}
const a = document.createElement('a')
a.href = url
a.target = '_blank'
a.click()
},
backToRoot() {
this.mindMap.renderer.setRootNodeCenter()
},
openSourceCodeEdit() {
this.setIsSourceCodeEdit(true)
}
}
}
</script>
<style lang="less" scoped>
.navigatorContainer {
padding: 0 12px;
position: fixed;
right: 20px;
bottom: 20px;
background: hsla(0, 0%, 100%, 0.8);
border-radius: 5px;
opacity: 0.8;
height: 44px;
font-size: 12px;
display: flex;
align-items: center;
&.isDark {
background: #262a2e;
.item {
a {
color: hsla(0, 0%, 100%, 0.6);
}
.btn {
color: hsla(0, 0%, 100%, 0.6);
}
}
}
.item {
margin-right: 20px;
&:last-of-type {
margin-right: 0;
}
a {
color: #303133;
text-decoration: none;
}
.btn {
cursor: pointer;
font-size: 18px;
}
}
}
@media screen and (max-width: 700px) {
.navigatorContainer {
left: 20px;
overflow-x: auto;
overflow-y: hidden;
height: 60px;
}
}
</style>