This commit is contained in:
锦恢 2024-12-18 19:28:31 +08:00
parent 3499ef52cc
commit 0ace90c63c
21 changed files with 553 additions and 79 deletions

View File

@ -12,22 +12,15 @@ python scripts/vscode-package.py
``` ```
resources resources
- dide-viewer - dide-netlist
- view - view
- css - css
- js - js
- worker.js - worker.js
- index.html - index.html
- vcd.wasm
- vcd.css
- ... - ...
- index.js - index.js
``` ```
--- ---
触发 view 修改的地方
- src\components\treeview\signals.vue
-

6
package-lock.json generated
View File

@ -10,6 +10,7 @@
"dependencies": { "dependencies": {
"core-js": "^3.8.3", "core-js": "^3.8.3",
"element-plus": "^2.9.1", "element-plus": "^2.9.1",
"mitt": "^3.0.1",
"vue": "^3.2.13", "vue": "^3.2.13",
"vue-i18n": "10.0.5" "vue-i18n": "10.0.5"
}, },
@ -7753,6 +7754,11 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true "dev": true
}, },
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
},
"node_modules/mkdirp": { "node_modules/mkdirp": {
"version": "0.5.6", "version": "0.5.6",
"resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",

View File

@ -9,9 +9,10 @@
}, },
"dependencies": { "dependencies": {
"core-js": "^3.8.3", "core-js": "^3.8.3",
"element-plus": "^2.9.1",
"mitt": "^3.0.1",
"vue": "^3.2.13", "vue": "^3.2.13",
"vue-i18n": "10.0.5", "vue-i18n": "10.0.5"
"element-plus": "^2.9.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.12.16", "@babel/core": "^7.12.16",
@ -34,7 +35,11 @@
"parserOptions": { "parserOptions": {
"parser": "@babel/eslint-parser" "parser": "@babel/eslint-parser"
}, },
"rules": {} "rules": {
"no-unused-vars": "off",
"no-undef": "off",
"no-redeclare": "off"
}
}, },
"browserslist": [ "browserslist": [
"> 1%", "> 1%",

View File

@ -7,6 +7,10 @@
<meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>icon.png"> <link rel="icon" href="<%= BASE_URL %>icon.png">
<title>Netlist</title> <title>Netlist</title>
<link rel="stylesheet" href="default-dark.css">
<link rel="stylesheet" href="vscode.css">
<link rel="stylesheet" href="iconfont.css">
<link rel="stylesheet" href="animation.css">
</head> </head>
<body> <body>

128
public/netlist.css Normal file
View File

@ -0,0 +1,128 @@
:root {
--display-signal-info-height: 50px;
--signal-default-color: #4CAF50;
--main-color: #CB81DA;
--main-dark-color: #2D323B;
--main-light-color: var(--main-color);
--sidebar-width: 330px;
--right-nav-width: 50px;
--time-scale-height: 30px;
--sidebar-padding: 10px;
--sidebar-item-margin: 5px;
--toolbar-height: 50px;
--toolbar-item-height: 32px;
/* css 动画属性 */
--animation-7s: .7s cubic-bezier(0.23,1,0.32,1);
--animation-5s: .5s cubic-bezier(0.23,1,0.32,1);
--animation-3s: .35s cubic-bezier(0.23,1,0.32,1);
--gray-box-shadow-0: 0 0 8px 3px rgba(182, 181, 182, 0.9);
--gray-box-shadow-1: 0 0 5px 1px rgba(16, 16, 16, 0.5);
}
@font-face {
font-family: "Cascadia code";
src: url("./CascadiaCode.woff2");
}
html, body {
background-color: var(--background);
color: var(--foreground);
overflow: hidden;
}
body::-webkit-scrollbar {
width: 0;
}
* hr {
border: none;
background-color: var(--vscode-focusBorder);
height: 2px;
width: 95%;
}
/*
::-webkit-scrollbar {
width: 12px;
}
::-webkit-scrollbar-track {
background: var(--sidebar);
}
::-webkit-scrollbar-thumb {
background: var(--scrollbar-background);
border-radius: .3em;
}
::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-hover);
border-radius: .3em;
}
::-webkit-scrollbar-thumb:active {
background: var(--scrollbar-active);
border-radius: .3em;
}
::-webkit-scrollbar-button {
height: 0;
width: 0;
}
::-webkit-scrollbar-corner {
background: none;
display: none;
} */
.el-select__wrapper {
min-width: 100px;
padding: 13px;
font-size: 16px;
color: var(--sidebar-item-text);
}
.el-select-group__title {
color: var(--main-color) !important;
}
.el-select__placeholder {
color: var(--sidebar-item-text) !important;
}
.el-select-dropdown {
background-color: var(--sidebar);
border: 1.0px solid var(--main-color);
}
.el-checkbox-button__inner {
font-size: 16px !important;
}
a {
color: var(--main-color);
}
.digital-ide-icon {
background-image: url(./icon.svg);
background-size: 100%;
height: 50px;
width: 50px;
}
.digital-ide-icon.big {
background-image: url(./icon.svg);
background-size: 100%;
height: 200px;
width: 200px;
}
.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner {
opacity: 0.6;
}
.el-select__wrapper.is-disabled {
opacity: 0.6;
box-shadow: unset !important;
}

View File

@ -1,58 +0,0 @@
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

View File

@ -0,0 +1,98 @@
<template>
<div class="about-wrapper">
<div class="usermanual">
</div>
<br>
<hr>
<br>
<div class="icon-caption" @click="goto('https://github.com/Digital-EDA')">
<div class="digital-ide-icon big"/>
</div>
<div class="version-caption">
<span>{{ t('current-version') }} &ensp; <span class="version-wrapper">0.4.0</span></span>
</div>
<br>
<div style="display: flex;justify-content: space-around;">
<div class="copyright-caption" v-html="t('copyright')"></div>
</div>
</div>
</template>
<script setup>
import { defineComponent } from 'vue';
import { useI18n } from 'vue-i18n';
defineComponent({ name: 'dide-about' });
function goto(url) {
window.open(url, '_blank');
}
const platform = navigator.platform;
const { t } = useI18n();
</script>
<style>
.about-wrapper {
margin-top: 10px;
width: 450px;
}
.version-caption {
display: flex;
width: 100% !important;
font-size: 1.1rem;
padding: 10px;
margin: 10px;
align-items: center;
justify-content: space-evenly;
}
.copyright-caption {
width: 50% !important;
line-height: 30px;
font-size: 0.9rem;
padding: 10px;
margin: 10px;
align-items: center;
}
.icon-caption {
display: flex;
align-items: center;
justify-content: space-around;
cursor: pointer;
}
.version-wrapper {
border-radius: .5em;
color: white;
background-color: var(--color-deepPurple);
padding: 5px;
}
.usermanual {
margin: 10px;
margin-top: 0;
padding: 10px;
padding-top: 0;
}
.usermanual-item {
display: flex;
justify-content: space-between;
padding: 5px;
margin: 5px;
font-size: 0.9rem;
}
.usermanual-item .iconfont {
font-size: 1.1rem !important;
color: var(--sidebar-text-item);
}
</style>

View File

@ -0,0 +1,24 @@
import { reactive } from "vue";
export const controlPanel = reactive({
sections: [
{
iconClass: 'iconfont icon-collections'
},
{
iconClass: 'iconfont icon-setting'
},
{
iconClass: 'iconfont icon-about'
}
],
currentIndex: -1,
click(index) {
if (this.currentIndex === index) {
this.currentIndex = -1;
} else {
this.currentIndex = index;
}
}
});

View File

@ -0,0 +1,106 @@
<template>
<div class="vcd-right-nav">
<div class="vcd-function-panel">
<TreeView :topModules="props.topModules"
v-show="controlPanel.currentIndex === 0"></TreeView>
<Setting
v-show="controlPanel.currentIndex === 1"></Setting>
<About
v-show="controlPanel.currentIndex === 2"></About>
</div>
<div class="vcd-function-option">
<div class="vcd-control-panel-wrapper">
<div class="vcd-control-panel-icon digital-ide-icon" />
</div>
<hr>
<div class="vcd-control-panel-wrapper"
v-for="(section, index) of controlPanel.sections" :key="index"
@click="controlPanel.click(index)"
>
<div :class="controlPanel.currentIndex === index ? 'vcd-control-panel-active': ''"><span
class="vcd-control-panel-icon"
:class="section.iconClass"
></span></div>
</div>
</div>
</div>
</template>
<script setup>
import { defineComponent, reactive } from 'vue';
import TreeView from '@/components/treeview';
import Setting from '@/components/setting';
import About from '@/components/about';
import { emitter } from '@/hook/global';
import { controlPanel } from './right-nav';
defineComponent({ name: 'right-nav' });
const props = defineProps({
topModules: {
type: Array,
required: true
}
});
emitter.on('right-nav', index => {
if (controlPanel.currentIndex === index) {
controlPanel.currentIndex = -1;
} else {
controlPanel.currentIndex = index;
}
});
</script>
<style>
.vcd-right-nav {
display: flex;
position: fixed;
top: 0;
right: 0;
z-index: 230;
}
.vcd-function-panel {
display: flex;
background-color: var(--sidebar);
height: 100vh;
box-shadow: var(--gray-box-shadow-1);
}
.vcd-function-option {
width: fit-content;
height: 100vh;
background-color: var(--sidebar);
box-shadow: var(--gray-box-shadow-1);
}
.vcd-control-panel-wrapper {
width: var(--right-nav-width);
height: var(--right-nav-width);
display: flex;
align-items: center;
justify-content: space-around;
cursor: pointer;
margin-top: 10px;
color: var(--vscode-foreground);
}
.vcd-control-panel-wrapper:hover {
color: var(--vscode-icon-foreground);
}
.vcd-control-panel-icon {
width: 45px;
height: 45px;
font-size: 30px;
}
.vcd-control-panel-active {
color: var(--main-color);
}
</style>

View File

@ -0,0 +1,121 @@
<template>
<div class="setting-wrapper">
<el-scrollbar height="98vh">
<div class="setting-section">
<h2>{{ t('general-setting') }}</h2>
<div class="setting-option" style="width: 220px;">
<span class="iconfont icon-i18n"></span>
&ensp;
<span class="option-title">{{ t('language-setting') }}</span>
<div style="width: 100px;">
<el-select
name="language-setting"
class="language-setting"
v-model="locale"
@change="onlanguagechange"
>
<el-option
v-for="option in languageSetting.options"
:value="option.value"
:label="option.text"
:key="option.value">
</el-option>
</el-select>
</div>
<el-dialog
v-model="languageDialogShow"
class="language-dialog"
:title="t('tips')"
width="500"
>
<span>{{ t('setting.language.change-dialog') }}</span>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="confirmLanguageDialog()">
{{ t('confirm') }}
</el-button>
</div>
</template>
</el-dialog>
</div>
<br>
</div>
</el-scrollbar>
</div>
</template>
<script setup>
</script>
<style>
.setting-wrapper {
width: fit-content;
padding: 10px;
}
.setting-container {
overflow-y: scroll;
height: 99vh;
}
.setting-section {
padding: 10px;
margin: 10px;
border-radius: .3em;
min-height: 50px;
}
.setting-option {
margin: 5px;
padding: 8px 12px;
height: 40px;
width: fit-content;
border-radius: .5em;
background-color: var(--background);
display: flex;
align-items: center;
font-size: 0.9rem;
}
.option-title {
min-width: 80px;
margin-right: 12px;
user-select: none;
}
.el-slider__button {
background-color: var(--background) !important;
}
.el-switch__core .el-switch__action {
background-color: var(--background) !important;
}
.el-slider__stop {
background-color: var(--vscode-foreground) !important;
}
.icon-help {
cursor: pointer;
transition: var(--animation-3s);
-webkit-transition: var(--animation-3s);
}
.icon-help:hover {
color: var(--main-color);
transition: var(--animation-3s);
-webkit-transition: var(--animation-3s);
}
.language-dialog {
color: var(--vscode-foreground);
background-color: var(--sidebar) !important;
}
.el-dialog__title {
color: var(--vscode-foreground) !important;
}
</style>

View File

3
src/hook/global.js Normal file
View File

@ -0,0 +1,3 @@
import mitt from 'mitt';
export const emitter = mitt();

View File

@ -1,3 +1,7 @@
{ {
"info.common.hello-world": "مرحبا بالعالم" "info.common.hello-world": "مرحبا بالعالم",
"general-setting": "عام",
"appearance-setting": "المظهر",
"current-version": "الإصدار الحالي",
"copyright": "حقوق النشر مملوكة لفريق مشروع <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a>، نرحب بـ <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>."
} }

View File

@ -1,3 +1,7 @@
{ {
"info.common.hello-world": "Hallo Welt" "info.common.hello-world": "Hallo Welt",
"general-setting": "Allgemein",
"appearance-setting": "Aussehen",
"current-version": "Aktuelle Version",
"copyright": "Dieses Software gehört dem <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> Projektteam, willkommen <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>."
} }

View File

@ -1,3 +1,7 @@
{ {
"info.common.hello-world": "hello world" "info.common.hello-world": "hello world",
"general-setting": "General",
"appearance-setting": "Appearance",
"current-version": "current version",
"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

@ -1,3 +1,8 @@
{ {
"info.common.hello-world": "bonjour le monde" "info.common.hello-world": "bonjour le monde",
"general-setting": "Général",
"appearance-setting": "Apparence",
"current-version": "Version actuelle",
"copyright": "Les droits d'auteur appartiennent au groupe de projet <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a>, bienvenue <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>."
} }

View File

@ -1,3 +1,8 @@
{ {
"info.common.hello-world": "こんにちは世界" "info.common.hello-world": "こんにちは世界",
"general-setting": "一般",
"appearance-setting": "外観",
"current-version": "現在のバージョン",
"copyright": "このソフトウェアの著作権は <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> プロジェクトチームに帰属します。<a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a> を歓迎します。"
} }

View File

@ -1,3 +1,8 @@
{ {
"info.common.hello-world": "안녕하세요 세계" "info.common.hello-world": "안녕하세요 세계",
"general-setting": "일반",
"appearance-setting": "외관",
"current-version": "현재 버전",
"copyright": "이 소프트웨어의 저작권은 <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> 프로젝트 팀에 있으며, <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>를 환영합니다."
} }

View File

@ -1,3 +1,8 @@
{ {
"info.common.hello-world": "привет мир" "info.common.hello-world": "привет мир",
"general-setting": "Общие",
"appearance-setting": "Внешний вид",
"current-version": "Текущая версия",
"copyright": "Авторские права принадлежат проектной группе <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a>, приветствуем <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>."
} }

View File

@ -1,3 +1,9 @@
{ {
"info.common.hello-world": "hello world" "info.common.hello-world": "hello world",
"general-setting": "通用",
"appearance-setting": "外观",
"current-version": "当前版本",
"copyright": "本软件版权归 <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> 项目组所有,欢迎 <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>。"
} }

View File

@ -1,3 +1,9 @@
{ {
"info.common.hello-world": "你好,世界" "info.common.hello-world": "你好,世界",
"general-setting": "通用",
"appearance-setting": "外觀",
"current-version": "當前版本",
"copyright": "本軟件版權歸 <a href=\"https://github.com/Digital-EDA\" target=\"_blank\">Digital-IDE</a> 項目組所有,歡迎 <a href=\"https://github.com/Digital-EDA/Digital-IDE\">Star</a>。"
} }