@lvce-editor/title-bar-worker 1.3.0 → 1.4.0
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.
- package/README.md +13 -0
- package/dist/titleBarWorkerMain.js +250 -130
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
# Title Bar Worker
|
|
2
2
|
|
|
3
3
|
Webworker for the title bar functionality in LVCE Editor.
|
|
4
|
+
|
|
5
|
+
## Contributing
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
git clone git@github.com:lvce-editor/title-bar-worker.git &&
|
|
9
|
+
cd text-search-worker &&
|
|
10
|
+
npm ci &&
|
|
11
|
+
npm test
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Gitpod
|
|
15
|
+
|
|
16
|
+
[](https://gitpod.io/#https://github.com/lvce-editor/title-bar-worker)
|
|
@@ -868,6 +868,7 @@ const Menu$1 = 'menu';
|
|
|
868
868
|
const MenuBar = 'menubar';
|
|
869
869
|
const MenuItem$1 = 'menuitem';
|
|
870
870
|
const MenuItemCheckBox = 'menuitemcheckbox';
|
|
871
|
+
const None$1 = 'none';
|
|
871
872
|
const Separator$1 = 'separator';
|
|
872
873
|
|
|
873
874
|
const Menu = 'Menu';
|
|
@@ -1184,9 +1185,12 @@ const parseKey = rawKey => {
|
|
|
1184
1185
|
};
|
|
1185
1186
|
};
|
|
1186
1187
|
|
|
1188
|
+
const Button = 1;
|
|
1187
1189
|
const Div = 4;
|
|
1188
1190
|
const Span = 8;
|
|
1189
1191
|
const Text = 12;
|
|
1192
|
+
const I = 16;
|
|
1193
|
+
const Img = 17;
|
|
1190
1194
|
|
|
1191
1195
|
const text = data => {
|
|
1192
1196
|
return {
|
|
@@ -1637,98 +1641,6 @@ const getKeyBindings = () => {
|
|
|
1637
1641
|
}];
|
|
1638
1642
|
};
|
|
1639
1643
|
|
|
1640
|
-
const getFontString = (fontWeight, fontSize, fontFamily) => {
|
|
1641
|
-
return `${fontWeight} ${fontSize}px ${fontFamily}`;
|
|
1642
|
-
};
|
|
1643
|
-
|
|
1644
|
-
const state$1 = {
|
|
1645
|
-
ctx: undefined
|
|
1646
|
-
};
|
|
1647
|
-
const getOrCreate = createCtx => {
|
|
1648
|
-
if (state$1.ctx) {
|
|
1649
|
-
return state$1.ctx;
|
|
1650
|
-
}
|
|
1651
|
-
state$1.ctx = createCtx();
|
|
1652
|
-
return state$1.ctx;
|
|
1653
|
-
};
|
|
1654
|
-
|
|
1655
|
-
const createCtx = () => {
|
|
1656
|
-
const canvas = new OffscreenCanvas(0, 0);
|
|
1657
|
-
const ctx = /** @type {OffscreenCanvasRenderingContext2D} */canvas.getContext('2d');
|
|
1658
|
-
if (!ctx) {
|
|
1659
|
-
throw new Error('Failed to get canvas context 2d');
|
|
1660
|
-
}
|
|
1661
|
-
return ctx;
|
|
1662
|
-
};
|
|
1663
|
-
const getContext = () => {
|
|
1664
|
-
const ctx = getOrCreate(createCtx);
|
|
1665
|
-
return ctx;
|
|
1666
|
-
};
|
|
1667
|
-
|
|
1668
|
-
const px = value => {
|
|
1669
|
-
return `${value}px`;
|
|
1670
|
-
};
|
|
1671
|
-
|
|
1672
|
-
const getLetterSpacingString = letterSpacing => {
|
|
1673
|
-
return px(letterSpacing);
|
|
1674
|
-
};
|
|
1675
|
-
const measureTextWidth = (text, fontWeight, fontSize, fontFamily, letterSpacing, isMonoSpaceFont, charWidth) => {
|
|
1676
|
-
string(text);
|
|
1677
|
-
number(fontWeight);
|
|
1678
|
-
number(fontSize);
|
|
1679
|
-
string(fontFamily);
|
|
1680
|
-
boolean(isMonoSpaceFont);
|
|
1681
|
-
number(charWidth);
|
|
1682
|
-
if (typeof letterSpacing !== 'number') {
|
|
1683
|
-
throw new TypeError('letterSpacing must be of type number');
|
|
1684
|
-
}
|
|
1685
|
-
const letterSpacingString = getLetterSpacingString(letterSpacing);
|
|
1686
|
-
const fontString = getFontString(fontWeight, fontSize, fontFamily);
|
|
1687
|
-
const ctx = getContext();
|
|
1688
|
-
// @ts-ignore
|
|
1689
|
-
ctx.letterSpacing = letterSpacingString;
|
|
1690
|
-
ctx.font = fontString;
|
|
1691
|
-
const metrics = ctx.measureText(text);
|
|
1692
|
-
const {
|
|
1693
|
-
width
|
|
1694
|
-
} = metrics;
|
|
1695
|
-
return width;
|
|
1696
|
-
};
|
|
1697
|
-
|
|
1698
|
-
const measureTitleBarEntryWidth = (label, fontWeight, fontSize, fontFamily, letterSpacing) => {
|
|
1699
|
-
const isMonospaceFont = false;
|
|
1700
|
-
const charWidth = 0;
|
|
1701
|
-
return measureTextWidth(label, fontWeight, fontSize, fontFamily, letterSpacing, isMonospaceFont, charWidth);
|
|
1702
|
-
};
|
|
1703
|
-
|
|
1704
|
-
const addWidths = (entries, labelPadding, fontWeight, fontSize, fontFamily, letterSpacing) => {
|
|
1705
|
-
const withWidths = [];
|
|
1706
|
-
for (const entry of entries) {
|
|
1707
|
-
const textWidth = measureTitleBarEntryWidth(entry.label, fontWeight, fontSize, fontFamily, letterSpacing);
|
|
1708
|
-
const width = textWidth + labelPadding * 2;
|
|
1709
|
-
withWidths.push({
|
|
1710
|
-
...entry,
|
|
1711
|
-
width
|
|
1712
|
-
});
|
|
1713
|
-
}
|
|
1714
|
-
return withWidths;
|
|
1715
|
-
};
|
|
1716
|
-
|
|
1717
|
-
const loadContent = async (state, titleBarEntries) => {
|
|
1718
|
-
const {
|
|
1719
|
-
labelFontFamily,
|
|
1720
|
-
labelFontSize,
|
|
1721
|
-
labelFontWeight,
|
|
1722
|
-
labelLetterSpacing,
|
|
1723
|
-
labelPadding
|
|
1724
|
-
} = state;
|
|
1725
|
-
const withWidths = addWidths(titleBarEntries, labelPadding, labelFontWeight, labelFontSize, labelFontFamily, labelLetterSpacing);
|
|
1726
|
-
return {
|
|
1727
|
-
...state,
|
|
1728
|
-
titleBarEntries: withWidths
|
|
1729
|
-
};
|
|
1730
|
-
};
|
|
1731
|
-
|
|
1732
1644
|
/**
|
|
1733
1645
|
* @enum {string}
|
|
1734
1646
|
*/
|
|
@@ -1801,7 +1713,7 @@ const menuEntrySeparator = {
|
|
|
1801
1713
|
};
|
|
1802
1714
|
|
|
1803
1715
|
const id$9 = Edit;
|
|
1804
|
-
const getMenuEntries$
|
|
1716
|
+
const getMenuEntries$d = () => {
|
|
1805
1717
|
return [{
|
|
1806
1718
|
id: 'undo',
|
|
1807
1719
|
label: undo(),
|
|
@@ -1842,7 +1754,7 @@ const getMenuEntries$c = () => {
|
|
|
1842
1754
|
|
|
1843
1755
|
const MenuEntriesEdit = {
|
|
1844
1756
|
__proto__: null,
|
|
1845
|
-
getMenuEntries: getMenuEntries$
|
|
1757
|
+
getMenuEntries: getMenuEntries$d,
|
|
1846
1758
|
id: id$9
|
|
1847
1759
|
};
|
|
1848
1760
|
|
|
@@ -1885,7 +1797,7 @@ const platform = 1;
|
|
|
1885
1797
|
const Web = 1;
|
|
1886
1798
|
|
|
1887
1799
|
const id$8 = File;
|
|
1888
|
-
const getMenuEntries$
|
|
1800
|
+
const getMenuEntries$c = () => {
|
|
1889
1801
|
const entries = [{
|
|
1890
1802
|
id: 'newFile',
|
|
1891
1803
|
label: newFile(),
|
|
@@ -1927,18 +1839,18 @@ const getMenuEntries$b = () => {
|
|
|
1927
1839
|
|
|
1928
1840
|
const MenuEntriesFile = {
|
|
1929
1841
|
__proto__: null,
|
|
1930
|
-
getMenuEntries: getMenuEntries$
|
|
1842
|
+
getMenuEntries: getMenuEntries$c,
|
|
1931
1843
|
id: id$8
|
|
1932
1844
|
};
|
|
1933
1845
|
|
|
1934
1846
|
const id$7 = Go;
|
|
1935
|
-
const getMenuEntries$
|
|
1847
|
+
const getMenuEntries$b = () => {
|
|
1936
1848
|
return [];
|
|
1937
1849
|
};
|
|
1938
1850
|
|
|
1939
1851
|
const MenuEntriesGo = {
|
|
1940
1852
|
__proto__: null,
|
|
1941
|
-
getMenuEntries: getMenuEntries$
|
|
1853
|
+
getMenuEntries: getMenuEntries$b,
|
|
1942
1854
|
id: id$7
|
|
1943
1855
|
};
|
|
1944
1856
|
|
|
@@ -1956,7 +1868,7 @@ const isAutoUpdateSupported = () => {
|
|
|
1956
1868
|
};
|
|
1957
1869
|
|
|
1958
1870
|
const id$6 = Help;
|
|
1959
|
-
const getMenuEntries$
|
|
1871
|
+
const getMenuEntries$a = async () => {
|
|
1960
1872
|
const autoUpdateSupported = isAutoUpdateSupported();
|
|
1961
1873
|
const entries = [];
|
|
1962
1874
|
if (autoUpdateSupported) {
|
|
@@ -1981,22 +1893,26 @@ const getMenuEntries$9 = async () => {
|
|
|
1981
1893
|
|
|
1982
1894
|
const MenuEntriesHelp = {
|
|
1983
1895
|
__proto__: null,
|
|
1984
|
-
getMenuEntries: getMenuEntries$
|
|
1896
|
+
getMenuEntries: getMenuEntries$a,
|
|
1985
1897
|
id: id$6
|
|
1986
1898
|
};
|
|
1987
1899
|
|
|
1988
|
-
const state = {
|
|
1900
|
+
const state$1 = {
|
|
1989
1901
|
rpc: undefined
|
|
1990
1902
|
};
|
|
1991
1903
|
const invoke = (method, ...params) => {
|
|
1992
1904
|
const {
|
|
1993
1905
|
rpc
|
|
1994
|
-
} = state;
|
|
1906
|
+
} = state$1;
|
|
1995
1907
|
// @ts-ignore
|
|
1996
1908
|
return rpc.invoke(method, ...params);
|
|
1997
1909
|
};
|
|
1998
1910
|
const setRpc = rpc => {
|
|
1999
|
-
state.rpc = rpc;
|
|
1911
|
+
state$1.rpc = rpc;
|
|
1912
|
+
};
|
|
1913
|
+
|
|
1914
|
+
const getRecentlyOpened = () => {
|
|
1915
|
+
return invoke(/* RecentlyOpened.getRecentlyOpened */'RecentlyOpened.getRecentlyOpened');
|
|
2000
1916
|
};
|
|
2001
1917
|
|
|
2002
1918
|
const getTitle = uri => {
|
|
@@ -2016,11 +1932,8 @@ const toMenuItem = folder => {
|
|
|
2016
1932
|
args: [folder]
|
|
2017
1933
|
};
|
|
2018
1934
|
};
|
|
2019
|
-
const getRecentlyOpened = () => {
|
|
2020
|
-
return invoke(/* RecentlyOpened.getRecentlyOpened */'RecentlyOpened.getRecentlyOpened');
|
|
2021
|
-
};
|
|
2022
1935
|
const id$5 = OpenRecent;
|
|
2023
|
-
const getMenuEntries$
|
|
1936
|
+
const getMenuEntries$9 = async () => {
|
|
2024
1937
|
const allItems = await getRecentlyOpened();
|
|
2025
1938
|
const itemsToShow = allItems.slice(0, MAX_MENU_RECENT_ENTRIES);
|
|
2026
1939
|
const items = [];
|
|
@@ -2043,23 +1956,23 @@ const getMenuEntries$8 = async () => {
|
|
|
2043
1956
|
|
|
2044
1957
|
const MenuEntriesOpenRecent = {
|
|
2045
1958
|
__proto__: null,
|
|
2046
|
-
getMenuEntries: getMenuEntries$
|
|
1959
|
+
getMenuEntries: getMenuEntries$9,
|
|
2047
1960
|
id: id$5
|
|
2048
1961
|
};
|
|
2049
1962
|
|
|
2050
1963
|
const id$4 = Run;
|
|
2051
|
-
const getMenuEntries$
|
|
1964
|
+
const getMenuEntries$8 = () => {
|
|
2052
1965
|
return [];
|
|
2053
1966
|
};
|
|
2054
1967
|
|
|
2055
1968
|
const MenuEntriesRun = {
|
|
2056
1969
|
__proto__: null,
|
|
2057
|
-
getMenuEntries: getMenuEntries$
|
|
1970
|
+
getMenuEntries: getMenuEntries$8,
|
|
2058
1971
|
id: id$4
|
|
2059
1972
|
};
|
|
2060
1973
|
|
|
2061
1974
|
const id$3 = Selection;
|
|
2062
|
-
const getMenuEntries$
|
|
1975
|
+
const getMenuEntries$7 = () => {
|
|
2063
1976
|
return [{
|
|
2064
1977
|
id: 'selectAll',
|
|
2065
1978
|
label: selectAll(),
|
|
@@ -2090,7 +2003,7 @@ const getMenuEntries$6 = () => {
|
|
|
2090
2003
|
|
|
2091
2004
|
const MenuEntriesSelection = {
|
|
2092
2005
|
__proto__: null,
|
|
2093
|
-
getMenuEntries: getMenuEntries$
|
|
2006
|
+
getMenuEntries: getMenuEntries$7,
|
|
2094
2007
|
id: id$3
|
|
2095
2008
|
};
|
|
2096
2009
|
|
|
@@ -2105,7 +2018,7 @@ const newTerminal = () => {
|
|
|
2105
2018
|
};
|
|
2106
2019
|
|
|
2107
2020
|
const id$2 = Terminal;
|
|
2108
|
-
const getMenuEntries$
|
|
2021
|
+
const getMenuEntries$6 = () => {
|
|
2109
2022
|
return [{
|
|
2110
2023
|
id: 'newTerminal',
|
|
2111
2024
|
label: newTerminal(),
|
|
@@ -2117,7 +2030,7 @@ const getMenuEntries$5 = () => {
|
|
|
2117
2030
|
|
|
2118
2031
|
const MenuEntriesTerminal = {
|
|
2119
2032
|
__proto__: null,
|
|
2120
|
-
getMenuEntries: getMenuEntries$
|
|
2033
|
+
getMenuEntries: getMenuEntries$6,
|
|
2121
2034
|
id: id$2
|
|
2122
2035
|
};
|
|
2123
2036
|
|
|
@@ -2146,7 +2059,7 @@ const help = () => {
|
|
|
2146
2059
|
return i18nString(Help$1);
|
|
2147
2060
|
};
|
|
2148
2061
|
|
|
2149
|
-
const getMenuEntries$
|
|
2062
|
+
const getMenuEntries$5 = () => {
|
|
2150
2063
|
return [{
|
|
2151
2064
|
id: File,
|
|
2152
2065
|
label: file(),
|
|
@@ -2185,7 +2098,7 @@ const getMenuEntries$4 = () => {
|
|
|
2185
2098
|
}];
|
|
2186
2099
|
};
|
|
2187
2100
|
|
|
2188
|
-
const getMenuEntries$
|
|
2101
|
+
const getMenuEntries$4 = () => {
|
|
2189
2102
|
return [{
|
|
2190
2103
|
id: File,
|
|
2191
2104
|
label: file(),
|
|
@@ -2216,34 +2129,219 @@ const getMenuEntries$3 = () => {
|
|
|
2216
2129
|
const getFn = () => {
|
|
2217
2130
|
switch (platform) {
|
|
2218
2131
|
case Web:
|
|
2219
|
-
return getMenuEntries$3;
|
|
2220
|
-
default:
|
|
2221
2132
|
return getMenuEntries$4;
|
|
2133
|
+
default:
|
|
2134
|
+
return getMenuEntries$5;
|
|
2222
2135
|
}
|
|
2223
2136
|
};
|
|
2224
2137
|
const id$1 = TitleBar;
|
|
2225
|
-
const getMenuEntries$
|
|
2138
|
+
const getMenuEntries$3 = async () => {
|
|
2226
2139
|
const fn = getFn();
|
|
2227
2140
|
return fn();
|
|
2228
2141
|
};
|
|
2229
2142
|
|
|
2230
2143
|
const MenuEntriesTitleBar = {
|
|
2231
2144
|
__proto__: null,
|
|
2232
|
-
getMenuEntries: getMenuEntries$
|
|
2145
|
+
getMenuEntries: getMenuEntries$3,
|
|
2233
2146
|
id: id$1
|
|
2234
2147
|
};
|
|
2235
2148
|
|
|
2236
2149
|
const id = View;
|
|
2237
|
-
const getMenuEntries$
|
|
2150
|
+
const getMenuEntries$2 = () => {
|
|
2238
2151
|
return [];
|
|
2239
2152
|
};
|
|
2240
2153
|
|
|
2241
2154
|
const MenuEntriesView = {
|
|
2242
2155
|
__proto__: null,
|
|
2243
|
-
getMenuEntries: getMenuEntries$
|
|
2156
|
+
getMenuEntries: getMenuEntries$2,
|
|
2244
2157
|
id
|
|
2245
2158
|
};
|
|
2246
2159
|
|
|
2160
|
+
const menus$1 = [MenuEntriesEdit, MenuEntriesFile, MenuEntriesGo, MenuEntriesHelp, MenuEntriesRun, MenuEntriesSelection, MenuEntriesTerminal, MenuEntriesTitleBar, MenuEntriesView, MenuEntriesOpenRecent];
|
|
2161
|
+
const getMenuIds = () => {
|
|
2162
|
+
return menus$1.map(menu => menu.id);
|
|
2163
|
+
};
|
|
2164
|
+
const getMenuEntries$1 = id => {
|
|
2165
|
+
const menu = menus$1.find(item => item.id === id);
|
|
2166
|
+
if (!menu) {
|
|
2167
|
+
return [];
|
|
2168
|
+
}
|
|
2169
|
+
return menu.getMenuEntries();
|
|
2170
|
+
};
|
|
2171
|
+
|
|
2172
|
+
const getIconVirtualDom = (icon, type = Div) => {
|
|
2173
|
+
return {
|
|
2174
|
+
type,
|
|
2175
|
+
className: `MaskIcon MaskIcon${icon}`,
|
|
2176
|
+
role: None$1,
|
|
2177
|
+
childCount: 0
|
|
2178
|
+
};
|
|
2179
|
+
};
|
|
2180
|
+
|
|
2181
|
+
const createTitleBarButton = button => {
|
|
2182
|
+
const {
|
|
2183
|
+
id,
|
|
2184
|
+
icon,
|
|
2185
|
+
label,
|
|
2186
|
+
onClick
|
|
2187
|
+
} = button;
|
|
2188
|
+
const dom = [{
|
|
2189
|
+
type: Button,
|
|
2190
|
+
className: `TitleBarButton TitleBarButton${id}`,
|
|
2191
|
+
ariaLabel: label,
|
|
2192
|
+
childCount: 1,
|
|
2193
|
+
onClick
|
|
2194
|
+
}, getIconVirtualDom(icon, I)];
|
|
2195
|
+
return dom;
|
|
2196
|
+
};
|
|
2197
|
+
|
|
2198
|
+
const getTitleBarButtonsVirtualDom = buttons => {
|
|
2199
|
+
const dom = [{
|
|
2200
|
+
type: Div,
|
|
2201
|
+
className: 'Viewlet TitleBarButtons',
|
|
2202
|
+
childCount: buttons.length
|
|
2203
|
+
}, ...buttons.flatMap(createTitleBarButton)];
|
|
2204
|
+
return dom;
|
|
2205
|
+
};
|
|
2206
|
+
|
|
2207
|
+
const getTitleBarIconVirtualDom = iconSrc => {
|
|
2208
|
+
return [{
|
|
2209
|
+
type: Div,
|
|
2210
|
+
className: 'Viewlet TitleBarIcon',
|
|
2211
|
+
childCount: 1
|
|
2212
|
+
}, {
|
|
2213
|
+
type: Img,
|
|
2214
|
+
className: 'TitleBarIconIcon',
|
|
2215
|
+
src: iconSrc,
|
|
2216
|
+
alt: '',
|
|
2217
|
+
childCount: 0
|
|
2218
|
+
}];
|
|
2219
|
+
};
|
|
2220
|
+
|
|
2221
|
+
const getTitleVirtualDom = title => {
|
|
2222
|
+
return [text(title)];
|
|
2223
|
+
};
|
|
2224
|
+
|
|
2225
|
+
const handleClickClose = async state => {
|
|
2226
|
+
await invoke('ElectronWindow.close');
|
|
2227
|
+
return state;
|
|
2228
|
+
};
|
|
2229
|
+
|
|
2230
|
+
const handleClickMinimize = async state => {
|
|
2231
|
+
await invoke('ElectronWindow.minimize');
|
|
2232
|
+
return state;
|
|
2233
|
+
};
|
|
2234
|
+
|
|
2235
|
+
const handleClickToggleMaximize = async state => {
|
|
2236
|
+
await (invoke('ElectronWindow.maximize'));
|
|
2237
|
+
return state;
|
|
2238
|
+
};
|
|
2239
|
+
|
|
2240
|
+
const handleClick$1 = (state, className) => {
|
|
2241
|
+
if (className.includes('Minimize')) {
|
|
2242
|
+
return handleClickMinimize(state);
|
|
2243
|
+
}
|
|
2244
|
+
if (className.includes('Maximize') || className.includes('Restore')) {
|
|
2245
|
+
return handleClickToggleMaximize(state);
|
|
2246
|
+
}
|
|
2247
|
+
if (className.includes('Close')) {
|
|
2248
|
+
return handleClickClose(state);
|
|
2249
|
+
}
|
|
2250
|
+
return state;
|
|
2251
|
+
};
|
|
2252
|
+
|
|
2253
|
+
const getFontString = (fontWeight, fontSize, fontFamily) => {
|
|
2254
|
+
return `${fontWeight} ${fontSize}px ${fontFamily}`;
|
|
2255
|
+
};
|
|
2256
|
+
|
|
2257
|
+
const state = {
|
|
2258
|
+
ctx: undefined
|
|
2259
|
+
};
|
|
2260
|
+
const getOrCreate = createCtx => {
|
|
2261
|
+
if (state.ctx) {
|
|
2262
|
+
return state.ctx;
|
|
2263
|
+
}
|
|
2264
|
+
state.ctx = createCtx();
|
|
2265
|
+
return state.ctx;
|
|
2266
|
+
};
|
|
2267
|
+
|
|
2268
|
+
const createCtx = () => {
|
|
2269
|
+
const canvas = new OffscreenCanvas(0, 0);
|
|
2270
|
+
const ctx = /** @type {OffscreenCanvasRenderingContext2D} */canvas.getContext('2d');
|
|
2271
|
+
if (!ctx) {
|
|
2272
|
+
throw new Error('Failed to get canvas context 2d');
|
|
2273
|
+
}
|
|
2274
|
+
return ctx;
|
|
2275
|
+
};
|
|
2276
|
+
const getContext = () => {
|
|
2277
|
+
const ctx = getOrCreate(createCtx);
|
|
2278
|
+
return ctx;
|
|
2279
|
+
};
|
|
2280
|
+
|
|
2281
|
+
const px = value => {
|
|
2282
|
+
return `${value}px`;
|
|
2283
|
+
};
|
|
2284
|
+
|
|
2285
|
+
const getLetterSpacingString = letterSpacing => {
|
|
2286
|
+
return px(letterSpacing);
|
|
2287
|
+
};
|
|
2288
|
+
const measureTextWidth = (text, fontWeight, fontSize, fontFamily, letterSpacing, isMonoSpaceFont, charWidth) => {
|
|
2289
|
+
string(text);
|
|
2290
|
+
number(fontWeight);
|
|
2291
|
+
number(fontSize);
|
|
2292
|
+
string(fontFamily);
|
|
2293
|
+
boolean(isMonoSpaceFont);
|
|
2294
|
+
number(charWidth);
|
|
2295
|
+
if (typeof letterSpacing !== 'number') {
|
|
2296
|
+
throw new TypeError('letterSpacing must be of type number');
|
|
2297
|
+
}
|
|
2298
|
+
const letterSpacingString = getLetterSpacingString(letterSpacing);
|
|
2299
|
+
const fontString = getFontString(fontWeight, fontSize, fontFamily);
|
|
2300
|
+
const ctx = getContext();
|
|
2301
|
+
// @ts-ignore
|
|
2302
|
+
ctx.letterSpacing = letterSpacingString;
|
|
2303
|
+
ctx.font = fontString;
|
|
2304
|
+
const metrics = ctx.measureText(text);
|
|
2305
|
+
const {
|
|
2306
|
+
width
|
|
2307
|
+
} = metrics;
|
|
2308
|
+
return width;
|
|
2309
|
+
};
|
|
2310
|
+
|
|
2311
|
+
const measureTitleBarEntryWidth = (label, fontWeight, fontSize, fontFamily, letterSpacing) => {
|
|
2312
|
+
const isMonospaceFont = false;
|
|
2313
|
+
const charWidth = 0;
|
|
2314
|
+
return measureTextWidth(label, fontWeight, fontSize, fontFamily, letterSpacing, isMonospaceFont, charWidth);
|
|
2315
|
+
};
|
|
2316
|
+
|
|
2317
|
+
const addWidths = (entries, labelPadding, fontWeight, fontSize, fontFamily, letterSpacing) => {
|
|
2318
|
+
const withWidths = [];
|
|
2319
|
+
for (const entry of entries) {
|
|
2320
|
+
const textWidth = measureTitleBarEntryWidth(entry.label, fontWeight, fontSize, fontFamily, letterSpacing);
|
|
2321
|
+
const width = textWidth + labelPadding * 2;
|
|
2322
|
+
withWidths.push({
|
|
2323
|
+
...entry,
|
|
2324
|
+
width
|
|
2325
|
+
});
|
|
2326
|
+
}
|
|
2327
|
+
return withWidths;
|
|
2328
|
+
};
|
|
2329
|
+
|
|
2330
|
+
const loadContent = async (state, titleBarEntries) => {
|
|
2331
|
+
const {
|
|
2332
|
+
labelFontFamily,
|
|
2333
|
+
labelFontSize,
|
|
2334
|
+
labelFontWeight,
|
|
2335
|
+
labelLetterSpacing,
|
|
2336
|
+
labelPadding
|
|
2337
|
+
} = state;
|
|
2338
|
+
const withWidths = addWidths(titleBarEntries, labelPadding, labelFontWeight, labelFontSize, labelFontFamily, labelLetterSpacing);
|
|
2339
|
+
return {
|
|
2340
|
+
...state,
|
|
2341
|
+
titleBarEntries: withWidths
|
|
2342
|
+
};
|
|
2343
|
+
};
|
|
2344
|
+
|
|
2247
2345
|
const menus = [MenuEntriesEdit, MenuEntriesFile, MenuEntriesGo, MenuEntriesHelp, MenuEntriesRun, MenuEntriesSelection, MenuEntriesTerminal, MenuEntriesTitleBar, MenuEntriesView, MenuEntriesOpenRecent];
|
|
2248
2346
|
const getMenus = () => {
|
|
2249
2347
|
return menus;
|
|
@@ -2268,6 +2366,19 @@ const getMenuEntries = async (id, ...args) => {
|
|
|
2268
2366
|
}
|
|
2269
2367
|
};
|
|
2270
2368
|
|
|
2369
|
+
const renderEventListeners = () => {
|
|
2370
|
+
return [{
|
|
2371
|
+
name: 'handleClickMinimize',
|
|
2372
|
+
params: ['handleClickMinimize']
|
|
2373
|
+
}, {
|
|
2374
|
+
name: 'handleClickClose',
|
|
2375
|
+
params: ['handleClickClose']
|
|
2376
|
+
}, {
|
|
2377
|
+
name: 'handleClickToggleMaximize',
|
|
2378
|
+
params: ['handleClickToggleMaximize']
|
|
2379
|
+
}];
|
|
2380
|
+
};
|
|
2381
|
+
|
|
2271
2382
|
const saveState = uid => {
|
|
2272
2383
|
return {};
|
|
2273
2384
|
};
|
|
@@ -2336,14 +2447,9 @@ const getTotalWidth = entries => {
|
|
|
2336
2447
|
};
|
|
2337
2448
|
|
|
2338
2449
|
// TODO lazyload menuEntries and use Command.execute (maybe)
|
|
2339
|
-
const MENU_WIDTH = 150;
|
|
2340
2450
|
const CONTEXT_MENU_ITEM_HEIGHT = 26;
|
|
2341
2451
|
const CONTEXT_MENU_SEPARATOR_HEIGHT = 11;
|
|
2342
2452
|
const CONTEXT_MENU_PADDING = 8;
|
|
2343
|
-
const CONTEXT_MENU_WIDTH = 250;
|
|
2344
|
-
const getMenuWidth = () => {
|
|
2345
|
-
return CONTEXT_MENU_WIDTH;
|
|
2346
|
-
};
|
|
2347
2453
|
const getMenuHeight = items => {
|
|
2348
2454
|
let height = CONTEXT_MENU_PADDING;
|
|
2349
2455
|
for (const item of items) {
|
|
@@ -2359,6 +2465,13 @@ const getMenuHeight = items => {
|
|
|
2359
2465
|
return height;
|
|
2360
2466
|
};
|
|
2361
2467
|
|
|
2468
|
+
// TODO lazyload menuEntries and use Command.execute (maybe)
|
|
2469
|
+
const MENU_WIDTH = 150;
|
|
2470
|
+
const CONTEXT_MENU_WIDTH = 250;
|
|
2471
|
+
const getMenuWidth = () => {
|
|
2472
|
+
return CONTEXT_MENU_WIDTH;
|
|
2473
|
+
};
|
|
2474
|
+
|
|
2362
2475
|
// TODO difference between focusing with mouse or keyboard
|
|
2363
2476
|
// with mouse -> open submenu
|
|
2364
2477
|
// with keyboard -> don't open submenu, only focus
|
|
@@ -2955,6 +3068,13 @@ const wrapCommand = fn => {
|
|
|
2955
3068
|
};
|
|
2956
3069
|
|
|
2957
3070
|
const commandMap = {
|
|
3071
|
+
'TitleBar.getButtonsVirtualDom': getTitleBarButtonsVirtualDom,
|
|
3072
|
+
'TitleBar.getIconVirtualDom': getTitleBarIconVirtualDom,
|
|
3073
|
+
'TitleBar.getMenuEntries': getMenuEntries$1,
|
|
3074
|
+
'TitleBar.getMenuIds': getMenuIds,
|
|
3075
|
+
'TitleBar.getTitleVirtualDom': getTitleVirtualDom,
|
|
3076
|
+
'TitleBar.handleButtonsClick': handleClick$1,
|
|
3077
|
+
'TitleBar.renderEventListeners': renderEventListeners,
|
|
2958
3078
|
'TitleBarMenuBar.closeMenu': closeMenu,
|
|
2959
3079
|
'TitleBarMenuBar.create': create,
|
|
2960
3080
|
'TitleBarMenuBar.focus': wrapCommand(focus),
|
|
@@ -2976,7 +3096,6 @@ const commandMap = {
|
|
|
2976
3096
|
'TitleBarMenuBar.handleKeyEnd': wrapCommand(handleKeyEnd),
|
|
2977
3097
|
'TitleBarMenuBar.handleKeyEnter': wrapCommand(handleKeyEnter),
|
|
2978
3098
|
'TitleBarMenuBar.handleKeyEscape': wrapCommand(handleKeyEscape),
|
|
2979
|
-
'TitleBarMenuBar.saveState': saveState,
|
|
2980
3099
|
'TitleBarMenuBar.handleKeyHome': wrapCommand(handleKeyHome),
|
|
2981
3100
|
'TitleBarMenuBar.handleKeySpace': wrapCommand(handleKeySpace),
|
|
2982
3101
|
'TitleBarMenuBar.handleMenuClick': wrapCommand(handleMenuClick),
|
|
@@ -2985,9 +3104,10 @@ const commandMap = {
|
|
|
2985
3104
|
'TitleBarMenuBar.handleMouseOver': wrapCommand(handleMouseOver),
|
|
2986
3105
|
'TitleBarMenuBar.loadContent': wrapCommand(loadContent),
|
|
2987
3106
|
'TitleBarMenuBar.render': doRender,
|
|
3107
|
+
'TitleBarMenuBar.saveState': saveState,
|
|
3108
|
+
'TitleBarMenuBar.terminate': terminate,
|
|
2988
3109
|
'TitleBarMenuBar.toggleIndex': wrapCommand(toggleIndex),
|
|
2989
|
-
'TitleBarMenuBar.toggleMenu': wrapCommand(toggleMenu)
|
|
2990
|
-
'TitleBarMenuBar.terminate': terminate
|
|
3110
|
+
'TitleBarMenuBar.toggleMenu': wrapCommand(toggleMenu)
|
|
2991
3111
|
};
|
|
2992
3112
|
|
|
2993
3113
|
const listen = async () => {
|