Update All Top Ranking Issues / update_top_ranking_issues (push) Has been cancelled
release_nightly / notify_on_failure (push) Has been cancelled
release_nightly / check_style (push) Has been cancelled
release_nightly / run_tests_windows (push) Has been cancelled
release_nightly / clippy_windows (push) Has been cancelled
release_nightly / bundle_linux_aarch64 (push) Has been cancelled
release_nightly / bundle_linux_x86_64 (push) Has been cancelled
release_nightly / bundle_mac_aarch64 (push) Has been cancelled
release_nightly / bundle_mac_x86_64 (push) Has been cancelled
release_nightly / bundle_windows_aarch64 (push) Has been cancelled
release_nightly / bundle_windows_x86_64 (push) Has been cancelled
release_nightly / build_nix_mac_aarch64 (push) Has been cancelled
release_nightly / update_nightly_tag (push) Has been cancelled
Hotfix Review Monitor / check-hotfix-reviews (push) Has been cancelled
Stale PR Review Reminder / check-stale-prs (push) Has been cancelled
Update Weekly Top Ranking Issues / update_top_ranking_issues (push) Has been cancelled
Triage Project Sync (#84) / Sync triage project (push) Has been cancelled
release_nightly / build_nix_linux_x86_64 (push) Has been cancelled
Bump collab-staging Tag / update-collab-staging-tag (push) Has been cancelled
compliance_check / scheduled_compliance_check (push) Has been cancelled
Single-commit orphan branch: full zed-industries/zed @ 8c74db0 source tree with a 3-file patch applied (no upstream history). Patch (crates/gpui_linux/src/linux/wayland/): - serial.rs: add SerialKind::KeyboardEnter - client.rs: store wl_keyboard.enter serial; add latest_serial_of() - window.rs: activate() uses keyboard-enter serial (Mutter focus gate) Mutter honors window activation only when the token carries the keyboard- focus serial from wl_keyboard.enter; GPUI used a stale mouse-press serial. See docs/tray-window-focus-wayland.md in logiguard. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
146 lines
5.2 KiB
Rust
146 lines
5.2 KiB
Rust
use std::sync::Arc;
|
|
|
|
use anyhow::anyhow;
|
|
use auto_update::{AutoUpdateStatus, AutoUpdater, UpdateCheckType, VersionCheckType};
|
|
use gpui::{Empty, Render};
|
|
use semver::Version;
|
|
use ui::{UpdateButton, prelude::*};
|
|
|
|
pub struct UpdateVersion {
|
|
status: AutoUpdateStatus,
|
|
update_check_type: UpdateCheckType,
|
|
dismissed: bool,
|
|
}
|
|
|
|
impl UpdateVersion {
|
|
pub fn new(cx: &mut Context<Self>) -> Self {
|
|
if let Some(auto_updater) = AutoUpdater::get(cx) {
|
|
cx.observe(&auto_updater, |this, auto_update, cx| {
|
|
this.status = auto_update.read(cx).status();
|
|
this.update_check_type = auto_update.read(cx).update_check_type();
|
|
if this.status.is_updated() {
|
|
this.dismissed = false;
|
|
}
|
|
})
|
|
.detach();
|
|
Self {
|
|
status: auto_updater.read(cx).status(),
|
|
update_check_type: UpdateCheckType::Automatic,
|
|
dismissed: false,
|
|
}
|
|
} else {
|
|
Self {
|
|
status: AutoUpdateStatus::Idle,
|
|
update_check_type: UpdateCheckType::Automatic,
|
|
dismissed: false,
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn update_simulation(&mut self, cx: &mut Context<Self>) {
|
|
let next_state = match self.status {
|
|
AutoUpdateStatus::Idle => AutoUpdateStatus::Checking,
|
|
AutoUpdateStatus::Checking => AutoUpdateStatus::Downloading {
|
|
version: VersionCheckType::Semantic(Version::new(1, 99, 0)),
|
|
},
|
|
AutoUpdateStatus::Downloading { .. } => AutoUpdateStatus::Installing {
|
|
version: VersionCheckType::Semantic(Version::new(1, 99, 0)),
|
|
},
|
|
AutoUpdateStatus::Installing { .. } => AutoUpdateStatus::Updated {
|
|
version: VersionCheckType::Semantic(Version::new(1, 99, 0)),
|
|
},
|
|
AutoUpdateStatus::Updated { .. } => AutoUpdateStatus::Errored {
|
|
error: Arc::new(anyhow!("Network timeout")),
|
|
},
|
|
AutoUpdateStatus::Errored { .. } => AutoUpdateStatus::Idle,
|
|
};
|
|
|
|
self.status = next_state;
|
|
self.update_check_type = UpdateCheckType::Manual;
|
|
self.dismissed = false;
|
|
cx.notify()
|
|
}
|
|
|
|
pub fn show_update_in_menu_bar(&self) -> bool {
|
|
self.dismissed && self.status.is_updated()
|
|
}
|
|
|
|
fn version_tooltip_message(version: &VersionCheckType) -> String {
|
|
format!("Version: {}", {
|
|
match version {
|
|
VersionCheckType::Sha(sha) => format!("{}…", sha.short()),
|
|
VersionCheckType::Semantic(semantic_version) => semantic_version.to_string(),
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
impl Render for UpdateVersion {
|
|
fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
|
|
if self.dismissed {
|
|
return Empty.into_any_element();
|
|
}
|
|
match &self.status {
|
|
AutoUpdateStatus::Checking if self.update_check_type.is_manual() => {
|
|
UpdateButton::checking().into_any_element()
|
|
}
|
|
AutoUpdateStatus::Downloading { version } => {
|
|
let tooltip = Self::version_tooltip_message(&version);
|
|
UpdateButton::downloading(tooltip).into_any_element()
|
|
}
|
|
AutoUpdateStatus::Installing { version } => {
|
|
let tooltip = Self::version_tooltip_message(&version);
|
|
UpdateButton::installing(tooltip).into_any_element()
|
|
}
|
|
AutoUpdateStatus::Updated { version } => {
|
|
let tooltip = Self::version_tooltip_message(&version);
|
|
UpdateButton::updated(tooltip)
|
|
.on_click(|_, _, cx| {
|
|
workspace::reload(cx);
|
|
})
|
|
.on_dismiss(cx.listener(|this, _, _window, cx| {
|
|
this.dismissed = true;
|
|
cx.notify()
|
|
}))
|
|
.into_any_element()
|
|
}
|
|
AutoUpdateStatus::Errored { error } => {
|
|
let error_str = error.to_string();
|
|
UpdateButton::errored(error_str)
|
|
.on_click(|_, window, cx| {
|
|
window.dispatch_action(Box::new(workspace::OpenLog), cx);
|
|
})
|
|
.on_dismiss(cx.listener(|this, _, _window, cx| {
|
|
this.dismissed = true;
|
|
cx.notify()
|
|
}))
|
|
.into_any_element()
|
|
}
|
|
AutoUpdateStatus::Idle | AutoUpdateStatus::Checking { .. } => Empty.into_any_element(),
|
|
}
|
|
}
|
|
}
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use auto_update::VersionCheckType;
|
|
use release_channel::AppCommitSha;
|
|
use semver::Version;
|
|
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_version_tooltip_message() {
|
|
let message = UpdateVersion::version_tooltip_message(&VersionCheckType::Semantic(
|
|
Version::new(1, 0, 0),
|
|
));
|
|
|
|
assert_eq!(message, "Version: 1.0.0");
|
|
|
|
let message = UpdateVersion::version_tooltip_message(&VersionCheckType::Sha(
|
|
AppCommitSha::new("14d9a4189f058d8736339b06ff2340101eaea5af".to_string()),
|
|
));
|
|
|
|
assert_eq!(message, "Version: 14d9a41…");
|
|
}
|
|
}
|