From 47e9e57c80fef5800dcac239066ea00b8dce5afa Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Fri, 30 Aug 2024 23:56:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BF=A1=E6=A0=87=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/iconfont.css | 6 +- public/iconfont.woff2 | Bin 6296 -> 6344 bytes src/App.vue | 6 +- src/components/{render => pivot}/cursor.js | 46 +++- src/components/{render => pivot}/index.vue | 69 +++++- src/components/pivot/moving-pivot.vue | 165 +++++++++++++ src/components/pivot/pivot-view.js | 138 +++++++++++ src/components/pivot/pivot-view.vue | 27 ++ .../cursor.vue => pivot/system-pivot.vue} | 47 ++-- src/components/pivot/user-context-menu.js | 17 ++ src/components/pivot/user-context-menu.vue | 76 ++++++ src/components/pivot/user-pivot.vue | 232 ++++++++++++++++++ src/components/render/time-scale.vue | 135 ---------- src/components/setting/index.vue | 127 +++++++++- .../sidebar/signal-context-menu.vue | 4 - src/components/toolbar/cursor-location.js | 21 +- src/components/toolbar/cursor-location.vue | 5 +- src/components/toolbar/pivot-view.js | 1 - src/components/toolbar/value-search.js | 14 +- src/hook/sidebar-select-wire.js | 8 + src/hook/wave-view/dom-container.js | 26 -- src/hook/wave-view/render-cursor.js | 59 ----- src/hook/wave-view/render-wave.js | 4 +- src/hook/wave-view/wheel-event.js | 11 +- src/i18n/en.json | 13 + src/i18n/zh.json | 13 + 26 files changed, 974 insertions(+), 296 deletions(-) rename src/components/{render => pivot}/cursor.js (57%) rename src/components/{render => pivot}/index.vue (56%) create mode 100644 src/components/pivot/moving-pivot.vue create mode 100644 src/components/pivot/pivot-view.js create mode 100644 src/components/pivot/pivot-view.vue rename src/components/{render/cursor.vue => pivot/system-pivot.vue} (75%) create mode 100644 src/components/pivot/user-context-menu.js create mode 100644 src/components/pivot/user-context-menu.vue create mode 100644 src/components/pivot/user-pivot.vue delete mode 100644 src/components/render/time-scale.vue delete mode 100644 src/components/toolbar/pivot-view.js delete mode 100644 src/hook/wave-view/render-cursor.js diff --git a/public/iconfont.css b/public/iconfont.css index 3872182..1552658 100644 --- a/public/iconfont.css +++ b/public/iconfont.css @@ -1,6 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id 4440655 */ - src: url('iconfont.woff2?t=1723382481292') format('woff2'); + src: url('iconfont.woff2?t=1725033317914') format('woff2'); } .iconfont { @@ -11,6 +11,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-axis:before { + content: "\ed1f"; +} + .icon-add-line:before { content: "\e7b0"; } diff --git a/public/iconfont.woff2 b/public/iconfont.woff2 index 11a952b051ede330ea343213b019f6ce9f20e965..1e1f7fe0a99b98899ca6ba0869f83094aac0bae5 100644 GIT binary patch literal 6344 zcmV;(7&qs4Pew8T0RR9102s&s3jhEB056CD02q1z0RR9100000000000000000000 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 literal 6296 zcmV;J7-#2qPew8T0RR9102r763jhEB0513d02oLB0RR9100000000000000000000 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 Om9A)N2D2G=0001djtjW} diff --git a/src/App.vue b/src/App.vue index 9c40918..7fbf1a9 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,8 +2,8 @@ - - + + @@ -27,7 +27,7 @@ import { getCrossOriginWorkerURL } from '@/hook/network'; import ToolBar from '@/components/toolbar'; import Sidebar from '@/components/sidebar'; import RightNav from '@/components/right-nav.vue'; -import MainRender from '@/components/render'; +import Pivot from '@/components/pivot'; const { t } = useI18n(); diff --git a/src/components/render/cursor.js b/src/components/pivot/cursor.js similarity index 57% rename from src/components/render/cursor.js rename to src/components/pivot/cursor.js index 3889446..f49e923 100644 --- a/src/components/render/cursor.js +++ b/src/components/pivot/cursor.js @@ -2,30 +2,53 @@ import { globalLookup } from '@/hook/global'; import formatTime from '@/hook/wave-view/format-time'; import { reactive } from 'vue'; -export const StaticCursor = reactive({ +/** + * @typedef {(event: MouseEvent) => void} MousemoveFn + */ + +export const MovingPivot = reactive({ + color: '#CB81DA', + label: '', + left: 0, + currentTime: 0, + show: true, + + /** + * @type {import('./pivot-view').UserPivot | undefined} + */ + currentTakenPivot: undefined, + dragEnable: false +}); + +export const SystemPivot = reactive({ label: '', show: false, currentTime: 0, left: 0, + color: '#CB81DA', updateLabel(timescale) { this.label = formatTime(this.currentTime, timescale); - this.show = true; }, updateLeft() { this.left = calcCursorLeft(this.currentTime); - this.show = true; } }); -export function changeCursorLocation() { - StaticCursor.show = true; +/** + * @description 左击改变系统信标的位置 + */ +export function changeCursorLocation() { + if (MovingPivot.dragEnable) { + return; + } + SystemPivot.show = true; const pstate = globalLookup.pstate; if (pstate) { const { xCursor, xOffset, xScale, tgcd, timescale } = pstate; const currentTime = Math.round((xCursor - xOffset) / xScale) * tgcd; - StaticCursor.currentTime = currentTime; - StaticCursor.updateLabel(timescale); - StaticCursor.updateLeft(); + SystemPivot.currentTime = currentTime; + SystemPivot.updateLabel(timescale); + SystemPivot.updateLeft(); } } @@ -44,6 +67,7 @@ export function calcCursorLeft(currentTime) { return 0; } -export const MovingCursor = reactive({ - -}); \ No newline at end of file +/** + * @type {Map} + */ +export const mousemoveEventPipes = new Map(); \ No newline at end of file diff --git a/src/components/render/index.vue b/src/components/pivot/index.vue similarity index 56% rename from src/components/render/index.vue rename to src/components/pivot/index.vue index b3c54c5..15c698b 100644 --- a/src/components/render/index.vue +++ b/src/components/pivot/index.vue @@ -1,18 +1,47 @@ - \ No newline at end of file diff --git a/src/components/pivot/pivot-view.js b/src/components/pivot/pivot-view.js new file mode 100644 index 0000000..f9fd09a --- /dev/null +++ b/src/components/pivot/pivot-view.js @@ -0,0 +1,138 @@ +import { reactive, ref } from "vue"; +import { calcCursorLeft, SystemPivot } from "./cursor"; +import { globalLookup } from "@/hook/global"; +import formatTime from "@/hook/wave-view/format-time"; + +/** + * @description 每一个动态信标 + * @typedef {Object} UserPivot + * @property {number} id + * @property {string} label + * @property {number} x + * @property {number} time + * @property {boolean} show + */ + + +/** + * @description 该数据结构描述了所有通过 makePivot 创建的 用户信标 + * @type {Map} + */ +export const UserPivots = reactive(new Map()); +export const orderedTimes = []; + +export const UserPivotColor = ref('#1e90ff'); + +/** + * @description 创建一个信标 + * @param {number} time 需要创建的轴的时间点 + */ +export function createPivot(time) { + if (UserPivots.has(time)) { + return; + } + + const id = Date.now(); + const x = calcCursorLeft(time); + const timescale = globalLookup.timescale; + const label = formatTime(time, timescale); + const show = true; + + UserPivots.set(time, { time, x, id, label, show }); + orderedTimes.push(time); + orderedTimes.sort((a, b) => a < b); +} + +export function searchOrderedTimeIndex(time) { + for (let i = 0; i < orderedTimes.length; ++ i) { + if (orderedTimes[i] === time) { + return i; + } + } + return undefined; +} + +export function deletePivot(time) { + if (!UserPivots.has(time)) { + return; + } + + UserPivots.delete(time); + const i = searchOrderedTimeIndex(time); + if (i !== undefined) { + orderedTimes.splice(i, 1); + } +} + +export function updateAllPivots() { + // 更新系统信标 + SystemPivot.updateLeft(); + + // 更新所有用户信标 + for (const time of UserPivots.keys()) { + const pivot = UserPivots.get(time); + pivot.x = calcCursorLeft(time); + } +} + +/** + * + * @param {number[]} times + * @param {number} target 目标时间 + * @returns + */ +function bisearch(times, target) { + let i = 0, j = times.length - 1; + while (i < j) { + if (times[i] === target) { + break; + } + if (times[j] <= target) { + i = j; + break; + } + if (j - i === 1) { + break; + } + const mid = (i + j) >> 1; + if (times[mid] > target) { + j = mid; + } else { + i = mid; + } + } + + return i; +} + +/** + * @description 高效获取距离 time 最近的时间点 t,时间复杂度 O(logn) + * @param {number} time + * @returns {UserPivot | undefined} + */ +export function getNearestUserPivot(time) { + const pivotNum = UserPivots.size; + if (pivotNum === 0) { + return undefined; + } + + if (pivotNum === 1) { + for (const [time, pivot] of UserPivots) { + return pivot; + } + } + + const i = bisearch(orderedTimes, time); + // console.log(i, orderedTimes, time); + + if (i === pivotNum - 1) { + return UserPivots.get(orderedTimes[i]); + } + + const prevT = orderedTimes[i]; + const nextT = orderedTimes[i + 1]; + if (nextT - time > time - prevT) { + return UserPivots.get(prevT); + } + return UserPivots.get(nextT); +} diff --git a/src/components/pivot/pivot-view.vue b/src/components/pivot/pivot-view.vue new file mode 100644 index 0000000..db85156 --- /dev/null +++ b/src/components/pivot/pivot-view.vue @@ -0,0 +1,27 @@ + + + \ No newline at end of file diff --git a/src/components/render/cursor.vue b/src/components/pivot/system-pivot.vue similarity index 75% rename from src/components/render/cursor.vue rename to src/components/pivot/system-pivot.vue index 9089329..7ae627e 100644 --- a/src/components/render/cursor.vue +++ b/src/components/pivot/system-pivot.vue @@ -1,48 +1,65 @@ \ No newline at end of file diff --git a/src/components/pivot/user-pivot.vue b/src/components/pivot/user-pivot.vue new file mode 100644 index 0000000..0d9691d --- /dev/null +++ b/src/components/pivot/user-pivot.vue @@ -0,0 +1,232 @@ + + + + + \ No newline at end of file diff --git a/src/components/render/time-scale.vue b/src/components/render/time-scale.vue deleted file mode 100644 index 229f79d..0000000 --- a/src/components/render/time-scale.vue +++ /dev/null @@ -1,135 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/setting/index.vue b/src/components/setting/index.vue index 57e6067..9255d50 100644 --- a/src/components/setting/index.vue +++ b/src/components/setting/index.vue @@ -10,6 +10,7 @@ name="language-setting" class="language-setting" v-model="locale" + @change="onlanguagechange" > + + + {{ t('setting.language.change-dialog') }} + +