增加 sidebar + signal view tree 新功能:shift + 鼠标左击连续选择

This commit is contained in:
锦恢 2024-09-02 20:49:53 +08:00
parent 0e21f5c4f8
commit ce90f9df4b
5 changed files with 126 additions and 32 deletions

View File

@ -23,7 +23,7 @@
<SignalItem
v-show="view.renderType === 0"
:view="view"
@click.stop="handleItemClick(view.signalInfo.link)"
@click.stop="handleItemClick($event, view.signalInfo.link)"
@contextmenu.prevent="handleContextmenu($event, view, index)"
/>
@ -76,6 +76,7 @@ import SignalItem from './signal-item.vue';
import GroupItem from './group-item.vue';
import GroupContextMenu from './group-context-menu.vue';
import { sidebarSelectedWires } from '@/hook/sidebar-select-wire';
import { genOrderedLinks } from '@/hook/wave-container-view';
const { t } = useI18n();
defineComponent({ name: 'side-bar' });
@ -102,16 +103,35 @@ function addSignal() {
}
function handleItemClick(link) {
function handleItemClick(event, link) {
contextmenu.show = false;
groupcontextmenu.show = false;
const lastLink = sidebarSelectedWires.lastLink;
if (event.shiftKey && lastLink !== undefined) {
// shift link link
let addBegin = false;
const links = [];
for (const currentLink of genOrderedLinks({returnGroup: false})) {
if (currentLink === link || currentLink === lastLink) {
links.push(currentLink);
addBegin = !addBegin;
} else if (addBegin) {
links.push(currentLink);
}
}
sidebarSelectedWires.addLinks(links);
} else {
//
if (sidebarSelectedWires.has(link)) {
sidebarSelectedWires.delete(link);
} else {
sidebarSelectedWires.add(link);
}
}
}
function handleSidebarGlobalClick() {

View File

@ -70,6 +70,7 @@ export default {
display: flex;
flex-direction: column;
transition: height .5s ease-in-out;
user-select: none;
}
.vcd-module-wrapper {

View File

@ -4,7 +4,7 @@
<hr>
<el-scrollbar height="86vh" class="vcd-signal-signals-display">
<div v-for="(signal, index) in signals.content" :key="index"
@click="toggleRender(signal)"
@click="toggleRender($event, signal)"
class="vcd-signal-signal-item"
:class="globalLookup.currentWires.has(signal) ? 'vcd-treeview-selected' : ''"
>
@ -19,28 +19,27 @@
</div>
</template>
<script>
import { reactive } from 'vue';
<script setup>
import { defineComponent, reactive } from 'vue';
import { useI18n } from 'vue-i18n';
import { emitter, globalLookup } from '@/hook/global';
import { makeIconClass } from '@/hook/utils';
import { toggleRender } from '@/hook/render';
import { WaveContainerView } from '@/hook/wave-container-view';
defineComponent({ name: 'signals' });
/* eslint-disable */
export default {
name: 'signals',
props: {},
setup() {
const { t } = useI18n();
// signal : link, name, size, type
const signals = reactive({
/**
* @type {WireItem[]}
*/
content: []
});
emitter.on('tree-view', sendWires => {
signals.content = [];
signals.content = sendWires;
});
@ -48,13 +47,45 @@ export default {
return signal.size === 1 ? '' : `${signal.size - 1}:0`;
}
return {
signals,
toggleRender,
globalLookup,
makeSignalCaption,
t,
makeIconClass
const controller = {
lastSignal: undefined
};
/**
* @description 用于点击波形后触发的逻辑如果波形已经在列表中则去除否则加入
* NOTE该函数需要同时操作所有的波形容器视图
* @param {MouseEvent} event
* @param {WireItem} signal
*/
function toggleRender(event, signal) {
const lastSignal = controller.lastSignal;
if (event.shiftKey && lastSignal !== undefined) {
const renderSignals = [];
let addBegin = false;
for (const currentSignal of signals.content) {
if (currentSignal === signal || lastSignal === currentSignal) {
renderSignals.push(currentSignal);
addBegin = !addBegin;
} else if (addBegin) {
renderSignals.push(currentSignal);
}
}
for (const renderSignal of renderSignals) {
WaveContainerView.add(renderSignal);
controller.lastSignal = renderSignal;
}
globalLookup.render();
} else {
if (WaveContainerView.has(signal)) {
WaveContainerView.delete(signal);
controller.lastSignal = undefined;
globalLookup.render();
} else {
WaveContainerView.add(signal);
controller.lastSignal = signal;
globalLookup.render();
}
}
}

View File

@ -31,6 +31,21 @@ export const sidebarSelectedWires = {
this.togglePipe();
},
/**
* @description 批量加入 link
* @param {string[]} links
*/
addLinks(links) {
for (const link of links) {
globalLookup.sidebarSelectedWireLinks.add(link);
globalLookup.setRenderOption(link, 'highlight', 1);
this.lastLink = link;
}
globalLookup.render({ type: 'wave-only' });
this.togglePipe();
},
delete(link) {
globalLookup.sidebarSelectedWireLinks.delete(link);
if (this.lastLink === link) {

View File

@ -7,6 +7,11 @@ import { globalLookup } from "./global";
import { getSmartCurrentSignalValue } from "./utils";
/**
* @typedef {Object} ViewIterConfig
* @property {boolean} returnGroup
*/
/**
* @namespace WaveContainerView
*/
@ -115,3 +120,25 @@ function makeFullSignalNameDeps(signal) {
htmlString = '<div class="signal-info-tooltip-wrapper">' + htmlString + '</div>';
return htmlString;
}
/**
*
* @param {ViewIterConfig} iterConfig
* @returns {Generator<string>}
*/
export function* genOrderedLinks(iterConfig) {
const iterGroup = (iterConfig || {}).iterGroup || false;
for (const view of globalLookup.currentWiresRenderView) {
if (view.renderType === 0) {
yield view.signalInfo.link;
} else {
if (iterGroup) {
// groupLink 都会以 -group 结尾
yield view.signalInfo.link;
}
for (const child of view.children) {
yield child.signalInfo.link;
}
}
}
}