mirror of
https://github.com/workbenchdev/Workbench.git
synced 2025-08-12 00:02:38 -04:00
Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
730729b2f1 | ||
|
b5d2e7806f | ||
|
a48d234c56 | ||
|
34fbe9f018 | ||
|
dc0c931917 | ||
|
af32c09966 | ||
|
584b9e440e | ||
|
2a65be9e33 | ||
|
630dbb486f | ||
|
8ec88e697b | ||
|
987a9d4587 | ||
|
42c5e6c1d7 | ||
|
39f6eb9b51 | ||
|
156186b1c9 | ||
|
e97114eee2 | ||
|
0719075808 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -15,6 +15,7 @@ install
|
||||
__pycache__
|
||||
*.pyc
|
||||
*.gresource
|
||||
.frun
|
||||
|
||||
# IDEs / editors
|
||||
.idea
|
||||
|
8
.vscode/settings.json
vendored
8
.vscode/settings.json
vendored
@ -29,5 +29,11 @@
|
||||
"build",
|
||||
"builddir"
|
||||
],
|
||||
"vala.languageServerPath": "${workspaceFolder}/.flatpak/vala-language-server.sh"
|
||||
"vala.languageServerPath": "${workspaceFolder}/.flatpak/vala-language-server.sh",
|
||||
"[meson]": {
|
||||
"editor.defaultFormatter": "mesonbuild.mesonbuild"
|
||||
},
|
||||
"mesonbuild.configureOnOpen": false,
|
||||
"mesonbuild.buildFolder": "_build",
|
||||
"mesonbuild.mesonPath": "${workspaceFolder}/.flatpak/meson.sh"
|
||||
}
|
||||
|
6
Makefile
6
Makefile
@ -4,7 +4,7 @@ SHELL:=/bin/bash -O globstar
|
||||
|
||||
setup:
|
||||
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
||||
flatpak install --or-update --user --noninteractive flathub org.gnome.Sdk//47 org.flatpak.Builder org.freedesktop.Sdk.Extension.rust-stable//24.08 org.freedesktop.Sdk.Extension.vala//24.08 org.freedesktop.Sdk.Extension.llvm18//24.08 org.freedesktop.Sdk.Extension.node20//24.08 org.freedesktop.Sdk.Extension.typescript//24.08
|
||||
flatpak install --or-update --user --noninteractive flathub org.gnome.Sdk//48 org.flatpak.Builder org.freedesktop.Sdk.Extension.rust-stable//24.08 org.freedesktop.Sdk.Extension.vala//24.08 org.freedesktop.Sdk.Extension.llvm18//24.08 org.freedesktop.Sdk.Extension.node20//24.08 org.freedesktop.Sdk.Extension.typescript//24.08
|
||||
# flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo
|
||||
# flatpak remote-add --user --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
|
||||
# flatpak install --or-update --user --noninteractive gnome-nightly org.gnome.Sdk//master
|
||||
@ -43,8 +43,8 @@ lint:
|
||||
# CSS
|
||||
./build-aux/fun workbench-cli check css src/**/*.css
|
||||
# Flatpak manifests
|
||||
flatpak run --user --command=flatpak-builder-lint org.flatpak.Builder manifest --exceptions build-aux/re.sonny.Workbench.json
|
||||
flatpak run --user --command=flatpak-builder-lint org.flatpak.Builder manifest --exceptions build-aux/re.sonny.Workbench.Devel.json
|
||||
flatpak run --user --command=flatpak-builder-lint org.flatpak.Builder manifest --exceptions --user-exceptions ./build-aux/exceptions.json build-aux/re.sonny.Workbench.json
|
||||
flatpak run --user --command=flatpak-builder-lint org.flatpak.Builder manifest --exceptions --user-exceptions ./build-aux/exceptions.json build-aux/re.sonny.Workbench.Devel.json
|
||||
|
||||
unit:
|
||||
./build-aux/fun gjs -m ./troll/tst/bin.js test/*.test.js
|
||||
|
@ -31,9 +31,9 @@ Among other things, Workbench comes with
|
||||
|
||||
| | Formatter | Linter | Library demos[1] |
|
||||
| ---------- | --------- | ------ | ---------------- |
|
||||
| JavaScript | ✅ | ✅ | 99 |
|
||||
| Python | ✅ | ✅ | 95 |
|
||||
| Vala | ✅ | ✅ | 91 |
|
||||
| JavaScript | ✅ | ✅ | 103 |
|
||||
| Python | ✅ | ✅ | 98 |
|
||||
| Vala | ✅ | ✅ | 92 |
|
||||
| Rust | ✅ | ✅ | 52 |
|
||||
| Blueprint | ✅ | ✅ | |
|
||||
| CSS | ✅ | ✅ | |
|
||||
@ -45,7 +45,7 @@ Among other things, Workbench comes with
|
||||
<details>
|
||||
<summary>Disable code formatting</summary>
|
||||
|
||||
[JavaScript](https://docs.rome.tools/formatter/#ignoring-code)
|
||||
[JavaScript](https://biomejs.dev/formatter/#ignore-code)
|
||||
|
||||
[CSS](https://prettier.io/docs/en/ignore.html#css)
|
||||
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 8e10fcf8692108b9d4ab78f41086c5d7773ef864
|
||||
Subproject commit 04ef0944db56ab01307a29aaa7303df6067cb3c0
|
4
build-aux/exceptions.json
Normal file
4
build-aux/exceptions.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"re.sonny.Workbench": ["external-gitmodule-url-found"],
|
||||
"re.sonny.Workbench.Devel": ["external-gitmodule-url-found"]
|
||||
}
|
@ -21,8 +21,8 @@
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://download.gnome.org/sources/jsonrpc-glib/3.44/jsonrpc-glib-3.44.0.tar.xz",
|
||||
"sha256": "69406a0250d0cc5175408cae7eca80c0c6bfaefc4ae1830b354c0433bcd5ce06"
|
||||
"url": "https://download.gnome.org/sources/jsonrpc-glib/3.44/jsonrpc-glib-3.44.1.tar.xz",
|
||||
"sha256": "1361d17e9c805646afe5102e59baf8ca450238600fcabd01586c654b78bb30df"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -12,8 +12,8 @@
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://github.com/flatpak/libportal/releases/download/0.8.1/libportal-0.8.1.tar.xz",
|
||||
"sha256": "281e54e4f8561125a65d20658f1462ab932b2b1258c376fed2137718441825ac"
|
||||
"url": "https://github.com/flatpak/libportal/releases/download/0.9.1/libportal-0.9.1.tar.xz",
|
||||
"sha256": "de801ee349ed3c255a9af3c01b1a401fab5b3fc1c35eb2fd7dfb35d4b8194d7f"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "libshumate",
|
||||
"buildsystem": "meson",
|
||||
"config-opts": ["--libdir=/app/lib", "-Dgtk_doc=false"],
|
||||
"config-opts": ["--libdir=/app/lib", "-Ddemos=false", "-Dgtk_doc=false"],
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://download.gnome.org/sources/libshumate/1.3/libshumate-1.3.0.tar.xz",
|
||||
"sha256": "8227a6e8281cde12232894fef83760d44fa66b39ef033c61ed934a86c6dc75d4"
|
||||
"url": "https://download.gnome.org/sources/libshumate/1.4/libshumate-1.4.rc.tar.xz",
|
||||
"sha256": "a57b97dbbda55bcb07c6f0197ff006128518c2b2c88fbee8bea5168acbc9baee"
|
||||
}
|
||||
],
|
||||
"modules": [
|
||||
@ -29,8 +29,8 @@
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://github.com/protobuf-c/protobuf-c/releases/download/v1.5.0/protobuf-c-1.5.0.tar.gz",
|
||||
"sha256": "7b404c63361ed35b3667aec75cc37b54298d56dd2bcf369de3373212cc06fd98"
|
||||
"url": "https://github.com/protobuf-c/protobuf-c/releases/download/v1.4.0/protobuf-c-1.4.0.tar.gz",
|
||||
"sha256": "26d98ee9bf18a6eba0d3f855ddec31dbe857667d269bc0b6017335572f85bbcb"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -5,8 +5,8 @@
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://download.gnome.org/sources/libspelling/0.4/libspelling-0.4.5.tar.xz",
|
||||
"sha256": "ec0372d83f42b65aee3734248ef8e2ffbfba4ea91268419c98ea44a00ef3e83f"
|
||||
"url": "https://download.gnome.org/sources/libspelling/0.4/libspelling-0.4.6.tar.xz",
|
||||
"sha256": "3248a9b5336ea2f727d2db912d2f0083accc0505ce707679b3d9b8266c0101f5"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -12,8 +12,21 @@
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://download.gnome.org/sources/vte/0.78/vte-0.78.2.tar.xz",
|
||||
"sha256": "35d7bcde07356846b4a12881c8e016705b70a9004a9082285eee5834ccc49890"
|
||||
"url": "https://download.gnome.org/sources/vte/0.79/vte-0.79.91.tar.xz",
|
||||
"sha256": "adca667d40ae1839ba258b63701cd05fba249303d72258711cc69294b2cb8646"
|
||||
}
|
||||
],
|
||||
"modules": [
|
||||
{
|
||||
"name": "fast_float",
|
||||
"buildsystem": "cmake-ninja",
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://github.com/fastfloat/fast_float/archive/refs/tags/v6.1.6.tar.gz",
|
||||
"sha256": "4458aae4b0eb55717968edda42987cabf5f7fc737aee8fede87a70035dba9ab0"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
"$schema": "https://raw.githubusercontent.com/flatpak/flatpak-builder/main/data/flatpak-manifest.schema.json",
|
||||
"id": "re.sonny.Workbench.Devel",
|
||||
"runtime": "org.gnome.Sdk",
|
||||
"runtime-version": "47",
|
||||
"runtime-version": "48",
|
||||
"sdk": "org.gnome.Sdk",
|
||||
"sdk-extensions": [
|
||||
"org.freedesktop.Sdk.Extension.vala",
|
||||
|
@ -2,7 +2,7 @@
|
||||
"$schema": "https://raw.githubusercontent.com/flatpak/flatpak-builder/main/data/flatpak-manifest.schema.json",
|
||||
"id": "re.sonny.Workbench",
|
||||
"runtime": "org.gnome.Sdk",
|
||||
"runtime-version": "47",
|
||||
"runtime-version": "48",
|
||||
"sdk": "org.gnome.Sdk",
|
||||
"sdk-extensions": [
|
||||
"org.freedesktop.Sdk.Extension.vala",
|
||||
|
@ -27,7 +27,7 @@ console.debug(argv);
|
||||
const [manifest_path] = argv._;
|
||||
if (!manifest_path) {
|
||||
// eslint-disable-next-line no-restricted-globals
|
||||
print(`${programInvocationName} [--verbose] [--debug] MANIFEST`);
|
||||
print(`${programInvocationName} [--verbose] [--debug] MANIFEST [-- command]`);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@ -100,6 +100,7 @@ if (!exists(`${path}/.flatpak/flatpak-builder`)) {
|
||||
|
||||
// builds workbench
|
||||
if (!exists(`${path}/_build`)) {
|
||||
await buildModules();
|
||||
await buildCommand([
|
||||
"meson",
|
||||
"--prefix",
|
||||
@ -224,7 +225,7 @@ async function exec(argv, { cancellable = null /*, verbose = false*/ }) {
|
||||
return arg.toString();
|
||||
});
|
||||
|
||||
console.debug(`$ ${argv}`);
|
||||
console.debug(`$ ${argv.join(" ")}`);
|
||||
|
||||
let cancelId = 0;
|
||||
|
||||
|
@ -8,6 +8,6 @@ Type=Application
|
||||
Categories=WebDevelopment;Development;IDE;GNOME;GTK;
|
||||
Icon=@app_id@
|
||||
# TRANSLATORS: Don't translate
|
||||
Keywords=CSS;JavaScript;GJS;Blueprint;builder;Vala;GTK;libadwaita;Python;PyGObject;Rust;doc;playground;code;
|
||||
Keywords=CSS;JavaScript;GJS;Blueprint;builder;Vala;GTK;libadwaita;Python;PyGObject;Rust;doc;playground;code;TypeScript;
|
||||
DBusActivatable=true
|
||||
StartupNotify=true
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<schemalist gettext-domain="@app_id@">
|
||||
<schemalist>
|
||||
<enum id="re.sonny.Workbench.UserInterfaceLanguage">
|
||||
<value nick="blueprint" value="0"/>
|
||||
<value nick="xml" value="1"/>
|
||||
@ -59,16 +59,16 @@
|
||||
<key name="edited" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
<key name="width" type="i">
|
||||
<key name="window-width" type="i">
|
||||
<default>0</default>
|
||||
</key>
|
||||
<key name="height" type="i">
|
||||
<key name="window-height" type="i">
|
||||
<default>0</default>
|
||||
</key>
|
||||
<key name="maximized" type="b">
|
||||
<key name="window-maximized" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
<key name="fullscreened" type="b">
|
||||
<key name="window-fullscreened" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
</schema>
|
||||
|
@ -43,6 +43,41 @@
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1" />
|
||||
<releases>
|
||||
<release version="48.0" date="2025-04-xx">
|
||||
<description translatable="no">
|
||||
<ul>
|
||||
<li>Use GNOME 48</li>
|
||||
</ul>
|
||||
<p>Library:</p>
|
||||
<ul>
|
||||
<li>Add "Shortcuts Window" demo</li>
|
||||
</ul>
|
||||
<p>Dependencies:</p>
|
||||
<ul>
|
||||
<!-- <li>Update Jsonrpc-GLib to 3.44.1</li> -->
|
||||
<li>Update libportal to 0.9.1</li>
|
||||
<li>Update libshumate to 1.4</li>
|
||||
<li>Update libspelling to 0.4.6</li>
|
||||
<li>Update vte to 0.80.0</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
|
||||
<release version="47.1" date="2025-01-24">
|
||||
<description translatable="no">
|
||||
<ul>
|
||||
<li>Fix permissions dialog</li>
|
||||
<li>Update Blueprint to 0.16.0</li>
|
||||
<li>Update libportal to 0.9.0</li>
|
||||
</ul>
|
||||
<p>Library:</p>
|
||||
<ul>
|
||||
<li>Replace GTK syntax with CSS variables</li>
|
||||
<li>Fix year sorting in "Column View" Python</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
|
||||
<release version="47.0" date="2024-12-11">
|
||||
<description translatable="no">
|
||||
<ul>
|
||||
|
2
demos
2
demos
@ -1 +1 @@
|
||||
Subproject commit a63852e11f84f77907a699cc6ec4c09cf4ef921b
|
||||
Subproject commit cd8b209df99294c72a5846ead00797db0bafa862
|
12
meson.build
12
meson.build
@ -1,9 +1,13 @@
|
||||
project('Workbench', ['vala', 'c', 'rust'],
|
||||
version: '47.0',
|
||||
meson_version: '>= 0.64.0',
|
||||
project(
|
||||
'Workbench',
|
||||
['vala', 'c', 'rust'],
|
||||
version: '48.0',
|
||||
meson_version: '>= 1.0.0',
|
||||
license: 'GPL-3.0-only',
|
||||
default_options: [
|
||||
'libdir=lib',
|
||||
'warning_level=2',
|
||||
'werror=false',
|
||||
],
|
||||
)
|
||||
|
||||
@ -33,5 +37,5 @@ subdir('src')
|
||||
gnome.post_install(
|
||||
glib_compile_schemas: true,
|
||||
gtk_update_icon_cache: true,
|
||||
update_desktop_database: true
|
||||
update_desktop_database: true,
|
||||
)
|
14
package-lock.json
generated
14
package-lock.json
generated
@ -17,7 +17,7 @@
|
||||
"events": "^3.3.0",
|
||||
"husky": "^8.0.3",
|
||||
"lint-staged": "^14.0.1",
|
||||
"ltx": "git://github.com/xmppjs/ltx.git#d351ffa26ef1c5f2fbee7888d0bcd5047eb8a988",
|
||||
"ltx": "git://github.com/xmppjs/ltx.git#072690a43a51254ddd17b082131a8b9115586e8a",
|
||||
"postcss": "^8.4.14",
|
||||
"prettier": "3.0.3",
|
||||
"rollup": "^2.76.0",
|
||||
@ -2921,9 +2921,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ltx": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "git+ssh://git@github.com/xmppjs/ltx.git#d351ffa26ef1c5f2fbee7888d0bcd5047eb8a988",
|
||||
"integrity": "sha512-niPDXqeoCqzZZVatSN1iT2ggttETmxV91GQbIThz1NBWqxJEaoMVU1dy5ec0Qy0BNLZlaKmylP0pSLP1S6u/Zg==",
|
||||
"version": "3.1.2",
|
||||
"resolved": "git+ssh://git@github.com/xmppjs/ltx.git#072690a43a51254ddd17b082131a8b9115586e8a",
|
||||
"integrity": "sha512-AsQ9ifqUtYTZU79mjlgoeVYPfVxLfqrJHvKaDZwZPEA7bWey4uhMMxfI1NIIxfyX5A/KUOkXl3sbUqR4u6Y/zQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@ -6366,10 +6366,10 @@
|
||||
}
|
||||
},
|
||||
"ltx": {
|
||||
"version": "git+ssh://git@github.com/xmppjs/ltx.git#d351ffa26ef1c5f2fbee7888d0bcd5047eb8a988",
|
||||
"integrity": "sha512-niPDXqeoCqzZZVatSN1iT2ggttETmxV91GQbIThz1NBWqxJEaoMVU1dy5ec0Qy0BNLZlaKmylP0pSLP1S6u/Zg==",
|
||||
"version": "git+ssh://git@github.com/xmppjs/ltx.git#072690a43a51254ddd17b082131a8b9115586e8a",
|
||||
"integrity": "sha512-AsQ9ifqUtYTZU79mjlgoeVYPfVxLfqrJHvKaDZwZPEA7bWey4uhMMxfI1NIIxfyX5A/KUOkXl3sbUqR4u6Y/zQ==",
|
||||
"dev": true,
|
||||
"from": "ltx@git://github.com/xmppjs/ltx.git#d351ffa26ef1c5f2fbee7888d0bcd5047eb8a988"
|
||||
"from": "ltx@git://github.com/xmppjs/ltx.git#072690a43a51254ddd17b082131a8b9115586e8a"
|
||||
},
|
||||
"magic-string": {
|
||||
"version": "0.25.7",
|
||||
|
@ -13,7 +13,7 @@
|
||||
"events": "^3.3.0",
|
||||
"husky": "^8.0.3",
|
||||
"lint-staged": "^14.0.1",
|
||||
"ltx": "git://github.com/xmppjs/ltx.git#d351ffa26ef1c5f2fbee7888d0bcd5047eb8a988",
|
||||
"ltx": "git://github.com/xmppjs/ltx.git#072690a43a51254ddd17b082131a8b9115586e8a",
|
||||
"postcss": "^8.4.14",
|
||||
"prettier": "3.0.3",
|
||||
"rollup": "^2.76.0",
|
||||
|
@ -21,7 +21,7 @@ template $Extension: ListBoxRow {
|
||||
icon-name: "re.sonny.Workbench-test-pass-symbolic";
|
||||
|
||||
styles [
|
||||
"success"
|
||||
"success",
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -39,7 +39,7 @@ template $Extension: ListBoxRow {
|
||||
label: _("Run the following command");
|
||||
|
||||
styles [
|
||||
"dim-label"
|
||||
"dim-label",
|
||||
]
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ template $Extension: ListBoxRow {
|
||||
xalign: 0;
|
||||
|
||||
styles [
|
||||
"command_snippet"
|
||||
"command_snippet",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ Adw.Dialog dialog {
|
||||
selection-mode: none;
|
||||
|
||||
styles [
|
||||
"boxed-list"
|
||||
"boxed-list",
|
||||
]
|
||||
|
||||
$Extension {
|
||||
@ -72,7 +72,7 @@ Adw.Dialog dialog {
|
||||
wrap: true;
|
||||
|
||||
styles [
|
||||
"dim-label"
|
||||
"dim-label",
|
||||
]
|
||||
}
|
||||
|
||||
@ -83,7 +83,7 @@ Adw.Dialog dialog {
|
||||
wrap: true;
|
||||
|
||||
styles [
|
||||
"dim-label"
|
||||
"dim-label",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ template $EntryRow: Adw.ActionRow {
|
||||
Label description_label {
|
||||
styles [
|
||||
"dim-label",
|
||||
"caption"
|
||||
"caption",
|
||||
]
|
||||
|
||||
xalign: 0;
|
||||
|
@ -46,7 +46,7 @@ Adw.Window window {
|
||||
label: _("Learn, Test, Remix");
|
||||
|
||||
styles [
|
||||
"title-1"
|
||||
"title-1",
|
||||
]
|
||||
}
|
||||
|
||||
@ -79,7 +79,7 @@ Adw.Window window {
|
||||
selection-mode: none;
|
||||
|
||||
styles [
|
||||
"boxed-list"
|
||||
"boxed-list",
|
||||
]
|
||||
}
|
||||
|
||||
@ -100,7 +100,7 @@ Adw.Window window {
|
||||
label: _("No results");
|
||||
|
||||
styles [
|
||||
"title-3"
|
||||
"title-3",
|
||||
]
|
||||
}
|
||||
|
||||
@ -109,7 +109,7 @@ Adw.Window window {
|
||||
halign: center;
|
||||
|
||||
styles [
|
||||
"pill"
|
||||
"pill",
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -119,7 +119,7 @@ Adw.Window window {
|
||||
use-markup: true;
|
||||
|
||||
styles [
|
||||
"caption"
|
||||
"caption",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ Adw.Dialog dialog {
|
||||
label: _("Permissions Needed");
|
||||
|
||||
styles [
|
||||
"title-1"
|
||||
"title-1",
|
||||
]
|
||||
}
|
||||
|
||||
@ -55,7 +55,7 @@ Adw.Dialog dialog {
|
||||
xalign: 0;
|
||||
|
||||
styles [
|
||||
"command_snippet"
|
||||
"command_snippet",
|
||||
]
|
||||
}
|
||||
|
||||
@ -71,7 +71,7 @@ Adw.Dialog dialog {
|
||||
hexpand: true;
|
||||
|
||||
styles [
|
||||
"heading"
|
||||
"heading",
|
||||
]
|
||||
}
|
||||
|
||||
@ -79,7 +79,7 @@ Adw.Dialog dialog {
|
||||
icon-name: "re.sonny.Workbench-external-link-symbolic";
|
||||
|
||||
styles [
|
||||
"flat"
|
||||
"flat",
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -88,7 +88,7 @@ Adw.Dialog dialog {
|
||||
selection-mode: none;
|
||||
|
||||
styles [
|
||||
"boxed-list"
|
||||
"boxed-list",
|
||||
]
|
||||
|
||||
Adw.ActionRow {
|
||||
@ -101,7 +101,7 @@ Adw.Dialog dialog {
|
||||
subtitle: _("Grant for your account only");
|
||||
|
||||
styles [
|
||||
"property"
|
||||
"property",
|
||||
]
|
||||
}
|
||||
|
||||
@ -115,7 +115,7 @@ Adw.Dialog dialog {
|
||||
subtitle: _("Network access");
|
||||
|
||||
styles [
|
||||
"property"
|
||||
"property",
|
||||
]
|
||||
}
|
||||
|
||||
@ -129,7 +129,7 @@ Adw.Dialog dialog {
|
||||
subtitle: _("Record and play audio");
|
||||
|
||||
styles [
|
||||
"property"
|
||||
"property",
|
||||
]
|
||||
}
|
||||
|
||||
@ -143,7 +143,7 @@ Adw.Dialog dialog {
|
||||
subtitle: _("Access to input device such as gamepads");
|
||||
|
||||
styles [
|
||||
"property"
|
||||
"property",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,8 @@ import {
|
||||
isDeviceInputOverrideAvailable,
|
||||
} from "../flatpak.js";
|
||||
|
||||
const device = isDeviceInputOverrideAvailable() ? "input" : "all";
|
||||
|
||||
const action_permissions = new Gio.SimpleAction({
|
||||
name: "permissions",
|
||||
parameter_type: null,
|
||||
@ -29,7 +31,6 @@ export function Permissions({ window }) {
|
||||
|
||||
picture_illustration.set_resource(illustration);
|
||||
|
||||
const device = isDeviceInputOverrideAvailable() ? "input" : "all";
|
||||
label_command.label = `flatpak override --user --share=network --socket=pulseaudio --device=${device} ${getFlatpakId()}`;
|
||||
action_row_device.title = `--input=${device}`;
|
||||
|
||||
@ -57,7 +58,7 @@ const missing_permissions = (() => {
|
||||
return (
|
||||
!shared.includes("network") ||
|
||||
!sockets.includes("pulseaudio") ||
|
||||
!devices.includes("all")
|
||||
!devices.includes(device)
|
||||
);
|
||||
})();
|
||||
|
||||
|
@ -12,8 +12,7 @@ class WorkbenchHoverProvider extends GObject.Object {
|
||||
}
|
||||
|
||||
findDiagnostics(context) {
|
||||
const iter = new Gtk.TextIter();
|
||||
context.get_iter(iter);
|
||||
const [, iter] = context.get_iter();
|
||||
|
||||
const line = iter.get_line();
|
||||
// Looks like line_offset starts at 0
|
||||
|
@ -104,5 +104,5 @@ function getValaVersion() {
|
||||
}
|
||||
|
||||
function getBlueprintVersion() {
|
||||
return "Blueprint d47955c5";
|
||||
return "Blueprint 0.16.0";
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
#!@GJS@ -m
|
||||
|
||||
import { exit, programArgs } from "system";
|
||||
import GLib from "gi://GLib";
|
||||
import { setConsoleLogDomain } from "console";
|
||||
import Xdp from "gi://Xdp";
|
||||
|
||||
@ -14,7 +13,6 @@ imports.package.init({
|
||||
datadir: "@datadir@",
|
||||
});
|
||||
setConsoleLogDomain(pkg.name);
|
||||
GLib.set_application_name("Workbench");
|
||||
|
||||
if (!Xdp.Portal.running_under_flatpak()) {
|
||||
console.error(
|
||||
|
97
src/cli/blueprint.js
Normal file
97
src/cli/blueprint.js
Normal file
@ -0,0 +1,97 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
|
||||
import Gtk from "gi://Gtk";
|
||||
|
||||
import { getLanguage } from "../common.js";
|
||||
import { parse } from "../langs/xml/xml.js";
|
||||
import { LSPError } from "../lsp/LSP.js";
|
||||
import { checkFile, diagnose } from "./util.js";
|
||||
|
||||
const languageId = "blueprint";
|
||||
|
||||
export default async function blueprint({ file, lspc }) {
|
||||
print(` ${file.get_path()}`);
|
||||
|
||||
await diagnose({
|
||||
file,
|
||||
lspc,
|
||||
languageId,
|
||||
filter(diagnostic) {
|
||||
// No replacements yet
|
||||
return ![
|
||||
"Gtk.ShortcutsShortcut is deprecated\nhint: This widget will be removed in GTK 5",
|
||||
"Gtk.ShortcutLabel is deprecated\nhint: This widget will be removed in GTK 5",
|
||||
"Gtk.ShortcutsWindow is deprecated\nhint: This widget will be removed in GTK 5",
|
||||
"Gtk.ShortcutsGroup is deprecated\nhint: This widget will be removed in GTK 5",
|
||||
"Gtk.ShortcutsSection is deprecated\nhint: This widget will be removed in GTK 5",
|
||||
].includes(diagnostic.message);
|
||||
},
|
||||
});
|
||||
|
||||
const { xml } = await lspc._request("textDocument/x-blueprint-compile", {
|
||||
textDocument: {
|
||||
uri: file.get_uri(),
|
||||
},
|
||||
});
|
||||
|
||||
print(` ✅ compiles`);
|
||||
|
||||
try {
|
||||
await lspc._request("x-blueprint/decompile", {
|
||||
text: xml,
|
||||
});
|
||||
print(" ✅ decompiles");
|
||||
} catch (err) {
|
||||
if (!(err instanceof LSPError)) throw err;
|
||||
if (
|
||||
![
|
||||
// https://gitlab.gnome.org/jwestman/blueprint-compiler/-/issues/128
|
||||
"unsupported XML tag: <condition>",
|
||||
// https://gitlab.gnome.org/jwestman/blueprint-compiler/-/issues/139
|
||||
"unsupported XML tag: <items>",
|
||||
].includes(err.message)
|
||||
) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
await checkFile({
|
||||
lspc,
|
||||
file,
|
||||
lang: getLanguage(languageId),
|
||||
uri: file.get_uri(),
|
||||
});
|
||||
|
||||
await lspc._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri: file.get_uri(),
|
||||
},
|
||||
});
|
||||
|
||||
const tree = parse(xml);
|
||||
const template_el = tree.getChild("template");
|
||||
|
||||
let template;
|
||||
const builder = new Gtk.Builder();
|
||||
const blueprint_object_ids = [];
|
||||
|
||||
if (template_el) {
|
||||
template = tree.toString();
|
||||
} else {
|
||||
builder.add_from_string(xml, -1);
|
||||
print(` ✅ instantiates`);
|
||||
getXMLObjectIds(tree, blueprint_object_ids);
|
||||
}
|
||||
|
||||
return { template, builder, blueprint_object_ids };
|
||||
}
|
||||
|
||||
function getXMLObjectIds(tree, object_ids) {
|
||||
for (const object of tree.getChildren("object")) {
|
||||
if (object.attrs.id) object_ids.push(object.attrs.id);
|
||||
// <child> or <property name="child">
|
||||
for (const child of object.getChildElements()) {
|
||||
getXMLObjectIds(child, object_ids);
|
||||
}
|
||||
}
|
||||
}
|
25
src/cli/css.js
Normal file
25
src/cli/css.js
Normal file
@ -0,0 +1,25 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
|
||||
import { getLanguage } from "../common.js";
|
||||
import { checkFile, diagnose } from "./util.js";
|
||||
|
||||
const languageId = "css";
|
||||
|
||||
export default async function css({ file, lspc }) {
|
||||
print(` ${file.get_path()}`);
|
||||
|
||||
await diagnose({ file, lspc, languageId });
|
||||
|
||||
await checkFile({
|
||||
lspc,
|
||||
file,
|
||||
lang: getLanguage(languageId),
|
||||
uri: file.get_uri(),
|
||||
});
|
||||
|
||||
await lspc._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri: file.get_uri(),
|
||||
},
|
||||
});
|
||||
}
|
56
src/cli/javascript.js
Normal file
56
src/cli/javascript.js
Normal file
@ -0,0 +1,56 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
|
||||
import { getLanguage } from "../common.js";
|
||||
import { checkFile, getCodeObjectIds, diagnose, Interrupt } from "./util.js";
|
||||
|
||||
const languageId = "javascript";
|
||||
|
||||
export default async function javascript({
|
||||
file,
|
||||
lspc,
|
||||
blueprint_object_ids,
|
||||
demo_dir,
|
||||
application,
|
||||
builder,
|
||||
template,
|
||||
window,
|
||||
}) {
|
||||
print(` ${file.get_path()}`);
|
||||
|
||||
const text = await diagnose({ file, lspc, languageId });
|
||||
|
||||
await checkFile({
|
||||
lspc: lspc,
|
||||
file: file,
|
||||
lang: getLanguage("javascript"),
|
||||
uri: file.get_uri(),
|
||||
});
|
||||
|
||||
const js_object_ids = getCodeObjectIds(text);
|
||||
for (const object_id of js_object_ids) {
|
||||
if (!blueprint_object_ids.includes(object_id)) {
|
||||
print(` ❌ Reference to inexistant object id "${object_id}"`);
|
||||
throw new Interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
globalThis.workbench = {
|
||||
window,
|
||||
application,
|
||||
builder,
|
||||
template,
|
||||
resolve(path) {
|
||||
return demo_dir.resolve_relative_path(path).get_uri();
|
||||
},
|
||||
preview() {},
|
||||
};
|
||||
|
||||
await import(`file://${file.get_path()}`);
|
||||
print(" ✅ runs");
|
||||
|
||||
await lspc._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri: file.get_uri(),
|
||||
},
|
||||
});
|
||||
}
|
@ -4,6 +4,7 @@ import Gio from "gi://Gio";
|
||||
|
||||
import { formatting } from "./format.js";
|
||||
import { diagnostic_severities } from "../lsp/LSP.js";
|
||||
import { waitForDiagnostics } from "./util.js";
|
||||
|
||||
export default async function lint({ filenames, lang, lspc, ci }) {
|
||||
let success = true;
|
||||
@ -47,19 +48,6 @@ export default async function lint({ filenames, lang, lspc, ci }) {
|
||||
return success;
|
||||
}
|
||||
|
||||
export function waitForDiagnostics({ uri, lspc }) {
|
||||
return new Promise((resolve) => {
|
||||
const handler_id = lspc.connect(
|
||||
"notification::textDocument/publishDiagnostics",
|
||||
(_self, params) => {
|
||||
if (uri !== params.uri) return;
|
||||
lspc.disconnect(handler_id);
|
||||
resolve(params.diagnostics);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function serializeDiagnostics({ file, diagnostics }) {
|
||||
return (
|
||||
`\n${file.get_path()}\n` +
|
||||
|
540
src/cli/main.js
540
src/cli/main.js
@ -5,23 +5,23 @@ import "../init.js";
|
||||
|
||||
import GLib from "gi://GLib";
|
||||
import Gio from "gi://Gio";
|
||||
import Gtk from "gi://Gtk";
|
||||
import Adw from "gi://Adw";
|
||||
import GObject from "gi://GObject";
|
||||
import Shumate from "gi://Shumate";
|
||||
import WebKit from "gi://WebKit";
|
||||
|
||||
import { parse } from "../langs/xml/xml.js";
|
||||
import { LSPError, diagnostic_severities } from "../lsp/LSP.js";
|
||||
import { createLSPClient, languages, PYTHON_LSP_CONFIG } from "../common.js";
|
||||
import lint from "./lint.js";
|
||||
import format from "./format.js";
|
||||
|
||||
import {
|
||||
createLSPClient,
|
||||
languages,
|
||||
getLanguage,
|
||||
PYTHON_LSP_CONFIG,
|
||||
} from "../common.js";
|
||||
import lint, { waitForDiagnostics } from "./lint.js";
|
||||
import format, { formatting } from "./format.js";
|
||||
import blueprint from "./blueprint.js";
|
||||
import css from "./css.js";
|
||||
import javascript from "./javascript.js";
|
||||
import typescript from "./typescript.js";
|
||||
import vala from "./vala.js";
|
||||
import python from "./python.js";
|
||||
import rust from "./rust.js";
|
||||
import { Interrupt } from "./util.js";
|
||||
|
||||
GObject.type_ensure(Shumate.SimpleMap);
|
||||
GObject.type_ensure(WebKit.WebView);
|
||||
@ -31,8 +31,16 @@ export async function main([action, ...args]) {
|
||||
|
||||
if (action === "ci") {
|
||||
const filenames = args;
|
||||
const success = await ci({ filenames });
|
||||
return success ? 0 : 1;
|
||||
try {
|
||||
await ci({ filenames });
|
||||
return 0;
|
||||
} catch (err) {
|
||||
if (err instanceof Interrupt) {
|
||||
return 1;
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const [language_id, ...filenames] = args;
|
||||
@ -67,19 +75,27 @@ export async function main([action, ...args]) {
|
||||
});
|
||||
}
|
||||
|
||||
let success = false;
|
||||
|
||||
try {
|
||||
if (action === "lint") {
|
||||
success = await lint({ filenames, lang, lspc, ci: false });
|
||||
await lint({ filenames, lang, lspc, ci: false });
|
||||
return 0;
|
||||
} else if (action === "check") {
|
||||
success = await lint({ filenames, lang, lspc, ci: true });
|
||||
await lint({ filenames, lang, lspc, ci: true });
|
||||
return 0;
|
||||
} else if (action === "format") {
|
||||
success = await format({ filenames, lang, lspc });
|
||||
await format({ filenames, lang, lspc });
|
||||
return 0;
|
||||
} else {
|
||||
printerr(`Unknown action "${action}"}`);
|
||||
return 1;
|
||||
}
|
||||
} catch (err) {
|
||||
if (err instanceof Interrupt) {
|
||||
return 1;
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
return success ? 0 : 1;
|
||||
}
|
||||
|
||||
const application = new Adw.Application();
|
||||
@ -107,27 +123,6 @@ function createLSPClients({ root_uri }) {
|
||||
);
|
||||
}
|
||||
|
||||
async function checkFile({ lspc, file, lang, uri }) {
|
||||
const [contents] = await file.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
const buffer = new Gtk.TextBuffer({ text });
|
||||
|
||||
const buffer_tmp = new Gtk.TextBuffer({ text: buffer.text });
|
||||
await formatting({ buffer: buffer_tmp, uri, lang, lspc });
|
||||
|
||||
if (buffer_tmp.text === buffer.text) {
|
||||
print(` ✅ checks`);
|
||||
return true;
|
||||
} else {
|
||||
printerr(
|
||||
` ❌ formatting differs - open and run ${file
|
||||
.get_parent()
|
||||
.get_basename()} with Workbench to fix`,
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function ci({ filenames }) {
|
||||
for (const filename of filenames) {
|
||||
const demo_dir = Gio.File.new_for_path(filename);
|
||||
@ -150,449 +145,63 @@ async function ci({ filenames }) {
|
||||
);
|
||||
|
||||
let template = null;
|
||||
const builder = new Gtk.Builder();
|
||||
const blueprint_object_ids = [];
|
||||
let xml = null;
|
||||
let builder = null;
|
||||
let blueprint_object_ids = null;
|
||||
|
||||
const file_blueprint = demo_dir.get_child("main.blp");
|
||||
if (file_blueprint.query_exists(null)) {
|
||||
print(` ${file_blueprint.get_path()}`);
|
||||
const uri = file_blueprint.get_uri();
|
||||
const languageId = "blueprint";
|
||||
let version = 0;
|
||||
|
||||
const [contents] = await file_blueprint.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
await lsp_clients.blueprint._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
const diagnostics = await waitForDiagnostics({
|
||||
uri,
|
||||
lspc: lsp_clients.blueprint,
|
||||
});
|
||||
if (diagnostics.length > 0) {
|
||||
printerr(serializeDiagnostics({ diagnostics }));
|
||||
return false;
|
||||
}
|
||||
|
||||
print(` ✅ lints`);
|
||||
|
||||
({ xml } = await lsp_clients.blueprint._request(
|
||||
"textDocument/x-blueprint-compile",
|
||||
{
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
},
|
||||
));
|
||||
|
||||
print(` ✅ compiles`);
|
||||
|
||||
try {
|
||||
await lsp_clients.blueprint._request("x-blueprint/decompile", {
|
||||
text: xml,
|
||||
});
|
||||
print(" ✅ decompiles");
|
||||
} catch (err) {
|
||||
if (!(err instanceof LSPError)) throw err;
|
||||
if (
|
||||
![
|
||||
// https://gitlab.gnome.org/jwestman/blueprint-compiler/-/issues/128
|
||||
"unsupported XML tag: <condition>",
|
||||
// https://gitlab.gnome.org/jwestman/blueprint-compiler/-/issues/139
|
||||
"unsupported XML tag: <items>",
|
||||
].includes(err.message)
|
||||
) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
const checks = await checkFile({
|
||||
lspc: lsp_clients.blueprint,
|
||||
({ template, builder, blueprint_object_ids } = await blueprint({
|
||||
file: file_blueprint,
|
||||
lang: getLanguage("blueprint"),
|
||||
uri,
|
||||
});
|
||||
if (!checks) return false;
|
||||
|
||||
await lsp_clients.blueprint._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
});
|
||||
|
||||
const tree = parse(xml);
|
||||
const template_el = tree.getChild("template");
|
||||
|
||||
if (template_el) {
|
||||
template = tree.toString();
|
||||
} else {
|
||||
builder.add_from_string(xml, -1);
|
||||
print(` ✅ instantiates`);
|
||||
getXMLObjectIds(tree, blueprint_object_ids);
|
||||
}
|
||||
lspc: lsp_clients.blueprint,
|
||||
}));
|
||||
}
|
||||
|
||||
const file_css = demo_dir.get_child("main.css");
|
||||
if (file_css.query_exists(null)) {
|
||||
print(` ${file_css.get_path()}`);
|
||||
|
||||
const uri = file_css.get_uri();
|
||||
const languageId = "css";
|
||||
let version = 0;
|
||||
|
||||
const [contents] = await file_css.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
await lsp_clients.css._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
const diagnostics = await waitForDiagnostics({
|
||||
uri,
|
||||
lspc: lsp_clients.css,
|
||||
});
|
||||
if (diagnostics.length > 0) {
|
||||
printerr(serializeDiagnostics({ diagnostics }));
|
||||
return false;
|
||||
}
|
||||
print(` ✅ lints`);
|
||||
|
||||
const checks = await checkFile({
|
||||
lspc: lsp_clients.css,
|
||||
file: file_css,
|
||||
lang: getLanguage("css"),
|
||||
uri,
|
||||
});
|
||||
if (!checks) return false;
|
||||
|
||||
await lsp_clients.css._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
});
|
||||
await css({ file: file_css, lspc: lsp_clients.css });
|
||||
}
|
||||
|
||||
const file_javascript = demo_dir.get_child("main.js");
|
||||
if (file_javascript.query_exists(null)) {
|
||||
print(` ${file_javascript.get_path()}`);
|
||||
|
||||
const uri = file_javascript.get_uri();
|
||||
const languageId = "javascript";
|
||||
let version = 0;
|
||||
|
||||
const [contents] = await file_javascript.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
await lsp_clients.javascript._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
const diagnostics = await waitForDiagnostics({
|
||||
uri,
|
||||
lspc: lsp_clients.javascript,
|
||||
});
|
||||
if (diagnostics.length > 0) {
|
||||
printerr(serializeDiagnostics({ diagnostics }));
|
||||
return false;
|
||||
}
|
||||
print(` ✅ lints`);
|
||||
|
||||
const checks = await checkFile({
|
||||
lspc: lsp_clients.javascript,
|
||||
await javascript({
|
||||
file: file_javascript,
|
||||
lang: getLanguage("javascript"),
|
||||
uri,
|
||||
});
|
||||
if (!checks) return false;
|
||||
|
||||
const js_object_ids = getCodeObjectIds(text);
|
||||
for (const object_id of js_object_ids) {
|
||||
if (!blueprint_object_ids.includes(object_id)) {
|
||||
print(` ❌ Reference to inexistant object id "${object_id}"`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
globalThis.workbench = {
|
||||
window,
|
||||
lspc: lsp_clients.javascript,
|
||||
blueprint_object_ids,
|
||||
demo_dir,
|
||||
application,
|
||||
builder,
|
||||
template,
|
||||
resolve(path) {
|
||||
return demo_dir.resolve_relative_path(path).get_uri();
|
||||
},
|
||||
preview() {},
|
||||
};
|
||||
|
||||
await import(`file://${file_javascript.get_path()}`);
|
||||
print(" ✅ runs");
|
||||
|
||||
await lsp_clients.javascript._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
window,
|
||||
});
|
||||
}
|
||||
|
||||
const file_typescript = demo_dir.get_child("main.ts");
|
||||
if (file_typescript.query_exists(null)) {
|
||||
print(` ${file_typescript.get_path()}`);
|
||||
|
||||
const uri = file_typescript.get_uri();
|
||||
const languageId = "typescript";
|
||||
let version = 0;
|
||||
|
||||
const [contents] = await file_typescript.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
await lsp_clients.typescript._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
const diagnostics = await waitForDiagnostics({
|
||||
uri,
|
||||
lspc: lsp_clients.typescript,
|
||||
});
|
||||
if (diagnostics.length > 0) {
|
||||
printerr(serializeDiagnostics({ diagnostics }));
|
||||
return false;
|
||||
}
|
||||
print(` ✅ lints`);
|
||||
|
||||
const checks = await checkFile({
|
||||
lspc: lsp_clients.typescript,
|
||||
await typescript({
|
||||
file: file_typescript,
|
||||
lang: getLanguage("typescript"),
|
||||
uri,
|
||||
});
|
||||
if (!checks) return false;
|
||||
|
||||
const js_object_ids = getCodeObjectIds(text);
|
||||
for (const object_id of js_object_ids) {
|
||||
if (!blueprint_object_ids.includes(object_id)) {
|
||||
print(` ❌ Reference to inexistant object id "${object_id}"`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
globalThis.workbench = {
|
||||
window,
|
||||
lspc: lsp_clients.typescript,
|
||||
blueprint_object_ids,
|
||||
demo_dir,
|
||||
application,
|
||||
builder,
|
||||
template,
|
||||
resolve(path) {
|
||||
return demo_dir.resolve_relative_path(path).get_uri();
|
||||
},
|
||||
preview() {},
|
||||
};
|
||||
|
||||
await import(`file://${file_typescript.get_path()}`);
|
||||
print(" ✅ runs");
|
||||
|
||||
await lsp_clients.typescript._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
window,
|
||||
});
|
||||
}
|
||||
|
||||
const file_vala = demo_dir.get_child("main.vala");
|
||||
if (file_vala.query_exists(null)) {
|
||||
print(` ${file_vala.get_path()}`);
|
||||
|
||||
const uri = file_vala.get_uri();
|
||||
const languageId = "vala";
|
||||
let version = 0;
|
||||
|
||||
const file_api = Gio.File.new_for_path(pkg.pkgdatadir).get_child(
|
||||
"workbench.vala",
|
||||
);
|
||||
file_api.copy(
|
||||
demo_dir.get_child("workbench.vala"),
|
||||
Gio.FileCopyFlags.OVERWRITE,
|
||||
null,
|
||||
null,
|
||||
);
|
||||
|
||||
const [contents] = await file_vala.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
await lsp_clients.vala._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
let diagnostics = await waitForDiagnostics({
|
||||
uri,
|
||||
lspc: lsp_clients.vala,
|
||||
});
|
||||
// FIXME: deprecated features, no replacement?
|
||||
if (demo_dir.get_basename() === "Text Fields") {
|
||||
const ignore_for_text_fields = [
|
||||
"`Gtk.EntryCompletion' has been deprecated since 4.10",
|
||||
"`Gtk.Entry.completion' has been deprecated since 4.10",
|
||||
"`Gtk.ListStore' has been deprecated since 4.10",
|
||||
"`Gtk.TreeIter' has been deprecated since 4.10",
|
||||
];
|
||||
diagnostics = diagnostics.filter((diagnostic) => {
|
||||
return !ignore_for_text_fields.includes(diagnostic.message);
|
||||
});
|
||||
// Gtk.StyleContext class is deprecated but not the following methods
|
||||
// gtk_style_context_add_provider_for_display
|
||||
// gtk_style_context_remove_provider_for_display
|
||||
} else if (demo_dir.get_basename() === "CSS Gradients") {
|
||||
diagnostics = diagnostics.filter((diagnostic) => {
|
||||
return (
|
||||
diagnostic.message !==
|
||||
"`Gtk.StyleContext' has been deprecated since 4.10"
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
if (diagnostics.length > 0) {
|
||||
printerr(serializeDiagnostics({ diagnostics }));
|
||||
return false;
|
||||
}
|
||||
print(` ✅ lints`);
|
||||
|
||||
const checks = await checkFile({
|
||||
lspc: lsp_clients.vala,
|
||||
file: file_vala,
|
||||
lang: getLanguage("vala"),
|
||||
uri,
|
||||
});
|
||||
if (!checks) return false;
|
||||
|
||||
await lsp_clients.vala._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
});
|
||||
await vala({ file: file_vala, lspc: lsp_clients.vala, demo_dir });
|
||||
}
|
||||
|
||||
const file_python = demo_dir.get_child("main.py");
|
||||
if (file_python.query_exists(null)) {
|
||||
print(` ${file_python.get_path()}`);
|
||||
|
||||
const uri = file_python.get_uri();
|
||||
const languageId = "python";
|
||||
let version = 0;
|
||||
|
||||
const [contents] = await file_python.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
await lsp_clients.python._request("workspace/didChangeConfiguration", {
|
||||
settings: PYTHON_LSP_CONFIG,
|
||||
});
|
||||
|
||||
await lsp_clients.python._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
const diagnostics = await waitForDiagnostics({
|
||||
uri,
|
||||
lspc: lsp_clients.python,
|
||||
});
|
||||
if (diagnostics.length > 0) {
|
||||
printerr(serializeDiagnostics({ diagnostics }));
|
||||
return false;
|
||||
}
|
||||
print(` ✅ lints`);
|
||||
|
||||
const checks = await checkFile({
|
||||
lspc: lsp_clients.python,
|
||||
file: file_python,
|
||||
lang: getLanguage("python"),
|
||||
uri,
|
||||
});
|
||||
if (!checks) return false;
|
||||
|
||||
await lsp_clients.python._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
});
|
||||
await python({ file: file_python, lspc: lsp_clients.python });
|
||||
}
|
||||
|
||||
const file_rust = demo_dir.get_child("code.rs");
|
||||
if (file_rust.query_exists(null)) {
|
||||
print(` ${file_rust.get_path()}`);
|
||||
|
||||
const uri = file_rust.get_uri();
|
||||
const languageId = "rust";
|
||||
let version = 0;
|
||||
|
||||
const [contents] = await file_rust.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
await lsp_clients.rust._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
// FIXME: rust analyzer doesn't publish diagnostics if there are none
|
||||
// probably we should switch to pulling diagnostics but unknown if supported
|
||||
// https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#textDocument_pullDiagnostics
|
||||
|
||||
// const diagnostics = await waitForDiagnostics({
|
||||
// uri,
|
||||
// lspc: lsp_clients.rust,
|
||||
// });
|
||||
// if (diagnostics.length > 0) {
|
||||
// printerr(serializeDiagnostics({ diagnostics }));
|
||||
// return false;
|
||||
// }
|
||||
// print(` ✅ lints`);
|
||||
|
||||
const checks = await checkFile({
|
||||
lspc: lsp_clients.rust,
|
||||
file: file_rust,
|
||||
lang: getLanguage("rust"),
|
||||
uri,
|
||||
});
|
||||
if (!checks) return false;
|
||||
|
||||
await lsp_clients.rust._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
});
|
||||
await rust({ file: file_rust, lspc: lsp_clients.rust });
|
||||
}
|
||||
|
||||
await Promise.all(
|
||||
@ -601,45 +210,6 @@ async function ci({ filenames }) {
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function getXMLObjectIds(tree, object_ids) {
|
||||
for (const object of tree.getChildren("object")) {
|
||||
if (object.attrs.id) object_ids.push(object.attrs.id);
|
||||
// <child> or <property name="child">
|
||||
for (const child of object.getChildElements()) {
|
||||
getXMLObjectIds(child, object_ids);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getCodeObjectIds(text) {
|
||||
const object_ids = [];
|
||||
for (const match of text.matchAll(/get_object\("(.+)"\)/g)) {
|
||||
object_ids.push(match[1]);
|
||||
}
|
||||
return object_ids;
|
||||
}
|
||||
|
||||
function serializeDiagnostics({ diagnostics }) {
|
||||
return (
|
||||
diagnostics
|
||||
.map(({ severity, range, message }) => {
|
||||
return (
|
||||
" ❌ " +
|
||||
diagnostic_severities[severity] +
|
||||
" " +
|
||||
range.start.line +
|
||||
":" +
|
||||
range.start.character +
|
||||
" " +
|
||||
message.split("\n")[0]
|
||||
);
|
||||
})
|
||||
.join("\n") + "\n"
|
||||
);
|
||||
}
|
||||
|
||||
const key_file = new GLib.KeyFile();
|
||||
|
30
src/cli/python.js
Normal file
30
src/cli/python.js
Normal file
@ -0,0 +1,30 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
|
||||
import { PYTHON_LSP_CONFIG, getLanguage } from "../common.js";
|
||||
|
||||
import { checkFile, diagnose } from "./util.js";
|
||||
|
||||
const languageId = "python";
|
||||
|
||||
export default async function python({ file, lspc }) {
|
||||
print(` ${file.get_path()}`);
|
||||
|
||||
await lspc._request("workspace/didChangeConfiguration", {
|
||||
settings: PYTHON_LSP_CONFIG,
|
||||
});
|
||||
|
||||
await diagnose({ file, lspc, languageId });
|
||||
|
||||
await checkFile({
|
||||
lspc,
|
||||
file,
|
||||
lang: getLanguage(languageId),
|
||||
uri: file.get_uri(),
|
||||
});
|
||||
|
||||
await lspc._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri: file.get_uri(),
|
||||
},
|
||||
});
|
||||
}
|
48
src/cli/rust.js
Normal file
48
src/cli/rust.js
Normal file
@ -0,0 +1,48 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
|
||||
import { getLanguage } from "../common.js";
|
||||
|
||||
import { checkFile } from "./util.js";
|
||||
|
||||
const languageId = "rust";
|
||||
|
||||
export default async function rust({ file, lspc }) {
|
||||
print(` ${file.get_path()}`);
|
||||
|
||||
const uri = file.get_uri();
|
||||
let version = 0;
|
||||
|
||||
const [contents] = await file.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
await lspc._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
// FIXME: rust analyzer doesn't publish diagnostics if there are none
|
||||
// probably we should switch to pulling diagnostics but unknown if supported
|
||||
// https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#textDocument_pullDiagnostics
|
||||
// await diagnose({
|
||||
// file,
|
||||
// lspc,
|
||||
// languageId,
|
||||
// });
|
||||
|
||||
await checkFile({
|
||||
lspc,
|
||||
file,
|
||||
lang: getLanguage(languageId),
|
||||
uri,
|
||||
});
|
||||
|
||||
await lspc._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri,
|
||||
},
|
||||
});
|
||||
}
|
56
src/cli/typescript.js
Normal file
56
src/cli/typescript.js
Normal file
@ -0,0 +1,56 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
|
||||
import { getLanguage } from "../common.js";
|
||||
import { checkFile, getCodeObjectIds, diagnose, Interrupt } from "./util.js";
|
||||
|
||||
const languageId = "typescript";
|
||||
|
||||
export default async function typescript({
|
||||
file,
|
||||
lspc,
|
||||
blueprint_object_ids,
|
||||
demo_dir,
|
||||
application,
|
||||
builder,
|
||||
template,
|
||||
window,
|
||||
}) {
|
||||
print(` ${file.get_path()}`);
|
||||
|
||||
const text = await diagnose({ file, lspc, languageId });
|
||||
|
||||
await checkFile({
|
||||
lspc,
|
||||
file,
|
||||
lang: getLanguage(languageId),
|
||||
uri: file.get_uri(),
|
||||
});
|
||||
|
||||
const js_object_ids = getCodeObjectIds(text);
|
||||
for (const object_id of js_object_ids) {
|
||||
if (!blueprint_object_ids.includes(object_id)) {
|
||||
print(` ❌ Reference to inexistant object id "${object_id}"`);
|
||||
throw new Interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
globalThis.workbench = {
|
||||
window,
|
||||
application,
|
||||
builder,
|
||||
template,
|
||||
resolve(path) {
|
||||
return demo_dir.resolve_relative_path(path).get_uri();
|
||||
},
|
||||
preview() {},
|
||||
};
|
||||
|
||||
await import(`file://${file.get_path()}`);
|
||||
print(" ✅ runs");
|
||||
|
||||
await lspc._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri: file.get_uri(),
|
||||
},
|
||||
});
|
||||
}
|
111
src/cli/util.js
Normal file
111
src/cli/util.js
Normal file
@ -0,0 +1,111 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
|
||||
import Gtk from "gi://Gtk";
|
||||
|
||||
import { diagnostic_severities } from "../lsp/LSP.js";
|
||||
import { formatting } from "./format.js";
|
||||
|
||||
export class Interrupt extends Error {
|
||||
constructor(...args) {
|
||||
super(...args);
|
||||
Error.captureStackTrace?.(this, Interrupt);
|
||||
}
|
||||
}
|
||||
|
||||
export async function diagnose({
|
||||
file,
|
||||
lspc,
|
||||
languageId,
|
||||
filter = (_diagnostic) => {
|
||||
return true;
|
||||
},
|
||||
}) {
|
||||
const [contents] = await file.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
|
||||
const uri = file.get_uri();
|
||||
let version = 0;
|
||||
|
||||
await lspc._notify("textDocument/didOpen", {
|
||||
textDocument: {
|
||||
uri,
|
||||
languageId,
|
||||
version: version++,
|
||||
text,
|
||||
},
|
||||
});
|
||||
|
||||
let diagnostics = await waitForDiagnostics({
|
||||
uri,
|
||||
lspc,
|
||||
});
|
||||
diagnostics = diagnostics.filter(filter);
|
||||
if (diagnostics.length > 0) {
|
||||
printerr(serializeDiagnostics({ diagnostics }));
|
||||
throw new Interrupt();
|
||||
}
|
||||
|
||||
print(` ✅ lints`);
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
export function serializeDiagnostics({ diagnostics }) {
|
||||
return (
|
||||
diagnostics
|
||||
.map(({ severity, range, message }) => {
|
||||
return (
|
||||
" ❌ " +
|
||||
diagnostic_severities[severity] +
|
||||
" " +
|
||||
range.start.line +
|
||||
":" +
|
||||
range.start.character +
|
||||
" " +
|
||||
message.split("\n")[0]
|
||||
);
|
||||
})
|
||||
.join("\n") + "\n"
|
||||
);
|
||||
}
|
||||
|
||||
export async function checkFile({ lspc, file, lang, uri }) {
|
||||
const [contents] = await file.load_contents_async(null);
|
||||
const text = new TextDecoder().decode(contents);
|
||||
const buffer = new Gtk.TextBuffer({ text });
|
||||
|
||||
const buffer_tmp = new Gtk.TextBuffer({ text: buffer.text });
|
||||
await formatting({ buffer: buffer_tmp, uri, lang, lspc });
|
||||
|
||||
if (buffer_tmp.text === buffer.text) {
|
||||
print(` ✅ checks`);
|
||||
} else {
|
||||
printerr(
|
||||
` ❌ formatting differs - open and run ${file
|
||||
.get_parent()
|
||||
.get_basename()} with Workbench to fix`,
|
||||
);
|
||||
throw new Interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
export function getCodeObjectIds(text) {
|
||||
const object_ids = [];
|
||||
for (const match of text.matchAll(/get_object\("(.+)"\)/g)) {
|
||||
object_ids.push(match[1]);
|
||||
}
|
||||
return object_ids;
|
||||
}
|
||||
|
||||
export function waitForDiagnostics({ uri, lspc }) {
|
||||
return new Promise((resolve) => {
|
||||
const handler_id = lspc.connect(
|
||||
"notification::textDocument/publishDiagnostics",
|
||||
(_self, params) => {
|
||||
if (uri !== params.uri) return;
|
||||
lspc.disconnect(handler_id);
|
||||
resolve(params.diagnostics);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
62
src/cli/vala.js
Normal file
62
src/cli/vala.js
Normal file
@ -0,0 +1,62 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
|
||||
import Gio from "gi://Gio";
|
||||
|
||||
import { getLanguage } from "../common.js";
|
||||
import { checkFile, diagnose } from "./util.js";
|
||||
|
||||
const languageId = "vala";
|
||||
|
||||
export default async function vala({ file, lspc, demo_dir }) {
|
||||
print(` ${file.get_path()}`);
|
||||
|
||||
const file_api = Gio.File.new_for_path(pkg.pkgdatadir).get_child(
|
||||
"workbench.vala",
|
||||
);
|
||||
file_api.copy(
|
||||
demo_dir.get_child("workbench.vala"),
|
||||
Gio.FileCopyFlags.OVERWRITE,
|
||||
null,
|
||||
null,
|
||||
);
|
||||
|
||||
await diagnose({
|
||||
file,
|
||||
lspc,
|
||||
languageId,
|
||||
filter(diagnostic) {
|
||||
// FIXME: deprecated features, no replacement?
|
||||
if (demo_dir.get_basename() === "Text Fields") {
|
||||
const ignore_for_text_fields = [
|
||||
"`Gtk.EntryCompletion' has been deprecated since 4.10",
|
||||
"`Gtk.Entry.completion' has been deprecated since 4.10",
|
||||
"`Gtk.ListStore' has been deprecated since 4.10",
|
||||
"`Gtk.TreeIter' has been deprecated since 4.10",
|
||||
];
|
||||
return !ignore_for_text_fields.includes(diagnostic.message);
|
||||
// Gtk.StyleContext class is deprecated but not the following methods
|
||||
// gtk_style_context_add_provider_for_display
|
||||
// gtk_style_context_remove_provider_for_display
|
||||
} else if (demo_dir.get_basename() === "CSS Gradients") {
|
||||
return (
|
||||
diagnostic.message !==
|
||||
"`Gtk.StyleContext' has been deprecated since 4.10"
|
||||
);
|
||||
}
|
||||
return true;
|
||||
},
|
||||
});
|
||||
|
||||
await checkFile({
|
||||
lspc,
|
||||
file,
|
||||
lang: getLanguage("vala"),
|
||||
uri: file.get_uri(),
|
||||
});
|
||||
|
||||
await lspc._notify("textDocument/didClose", {
|
||||
textDocument: {
|
||||
uri: file.get_uri(),
|
||||
},
|
||||
});
|
||||
}
|
@ -12,7 +12,7 @@ export function setup({ document }) {
|
||||
const lspc = createLSPClient({
|
||||
lang: getLanguage("typescript"),
|
||||
root_uri: file.get_parent().get_uri(),
|
||||
quiet: true,
|
||||
quiet: false,
|
||||
});
|
||||
lspc.buffer = buffer;
|
||||
lspc.uri = file.get_uri();
|
||||
@ -48,9 +48,10 @@ export async function setupTypeScriptProject(destination, document) {
|
||||
Gio.FileCopyFlags.NONE,
|
||||
);
|
||||
|
||||
// FIXME: hangs
|
||||
// Notify the language server that the tsconfig file was created
|
||||
// to initialized diagnostics and type checkings
|
||||
await document.lspc.notify("workspace/didCreateFile", {
|
||||
files: [{ uri: destination_file.get_uri() }],
|
||||
});
|
||||
// await document.lspc.notify("workspace/didCreateFile", {
|
||||
// files: [{ uri: destination_file.get_uri() }],
|
||||
// });
|
||||
}
|
||||
|
3122
src/lib/postcss.js
3122
src/lib/postcss.js
File diff suppressed because it is too large
Load Diff
@ -9,7 +9,6 @@ import {
|
||||
getNowForFilename,
|
||||
demos_dir,
|
||||
settings as global_settings,
|
||||
settings,
|
||||
copyDirectory,
|
||||
decode,
|
||||
removeDirectory,
|
||||
@ -40,7 +39,7 @@ export async function getSessions() {
|
||||
}
|
||||
|
||||
// Projects
|
||||
const recent_projects = settings.get_strv("recent-projects");
|
||||
const recent_projects = global_settings.get_strv("recent-projects");
|
||||
for (const path of recent_projects) {
|
||||
const file = Gio.File.new_for_path(path);
|
||||
if (
|
||||
@ -165,15 +164,15 @@ export class Session {
|
||||
}
|
||||
|
||||
export function addToRecentProjects(path) {
|
||||
const recent_projects = new Set(settings.get_strv("recent-projects"));
|
||||
const recent_projects = new Set(global_settings.get_strv("recent-projects"));
|
||||
recent_projects.add(path);
|
||||
settings.set_strv("recent-projects", [...recent_projects]);
|
||||
global_settings.set_strv("recent-projects", [...recent_projects]);
|
||||
}
|
||||
|
||||
export function removeFromRecentProjects(path) {
|
||||
const recent_projects = new Set(settings.get_strv("recent-projects"));
|
||||
const recent_projects = new Set(global_settings.get_strv("recent-projects"));
|
||||
recent_projects.delete(path);
|
||||
settings.set_strv("recent-projects", [...recent_projects]);
|
||||
global_settings.set_strv("recent-projects", [...recent_projects]);
|
||||
}
|
||||
|
||||
async function buildGResourceIcons(file) {
|
||||
|
@ -9,13 +9,12 @@ export default function ShortcutsWindow({ application }) {
|
||||
|
||||
const action_shortcuts = new Gio.SimpleAction({
|
||||
name: "shortcuts",
|
||||
parameter_type: null,
|
||||
});
|
||||
action_shortcuts.connect("activate", () => {
|
||||
if (!window) {
|
||||
({ window } = build(resource));
|
||||
window.set_transient_for(application.get_active_window());
|
||||
}
|
||||
window.set_transient_for(application.active_window);
|
||||
window.present();
|
||||
});
|
||||
application.add_action(action_shortcuts);
|
||||
|
@ -13,12 +13,12 @@
|
||||
}
|
||||
|
||||
.command_snippet {
|
||||
color: @view_fg_color;
|
||||
background: @view_bg_color;
|
||||
color: var(--view-fg-color);
|
||||
background: var(--view-bg-color);
|
||||
font-family: monospace;
|
||||
border-radius: 6px;
|
||||
padding: 6px;
|
||||
border: 1px solid @borders;
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -36,7 +36,7 @@ button.pill.small {
|
||||
#panel_code,
|
||||
#panel_style,
|
||||
#panel_ui {
|
||||
border-right: solid 1px @borders;
|
||||
border-right: solid 1px var(--border-color);
|
||||
background-color: #fcfcfc;
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,7 @@ template $CodeFind: Revealer {
|
||||
|
||||
Box {
|
||||
styles [
|
||||
"toolbar"
|
||||
"toolbar",
|
||||
]
|
||||
|
||||
halign: center;
|
||||
@ -63,7 +63,7 @@ template $CodeFind: Revealer {
|
||||
|
||||
styles [
|
||||
"circular",
|
||||
"small"
|
||||
"small",
|
||||
]
|
||||
|
||||
clicked => $onClose();
|
||||
|
@ -45,7 +45,7 @@ Adw.ApplicationWindow window {
|
||||
|
||||
styles [
|
||||
"flat",
|
||||
"view-toggler"
|
||||
"view-toggler",
|
||||
]
|
||||
}
|
||||
|
||||
@ -65,7 +65,7 @@ Adw.ApplicationWindow window {
|
||||
|
||||
styles [
|
||||
"flat",
|
||||
"view-toggler"
|
||||
"view-toggler",
|
||||
]
|
||||
}
|
||||
|
||||
@ -85,7 +85,7 @@ Adw.ApplicationWindow window {
|
||||
|
||||
styles [
|
||||
"flat",
|
||||
"view-toggler"
|
||||
"view-toggler",
|
||||
]
|
||||
}
|
||||
|
||||
@ -105,7 +105,7 @@ Adw.ApplicationWindow window {
|
||||
|
||||
styles [
|
||||
"flat",
|
||||
"view-toggler"
|
||||
"view-toggler",
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -130,7 +130,7 @@ Adw.ApplicationWindow window {
|
||||
tooltip-text: _("Run (Ctrl+⏎)");
|
||||
|
||||
styles [
|
||||
"suggested-action"
|
||||
"suggested-action",
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -157,7 +157,7 @@ Adw.ApplicationWindow window {
|
||||
CenterBox {
|
||||
styles [
|
||||
"toolbar",
|
||||
"panel_header"
|
||||
"panel_header",
|
||||
]
|
||||
|
||||
height-request: 46;
|
||||
@ -169,13 +169,13 @@ Adw.ApplicationWindow window {
|
||||
use-markup: true;
|
||||
|
||||
styles [
|
||||
"dim-label"
|
||||
"dim-label",
|
||||
]
|
||||
}
|
||||
|
||||
Separator {
|
||||
styles [
|
||||
"spacer"
|
||||
"spacer",
|
||||
]
|
||||
}
|
||||
|
||||
@ -241,7 +241,7 @@ Adw.ApplicationWindow window {
|
||||
CenterBox {
|
||||
styles [
|
||||
"toolbar",
|
||||
"panel_header"
|
||||
"panel_header",
|
||||
]
|
||||
|
||||
height-request: 46;
|
||||
@ -252,7 +252,7 @@ Adw.ApplicationWindow window {
|
||||
use-markup: true;
|
||||
|
||||
styles [
|
||||
"dim-label"
|
||||
"dim-label",
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -271,7 +271,7 @@ Adw.ApplicationWindow window {
|
||||
CenterBox {
|
||||
styles [
|
||||
"toolbar",
|
||||
"panel_header"
|
||||
"panel_header",
|
||||
]
|
||||
|
||||
height-request: 46;
|
||||
@ -283,13 +283,13 @@ Adw.ApplicationWindow window {
|
||||
use-markup: true;
|
||||
|
||||
styles [
|
||||
"dim-label"
|
||||
"dim-label",
|
||||
]
|
||||
}
|
||||
|
||||
Separator {
|
||||
styles [
|
||||
"spacer"
|
||||
"spacer",
|
||||
]
|
||||
}
|
||||
|
||||
@ -341,7 +341,7 @@ Adw.ApplicationWindow window {
|
||||
CenterBox {
|
||||
styles [
|
||||
"toolbar",
|
||||
"panel_header"
|
||||
"panel_header",
|
||||
]
|
||||
|
||||
height-request: 46;
|
||||
@ -353,7 +353,7 @@ Adw.ApplicationWindow window {
|
||||
label: _("Preview");
|
||||
|
||||
styles [
|
||||
"flat"
|
||||
"flat",
|
||||
]
|
||||
|
||||
menu-model: preview_menu;
|
||||
@ -400,7 +400,7 @@ Adw.ApplicationWindow window {
|
||||
valign: fill;
|
||||
|
||||
styles [
|
||||
"background"
|
||||
"background",
|
||||
]
|
||||
};
|
||||
}
|
||||
@ -425,7 +425,7 @@ Adw.ApplicationWindow window {
|
||||
|
||||
styles [
|
||||
"pill",
|
||||
"suggested-action"
|
||||
"suggested-action",
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -447,7 +447,7 @@ Adw.ApplicationWindow window {
|
||||
label: _("Close Preview Window");
|
||||
|
||||
styles [
|
||||
"pill"
|
||||
"pill",
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -479,7 +479,7 @@ Adw.ApplicationWindow window {
|
||||
|
||||
styles [
|
||||
"toolbar",
|
||||
"panel_header"
|
||||
"panel_header",
|
||||
]
|
||||
|
||||
[start]
|
||||
@ -572,7 +572,7 @@ Adw.Dialog dialog_blueprint_experimental {
|
||||
|
||||
styles [
|
||||
"suggested-action",
|
||||
"pill"
|
||||
"pill",
|
||||
]
|
||||
}
|
||||
};
|
||||
@ -752,7 +752,7 @@ Adw.AlertDialog alert_dialog_save_project {
|
||||
selection-mode: none;
|
||||
|
||||
styles [
|
||||
"boxed-list"
|
||||
"boxed-list",
|
||||
]
|
||||
|
||||
Adw.EntryRow row_project_name {
|
||||
@ -767,7 +767,7 @@ Adw.AlertDialog alert_dialog_save_project {
|
||||
selection-mode: none;
|
||||
|
||||
styles [
|
||||
"boxed-list"
|
||||
"boxed-list",
|
||||
]
|
||||
|
||||
Adw.ActionRow row_project_location {
|
||||
@ -785,7 +785,7 @@ Adw.AlertDialog alert_dialog_save_project {
|
||||
|
||||
styles [
|
||||
"dim-label",
|
||||
"caption"
|
||||
"caption",
|
||||
]
|
||||
|
||||
justify: left;
|
||||
@ -799,7 +799,7 @@ Button button_location {
|
||||
valign: center;
|
||||
|
||||
styles [
|
||||
"flat"
|
||||
"flat",
|
||||
]
|
||||
}
|
||||
|
||||
|
2
troll
2
troll
@ -1 +1 @@
|
||||
Subproject commit 1dc72cb295edbc212b4a0952286c7b5cc66db60a
|
||||
Subproject commit bccc2a7fd570d5e9d6845e8fa8e4d838f35f571b
|
Loading…
x
Reference in New Issue
Block a user