@lvce-editor/title-bar-worker 1.3.0 → 1.5.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 +296 -137
- 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 {
|
|
@@ -1455,9 +1459,11 @@ const File$1 = 'File';
|
|
|
1455
1459
|
const Go$1 = 'Go';
|
|
1456
1460
|
const Help$1 = 'Help';
|
|
1457
1461
|
const MoreDot = 'More ...';
|
|
1462
|
+
const OpenProcessExplorer = 'Open Process Explorer';
|
|
1458
1463
|
const Run$1 = 'Run';
|
|
1459
1464
|
const Selection$1 = 'Selection';
|
|
1460
1465
|
const Terminal$1 = 'Terminal';
|
|
1466
|
+
const ToggleDeveloperTools = 'Toggle Developer Tools';
|
|
1461
1467
|
const View$1 = 'View';
|
|
1462
1468
|
|
|
1463
1469
|
const moreDot = () => {
|
|
@@ -1637,98 +1643,6 @@ const getKeyBindings = () => {
|
|
|
1637
1643
|
}];
|
|
1638
1644
|
};
|
|
1639
1645
|
|
|
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
1646
|
/**
|
|
1733
1647
|
* @enum {string}
|
|
1734
1648
|
*/
|
|
@@ -1801,7 +1715,7 @@ const menuEntrySeparator = {
|
|
|
1801
1715
|
};
|
|
1802
1716
|
|
|
1803
1717
|
const id$9 = Edit;
|
|
1804
|
-
const getMenuEntries$
|
|
1718
|
+
const getMenuEntries$d = () => {
|
|
1805
1719
|
return [{
|
|
1806
1720
|
id: 'undo',
|
|
1807
1721
|
label: undo(),
|
|
@@ -1842,7 +1756,7 @@ const getMenuEntries$c = () => {
|
|
|
1842
1756
|
|
|
1843
1757
|
const MenuEntriesEdit = {
|
|
1844
1758
|
__proto__: null,
|
|
1845
|
-
getMenuEntries: getMenuEntries$
|
|
1759
|
+
getMenuEntries: getMenuEntries$d,
|
|
1846
1760
|
id: id$9
|
|
1847
1761
|
};
|
|
1848
1762
|
|
|
@@ -1855,6 +1769,7 @@ const UiStrings$1 = {
|
|
|
1855
1769
|
OpenFile: 'Open File',
|
|
1856
1770
|
OpenFolder: 'Open Folder',
|
|
1857
1771
|
OpenRecent: 'Open Recent',
|
|
1772
|
+
Exit: 'Exit',
|
|
1858
1773
|
Save: 'Save',
|
|
1859
1774
|
SaveAll: 'Save All'
|
|
1860
1775
|
};
|
|
@@ -1879,13 +1794,15 @@ const save = () => {
|
|
|
1879
1794
|
const saveAll = () => {
|
|
1880
1795
|
return i18nString(UiStrings$1.SaveAll);
|
|
1881
1796
|
};
|
|
1882
|
-
|
|
1883
|
-
|
|
1797
|
+
const exit = () => {
|
|
1798
|
+
return i18nString(UiStrings$1.Exit);
|
|
1799
|
+
};
|
|
1884
1800
|
|
|
1885
1801
|
const Web = 1;
|
|
1802
|
+
const Electron = 2;
|
|
1886
1803
|
|
|
1887
1804
|
const id$8 = File;
|
|
1888
|
-
const getMenuEntries$
|
|
1805
|
+
const getMenuEntries$c = platform => {
|
|
1889
1806
|
const entries = [{
|
|
1890
1807
|
id: 'newFile',
|
|
1891
1808
|
label: newFile(),
|
|
@@ -1922,26 +1839,40 @@ const getMenuEntries$b = () => {
|
|
|
1922
1839
|
flags: None,
|
|
1923
1840
|
command: 'Main.saveAll'
|
|
1924
1841
|
}];
|
|
1842
|
+
if (platform === Electron) {
|
|
1843
|
+
entries.push(menuEntrySeparator, {
|
|
1844
|
+
id: 'exit',
|
|
1845
|
+
label: exit(),
|
|
1846
|
+
flags: Ignore,
|
|
1847
|
+
command: 'Chrome.exit'
|
|
1848
|
+
});
|
|
1849
|
+
}
|
|
1925
1850
|
return entries;
|
|
1926
1851
|
};
|
|
1927
1852
|
|
|
1928
1853
|
const MenuEntriesFile = {
|
|
1929
1854
|
__proto__: null,
|
|
1930
|
-
getMenuEntries: getMenuEntries$
|
|
1855
|
+
getMenuEntries: getMenuEntries$c,
|
|
1931
1856
|
id: id$8
|
|
1932
1857
|
};
|
|
1933
1858
|
|
|
1934
1859
|
const id$7 = Go;
|
|
1935
|
-
const getMenuEntries$
|
|
1860
|
+
const getMenuEntries$b = () => {
|
|
1936
1861
|
return [];
|
|
1937
1862
|
};
|
|
1938
1863
|
|
|
1939
1864
|
const MenuEntriesGo = {
|
|
1940
1865
|
__proto__: null,
|
|
1941
|
-
getMenuEntries: getMenuEntries$
|
|
1866
|
+
getMenuEntries: getMenuEntries$b,
|
|
1942
1867
|
id: id$7
|
|
1943
1868
|
};
|
|
1944
1869
|
|
|
1870
|
+
const toggleDeveloperTools = () => {
|
|
1871
|
+
return i18nString(ToggleDeveloperTools);
|
|
1872
|
+
};
|
|
1873
|
+
const openProcessExplorer = () => {
|
|
1874
|
+
return i18nString(OpenProcessExplorer);
|
|
1875
|
+
};
|
|
1945
1876
|
const checkForUpdates = () => {
|
|
1946
1877
|
return i18nString(CheckForUpdates);
|
|
1947
1878
|
};
|
|
@@ -1949,16 +1880,30 @@ const about = () => {
|
|
|
1949
1880
|
return i18nString(About);
|
|
1950
1881
|
};
|
|
1951
1882
|
|
|
1952
|
-
const isAutoUpdateSupported =
|
|
1953
|
-
{
|
|
1883
|
+
const isAutoUpdateSupported = platform => {
|
|
1884
|
+
if (platform !== Electron) {
|
|
1954
1885
|
return false;
|
|
1955
1886
|
}
|
|
1887
|
+
return false;
|
|
1956
1888
|
};
|
|
1957
1889
|
|
|
1958
1890
|
const id$6 = Help;
|
|
1959
|
-
const getMenuEntries$
|
|
1960
|
-
const autoUpdateSupported = isAutoUpdateSupported();
|
|
1891
|
+
const getMenuEntries$a = async platform => {
|
|
1892
|
+
const autoUpdateSupported = isAutoUpdateSupported(platform);
|
|
1961
1893
|
const entries = [];
|
|
1894
|
+
if (platform !== Web) {
|
|
1895
|
+
entries.push({
|
|
1896
|
+
id: 'toggleDeveloperTools',
|
|
1897
|
+
label: toggleDeveloperTools(),
|
|
1898
|
+
flags: None,
|
|
1899
|
+
command: 'Developer.toggleDeveloperTools'
|
|
1900
|
+
}, {
|
|
1901
|
+
id: 'openProcessExplorer',
|
|
1902
|
+
label: openProcessExplorer(),
|
|
1903
|
+
flags: RestoreFocus,
|
|
1904
|
+
command: 'Developer.openProcessExplorer'
|
|
1905
|
+
});
|
|
1906
|
+
}
|
|
1962
1907
|
if (autoUpdateSupported) {
|
|
1963
1908
|
entries.push(menuEntrySeparator, {
|
|
1964
1909
|
id: 'checkForUpdates',
|
|
@@ -1981,22 +1926,26 @@ const getMenuEntries$9 = async () => {
|
|
|
1981
1926
|
|
|
1982
1927
|
const MenuEntriesHelp = {
|
|
1983
1928
|
__proto__: null,
|
|
1984
|
-
getMenuEntries: getMenuEntries$
|
|
1929
|
+
getMenuEntries: getMenuEntries$a,
|
|
1985
1930
|
id: id$6
|
|
1986
1931
|
};
|
|
1987
1932
|
|
|
1988
|
-
const state = {
|
|
1933
|
+
const state$1 = {
|
|
1989
1934
|
rpc: undefined
|
|
1990
1935
|
};
|
|
1991
1936
|
const invoke = (method, ...params) => {
|
|
1992
1937
|
const {
|
|
1993
1938
|
rpc
|
|
1994
|
-
} = state;
|
|
1939
|
+
} = state$1;
|
|
1995
1940
|
// @ts-ignore
|
|
1996
1941
|
return rpc.invoke(method, ...params);
|
|
1997
1942
|
};
|
|
1998
1943
|
const setRpc = rpc => {
|
|
1999
|
-
state.rpc = rpc;
|
|
1944
|
+
state$1.rpc = rpc;
|
|
1945
|
+
};
|
|
1946
|
+
|
|
1947
|
+
const getRecentlyOpened = () => {
|
|
1948
|
+
return invoke(/* RecentlyOpened.getRecentlyOpened */'RecentlyOpened.getRecentlyOpened');
|
|
2000
1949
|
};
|
|
2001
1950
|
|
|
2002
1951
|
const getTitle = uri => {
|
|
@@ -2016,11 +1965,8 @@ const toMenuItem = folder => {
|
|
|
2016
1965
|
args: [folder]
|
|
2017
1966
|
};
|
|
2018
1967
|
};
|
|
2019
|
-
const getRecentlyOpened = () => {
|
|
2020
|
-
return invoke(/* RecentlyOpened.getRecentlyOpened */'RecentlyOpened.getRecentlyOpened');
|
|
2021
|
-
};
|
|
2022
1968
|
const id$5 = OpenRecent;
|
|
2023
|
-
const getMenuEntries$
|
|
1969
|
+
const getMenuEntries$9 = async () => {
|
|
2024
1970
|
const allItems = await getRecentlyOpened();
|
|
2025
1971
|
const itemsToShow = allItems.slice(0, MAX_MENU_RECENT_ENTRIES);
|
|
2026
1972
|
const items = [];
|
|
@@ -2043,23 +1989,23 @@ const getMenuEntries$8 = async () => {
|
|
|
2043
1989
|
|
|
2044
1990
|
const MenuEntriesOpenRecent = {
|
|
2045
1991
|
__proto__: null,
|
|
2046
|
-
getMenuEntries: getMenuEntries$
|
|
1992
|
+
getMenuEntries: getMenuEntries$9,
|
|
2047
1993
|
id: id$5
|
|
2048
1994
|
};
|
|
2049
1995
|
|
|
2050
1996
|
const id$4 = Run;
|
|
2051
|
-
const getMenuEntries$
|
|
1997
|
+
const getMenuEntries$8 = () => {
|
|
2052
1998
|
return [];
|
|
2053
1999
|
};
|
|
2054
2000
|
|
|
2055
2001
|
const MenuEntriesRun = {
|
|
2056
2002
|
__proto__: null,
|
|
2057
|
-
getMenuEntries: getMenuEntries$
|
|
2003
|
+
getMenuEntries: getMenuEntries$8,
|
|
2058
2004
|
id: id$4
|
|
2059
2005
|
};
|
|
2060
2006
|
|
|
2061
2007
|
const id$3 = Selection;
|
|
2062
|
-
const getMenuEntries$
|
|
2008
|
+
const getMenuEntries$7 = () => {
|
|
2063
2009
|
return [{
|
|
2064
2010
|
id: 'selectAll',
|
|
2065
2011
|
label: selectAll(),
|
|
@@ -2090,7 +2036,7 @@ const getMenuEntries$6 = () => {
|
|
|
2090
2036
|
|
|
2091
2037
|
const MenuEntriesSelection = {
|
|
2092
2038
|
__proto__: null,
|
|
2093
|
-
getMenuEntries: getMenuEntries$
|
|
2039
|
+
getMenuEntries: getMenuEntries$7,
|
|
2094
2040
|
id: id$3
|
|
2095
2041
|
};
|
|
2096
2042
|
|
|
@@ -2105,7 +2051,7 @@ const newTerminal = () => {
|
|
|
2105
2051
|
};
|
|
2106
2052
|
|
|
2107
2053
|
const id$2 = Terminal;
|
|
2108
|
-
const getMenuEntries$
|
|
2054
|
+
const getMenuEntries$6 = () => {
|
|
2109
2055
|
return [{
|
|
2110
2056
|
id: 'newTerminal',
|
|
2111
2057
|
label: newTerminal(),
|
|
@@ -2117,7 +2063,7 @@ const getMenuEntries$5 = () => {
|
|
|
2117
2063
|
|
|
2118
2064
|
const MenuEntriesTerminal = {
|
|
2119
2065
|
__proto__: null,
|
|
2120
|
-
getMenuEntries: getMenuEntries$
|
|
2066
|
+
getMenuEntries: getMenuEntries$6,
|
|
2121
2067
|
id: id$2
|
|
2122
2068
|
};
|
|
2123
2069
|
|
|
@@ -2146,7 +2092,7 @@ const help = () => {
|
|
|
2146
2092
|
return i18nString(Help$1);
|
|
2147
2093
|
};
|
|
2148
2094
|
|
|
2149
|
-
const getMenuEntries$
|
|
2095
|
+
const getMenuEntries$5 = () => {
|
|
2150
2096
|
return [{
|
|
2151
2097
|
id: File,
|
|
2152
2098
|
label: file(),
|
|
@@ -2185,7 +2131,7 @@ const getMenuEntries$4 = () => {
|
|
|
2185
2131
|
}];
|
|
2186
2132
|
};
|
|
2187
2133
|
|
|
2188
|
-
const getMenuEntries$
|
|
2134
|
+
const getMenuEntries$4 = () => {
|
|
2189
2135
|
return [{
|
|
2190
2136
|
id: File,
|
|
2191
2137
|
label: file(),
|
|
@@ -2213,37 +2159,227 @@ const getMenuEntries$3 = () => {
|
|
|
2213
2159
|
}];
|
|
2214
2160
|
};
|
|
2215
2161
|
|
|
2216
|
-
const getFn =
|
|
2162
|
+
const getFn = platform => {
|
|
2217
2163
|
switch (platform) {
|
|
2218
2164
|
case Web:
|
|
2219
|
-
return getMenuEntries$3;
|
|
2220
|
-
default:
|
|
2221
2165
|
return getMenuEntries$4;
|
|
2166
|
+
default:
|
|
2167
|
+
return getMenuEntries$5;
|
|
2222
2168
|
}
|
|
2223
2169
|
};
|
|
2224
2170
|
const id$1 = TitleBar;
|
|
2225
|
-
const getMenuEntries$
|
|
2226
|
-
const fn = getFn();
|
|
2171
|
+
const getMenuEntries$3 = async platform => {
|
|
2172
|
+
const fn = getFn(platform);
|
|
2227
2173
|
return fn();
|
|
2228
2174
|
};
|
|
2229
2175
|
|
|
2230
2176
|
const MenuEntriesTitleBar = {
|
|
2231
2177
|
__proto__: null,
|
|
2232
|
-
getMenuEntries: getMenuEntries$
|
|
2178
|
+
getMenuEntries: getMenuEntries$3,
|
|
2233
2179
|
id: id$1
|
|
2234
2180
|
};
|
|
2235
2181
|
|
|
2236
2182
|
const id = View;
|
|
2237
|
-
const getMenuEntries$
|
|
2183
|
+
const getMenuEntries$2 = () => {
|
|
2238
2184
|
return [];
|
|
2239
2185
|
};
|
|
2240
2186
|
|
|
2241
2187
|
const MenuEntriesView = {
|
|
2242
2188
|
__proto__: null,
|
|
2243
|
-
getMenuEntries: getMenuEntries$
|
|
2189
|
+
getMenuEntries: getMenuEntries$2,
|
|
2244
2190
|
id
|
|
2245
2191
|
};
|
|
2246
2192
|
|
|
2193
|
+
const menus$1 = [MenuEntriesEdit, MenuEntriesFile, MenuEntriesGo, MenuEntriesHelp, MenuEntriesRun, MenuEntriesSelection, MenuEntriesTerminal, MenuEntriesTitleBar, MenuEntriesView, MenuEntriesOpenRecent];
|
|
2194
|
+
|
|
2195
|
+
const getMenuIds = () => {
|
|
2196
|
+
return menus$1.map(menu => menu.id);
|
|
2197
|
+
};
|
|
2198
|
+
const getMenuEntries$1 = (id, platform) => {
|
|
2199
|
+
const menu = menus$1.find(item => item.id === id);
|
|
2200
|
+
if (!menu) {
|
|
2201
|
+
return [];
|
|
2202
|
+
}
|
|
2203
|
+
return menu.getMenuEntries(platform);
|
|
2204
|
+
};
|
|
2205
|
+
|
|
2206
|
+
const getIconVirtualDom = (icon, type = Div) => {
|
|
2207
|
+
return {
|
|
2208
|
+
type,
|
|
2209
|
+
className: `MaskIcon MaskIcon${icon}`,
|
|
2210
|
+
role: None$1,
|
|
2211
|
+
childCount: 0
|
|
2212
|
+
};
|
|
2213
|
+
};
|
|
2214
|
+
|
|
2215
|
+
const createTitleBarButton = button => {
|
|
2216
|
+
const {
|
|
2217
|
+
id,
|
|
2218
|
+
icon,
|
|
2219
|
+
label,
|
|
2220
|
+
onClick
|
|
2221
|
+
} = button;
|
|
2222
|
+
const dom = [{
|
|
2223
|
+
type: Button,
|
|
2224
|
+
className: `TitleBarButton TitleBarButton${id}`,
|
|
2225
|
+
ariaLabel: label,
|
|
2226
|
+
childCount: 1,
|
|
2227
|
+
onClick
|
|
2228
|
+
}, getIconVirtualDom(icon, I)];
|
|
2229
|
+
return dom;
|
|
2230
|
+
};
|
|
2231
|
+
|
|
2232
|
+
const getTitleBarButtonsVirtualDom = buttons => {
|
|
2233
|
+
const dom = [{
|
|
2234
|
+
type: Div,
|
|
2235
|
+
className: 'Viewlet TitleBarButtons',
|
|
2236
|
+
childCount: buttons.length
|
|
2237
|
+
}, ...buttons.flatMap(createTitleBarButton)];
|
|
2238
|
+
return dom;
|
|
2239
|
+
};
|
|
2240
|
+
|
|
2241
|
+
const getTitleBarIconVirtualDom = iconSrc => {
|
|
2242
|
+
return [{
|
|
2243
|
+
type: Div,
|
|
2244
|
+
className: 'Viewlet TitleBarIcon',
|
|
2245
|
+
childCount: 1
|
|
2246
|
+
}, {
|
|
2247
|
+
type: Img,
|
|
2248
|
+
className: 'TitleBarIconIcon',
|
|
2249
|
+
src: iconSrc,
|
|
2250
|
+
alt: '',
|
|
2251
|
+
childCount: 0
|
|
2252
|
+
}];
|
|
2253
|
+
};
|
|
2254
|
+
|
|
2255
|
+
const getTitleVirtualDom = title => {
|
|
2256
|
+
return [text(title)];
|
|
2257
|
+
};
|
|
2258
|
+
|
|
2259
|
+
const handleClickClose = async state => {
|
|
2260
|
+
await invoke('ElectronWindow.close');
|
|
2261
|
+
return state;
|
|
2262
|
+
};
|
|
2263
|
+
|
|
2264
|
+
const handleClickMinimize = async state => {
|
|
2265
|
+
await invoke('ElectronWindow.minimize');
|
|
2266
|
+
return state;
|
|
2267
|
+
};
|
|
2268
|
+
|
|
2269
|
+
const handleClickToggleMaximize = async state => {
|
|
2270
|
+
await (invoke('ElectronWindow.maximize'));
|
|
2271
|
+
return state;
|
|
2272
|
+
};
|
|
2273
|
+
|
|
2274
|
+
const handleClick$1 = (state, className) => {
|
|
2275
|
+
if (className.includes('Minimize')) {
|
|
2276
|
+
return handleClickMinimize(state);
|
|
2277
|
+
}
|
|
2278
|
+
if (className.includes('Maximize') || className.includes('Restore')) {
|
|
2279
|
+
return handleClickToggleMaximize(state);
|
|
2280
|
+
}
|
|
2281
|
+
if (className.includes('Close')) {
|
|
2282
|
+
return handleClickClose(state);
|
|
2283
|
+
}
|
|
2284
|
+
return state;
|
|
2285
|
+
};
|
|
2286
|
+
|
|
2287
|
+
const handleContextMenu = state => {
|
|
2288
|
+
return state;
|
|
2289
|
+
};
|
|
2290
|
+
|
|
2291
|
+
const getFontString = (fontWeight, fontSize, fontFamily) => {
|
|
2292
|
+
return `${fontWeight} ${fontSize}px ${fontFamily}`;
|
|
2293
|
+
};
|
|
2294
|
+
|
|
2295
|
+
const state = {
|
|
2296
|
+
ctx: undefined
|
|
2297
|
+
};
|
|
2298
|
+
const getOrCreate = createCtx => {
|
|
2299
|
+
if (state.ctx) {
|
|
2300
|
+
return state.ctx;
|
|
2301
|
+
}
|
|
2302
|
+
state.ctx = createCtx();
|
|
2303
|
+
return state.ctx;
|
|
2304
|
+
};
|
|
2305
|
+
|
|
2306
|
+
const createCtx = () => {
|
|
2307
|
+
const canvas = new OffscreenCanvas(0, 0);
|
|
2308
|
+
const ctx = /** @type {OffscreenCanvasRenderingContext2D} */canvas.getContext('2d');
|
|
2309
|
+
if (!ctx) {
|
|
2310
|
+
throw new Error('Failed to get canvas context 2d');
|
|
2311
|
+
}
|
|
2312
|
+
return ctx;
|
|
2313
|
+
};
|
|
2314
|
+
const getContext = () => {
|
|
2315
|
+
const ctx = getOrCreate(createCtx);
|
|
2316
|
+
return ctx;
|
|
2317
|
+
};
|
|
2318
|
+
|
|
2319
|
+
const px = value => {
|
|
2320
|
+
return `${value}px`;
|
|
2321
|
+
};
|
|
2322
|
+
|
|
2323
|
+
const getLetterSpacingString = letterSpacing => {
|
|
2324
|
+
return px(letterSpacing);
|
|
2325
|
+
};
|
|
2326
|
+
const measureTextWidth = (text, fontWeight, fontSize, fontFamily, letterSpacing, isMonoSpaceFont, charWidth) => {
|
|
2327
|
+
string(text);
|
|
2328
|
+
number(fontWeight);
|
|
2329
|
+
number(fontSize);
|
|
2330
|
+
string(fontFamily);
|
|
2331
|
+
boolean(isMonoSpaceFont);
|
|
2332
|
+
number(charWidth);
|
|
2333
|
+
if (typeof letterSpacing !== 'number') {
|
|
2334
|
+
throw new TypeError('letterSpacing must be of type number');
|
|
2335
|
+
}
|
|
2336
|
+
const letterSpacingString = getLetterSpacingString(letterSpacing);
|
|
2337
|
+
const fontString = getFontString(fontWeight, fontSize, fontFamily);
|
|
2338
|
+
const ctx = getContext();
|
|
2339
|
+
// @ts-ignore
|
|
2340
|
+
ctx.letterSpacing = letterSpacingString;
|
|
2341
|
+
ctx.font = fontString;
|
|
2342
|
+
const metrics = ctx.measureText(text);
|
|
2343
|
+
const {
|
|
2344
|
+
width
|
|
2345
|
+
} = metrics;
|
|
2346
|
+
return width;
|
|
2347
|
+
};
|
|
2348
|
+
|
|
2349
|
+
const measureTitleBarEntryWidth = (label, fontWeight, fontSize, fontFamily, letterSpacing) => {
|
|
2350
|
+
const isMonospaceFont = false;
|
|
2351
|
+
const charWidth = 0;
|
|
2352
|
+
return measureTextWidth(label, fontWeight, fontSize, fontFamily, letterSpacing, isMonospaceFont, charWidth);
|
|
2353
|
+
};
|
|
2354
|
+
|
|
2355
|
+
const addWidths = (entries, labelPadding, fontWeight, fontSize, fontFamily, letterSpacing) => {
|
|
2356
|
+
const withWidths = [];
|
|
2357
|
+
for (const entry of entries) {
|
|
2358
|
+
const textWidth = measureTitleBarEntryWidth(entry.label, fontWeight, fontSize, fontFamily, letterSpacing);
|
|
2359
|
+
const width = textWidth + labelPadding * 2;
|
|
2360
|
+
withWidths.push({
|
|
2361
|
+
...entry,
|
|
2362
|
+
width
|
|
2363
|
+
});
|
|
2364
|
+
}
|
|
2365
|
+
return withWidths;
|
|
2366
|
+
};
|
|
2367
|
+
|
|
2368
|
+
const loadContent = async (state, titleBarEntries) => {
|
|
2369
|
+
const {
|
|
2370
|
+
labelFontFamily,
|
|
2371
|
+
labelFontSize,
|
|
2372
|
+
labelFontWeight,
|
|
2373
|
+
labelLetterSpacing,
|
|
2374
|
+
labelPadding
|
|
2375
|
+
} = state;
|
|
2376
|
+
const withWidths = addWidths(titleBarEntries, labelPadding, labelFontWeight, labelFontSize, labelFontFamily, labelLetterSpacing);
|
|
2377
|
+
return {
|
|
2378
|
+
...state,
|
|
2379
|
+
titleBarEntries: withWidths
|
|
2380
|
+
};
|
|
2381
|
+
};
|
|
2382
|
+
|
|
2247
2383
|
const menus = [MenuEntriesEdit, MenuEntriesFile, MenuEntriesGo, MenuEntriesHelp, MenuEntriesRun, MenuEntriesSelection, MenuEntriesTerminal, MenuEntriesTitleBar, MenuEntriesView, MenuEntriesOpenRecent];
|
|
2248
2384
|
const getMenus = () => {
|
|
2249
2385
|
return menus;
|
|
@@ -2268,6 +2404,19 @@ const getMenuEntries = async (id, ...args) => {
|
|
|
2268
2404
|
}
|
|
2269
2405
|
};
|
|
2270
2406
|
|
|
2407
|
+
const renderEventListeners = () => {
|
|
2408
|
+
return [{
|
|
2409
|
+
name: 'handleClickMinimize',
|
|
2410
|
+
params: ['handleClickMinimize']
|
|
2411
|
+
}, {
|
|
2412
|
+
name: 'handleClickClose',
|
|
2413
|
+
params: ['handleClickClose']
|
|
2414
|
+
}, {
|
|
2415
|
+
name: 'handleClickToggleMaximize',
|
|
2416
|
+
params: ['handleClickToggleMaximize']
|
|
2417
|
+
}];
|
|
2418
|
+
};
|
|
2419
|
+
|
|
2271
2420
|
const saveState = uid => {
|
|
2272
2421
|
return {};
|
|
2273
2422
|
};
|
|
@@ -2336,14 +2485,9 @@ const getTotalWidth = entries => {
|
|
|
2336
2485
|
};
|
|
2337
2486
|
|
|
2338
2487
|
// TODO lazyload menuEntries and use Command.execute (maybe)
|
|
2339
|
-
const MENU_WIDTH = 150;
|
|
2340
2488
|
const CONTEXT_MENU_ITEM_HEIGHT = 26;
|
|
2341
2489
|
const CONTEXT_MENU_SEPARATOR_HEIGHT = 11;
|
|
2342
2490
|
const CONTEXT_MENU_PADDING = 8;
|
|
2343
|
-
const CONTEXT_MENU_WIDTH = 250;
|
|
2344
|
-
const getMenuWidth = () => {
|
|
2345
|
-
return CONTEXT_MENU_WIDTH;
|
|
2346
|
-
};
|
|
2347
2491
|
const getMenuHeight = items => {
|
|
2348
2492
|
let height = CONTEXT_MENU_PADDING;
|
|
2349
2493
|
for (const item of items) {
|
|
@@ -2359,6 +2503,13 @@ const getMenuHeight = items => {
|
|
|
2359
2503
|
return height;
|
|
2360
2504
|
};
|
|
2361
2505
|
|
|
2506
|
+
// TODO lazyload menuEntries and use Command.execute (maybe)
|
|
2507
|
+
const MENU_WIDTH = 150;
|
|
2508
|
+
const CONTEXT_MENU_WIDTH = 250;
|
|
2509
|
+
const getMenuWidth = () => {
|
|
2510
|
+
return CONTEXT_MENU_WIDTH;
|
|
2511
|
+
};
|
|
2512
|
+
|
|
2362
2513
|
// TODO difference between focusing with mouse or keyboard
|
|
2363
2514
|
// with mouse -> open submenu
|
|
2364
2515
|
// with keyboard -> don't open submenu, only focus
|
|
@@ -2955,6 +3106,14 @@ const wrapCommand = fn => {
|
|
|
2955
3106
|
};
|
|
2956
3107
|
|
|
2957
3108
|
const commandMap = {
|
|
3109
|
+
'TitleBar.getButtonsVirtualDom': getTitleBarButtonsVirtualDom,
|
|
3110
|
+
'TitleBar.handleContextMenu': handleContextMenu,
|
|
3111
|
+
'TitleBar.getIconVirtualDom': getTitleBarIconVirtualDom,
|
|
3112
|
+
'TitleBar.getMenuEntries': getMenuEntries$1,
|
|
3113
|
+
'TitleBar.getMenuIds': getMenuIds,
|
|
3114
|
+
'TitleBar.getTitleVirtualDom': getTitleVirtualDom,
|
|
3115
|
+
'TitleBar.handleButtonsClick': handleClick$1,
|
|
3116
|
+
'TitleBar.renderEventListeners': renderEventListeners,
|
|
2958
3117
|
'TitleBarMenuBar.closeMenu': closeMenu,
|
|
2959
3118
|
'TitleBarMenuBar.create': create,
|
|
2960
3119
|
'TitleBarMenuBar.focus': wrapCommand(focus),
|
|
@@ -2976,7 +3135,6 @@ const commandMap = {
|
|
|
2976
3135
|
'TitleBarMenuBar.handleKeyEnd': wrapCommand(handleKeyEnd),
|
|
2977
3136
|
'TitleBarMenuBar.handleKeyEnter': wrapCommand(handleKeyEnter),
|
|
2978
3137
|
'TitleBarMenuBar.handleKeyEscape': wrapCommand(handleKeyEscape),
|
|
2979
|
-
'TitleBarMenuBar.saveState': saveState,
|
|
2980
3138
|
'TitleBarMenuBar.handleKeyHome': wrapCommand(handleKeyHome),
|
|
2981
3139
|
'TitleBarMenuBar.handleKeySpace': wrapCommand(handleKeySpace),
|
|
2982
3140
|
'TitleBarMenuBar.handleMenuClick': wrapCommand(handleMenuClick),
|
|
@@ -2985,9 +3143,10 @@ const commandMap = {
|
|
|
2985
3143
|
'TitleBarMenuBar.handleMouseOver': wrapCommand(handleMouseOver),
|
|
2986
3144
|
'TitleBarMenuBar.loadContent': wrapCommand(loadContent),
|
|
2987
3145
|
'TitleBarMenuBar.render': doRender,
|
|
3146
|
+
'TitleBarMenuBar.saveState': saveState,
|
|
3147
|
+
'TitleBarMenuBar.terminate': terminate,
|
|
2988
3148
|
'TitleBarMenuBar.toggleIndex': wrapCommand(toggleIndex),
|
|
2989
|
-
'TitleBarMenuBar.toggleMenu': wrapCommand(toggleMenu)
|
|
2990
|
-
'TitleBarMenuBar.terminate': terminate
|
|
3149
|
+
'TitleBarMenuBar.toggleMenu': wrapCommand(toggleMenu)
|
|
2991
3150
|
};
|
|
2992
3151
|
|
|
2993
3152
|
const listen = async () => {
|