feat: monaco主题移至全局配置

This commit is contained in:
meilin.huang
2022-11-05 22:18:59 +08:00
parent 1be2cad78e
commit fa37937410
5 changed files with 39 additions and 31 deletions

View File

@@ -1,5 +1,5 @@
<template>
<div class="monaco-editor">
<div class="monaco-editor" style="border: 1px solid #ccc;">
<div ref="monacoTextarea" :style="{ height: height }"></div>
<el-select v-if="canChangeMode" class="code-mode-select" v-model="languageMode" @change="changeLanguage">
<el-option v-for="mode in languages" :key="mode.value" :label="mode.label" :value="mode.value"> </el-option>
@@ -23,7 +23,6 @@ import { editor } from 'monaco-editor';
// import Dracula from 'monaco-themes/themes/Dracula.json'
import SolarizedLight from 'monaco-themes/themes/Solarized-light.json'
import { language as shellLan } from 'monaco-editor/esm/vs/basic-languages/shell/shell.js';
import { ElOption, ElSelect } from 'element-plus';
const props = defineProps({
@@ -138,14 +137,14 @@ const {
onMounted(() => {
state.languageMode = props.language;
initMonacoEditor();
initMonacoEditorIns();
setEditorValue(props.modelValue);
registerCompletionItemProvider();
});
onBeforeUnmount(() => {
if (monacoEditor) {
monacoEditor.dispose();
if (monacoEditorIns) {
monacoEditorIns.dispose();
}
if (completionItemProvider) {
completionItemProvider.dispose();
@@ -153,9 +152,9 @@ onBeforeUnmount(() => {
})
watch(() => props.modelValue, (newValue: any) => {
if (!monacoEditor.hasTextFocus()) {
if (!monacoEditorIns.hasTextFocus()) {
state.languageMode = props.language
monacoEditor?.setValue(newValue)
monacoEditorIns?.setValue(newValue)
changeLanguage(state.languageMode)
}
})
@@ -163,7 +162,7 @@ watch(() => props.modelValue, (newValue: any) => {
const monacoTextarea: any = ref(null);
let monacoEditor: editor.IStandaloneCodeEditor = null;
let monacoEditorIns: editor.IStandaloneCodeEditor = null;
let completionItemProvider: any = null;
self.MonacoEnvironment = {
@@ -172,17 +171,19 @@ self.MonacoEnvironment = {
}
};
const initMonacoEditor = () => {
const initMonacoEditorIns = () => {
console.log('初始化monaco编辑器')
// options参数参考 https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneEditorConstructionOptions.html#language
// 初始化一些主题
monaco.editor.defineTheme('SolarizedLight', SolarizedLight);
options.language = state.languageMode;
monacoEditor = monaco.editor.create(monacoTextarea.value, Object.assign(options, props.options));
// 从localStorage中获取通过store可能存在父子组件都使用store报错
options.theme = JSON.parse(localStorage.getItem('themeConfig') as string).editorTheme || 'vs';
monacoEditorIns = monaco.editor.create(monacoTextarea.value, Object.assign(options, props.options));
// 监听内容改变,双向绑定
monacoEditor.onDidChangeModelContent(() => {
emit('update:modelValue', monacoEditor.getModel().getValue());
monacoEditorIns.onDidChangeModelContent(() => {
emit('update:modelValue', monacoEditorIns.getModel().getValue());
})
// 动态设置主题
@@ -192,11 +193,11 @@ const initMonacoEditor = () => {
const changeLanguage = (value: any) => {
console.log('change lan');
// 获取当前的文档模型
let oldModel = monacoEditor.getModel()
let oldModel = monacoEditorIns.getModel()
// 创建一个新的文档模型
let newModel = monaco.editor.createModel(oldModel.getValue(), value)
// 设置成新的
monacoEditor.setModel(newModel)
monacoEditorIns.setModel(newModel)
// 销毁旧的模型
if (oldModel) {
oldModel.dispose()
@@ -206,7 +207,7 @@ const changeLanguage = (value: any) => {
}
const setEditorValue = (value: any) => {
monacoEditor.getModel().setValue(value)
monacoEditorIns.getModel().setValue(value)
}
/**

View File

@@ -53,6 +53,7 @@ export interface ThemeConfigState {
terminalCursor: string;
terminalFontSize: number;
terminalFontWeight: string;
editorTheme: string;
};
}

View File

@@ -115,6 +115,9 @@ const themeConfigModule: Module<ThemeConfigState, RootStateTypes> = {
terminalFontSize: 15,
terminalFontWeight: 'normal',
// 编辑器主题
editorTheme: 'vs',
/* 后端控制路由
------------------------------- */

View File

@@ -50,6 +50,18 @@
</div>
</div>
<el-divider content-position="left">monaco editor</el-divider>
<div class="layout-breadcrumb-seting-bar-flex">
<div class="layout-breadcrumb-seting-bar-flex-label">主题</div>
<div class="layout-breadcrumb-seting-bar-flex-value">
<el-select @change="setLocalThemeConfig" v-model="getThemeConfig.editorTheme" size="small" style="width: 130px">
<el-option label="vs" value="vs"> </el-option>
<el-option label="vs-dark" value="vs-dark"> </el-option>
<el-option label="SolarizedLight" value="SolarizedLight"> </el-option>
</el-select>
</div>
</div>
<!-- 全局主题 -->
<el-divider content-position="left">全局主题</el-divider>
<div class="layout-breadcrumb-seting-bar-flex">

View File

@@ -87,14 +87,6 @@
</div>
<div style="float: right" class="fl">
<el-select v-model="monacoOptions.theme" placeholder="切换编辑器主题"
@change="changeEditorTheme" filterable allow-create default-first-option
size="small" class="mr10">
<el-option v-for="item in monacoOptions.defaultThemes as string" :key="item"
:label="item" :value="item">
{{ item }}
</el-option>
</el-select>
<el-select v-model="sqlName" placeholder="选择or输入SQL模板名" @change="changeSqlTemplate"
filterable allow-create default-first-option size="small" class="mr10">
<el-option v-for="item in sqlNames as any" :key="item" :label="item.database"
@@ -254,7 +246,7 @@
</template>
<script lang="ts" setup>
import { onMounted, toRefs, reactive, ref, watch } from 'vue';
import { onMounted, computed, toRefs, reactive, ref, watch } from 'vue';
import { dbApi } from './api';
import { format as sqlFormatter } from 'sql-formatter';
@@ -342,8 +334,6 @@ const state = reactive({
height: '',
tableMaxHeight: 250,
dbTables: {},
theme: 'vs',
defaultThemes: ['SolarizedLight', 'vs', 'vs-dark'],
}
});
const {
@@ -367,6 +357,11 @@ const {
monacoOptions
} = toRefs(state)
// 获取布局配置信息
const getThemeConfig: any = computed(() => {
return store.state.themeConfig.themeConfig;
});
let monacoEditor = {} as editor.IStandaloneCodeEditor;
let completionItemProvider: any = null;
@@ -382,7 +377,7 @@ const initMonacoEditor = () => {
monaco.editor.defineTheme('SolarizedLight', SolarizedLight);
monacoEditor = monaco.editor.create(monacoTextarea.value, {
language: 'sql',
theme: state.monacoOptions.theme,
theme: getThemeConfig.value.editorTheme,
automaticLayout: true, //自适应宽高布局
folding: false,
roundedSelection: false, // 禁用选择文本背景的圆角
@@ -1179,10 +1174,6 @@ const changeSqlTemplate = () => {
getUserSql();
};
const changeEditorTheme = () => {
monaco.editor.setTheme(state.monacoOptions.theme);
};
/**
* 获取用户保存的sql模板内容
*/