@lvce-editor/title-bar-worker 1.2.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 +269 -142
- 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 {
|
|
@@ -1515,7 +1519,7 @@ const renderTitleBarEntries = {
|
|
|
1515
1519
|
apply(oldState, newState) {
|
|
1516
1520
|
const visibleEntries = getVisibleTitleBarEntries(newState.titleBarEntries, newState.width, newState.focusedIndex, newState.isMenuOpen);
|
|
1517
1521
|
const dom = getTitleBarMenuBarVirtualDom(visibleEntries);
|
|
1518
|
-
return ['Viewlet.setDom2', dom];
|
|
1522
|
+
return ['Viewlet.setDom2', newState.uid, dom];
|
|
1519
1523
|
}
|
|
1520
1524
|
};
|
|
1521
1525
|
const renderFocusedIndex = {
|
|
@@ -1523,7 +1527,7 @@ const renderFocusedIndex = {
|
|
|
1523
1527
|
return oldState.focusedIndex === newState.focusedIndex && oldState.isMenuOpen === newState.isMenuOpen;
|
|
1524
1528
|
},
|
|
1525
1529
|
apply(oldState, newState) {
|
|
1526
|
-
return [/* method */SetFocusedIndex, /* oldFocusedIndex */oldState.focusedIndex, /* newfocusedIndex */newState.focusedIndex, /* oldIsMenuOpen */oldState.isMenuOpen, /* newIsMenuOpen */newState.isMenuOpen];
|
|
1530
|
+
return ['Viewlet.send', newState.uid, /* method */SetFocusedIndex, /* oldFocusedIndex */oldState.focusedIndex, /* newfocusedIndex */newState.focusedIndex, /* oldIsMenuOpen */oldState.isMenuOpen, /* newIsMenuOpen */newState.isMenuOpen];
|
|
1527
1531
|
}
|
|
1528
1532
|
};
|
|
1529
1533
|
const renderMenus = {
|
|
@@ -1555,7 +1559,7 @@ const renderMenus = {
|
|
|
1555
1559
|
} else if (difference < 0) {
|
|
1556
1560
|
changes.push(['closeMenus', newLength]);
|
|
1557
1561
|
}
|
|
1558
|
-
return [/* method */SetMenus, /* changes */changes, newState.uid];
|
|
1562
|
+
return ['Viewlet.send', newState.uid, /* method */SetMenus, /* changes */changes, newState.uid];
|
|
1559
1563
|
}
|
|
1560
1564
|
};
|
|
1561
1565
|
const render = [renderTitleBarEntries, renderFocusedIndex, renderMenus];
|
|
@@ -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,41 +2129,234 @@ 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;
|
|
2250
2348
|
};
|
|
2349
|
+
const getModule = id => {
|
|
2350
|
+
for (const module of menus) {
|
|
2351
|
+
if (module.id === id) {
|
|
2352
|
+
return module;
|
|
2353
|
+
}
|
|
2354
|
+
}
|
|
2355
|
+
return undefined;
|
|
2356
|
+
};
|
|
2251
2357
|
const getMenuEntries = async (id, ...args) => {
|
|
2252
2358
|
try {
|
|
2253
|
-
const module =
|
|
2359
|
+
const module = getModule(id);
|
|
2254
2360
|
// @ts-ignore
|
|
2255
2361
|
const inject = module.inject || [];
|
|
2256
2362
|
// @ts-ignore
|
|
@@ -2260,6 +2366,19 @@ const getMenuEntries = async (id, ...args) => {
|
|
|
2260
2366
|
}
|
|
2261
2367
|
};
|
|
2262
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
|
+
|
|
2263
2382
|
const saveState = uid => {
|
|
2264
2383
|
return {};
|
|
2265
2384
|
};
|
|
@@ -2328,14 +2447,9 @@ const getTotalWidth = entries => {
|
|
|
2328
2447
|
};
|
|
2329
2448
|
|
|
2330
2449
|
// TODO lazyload menuEntries and use Command.execute (maybe)
|
|
2331
|
-
const MENU_WIDTH = 150;
|
|
2332
2450
|
const CONTEXT_MENU_ITEM_HEIGHT = 26;
|
|
2333
2451
|
const CONTEXT_MENU_SEPARATOR_HEIGHT = 11;
|
|
2334
2452
|
const CONTEXT_MENU_PADDING = 8;
|
|
2335
|
-
const CONTEXT_MENU_WIDTH = 250;
|
|
2336
|
-
const getMenuWidth = () => {
|
|
2337
|
-
return CONTEXT_MENU_WIDTH;
|
|
2338
|
-
};
|
|
2339
2453
|
const getMenuHeight = items => {
|
|
2340
2454
|
let height = CONTEXT_MENU_PADDING;
|
|
2341
2455
|
for (const item of items) {
|
|
@@ -2351,6 +2465,13 @@ const getMenuHeight = items => {
|
|
|
2351
2465
|
return height;
|
|
2352
2466
|
};
|
|
2353
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
|
+
|
|
2354
2475
|
// TODO difference between focusing with mouse or keyboard
|
|
2355
2476
|
// with mouse -> open submenu
|
|
2356
2477
|
// with keyboard -> don't open submenu, only focus
|
|
@@ -2751,17 +2872,16 @@ const handleKeySpaceMenuOpen = state => {
|
|
|
2751
2872
|
const handleKeySpace = ifElse(handleKeySpaceMenuOpen, handleKeySpaceMenuClosed);
|
|
2752
2873
|
|
|
2753
2874
|
const executeMenuItemCommand = async item => {
|
|
2754
|
-
|
|
2755
|
-
throw new Error('not implemented');
|
|
2875
|
+
await invoke(item.command, ...(item.args || []));
|
|
2756
2876
|
};
|
|
2757
2877
|
|
|
2758
2878
|
const selectIndexIgnore = async (state, item) => {
|
|
2759
|
-
await executeMenuItemCommand();
|
|
2879
|
+
await executeMenuItemCommand(item);
|
|
2760
2880
|
return state;
|
|
2761
2881
|
};
|
|
2762
2882
|
|
|
2763
2883
|
const selectIndexNone = async (state, item) => {
|
|
2764
|
-
await executeMenuItemCommand();
|
|
2884
|
+
await executeMenuItemCommand(item);
|
|
2765
2885
|
return {
|
|
2766
2886
|
...state,
|
|
2767
2887
|
menus: [],
|
|
@@ -2770,7 +2890,7 @@ const selectIndexNone = async (state, item) => {
|
|
|
2770
2890
|
};
|
|
2771
2891
|
|
|
2772
2892
|
const selectIndexRestoreFocus = async (state, item) => {
|
|
2773
|
-
await executeMenuItemCommand();
|
|
2893
|
+
await executeMenuItemCommand(item);
|
|
2774
2894
|
return {
|
|
2775
2895
|
...state,
|
|
2776
2896
|
menus: [],
|
|
@@ -2816,13 +2936,13 @@ const handleMenuClick = (state, level, index) => {
|
|
|
2816
2936
|
const item = menu.items[index];
|
|
2817
2937
|
switch (item.flags) {
|
|
2818
2938
|
case None:
|
|
2819
|
-
return selectIndexNone(state);
|
|
2939
|
+
return selectIndexNone(state, item);
|
|
2820
2940
|
case SubMenu:
|
|
2821
2941
|
return selectIndexSubMenu(state, menu, index);
|
|
2822
2942
|
case RestoreFocus:
|
|
2823
|
-
return selectIndexRestoreFocus(state);
|
|
2943
|
+
return selectIndexRestoreFocus(state, item);
|
|
2824
2944
|
case Ignore:
|
|
2825
|
-
return selectIndexIgnore(state);
|
|
2945
|
+
return selectIndexIgnore(state, item);
|
|
2826
2946
|
default:
|
|
2827
2947
|
return state;
|
|
2828
2948
|
}
|
|
@@ -2948,6 +3068,13 @@ const wrapCommand = fn => {
|
|
|
2948
3068
|
};
|
|
2949
3069
|
|
|
2950
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,
|
|
2951
3078
|
'TitleBarMenuBar.closeMenu': closeMenu,
|
|
2952
3079
|
'TitleBarMenuBar.create': create,
|
|
2953
3080
|
'TitleBarMenuBar.focus': wrapCommand(focus),
|
|
@@ -2969,7 +3096,6 @@ const commandMap = {
|
|
|
2969
3096
|
'TitleBarMenuBar.handleKeyEnd': wrapCommand(handleKeyEnd),
|
|
2970
3097
|
'TitleBarMenuBar.handleKeyEnter': wrapCommand(handleKeyEnter),
|
|
2971
3098
|
'TitleBarMenuBar.handleKeyEscape': wrapCommand(handleKeyEscape),
|
|
2972
|
-
'TitleBarMenuBar.saveState': saveState,
|
|
2973
3099
|
'TitleBarMenuBar.handleKeyHome': wrapCommand(handleKeyHome),
|
|
2974
3100
|
'TitleBarMenuBar.handleKeySpace': wrapCommand(handleKeySpace),
|
|
2975
3101
|
'TitleBarMenuBar.handleMenuClick': wrapCommand(handleMenuClick),
|
|
@@ -2978,9 +3104,10 @@ const commandMap = {
|
|
|
2978
3104
|
'TitleBarMenuBar.handleMouseOver': wrapCommand(handleMouseOver),
|
|
2979
3105
|
'TitleBarMenuBar.loadContent': wrapCommand(loadContent),
|
|
2980
3106
|
'TitleBarMenuBar.render': doRender,
|
|
3107
|
+
'TitleBarMenuBar.saveState': saveState,
|
|
3108
|
+
'TitleBarMenuBar.terminate': terminate,
|
|
2981
3109
|
'TitleBarMenuBar.toggleIndex': wrapCommand(toggleIndex),
|
|
2982
|
-
'TitleBarMenuBar.toggleMenu': wrapCommand(toggleMenu)
|
|
2983
|
-
'TitleBarMenuBar.terminate': terminate
|
|
3110
|
+
'TitleBarMenuBar.toggleMenu': wrapCommand(toggleMenu)
|
|
2984
3111
|
};
|
|
2985
3112
|
|
|
2986
3113
|
const listen = async () => {
|