Skip to content

Commit bb8db64

Browse files
committed
Version 1.5.2
1 parent 58c5218 commit bb8db64

49 files changed

Lines changed: 2616 additions & 395 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release.yml

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ jobs:
5555
qt6-base \
5656
qt6-declarative \
5757
qt6-tools \
58+
qt6-svg \
5859
kirigami \
60+
breeze-icons \
5961
clang \
6062
ninja \
6163
mesa \
@@ -64,7 +66,8 @@ jobs:
6466
file \
6567
desktop-file-utils \
6668
appstream \
67-
github-cli
69+
github-cli \
70+
xorg-server-xvfb
6871
6972
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
7073

@@ -212,15 +215,28 @@ jobs:
212215
cd "$GITHUB_WORKSPACE"
213216
bash packaging/appimage/build.sh
214217
215-
dist="target/dist"
216-
if compgen -G "target/appimage/Grexa-*.AppImage" >/dev/null; then
217-
mv target/appimage/Grexa-*.AppImage "${dist}/"
218-
(cd "$dist" && sha256sum Grexa-*.AppImage >> sha256sums.txt)
219-
else
218+
appimage=(target/appimage/Grexa-*.AppImage)
219+
if [[ ! -e "${appimage[0]}" ]]; then
220220
echo "AppImage was not produced" >&2
221221
exit 1
222222
fi
223223
224+
# AGENTS.md verification: the AppImage must keep running without
225+
# falling back to the system QML2_IMPORT_PATH. Exit 2 means
226+
# "QML payload did not instantiate"; exits 0/124/143 are all
227+
# acceptable signs of a healthy or cleanly-terminated GUI event loop.
228+
env -u QML2_IMPORT_PATH xvfb-run -a timeout --preserve-status 12 "${appimage[0]}"
229+
exit_code=$?
230+
231+
if [[ "$exit_code" -ne 0 && "$exit_code" -ne 124 && "$exit_code" -ne 143 ]]; then
232+
echo "AppImage exited unexpectedly with ${exit_code}; likely QML payload did not instantiate" >&2
233+
exit "$exit_code"
234+
fi
235+
236+
dist="target/dist"
237+
mv target/appimage/Grexa-*.AppImage "${dist}/"
238+
(cd "$dist" && sha256sum Grexa-*.AppImage >> sha256sums.txt)
239+
224240
- name: Upload Linux artifacts
225241
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
226242
with:

