@lvce-editor/api 9.16.0 → 9.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
2
2
|
import { registerStatusBarItemProvider } from "../StatusBarItemProviderRegistry/StatusBarItemProviderRegistry.js";
|
|
3
|
-
const
|
|
3
|
+
const activeUidByViewId = Object.create(null);
|
|
4
|
+
const handlesByViewId = Object.create(null);
|
|
4
5
|
const itemsByUid = Object.create(null);
|
|
6
|
+
const renderedUidsByViewId = Object.create(null);
|
|
7
|
+
const viewIdByUid = Object.create(null);
|
|
5
8
|
const stringProperties = ['ariaLabel', 'icon', 'name', 'onClick', 'text', 'title'];
|
|
6
9
|
const normalizeStatusBarItem = (item, index) => {
|
|
7
10
|
if (!item || typeof item !== 'object' || Array.isArray(item)) {
|
|
@@ -47,44 +50,91 @@ const areItemsEqual = (oldItems, newItems) => {
|
|
|
47
50
|
oldItem.title === newItem.title);
|
|
48
51
|
});
|
|
49
52
|
};
|
|
50
|
-
const disposeHandles = (
|
|
51
|
-
for (const handle of
|
|
53
|
+
const disposeHandles = (viewId) => {
|
|
54
|
+
for (const handle of handlesByViewId[viewId] || []) {
|
|
52
55
|
handle.dispose();
|
|
53
56
|
}
|
|
54
|
-
delete
|
|
57
|
+
delete handlesByViewId[viewId];
|
|
55
58
|
};
|
|
56
|
-
const replaceItems = (
|
|
57
|
-
disposeHandles(
|
|
58
|
-
|
|
59
|
-
handlesByUid[uid] = items.map((_item, index) => registerStatusBarItemProvider({
|
|
59
|
+
const replaceItems = (viewId, itemCount) => {
|
|
60
|
+
disposeHandles(viewId);
|
|
61
|
+
handlesByViewId[viewId] = Array.from({ length: itemCount }, (_item, index) => registerStatusBarItemProvider({
|
|
60
62
|
getStatusBarItem() {
|
|
61
|
-
return itemsByUid[
|
|
63
|
+
return itemsByUid[activeUidByViewId[viewId]]?.[index];
|
|
62
64
|
},
|
|
63
|
-
id: `view:${viewId}:${
|
|
65
|
+
id: `view:${viewId}:${index}`,
|
|
64
66
|
}));
|
|
65
67
|
};
|
|
68
|
+
const refreshItems = async (viewId) => {
|
|
69
|
+
await Promise.all((handlesByViewId[viewId] || []).map((handle) => handle.refresh()));
|
|
70
|
+
};
|
|
71
|
+
const setActiveUid = (viewId, uid) => {
|
|
72
|
+
const renderedUids = renderedUidsByViewId[viewId] || [];
|
|
73
|
+
const index = renderedUids.indexOf(uid);
|
|
74
|
+
if (index !== -1) {
|
|
75
|
+
renderedUids.splice(index, 1);
|
|
76
|
+
}
|
|
77
|
+
renderedUids.push(uid);
|
|
78
|
+
renderedUidsByViewId[viewId] = renderedUids;
|
|
79
|
+
activeUidByViewId[viewId] = uid;
|
|
80
|
+
};
|
|
66
81
|
export const renderViewStatusBarItems = async (uid, viewId, instance) => {
|
|
67
82
|
if (typeof instance.renderStatusBarItems !== 'function') {
|
|
68
83
|
return;
|
|
69
84
|
}
|
|
70
85
|
const items = normalizeStatusBarItems(await instance.renderStatusBarItems());
|
|
71
86
|
const oldItems = itemsByUid[uid] || [];
|
|
72
|
-
|
|
87
|
+
const wasActive = activeUidByViewId[viewId] === uid;
|
|
88
|
+
itemsByUid[uid] = items;
|
|
89
|
+
viewIdByUid[uid] = viewId;
|
|
90
|
+
setActiveUid(viewId, uid);
|
|
91
|
+
if (wasActive && areItemsEqual(oldItems, items)) {
|
|
73
92
|
return;
|
|
74
93
|
}
|
|
75
|
-
if ((
|
|
76
|
-
replaceItems(
|
|
94
|
+
if ((handlesByViewId[viewId]?.length || 0) !== items.length) {
|
|
95
|
+
replaceItems(viewId, items.length);
|
|
77
96
|
return;
|
|
78
97
|
}
|
|
79
|
-
|
|
80
|
-
await Promise.all((handlesByUid[uid] || []).map((handle) => handle.refresh()));
|
|
98
|
+
await refreshItems(viewId);
|
|
81
99
|
};
|
|
82
100
|
export const disposeViewStatusBarItems = (uid) => {
|
|
83
|
-
|
|
101
|
+
const viewId = viewIdByUid[uid];
|
|
102
|
+
if (!viewId) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
84
105
|
delete itemsByUid[uid];
|
|
106
|
+
delete viewIdByUid[uid];
|
|
107
|
+
const renderedUids = renderedUidsByViewId[viewId] || [];
|
|
108
|
+
const remainingUids = renderedUids.filter((renderedUid) => renderedUid !== uid);
|
|
109
|
+
if (remainingUids.length === 0) {
|
|
110
|
+
disposeHandles(viewId);
|
|
111
|
+
delete activeUidByViewId[viewId];
|
|
112
|
+
delete renderedUidsByViewId[viewId];
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
renderedUidsByViewId[viewId] = remainingUids;
|
|
116
|
+
if (activeUidByViewId[viewId] !== uid) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const activeUid = remainingUids.at(-1);
|
|
120
|
+
const items = itemsByUid[activeUid] || [];
|
|
121
|
+
activeUidByViewId[viewId] = activeUid;
|
|
122
|
+
if ((handlesByViewId[viewId]?.length || 0) !== items.length) {
|
|
123
|
+
replaceItems(viewId, items.length);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
void refreshItems(viewId);
|
|
85
127
|
};
|
|
86
128
|
export const resetViewStatusBarItems = () => {
|
|
129
|
+
for (const viewId of Object.keys(handlesByViewId)) {
|
|
130
|
+
disposeHandles(viewId);
|
|
131
|
+
}
|
|
87
132
|
for (const uid of Object.keys(itemsByUid)) {
|
|
88
|
-
|
|
133
|
+
delete itemsByUid[Number(uid)];
|
|
134
|
+
delete viewIdByUid[Number(uid)];
|
|
135
|
+
}
|
|
136
|
+
for (const viewId of Object.keys(activeUidByViewId)) {
|
|
137
|
+
delete activeUidByViewId[viewId];
|
|
138
|
+
delete renderedUidsByViewId[viewId];
|
|
89
139
|
}
|
|
90
140
|
};
|