finish sidebar

This commit is contained in:
锦恢 2024-02-28 01:56:27 +08:00
parent b120bc39b7
commit b3f20fd55c
13 changed files with 224 additions and 52 deletions

View File

@ -1,27 +1,16 @@
:root {
--display-signal-info-height: 50px;
--signal-default-color: #4CAF50;
--main-color: #CB81DA;
}
html, body { html, body {
background-color: var(--background); background-color: var(--background);
color: var(--foreground); color: var(--foreground);
} }
.vcd-sidebar { body::-webkit-scrollbar {
position: absolute; width: 0;
top: 20px;
left: 0px;
background-color: var(--sidebar);
border: solid 1px var(--sidebar-border);
min-width: var(--sidebar-min-width);
}
.vcd-sidebar-item {
color: var(--sidebar-item-text);
}
.vcd-toolbar {
}
.vcd-render {
} }
* hr { * hr {
@ -70,7 +59,8 @@ html, body {
.el-select-dropdown { .el-select-dropdown {
min-width: 300px !important; min-width: 300px !important;
background-color: var(--sidebar); background-color: var(--sidebar);
border: 1px solid var(--main-color); border: 1.0px solid var(--main-color);
outline: none;
} }
.el-checkbox-button__inner { .el-checkbox-button__inner {

View File

@ -144,8 +144,6 @@
--color-orange: #ffab40; --color-orange: #ffab40;
--color-deepOrange: #ff6e40; --color-deepOrange: #ff6e40;
--main-color: #CB81DA;
/* Settings */ /* Settings */
--settings-action-background: var(--background); --settings-action-background: var(--background);
} }

View File

@ -1,11 +1,8 @@
<template> <template>
<div class="vcd-wrapper"> <div class="vcd-wrapper">
<!-- 左上角的 sidebar用于显示 --> <!-- 左上角的 sidebar用于显示 -->
<div class="vcd-sidebar"> <Sidebar></Sidebar>
<div class="vcd-sidebar-item">hello</div>
<div class="vcd-sidebar-item">hello</div>
<div class="vcd-sidebar-item">hello</div>
</div>
<!-- 工具栏 --> <!-- 工具栏 -->
<div class="vcd-toolbar"> <div class="vcd-toolbar">
@ -17,20 +14,21 @@
<!-- 显示当前信号树形关系 --> <!-- 显示当前信号树形关系 -->
<!-- 右侧工具合集 --> <!-- 右侧工具合集 -->
<RightNav :topModules="VcdInfo.topModules"></RightNav> <RightNav :topModules="VcdInfo.topModules"></RightNav>
</div> </div>
</template> </template>
<script> <script>
import { onMounted, reactive } from 'vue'; import { onMounted, reactive } from 'vue';
import { getVcdStream, readVcdFile } from '@/hook/utils'; import { getVcdStream, readVcdFile } from '@/hook/utils';
import { emitter, globalLookup } from '@/hook/global'; import { emitter, globalLookup, globalSetting } from '@/hook/global';
import Sidebar from '@/components/sidebar.vue';
import RightNav from '@/components/right-nav.vue'; import RightNav from '@/components/right-nav.vue';
export default { export default {
components: { components: {
RightNav RightNav,
Sidebar
}, },
setup() { setup() {
@ -50,6 +48,14 @@ export default {
document.body.style.setProperty('--el-fill-color-blank', 'var(--sidebar)'); document.body.style.setProperty('--el-fill-color-blank', 'var(--sidebar)');
document.body.style.setProperty('--el-fill-color-light', 'var(--vscode-button-hoverBackground)'); document.body.style.setProperty('--el-fill-color-light', 'var(--vscode-button-hoverBackground)');
document.body.style.setProperty('--el-switch-on-color', 'var(--main-color)'); document.body.style.setProperty('--el-switch-on-color', 'var(--main-color)');
document.body.style.setProperty('--el-border', 'var(--sidebar)');
document.body.style.setProperty('--el-border-color-light', 'var(--sidebar)');
document.body.style.setProperty('--el-border-color-lighter', 'var(--sidebar)');
document.body.style.setProperty('--el-bg-color-overlay', 'transplant');
// signal height
document.body.style.setProperty('--display-signal-info-height', globalSetting.displaySignalHeight + 'px');
const uint8array = await readVcdFile(); const uint8array = await readVcdFile();
@ -91,4 +97,5 @@ export default {
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
</style> </style>

View File

@ -34,6 +34,8 @@ import { reactive } from 'vue';
import TreeView from '@/components/treeview'; import TreeView from '@/components/treeview';
import Setting from '@/components/setting'; import Setting from '@/components/setting';
import About from '@/components/about'; import About from '@/components/about';
import { emitter } from '@/hook/global';
export default { export default {
name: 'right-nav', name: 'right-nav',
@ -71,6 +73,14 @@ export default {
} }
}); });
emitter.on('right-nav', index => {
if (controlPanel.currentIndex === index) {
controlPanel.currentIndex = -1;
} else {
controlPanel.currentIndex = index;
}
})
return { return {
props, props,
controlPanel controlPanel
@ -82,7 +92,7 @@ export default {
<style> <style>
.vcd-right-nav { .vcd-right-nav {
display: flex; display: flex;
position: absolute; position: fixed;
top: 0; top: 0;
right: 0; right: 0;
} }

View File

@ -3,10 +3,16 @@
<div class="setting-section"> <div class="setting-section">
<h2>{{ t('search-setting') }}</h2> <h2>{{ t('search-setting') }}</h2>
<div class="setting-option"> <div class="setting-option">
<span class="option-title">{{ t('case-sensitivity') }}</span> <span class="option-title">{{ t('search-case-sensitivity') }}</span>
<el-switch v-model="globalSetting.caseSensitivity" /> <el-switch v-model="globalSetting.caseSensitivity" size="large"/>
</div> </div>
<br>
<div class="setting-option">
<span class="option-title">{{ t('search-display-parent-only') }}</span>
<el-switch v-model="globalSetting.displayParentOnly" size="large"/>
</div>
<br> <br>
@ -26,7 +32,6 @@
<h2>{{ t('general-setting') }}</h2> <h2>{{ t('general-setting') }}</h2>
<div class="setting-option" style="width: 300px;"> <div class="setting-option" style="width: 300px;">
<span class="option-title">{{ t('language-setting') }}</span> <span class="option-title">{{ t('language-setting') }}</span>
<el-select name="language-setting" class="language-setting" v-model="locale"> <el-select name="language-setting" class="language-setting" v-model="locale">
<el-option <el-option
v-for="option in languageSetting.options" v-for="option in languageSetting.options"
@ -36,7 +41,16 @@
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
</div>
<hr>
<div class="setting-section">
<h2>{{ t('appearance-setting') }}</h2>
<div class="setting-option">
<span class="option-title">{{ t('display-wave-height') }}</span>
<el-input-number v-model="globalSetting.displaySignalHeight" :min="1" :max="100" @change="safeModifySignalTrackHeight" size="large"/>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -45,6 +59,7 @@
import { reactive } from 'vue'; import { reactive } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { globalSetting } from '@/hook/global'; import { globalSetting } from '@/hook/global';
import { debounceWrapper } from '@/hook/utils';
export default { export default {
name: 'dide-setting', name: 'dide-setting',
@ -64,10 +79,18 @@ export default {
] ]
}); });
function modifySignalTrackHeight() {
document.body.style.setProperty('--display-signal-info-height', globalSetting.displaySignalHeight + 'px');
}
const safeModifySignalTrackHeight = debounceWrapper(modifySignalTrackHeight, 200);
return { return {
t, t,
languageSetting, languageSetting,
globalSetting, globalSetting,
safeModifySignalTrackHeight,
locale locale
} }
} }

118
src/components/sidebar.vue Normal file
View File

@ -0,0 +1,118 @@
<template>
<div class="vcd-sidebar-wrapper">
<div class="display-signal-wrapper">
<div class="display-signal-item"
v-for="(signal, index) in globalLookup.currentWires" :key="index">
<div class="signal-color-vendor">
<span class="iconfont icon-wave-square"></span>
</div>
<div class="signal-info">
{{ signal.name }}
</div>
<div>
</div>
</div>
</div>
<div class="add-signal-button" @click="addSignal">
<span class="iconfont icon-Collections"></span>
</div>
</div>
</template>
<script>
/* eslint-disable */
import { reactive } from 'vue';
import { useI18n } from 'vue-i18n';
import { emitter, globalLookup } from '@/hook/global';
export default {
name: 'sidebar',
setup() {
const { t } = useI18n();
function addSignal() {
emitter.emit('right-nav', 0);
}
return {
t,
globalLookup,
addSignal
}
}
}
</script>
<style>
.vcd-sidebar-wrapper {
position: absolute;
top: 0px;
left: 0px;
}
.add-signal-button {
margin: 10px;
padding: 10px 25px;
background-color: var(--color-deepPurple);
border-radius: 0 0 1.5em 1.5em;
color: var(--sidebar-item-text);
cursor: pointer;
display: flex;
justify-content: space-around;
}
.add-signal-button > span {
font-size: 30px;
}
.display-signal-wrapper {
margin: 10px;
padding: 10px;
background-color: var(--sidebar);
border: solid 1px var(--sidebar-border);
min-width: var(--sidebar-min-width);
min-height: 50vh;
box-shadow: 0 0 15px 1px rgb(16, 16, 16);
}
.display-signal-item {
border-radius: .5em;
background-color: var(--background);
margin: 5px;
height: var(--display-signal-info-height);
display: flex;
}
.display-signal-item::selection {
background-color: none;
}
.signal-color-vendor {
width: 30px;
height: 100%;
margin: 0 10px 0 0;
border-radius: .4em 0 0 .4em;
background-color: #7CA532;
display: flex;
justify-content: space-around;
align-items: center;
}
.signal-color-vendor > span {
font-size: 15px;
color: var(--background);
}
.signal-info {
display: flex;
justify-content: space-around;
align-items: center;
}
.signal-info::selection {
background: none;
cursor: none;
}
</style>

View File

@ -71,12 +71,14 @@ export default {
border-radius: 1.0em; border-radius: 1.0em;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
transition: height .5s ease-in-out;
} }
.vcd-module-wrapper { .vcd-module-wrapper {
flex: 1; flex: 1;
display: flex; display: flex;
overflow: scroll; overflow: scroll;
transition: flex .5s ease-in-out;
} }
</style> </style>

View File

@ -53,13 +53,15 @@ export default {
const stacks = [ { name: '', body: globalLookup.topModules } ]; const stacks = [ { name: '', body: globalLookup.topModules } ];
const searchRule = new Set(globalSetting.searchScope); const searchRule = new Set(globalSetting.searchScope);
const caseSensitivity = globalSetting.caseSensitivity; const caseSensitivity = globalSetting.caseSensitivity;
const displayParentOnly = globalSetting.displayParentOnly;
while (stacks.length > 0) { while (stacks.length > 0) {
const p = stacks.pop(); const p = stacks.pop();
if (p.body && p.body.length) { if (p.body && p.body.length) {
p.body.forEach(mod => stacks.push(mod)); p.body.forEach(mod => stacks.push(mod));
} }
const searchResultItem = makeSearchResultItem(searchString, p, searchRule, caseSensitivity); const searchResultItem = makeSearchResultItem(searchString, p, searchRule, caseSensitivity, displayParentOnly);
if (searchResultItem) { if (searchResultItem) {
searchManage.searchResult.push(searchResultItem); searchManage.searchResult.push(searchResultItem);
} }
@ -95,6 +97,7 @@ export default {
.tree-view-search-wrapper { .tree-view-search-wrapper {
min-height: 30px; min-height: 30px;
padding: 10px; padding: 10px;
transition: flex .5s ease-in-out;
} }
.search-result { .search-result {

View File

@ -9,8 +9,8 @@
:class="globalLookup.currentWires.has(signal) ? 'vcd-treeview-selected' : ''"> :class="globalLookup.currentWires.has(signal) ? 'vcd-treeview-selected' : ''">
<div><span class="iconfont icon-wave-square"></span>&ensp;{{ signal.name }}</div> <div><span class="iconfont icon-wave-square"></span>&ensp;{{ signal.name }}</div>
<div> <div>
<div :class="signal.caption ? 'vcd-signal-signal-caption' : ''"> <div :class="signal.size > 1 ? 'vcd-signal-signal-caption' : ''">
{{ signal.caption }} {{ makeSignalCaption(signal) }}
</div> </div>
</div> </div>
</div> </div>
@ -38,14 +38,12 @@ export default {
emitter.on('tree-view', sendWires => { emitter.on('tree-view', sendWires => {
signals.content.length = 0; signals.content.length = 0;
for (const signal of sendWires) { signals.content = sendWires;
const caption = signal.size === 1 ? '' : `${signal.size - 1}:0`;
signals.content.push({
name: signal.name,
caption
}); });
function makeSignalCaption(signal) {
return signal.size === 1 ? '' : `${signal.size - 1}:0`;
} }
});
function clickItem(signal) { function clickItem(signal) {
if (globalLookup.currentWires.has(signal)) { if (globalLookup.currentWires.has(signal)) {
@ -59,6 +57,7 @@ export default {
signals, signals,
clickItem, clickItem,
globalLookup, globalLookup,
makeSignalCaption,
t t
} }
} }
@ -67,7 +66,7 @@ export default {
<style> <style>
.icon-wave-square { .icon-wave-square {
color: #00F600; color: var(--signal-default-color);
} }
.vcd-signal-signals-display { .vcd-signal-signals-display {

View File

@ -27,6 +27,8 @@ const globalLookup = reactive({
const globalSetting = reactive({ const globalSetting = reactive({
caseSensitivity: false, caseSensitivity: false,
displayParentOnly: false,
displaySignalHeight: 50,
searchMode: 'so', // so, mo, sm searchMode: 'so', // so, mo, sm
searchScope: ['wire', 'reg'] searchScope: ['wire', 'reg']
}) })

View File

@ -51,9 +51,10 @@ function debounceWrapper(fn, delay) {
* }} module * }} module
* @param { Set<string> } searchScope * @param { Set<string> } searchScope
* @param { boolean } caseSensitivity * @param { boolean } caseSensitivity
* @param { boolean } displayParentOnly
* @returns { { htmlString: string, module } | null } * @returns { { htmlString: string, module } | null }
*/ */
function makeSearchResultItem(searchString, module, searchScope, caseSensitivity) { function makeSearchResultItem(searchString, module, searchScope, caseSensitivity, displayParentOnly) {
if (searchScope.has(module.type)) { if (searchScope.has(module.type)) {
let pattern = module.name; let pattern = module.name;
if (!caseSensitivity) { if (!caseSensitivity) {
@ -62,13 +63,18 @@ function makeSearchResultItem(searchString, module, searchScope, caseSensitivity
} }
if (pattern.includes(searchString)) { if (pattern.includes(searchString)) {
let p = module; let p = module;
const deps = []; const deps = [];
while (p) { while (p) {
if (p.name && p.type) { if (p.name && p.type) {
deps.push(p); deps.push(p);
} }
p = p.parent; p = p.parent;
if (displayParentOnly && deps.length == 2) {
break;
} }
}
let htmlString = ''; let htmlString = '';
for (let i = deps.length - 1; i >= 0; -- i) { for (let i = deps.length - 1; i >= 0; -- i) {
const mod = deps[i]; const mod = deps[i];

View File

@ -3,15 +3,22 @@
"signal": "Signals", "signal": "Signals",
"search-signal": "Search Signal", "search-signal": "Search Signal",
"language-setting": "Language", "language-setting": "Language",
"search-setting": "Search", "search-setting": "Search",
"case-sensitivity": "case sensitivity", "search-case-sensitivity": "Case Sensitivity",
"search-mode": "search mode", "search-mode": "search mode",
"search-scope": "search scope", "search-scope": "Search Scope",
"search-display-parent-only": "Display Parent Module Only",
"search-nothing": "Find Nothing",
"signal-only": "Signal Only", "signal-only": "Signal Only",
"module-only": "Module Only", "module-only": "Module Only",
"signal-module": "Signal + Module", "signal-module": "Signal + Module",
"general-setting": "General", "general-setting": "General",
"appearance-setting": "Appearance",
"display-wave-height": "Height of Wave Track",
"current-version": "current version", "current-version": "current version",
"search-nothing": "find nothing",
"copyright": "The copyright of this software belongs to <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> project team. Welcome to <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>." "copyright": "The copyright of this software belongs to <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> project team. Welcome to <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>."
} }

View File

@ -3,15 +3,22 @@
"signal": "信号", "signal": "信号",
"search-signal": "搜索信号", "search-signal": "搜索信号",
"language-setting": "语言", "language-setting": "语言",
"search-setting": "搜索", "search-setting": "搜索",
"case-sensitivity": "区分大小写", "search-case-sensitivity": "区分大小写",
"search-mode": "搜索模式", "search-mode": "搜索模式",
"search-scope": "搜索范围", "search-scope": "搜索范围",
"search-display-parent-only": "只展示父模块",
"search-nothing": "没有找到任何符号",
"signal-only": "信号", "signal-only": "信号",
"module-only": "模块", "module-only": "模块",
"signal-module": "信号 + 模块", "signal-module": "信号 + 模块",
"general-setting": "通用", "general-setting": "通用",
"appearance-setting": "外观",
"display-wave-height": "波形轨道的高度",
"current-version": "当前版本", "current-version": "当前版本",
"search-nothing": "没有找到任何符号",
"copyright": "本软件版权归 <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> 项目组所有,欢迎 <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>。" "copyright": "本软件版权归 <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> 项目组所有,欢迎 <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>。"
} }