Cargo.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ members = [
1010
resolver = "3"
1111

1212
[workspace.package]
13-
version = "1.5.0"
13+
version = "1.5.2"
1414
edition = "2024"
1515
license = "GPL-3.0-only"
1616
repository = "https://github.com/visorcraft/grexa"

apps/grexa-gui/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ repository.workspace = true
88
description = "Grexa Qt 6 / Kirigami GUI shell"
99

1010
[dependencies]
11-
grexa-ai = { version = "1.5.0", path = "../../crates/grexa-ai" }
12-
grexa-containers = { version = "1.5.0", path = "../../crates/grexa-containers" }
13-
grexa-core = { version = "1.5.0", path = "../../crates/grexa-core" }
14-
grexa-i18n = { version = "1.5.0", path = "../../crates/grexa-i18n" }
11+
grexa-ai = { version = "1.5.2", path = "../../crates/grexa-ai" }
12+
grexa-containers = { version = "1.5.2", path = "../../crates/grexa-containers" }
13+
grexa-core = { version = "1.5.2", path = "../../crates/grexa-core" }
14+
grexa-i18n = { version = "1.5.2", path = "../../crates/grexa-i18n" }
1515
regex.workspace = true
1616
serde_json.workspace = true
1717
tracing.workspace = true

apps/grexa-gui/build.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ fn emit_vergen() {
1818

1919
fn main() {
2020
emit_vergen();
21-
CxxQtBuilder::new_qml_module(
21+
println!("cargo:rerun-if-changed=src/icon_theme.cpp");
22+
23+
let builder = CxxQtBuilder::new_qml_module(
2224
QmlModule::new("com.visorcraft.Grexa")
2325
.version(1, 0)
2426
.qml_files([
@@ -71,6 +73,16 @@ fn main() {
7173
.file("src/qobjects/search.rs")
7274
.file("src/qobjects/settings.rs")
7375
.file("src/qobjects/regex_builder.rs")
74-
.file("src/qobjects/ai.rs")
75-
.build();
76+
.file("src/qobjects/ai.rs");
77+
78+
// icon_theme.cpp prepends the bundled AppDir/usr/share/icons path to Qt's
79+
// icon theme search paths so the AppImage can resolve Breeze symbolic
80+
// icons without relying on the host theme.
81+
let builder = unsafe {
82+
builder.cc_builder(|cc| {
83+
cc.file("src/icon_theme.cpp");
84+
})
85+
};
86+
87+
builder.build();
7688
}

apps/grexa-gui/qml/AboutPage.qml

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ Kirigami.ScrollablePage {
4949
app.tokens.textPrimary.b, 0.55)
5050

5151
readonly property var features: [
52-
{ icon: "edit-find-symbolic", title: qsTr("Fast content search"),
53-
body: qsTr("Streams matches as files are scanned — no waiting for the whole tree.") },
54-
{ icon: "code-context-symbolic", title: qsTr("Regex builder"),
55-
body: qsTr("Test patterns against a sample with the same engine the search uses.") },
56-
{ icon: "view-list-symbolic", title: qsTr("Smart filters"),
57-
body: qsTr(".gitignore-aware, with per-extension include + per-directory exclude globs.") },
58-
{ icon: "tools-symbolic", title: qsTr("Optional AI assist"),
59-
body: qsTr("Plug in any OpenAI-compatible endpoint. Keys live in Secret Service.") }
52+
{ icon: "edit-find-symbolic", title: app.i18n("ui-fast-content-search"),
53+
body: app.i18n("ui-streams-matches-as-files-are-scanned-a42cad") },
54+
{ icon: "code-context-symbolic", title: app.i18n("ui-regex-builder"),
55+
body: app.i18n("ui-test-patterns-against-a-sample-with-ac6cae") },
56+
{ icon: "view-list-symbolic", title: app.i18n("ui-smart-filters"),
57+
body: app.i18n("ui-gitignoreaware-with-perextension-include-perdirectory-exclude-0d4b24") },
58+
{ icon: "tools-symbolic", title: app.i18n("ui-optional-ai-assist"),
59+
body: app.i18n("ui-plug-in-any-openaicompatible-endpoint-keys-931293") }
6060
]
6161

6262
ColumnLayout {
@@ -82,14 +82,14 @@ Kirigami.ScrollablePage {
8282
spacing: 1
8383
Layout.alignment: Qt.AlignVCenter
8484
Controls.Label {
85-
text: qsTr("About")
85+
text: app.i18n("ui-about")
8686
font.pixelSize: app.tokens.textHeading
8787
font.weight: app.tokens.weightBold
8888
font.family: app.tokens.sansFamily
8989
font.letterSpacing: 0
9090
}
9191
Controls.Label {
92-
text: qsTr("Built on Rust + Qt 6 / Kirigami via cxx-qt.")
92+
text: app.i18n("ui-built-on-rust-qt-6-kirigami")
9393
font.pixelSize: app.tokens.textCaption + 1
9494
font.family: app.tokens.sansFamily
9595
opacity: 0.6
@@ -150,14 +150,14 @@ Kirigami.ScrollablePage {
150150
Layout.fillWidth: true
151151
spacing: app.tokens.spaceXS
152152
Controls.Label {
153-
text: qsTr("Grexa")
153+
text: app.i18n("app-name")
154154
font.pixelSize: app.tokens.textDisplay
155155
font.weight: app.tokens.weightBold
156156
font.family: app.tokens.sansFamily
157157
font.letterSpacing: 0
158158
}
159159
Controls.Label {
160-
text: qsTr("Fast Linux file content searchbuilt on the ripgrep core.")
160+
text: app.i18n("ui-fast-linux-file-content-search-built")
161161
font.pixelSize: app.tokens.textBody + 1
162162
font.family: app.tokens.sansFamily
163163
opacity: 0.7
@@ -175,7 +175,7 @@ Kirigami.ScrollablePage {
175175
Controls.Label {
176176
id: versionLabel
177177
anchors.centerIn: parent
178-
text: qsTr("v%1").arg(Qt.application.version)
178+
text: app.i18n("ui-version-prefix").arg(Qt.application.version)
179179
font.pixelSize: app.tokens.textCaption + 1
180180
font.weight: app.tokens.weightSemibold
181181
font.family: app.tokens.monoFamily
@@ -192,7 +192,7 @@ Kirigami.ScrollablePage {
192192
Controls.Label {
193193
id: gplLabel
194194
anchors.centerIn: parent
195-
text: qsTr("GPL v3")
195+
text: app.i18n("ui-gpl-v3")
196196
font.pixelSize: app.tokens.textCaption + 1
197197
font.family: app.tokens.sansFamily
198198
opacity: 0.85
@@ -208,7 +208,7 @@ Kirigami.ScrollablePage {
208208
Controls.Label {
209209
id: platformLabel
210210
anchors.centerIn: parent
211-
text: qsTr("Linux · Qt 6")
211+
text: app.i18n("ui-linux-qt-6")
212212
font.pixelSize: app.tokens.textCaption + 1
213213
font.family: app.tokens.monoFamily
214214
opacity: 0.85
@@ -237,7 +237,7 @@ Kirigami.ScrollablePage {
237237
// A 2×2 grid of icon-led capability cards. Each card
238238
// has its own subtle border and an icon avatar.
239239
Controls.Label {
240-
text: qsTr("WHAT'S INSIDE")
240+
text: app.i18n("ui-whats-inside")
241241
font.pixelSize: 10
242242
font.weight: app.tokens.weightSemibold
243243
font.letterSpacing: 0
@@ -350,7 +350,7 @@ Kirigami.ScrollablePage {
350350
spacing: 2
351351
Controls.Label {
352352
Layout.fillWidth: true
353-
text: qsTr("Native Linux search app built with Rust, Qt 6, Kirigami, and cxx-qt.")
353+
text: app.i18n("ui-native-linux-search-app-built-with-0ff6f8")
354354
font.pixelSize: app.tokens.textBodyEmphasis
355355
font.weight: app.tokens.weightSemibold
356356
font.family: app.tokens.sansFamily
@@ -359,7 +359,7 @@ Kirigami.ScrollablePage {
359359
Controls.Label {
360360
Layout.fillWidth: true
361361
textFormat: Text.RichText
362-
text: qsTr("<a href='https://github.com/visorcraft/grexa'>github.com/visorcraft/grexa</a>")
362+
text: app.i18n("ui-a-hrefhttpsgithubcomvisorcraftgrexagithubcomvisorcraftgrexaa-90eda6")
363363
onLinkActivated: link => Qt.openUrlExternally(link)
364364
linkColor: app.tokens.accent
365365
font.pixelSize: app.tokens.textBody
@@ -375,7 +375,7 @@ Kirigami.ScrollablePage {
375375
anchors.verticalCenter: parent.verticalCenter
376376
icon.name: "go-next-symbolic"
377377
icon.color: app.tokens.textPrimary
378-
text: qsTr("Visit Grexa")
378+
text: app.i18n("ui-visit-grexa")
379379
display: Controls.AbstractButton.TextBesideIcon
380380
onClicked: Qt.openUrlExternally("https://github.com/visorcraft/grexa")
381381
}
@@ -427,7 +427,7 @@ Kirigami.ScrollablePage {
427427
spacing: 2
428428
Controls.Label {
429429
Layout.fillWidth: true
430-
text: qsTr("Official Linux port of our Grex tool for Windows.")
430+
text: app.i18n("ui-official-linux-port-of-our-grex")
431431
font.pixelSize: app.tokens.textBodyEmphasis
432432
font.weight: app.tokens.weightSemibold
433433
font.family: app.tokens.sansFamily
@@ -436,7 +436,7 @@ Kirigami.ScrollablePage {
436436
Controls.Label {
437437
Layout.fillWidth: true
438438
textFormat: Text.RichText
439-
text: qsTr("<a href='https://github.com/visorcraft/grex'>github.com/visorcraft/grex</a>")
439+
text: app.i18n("ui-a-hrefhttpsgithubcomvisorcraftgrexgithubcomvisorcraftgrexa-0e491d")
440440
onLinkActivated: link => Qt.openUrlExternally(link)
441441
linkColor: app.tokens.accent
442442
font.pixelSize: app.tokens.textBody
@@ -452,7 +452,7 @@ Kirigami.ScrollablePage {
452452
anchors.verticalCenter: parent.verticalCenter
453453
icon.name: "go-next-symbolic"
454454
icon.color: app.tokens.textPrimary
455-
text: qsTr("Visit Grex")
455+
text: app.i18n("ui-visit-grex")
456456
display: Controls.AbstractButton.TextBesideIcon
457457
onClicked: Qt.openUrlExternally("https://github.com/visorcraft/grex")
458458
}
@@ -461,22 +461,22 @@ Kirigami.ScrollablePage {
461461
// -- Licenses & Credits card --------------------------
462462
Card {
463463
Layout.fillWidth: true
464-
title: qsTr("Licenses & Credits")
465-
subtitle: qsTr("Every direct + transitive crate, acknowledgments, and full license text is bundled in the built-in licenses view.")
464+
title: app.i18n("ui-licenses-credits")
465+
subtitle: app.i18n("ui-every-direct-transitive-crate-acknowledgments-and-2f6d3e")
466466
RowLayout {
467467
Layout.fillWidth: true
468468
spacing: app.tokens.spaceM
469469
AppFlatButton {
470470
icon.name: "view-list-text"
471471
icon.color: app.tokens.textPrimary
472-
text: qsTr("Licenses")
472+
text: app.i18n("ui-licenses")
473473
display: Controls.AbstractButton.TextBesideIcon
474474
onClicked: page.navigateRequested("licenses")
475475
}
476476
AppFlatButton {
477477
icon.name: "help-about-symbolic"
478478
icon.color: app.tokens.textPrimary
479-
text: qsTr("Credits")
479+
text: app.i18n("ui-credits")
480480
display: Controls.AbstractButton.TextBesideIcon
481481
onClicked: page.navigateRequested("credits")
482482
}
@@ -490,7 +490,7 @@ Kirigami.ScrollablePage {
490490
Layout.topMargin: app.tokens.spaceL
491491
Layout.bottomMargin: app.tokens.spaceXL
492492
textFormat: Text.RichText
493-
text: qsTr("Built by <b>VisorCraft</b>") + " · " + qsTr("Powered by Rust, Qt 6, Kirigami, and cxx-qt")
493+
text: app.i18n("ui-built-by-bvisorcraftb") + " · " + app.i18n("ui-powered-by-rust-qt-6-kirigami")
494494
font.pixelSize: app.tokens.textCaption + 1
495495
font.family: app.tokens.sansFamily
496496
opacity: 0.55

0 commit comments

Comments
 (0)