diff --git a/.github/actions/cache-desktop-proguard/action.yml b/.github/actions/cache-desktop-proguard/action.yml new file mode 100644 index 0000000..01d7186 --- /dev/null +++ b/.github/actions/cache-desktop-proguard/action.yml @@ -0,0 +1,18 @@ +name: Cache desktop ProGuard jars +description: Restore or save the CI ProGuard export directory (speeds up release desktop-proguard job) + +outputs: + cache-hit: + description: Whether ProGuard jars were restored from cache + value: ${{ steps.cache.outputs.cache-hit }} + +runs: + using: composite + steps: + - uses: actions/cache@v5 + id: cache + with: + path: app/desktop/build/ci/proguard + key: desktop-proguard-v1-${{ hashFiles('gradle/libs.versions.toml', 'build.gradle.kts', 'settings.gradle.kts', 'app/desktop/build.gradle.kts', 'app/desktop/proguard-rules.pro', 'app/shared/build.gradle.kts') }} + restore-keys: | + desktop-proguard-v1- diff --git a/.github/actions/cache-windows-rust-tools/action.yml b/.github/actions/cache-windows-rust-tools/action.yml new file mode 100644 index 0000000..0fbf87f --- /dev/null +++ b/.github/actions/cache-windows-rust-tools/action.yml @@ -0,0 +1,18 @@ +name: Cache Windows installer Rust binaries +description: Restore or save compiled windows-setup release executables + +outputs: + cache-hit: + description: Whether Rust installer tools were restored from cache + value: ${{ steps.cache.outputs.cache-hit }} + +runs: + using: composite + steps: + - uses: actions/cache@v5 + id: cache + with: + path: app/desktop/windows-setup/target/release + key: windows-rust-tools-v1-${{ hashFiles('app/desktop/windows-setup/Cargo.lock') }} + restore-keys: | + windows-rust-tools-v1- diff --git a/.github/actions/setup-java-gradle/action.yml b/.github/actions/setup-java-gradle/action.yml index 8e5a45e..06d9e8b 100644 --- a/.github/actions/setup-java-gradle/action.yml +++ b/.github/actions/setup-java-gradle/action.yml @@ -10,14 +10,14 @@ inputs: runs: using: composite steps: - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: distribution: temurin java-version: "17" architecture: ${{ inputs.java-architecture }} - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@v5 with: gradle-version: wrapper cache-read-only: false - add-job-summary: true + add-job-summary: on-failure diff --git a/.github/workflows/desktop-windows-x64.yml b/.github/workflows/desktop-windows-x64.yml index a9a4a7b..d51bcb4 100644 --- a/.github/workflows/desktop-windows-x64.yml +++ b/.github/workflows/desktop-windows-x64.yml @@ -16,26 +16,23 @@ concurrency: cancel-in-progress: true env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g + GRADLE_OPTS: >- + -Dorg.gradle.jvmargs=-Xmx6g + -Dkotlin.daemon.jvm.options=-Xmx6g + -Dorg.gradle.parallel=true jobs: windows-x64: runs-on: windows-latest timeout-minutes: 45 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - uses: gradle/actions/setup-gradle@v4 - with: - gradle-version: wrapper + - uses: actions/checkout@v5 + - uses: ./.github/actions/setup-java-gradle - uses: dtolnay/rust-toolchain@stable with: targets: x86_64-pc-windows-msvc - name: Cache Cargo - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/registry @@ -62,7 +59,7 @@ jobs: run: | export FROMCHAT_PACKAGING_JDK="$JAVA_HOME" ./gradlew :app:desktop:packageBetaWindows -PbetaDesktop -PdesktopArch=x64 --no-daemon --console=plain - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: windows-x64-installer path: app/desktop/build/distributions/release/FromChat-Setup-*-beta2.exe diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 73ce906..d2952b0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,10 @@ concurrency: cancel-in-progress: true env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g + GRADLE_OPTS: >- + -Dorg.gradle.jvmargs=-Xmx6g + -Dkotlin.daemon.jvm.options=-Xmx6g + -Dorg.gradle.parallel=true jobs: resolve-version: @@ -55,64 +58,57 @@ jobs: env: FROMCHAT_PREBUILT_PROGUARD: "0" steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - uses: gradle/actions/setup-gradle@v4 - with: - gradle-version: wrapper + - uses: actions/checkout@v5 + - uses: ./.github/actions/setup-java-gradle - uses: ./.github/actions/set-version with: version: ${{ needs.resolve-version.outputs.version }} + - uses: ./.github/actions/cache-desktop-proguard + id: proguard-cache - name: Compile and ProGuard release desktop jars + if: steps.proguard-cache.outputs.cache-hit != 'true' run: ./gradlew :app:desktop:exportReleaseProguardForCi --no-daemon --console=plain - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: desktop-proguard path: app/desktop/build/ci/proguard/ if-no-files-found: error - retention-days: 7 + retention-days: 3 windows-common: needs: resolve-version runs-on: windows-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - uses: gradle/actions/setup-gradle@v4 - with: - gradle-version: wrapper + - uses: actions/checkout@v5 + - uses: ./.github/actions/setup-java-gradle - uses: ./.github/actions/set-version with: version: ${{ needs.resolve-version.outputs.version }} - uses: dtolnay/rust-toolchain@stable with: targets: x86_64-pc-windows-msvc - - name: Cache Cargo - uses: actions/cache@v4 + - name: Cache Cargo registry + uses: actions/cache@v5 with: path: | ~/.cargo/registry ~/.cargo/git - app/desktop/windows-setup/target - key: cargo-windows-${{ runner.os }}-${{ hashFiles('app/desktop/windows-setup/Cargo.lock') }} + key: cargo-registry-${{ runner.os }}-${{ hashFiles('app/desktop/windows-setup/Cargo.lock') }} restore-keys: | - cargo-windows-${{ runner.os }}- + cargo-registry-${{ runner.os }}- + - uses: ./.github/actions/cache-windows-rust-tools + id: rust-tools-cache - name: Build Windows installer Rust tooling + if: steps.rust-tools-cache.outputs.cache-hit != 'true' shell: bash run: ./gradlew :app:desktop:buildWindowsSetupRust --no-daemon --console=plain - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: windows-rust-tools path: app/desktop/windows-setup/target/release/*.exe if-no-files-found: error - retention-days: 7 + retention-days: 3 windows-package: needs: [resolve-version, desktop-proguard, windows-common] @@ -129,28 +125,27 @@ jobs: runs-on: ${{ matrix.runner }} timeout-minutes: 60 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Ensure ARM64 packaging JDK if: matrix.arch == 'arm64' shell: cmd run: call scripts\ensure-windows-arm64-jdk.cmd - - uses: actions/setup-java@v4 + - uses: ./.github/actions/setup-java-gradle if: matrix.arch == 'x64' - with: - distribution: temurin - java-version: "17" - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@v5 + if: matrix.arch == 'arm64' with: gradle-version: wrapper + add-job-summary: on-failure - uses: ./.github/actions/set-version with: version: ${{ needs.resolve-version.outputs.version }} - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: desktop-proguard path: app/desktop/build/prebuilt/main-release/proguard - name: Restore Windows Rust installer tools - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: windows-rust-tools path: app/desktop/windows-setup/target/release @@ -170,7 +165,7 @@ jobs: args+=("-PwindowsArm64") fi ./gradlew "${args[@]}" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: windows-${{ matrix.arch }} path: app/desktop/build/distributions/release/*-windows-${{ matrix.arch }}.exe @@ -189,30 +184,22 @@ jobs: runs-on: macos-latest timeout-minutes: 60 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: ./.github/actions/setup-java-gradle if: matrix.arch == 'x64' with: - distribution: temurin - java-version: "17" - architecture: x64 - - uses: actions/setup-java@v4 + java-architecture: x64 + - uses: ./.github/actions/setup-java-gradle if: matrix.arch == 'arm64' - with: - distribution: temurin - java-version: "17" - - uses: gradle/actions/setup-gradle@v4 - with: - gradle-version: wrapper - uses: ./.github/actions/set-version with: version: ${{ needs.resolve-version.outputs.version }} - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: desktop-proguard path: app/desktop/build/prebuilt/main-release/proguard - name: Cache DMG background tooling - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | app/desktop/dmg-background/node_modules @@ -226,14 +213,14 @@ jobs: fi DMG_DIR="app/desktop/dmg-background" if [[ ! -f "$DMG_DIR/node_modules/playwright/package.json" ]]; then - npm --prefix "$DMG_DIR" install --no-fund --no-audit + npm --prefix "$DMG_DIR" ci --no-fund --no-audit npm --prefix "$DMG_DIR" exec playwright install chromium fi - name: Package macOS ${{ matrix.arch }} run: | export FROMCHAT_PACKAGING_JDK="$JAVA_HOME" ./gradlew :app:desktop:packageReleaseMac -PdesktopArch=${{ matrix.arch }} --no-daemon --console=plain - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: macos-${{ matrix.arch }} path: app/desktop/build/distributions/release/*-macOS-${{ matrix.arch }}.dmg @@ -256,25 +243,20 @@ jobs: runs-on: ${{ matrix.runner }} timeout-minutes: 45 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - uses: gradle/actions/setup-gradle@v4 - with: - gradle-version: wrapper + - uses: actions/checkout@v5 + - uses: ./.github/actions/setup-java-gradle - uses: ./.github/actions/set-version with: version: ${{ needs.resolve-version.outputs.version }} - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: desktop-proguard path: app/desktop/build/prebuilt/main-release/proguard - name: Install Linux packaging tools run: | sudo apt-get update - sudo apt-get install -y fakeroot rpm binutils libfuse2 wget + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + fakeroot rpm binutils libfuse2 wget CACHE_DIR="${RUNNER_TOOL_CACHE}/appimagetool" mkdir -p "$CACHE_DIR" TOOL="$CACHE_DIR/appimagetool-${{ matrix.arch }}.AppImage" @@ -287,7 +269,7 @@ jobs: run: | export FROMCHAT_PACKAGING_JDK="$JAVA_HOME" ./gradlew :app:desktop:packageReleaseLinux -PdesktopArch=${{ matrix.arch }} --no-daemon --console=plain - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: linux-${{ matrix.arch }} path: | @@ -301,20 +283,14 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: "17" - - uses: gradle/actions/setup-gradle@v4 - with: - gradle-version: wrapper - - uses: android-actions/setup-android@v3 + - uses: actions/checkout@v5 + - uses: ./.github/actions/setup-java-gradle + - uses: android-actions/setup-android@v4 - uses: ./.github/actions/set-version with: version: ${{ needs.resolve-version.outputs.version }} - name: Cache Android SDK extras - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.android/build-cache @@ -353,7 +329,7 @@ jobs: mkdir -p release-staging APK="$(find app/android/build/outputs/apk/release -name '*release*.apk' | head -n 1)" cp "$APK" "release-staging/FromChat-${{ needs.resolve-version.outputs.version }}-android-universal.apk" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: android path: release-staging/*.apk @@ -371,8 +347,19 @@ jobs: permissions: contents: write steps: - - uses: actions/download-artifact@v4 + - uses: actions/checkout@v5 with: + sparse-checkout: | + RELEASE_NOTES.md + sparse-checkout-cone-mode: false + - uses: actions/download-artifact@v5 + with: + pattern: | + windows-* + macos-* + linux-* + android + merge-multiple: true path: artifacts - name: Collect release assets run: | @@ -384,7 +371,7 @@ jobs: -name '*.AppImage' -o \ -name '*.exe' -o \ -name '*.apk' \ - \) -exec cp {} release-assets/ \; + \) -exec cp -t release-assets {} + ls -la release-assets VERSION="${{ needs.resolve-version.outputs.version }}" for pattern in \ @@ -405,13 +392,23 @@ jobs: exit 1 fi done + - name: Prepare release notes + run: | + VERSION="${{ needs.resolve-version.outputs.version }}" + { + echo "# FromChat ${VERSION}" + echo "" + cat RELEASE_NOTES.md + } > release-body.md - name: Publish GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ needs.resolve-version.outputs.tag }} name: FromChat ${{ needs.resolve-version.outputs.version }} + body_path: release-body.md draft: false - generate_release_notes: true + prerelease: false + generate_release_notes: false files: release-assets/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/app/desktop/windows-setup/helper/src/main.rs b/app/desktop/windows-setup/helper/src/main.rs index 545adcd..e2e69b0 100644 --- a/app/desktop/windows-setup/helper/src/main.rs +++ b/app/desktop/windows-setup/helper/src/main.rs @@ -280,6 +280,3 @@ fn parse_edition(raw: &str) -> Result { } } -fn find_app_exe(dest: &PathBuf) -> Result { - find_jpackage_app_exe(dest) -} diff --git a/app/desktop/windows-setup/setup/Cargo.toml b/app/desktop/windows-setup/setup/Cargo.toml index 6900990..93122c4 100644 --- a/app/desktop/windows-setup/setup/Cargo.toml +++ b/app/desktop/windows-setup/setup/Cargo.toml @@ -26,6 +26,10 @@ image = { version = "0.25", default-features = false, features = ["png"] } earcutr = "0.4" raw-window-handle = "0.6" +[lints.rust] +dead_code = "allow" +unused_assignments = "warn" + [build-dependencies] winres = "0.1" image = { version = "0.25", default-features = false, features = ["png"] } diff --git a/app/desktop/windows-setup/setup/src/anim.rs b/app/desktop/windows-setup/setup/src/anim.rs index 739702f..b7faeaa 100644 --- a/app/desktop/windows-setup/setup/src/anim.rs +++ b/app/desktop/windows-setup/setup/src/anim.rs @@ -7,11 +7,6 @@ pub fn ease_in_out_cubic(t: f32) -> f32 { } } -pub fn ease_out_cubic(t: f32) -> f32 { - let t = t.clamp(0.0, 1.0); - 1.0 - (1.0 - t).powi(3) -} - #[derive(Clone, Copy)] pub struct ScreenTransition { pub from: S, diff --git a/app/desktop/windows-setup/setup/src/ui.rs b/app/desktop/windows-setup/setup/src/ui.rs index 6658b0a..bb61dfb 100644 --- a/app/desktop/windows-setup/setup/src/ui.rs +++ b/app/desktop/windows-setup/setup/src/ui.rs @@ -399,7 +399,7 @@ impl eframe::App for SetupApp { .transition .is_some_and(|t| t.from == Screen::Welcome || t.to == Screen::Welcome); - ui.allocate_ui_at_rect(full, |ui| { + widgets::scope_at_rect(ui, full, |ui| { ui.set_clip_rect(full); if let Some(tr) = self.transition { let w = full.width(); @@ -412,10 +412,10 @@ impl eframe::App for SetupApp { }; let from = tr.from; let to = tr.to; - ui.allocate_ui_at_rect(full.translate(Vec2::new(out_x, 0.0)), |ui| { + widgets::scope_at_rect(ui, full.translate(Vec2::new(out_x, 0.0)), |ui| { self.draw_screen(ui, from, false); }); - ui.allocate_ui_at_rect(full.translate(Vec2::new(in_x, 0.0)), |ui| { + widgets::scope_at_rect(ui, full.translate(Vec2::new(in_x, 0.0)), |ui| { // Hover off during slide; clicks still register. self.draw_screen(ui, to, false); }); @@ -511,7 +511,7 @@ impl SetupApp { Rect::from_min_size(Pos2::new(left, y), Vec2::new(card_w, version_h)); if let Some(upgrade_rect) = upgrade_rect { - ui.allocate_ui_at_rect(upgrade_rect, |ui| { + widgets::scope_at_rect(ui, upgrade_rect, |ui| { ui.set_clip_rect(upgrade_rect); if widgets::choice_card_sized( ui, @@ -525,7 +525,7 @@ impl SetupApp { } }); } - ui.allocate_ui_at_rect(primary_rect, |ui| { + widgets::scope_at_rect(ui, primary_rect, |ui| { ui.set_clip_rect(primary_rect); if widgets::choice_card_sized( ui, @@ -542,7 +542,7 @@ impl SetupApp { } } }); - ui.allocate_ui_at_rect(portable_rect, |ui| { + widgets::scope_at_rect(ui, portable_rect, |ui| { ui.set_clip_rect(portable_rect); if widgets::choice_card_sized( ui, @@ -555,7 +555,7 @@ impl SetupApp { self.go(Screen::PortableOptions); } }); - ui.allocate_ui_at_rect(version_rect, |ui| { + widgets::scope_at_rect(ui, version_rect, |ui| { ui.with_layout(egui::Layout::top_down(egui::Align::Center), |ui| { ui.set_width(card_w); ui.label( @@ -578,7 +578,7 @@ impl SetupApp { Pos2::new(full.right(), bar_rect.top()), ); - ui.allocate_ui_at_rect(body_rect, |ui| { + widgets::scope_at_rect(ui, body_rect, |ui| { ui.set_clip_rect(body_rect); ui.add_space(TITLE_BAR_HEIGHT + 4.0); egui::Frame::none() @@ -631,7 +631,7 @@ impl SetupApp { let mut back = false; let mut go_next = false; - ui.allocate_ui_at_rect(bar_rect, |ui| { + widgets::scope_at_rect(ui, bar_rect, |ui| { ui.set_clip_rect(bar_rect); ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { egui::Frame::none() @@ -671,7 +671,7 @@ impl SetupApp { Pos2::new(full.right(), bar_rect.top()), ); - ui.allocate_ui_at_rect(body_rect, |ui| { + widgets::scope_at_rect(ui, body_rect, |ui| { ui.set_clip_rect(body_rect); ui.add_space(TITLE_BAR_HEIGHT + 4.0); egui::Frame::none() @@ -707,7 +707,7 @@ impl SetupApp { let mut back = false; let mut go_next = false; - ui.allocate_ui_at_rect(bar_rect, |ui| { + widgets::scope_at_rect(ui, bar_rect, |ui| { ui.set_clip_rect(bar_rect); ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { egui::Frame::none() @@ -747,7 +747,7 @@ impl SetupApp { Pos2::new(full.right(), bar_rect.top()), ); - ui.allocate_ui_at_rect(body_rect, |ui| { + widgets::scope_at_rect(ui, body_rect, |ui| { ui.set_clip_rect(body_rect); ui.add_space(TITLE_BAR_HEIGHT + 4.0); egui::Frame::none() @@ -809,7 +809,7 @@ impl SetupApp { let mut back = false; let mut go_next = false; - ui.allocate_ui_at_rect(bar_rect, |ui| { + widgets::scope_at_rect(ui, bar_rect, |ui| { ui.set_clip_rect(bar_rect); ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { egui::Frame::none() @@ -872,7 +872,7 @@ impl SetupApp { ); let installed = self.installed.clone(); - ui.allocate_ui_at_rect(body_rect, |ui| { + widgets::scope_at_rect(ui, body_rect, |ui| { ui.set_clip_rect(body_rect); ui.add_space(TITLE_BAR_HEIGHT + 4.0); egui::Frame::none() @@ -921,7 +921,7 @@ impl SetupApp { let mut back = false; let mut go_next = false; let can_upgrade = installed.is_some(); - ui.allocate_ui_at_rect(bar_rect, |ui| { + widgets::scope_at_rect(ui, bar_rect, |ui| { ui.set_clip_rect(bar_rect); ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { egui::Frame::none() @@ -1009,7 +1009,7 @@ impl SetupApp { Pos2::new(full.right(), bar_rect.top()), ); - ui.allocate_ui_at_rect(body_rect, |ui| { + widgets::scope_at_rect(ui, body_rect, |ui| { ui.set_clip_rect(body_rect); ui.add_space(TITLE_BAR_HEIGHT + 4.0); egui::Frame::none() @@ -1083,7 +1083,7 @@ impl SetupApp { }); let ctx = ui.ctx().clone(); - ui.allocate_ui_at_rect(bar_rect, |ui| { + widgets::scope_at_rect(ui, bar_rect, |ui| { ui.set_clip_rect(bar_rect); ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { egui::Frame::none() @@ -1119,7 +1119,7 @@ impl SetupApp { Pos2::new(full.right(), bar_rect.top()), ); - ui.allocate_ui_at_rect(body_rect, |ui| { + widgets::scope_at_rect(ui, body_rect, |ui| { ui.set_clip_rect(body_rect); ui.add_space(TITLE_BAR_HEIGHT + 4.0); egui::Frame::none() @@ -1145,7 +1145,7 @@ impl SetupApp { }); let ctx = ui.ctx().clone(); - ui.allocate_ui_at_rect(bar_rect, |ui| { + widgets::scope_at_rect(ui, bar_rect, |ui| { ui.set_clip_rect(bar_rect); ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { egui::Frame::none() @@ -1742,35 +1742,12 @@ fn run_elevated_install( let _ = tx.send(ev); if done { got_terminal = true; - break; } } } Ok(()) } -fn find_app_exe(dest: &PathBuf) -> anyhow::Result { - find_jpackage_app_exe(dest).map_err(Into::into) -} - -fn walkdir_files(root: &PathBuf) -> anyhow::Result> { - let mut out = Vec::new(); - fn rec(dir: &PathBuf, out: &mut Vec) -> anyhow::Result<()> { - for e in std::fs::read_dir(dir)? { - let e = e?; - let p = e.path(); - if e.file_type()?.is_dir() { - rec(&p, out)?; - } else { - out.push(p); - } - } - Ok(()) - } - rec(root, &mut out)?; - Ok(out) -} - fn default_install_path(all_users: bool, edition: FromChatEdition) -> String { #[cfg(windows)] { diff --git a/app/desktop/windows-setup/setup/src/widgets.rs b/app/desktop/windows-setup/setup/src/widgets.rs index 9d352b4..f57e5e0 100644 --- a/app/desktop/windows-setup/setup/src/widgets.rs +++ b/app/desktop/windows-setup/setup/src/widgets.rs @@ -15,7 +15,12 @@ use crate::theme::{ TEXT_BUTTON_PAD_END_WITH_ICON, TEXT_BUTTON_PAD_START_WITH_ICON, TEXT_FIELD_CORNER_RADIUS, TEXT_FIELD_HEIGHT, TEXT_FIELD_PAD_HORIZONTAL, TEXT_FIELD_TRAILING_ICON_WIDTH, }; -use eframe::egui::{self, Color32, Id, Pos2, Rect, Rounding, Sense, Stroke, TextureHandle, Ui, Vec2}; +use eframe::egui::{self, Color32, Id, InnerResponse, Pos2, Rect, Rounding, Sense, Stroke, TextureHandle, Ui, UiBuilder, Vec2}; + +/// Lay out a child [Ui] in a fixed rectangle (replaces deprecated `allocate_ui_at_rect`). +pub fn scope_at_rect(ui: &mut Ui, rect: Rect, add_contents: impl FnOnce(&mut Ui) -> R) -> InnerResponse { + ui.scope_builder(UiBuilder::new().max_rect(rect), add_contents) +} pub const H_PADDING: f32 = 24.0; /// Matches [H_PADDING] so bottom / side insets stay equal. @@ -701,7 +706,7 @@ pub fn path_field(ui: &mut Ui, value: &mut String, enabled: bool, field_id: Id) paint_path_line(ui.painter(), &to_text, fade); } - ui.allocate_ui_at_rect(text_rect, |ui| { + scope_at_rect(ui, text_rect, |ui| { ui.set_clip_rect(text_rect); ui.with_layout( egui::Layout::left_to_right(egui::Align::Center), @@ -726,7 +731,7 @@ pub fn path_field(ui: &mut Ui, value: &mut String, enabled: bool, field_id: Id) }); let mut browse = false; - ui.allocate_ui_at_rect(icon_rect, |ui| { + scope_at_rect(ui, icon_rect, |ui| { ui.with_layout( egui::Layout::centered_and_justified(egui::Direction::LeftToRight), |ui| { diff --git a/app/desktop/windows-setup/setup/src/win_dialog.rs b/app/desktop/windows-setup/setup/src/win_dialog.rs index 85b1fcc..66c8222 100644 --- a/app/desktop/windows-setup/setup/src/win_dialog.rs +++ b/app/desktop/windows-setup/setup/src/win_dialog.rs @@ -5,7 +5,7 @@ mod imp { use windows::core::PCWSTR; use windows::Win32::Foundation::HWND; use windows::Win32::UI::WindowsAndMessaging::{ - MessageBoxW, MB_DEFBUTTON2, MB_ICONERROR, MB_ICONWARNING, MB_OK, MB_YESNO, IDNO, IDYES, + MessageBoxW, MB_DEFBUTTON2, MB_ICONERROR, MB_ICONWARNING, MB_OK, MB_YESNO, IDYES, }; fn wide(s: &str) -> Vec { diff --git a/gradle.properties b/gradle.properties index 2e4dd2e..e4833eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,4 +34,6 @@ android.enableR8.fullMode=true android.r8.optimizedResourceShrinking=true android.bundle.enableNativeLibraryCompressionInApk=true # Configuration cache can surface noisy IDE/sync issues on some setups; turn on when stable. -org.gradle.configuration-cache=false \ No newline at end of file +org.gradle.configuration-cache=false +# Windows CI hosts cannot run iOS simulator tests; suppress KMP disabled-target noise. +kotlin.native.ignoreDisabledTargets=true \ No newline at end of file