mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-01-29 17:15:38 +08:00
refactor: streamline UI readiness handling by replacing RwLock with AtomicU8 and updating related functions
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
use super::CmdResult;
|
use super::CmdResult;
|
||||||
use crate::core::sysopt::Sysopt;
|
use crate::core::sysopt::Sysopt;
|
||||||
|
use crate::utils::resolve::ui::{self, UiReadyStage};
|
||||||
use crate::{
|
use crate::{
|
||||||
cmd::StringifyErr,
|
cmd::StringifyErr,
|
||||||
feat, logging,
|
feat, logging,
|
||||||
@@ -242,34 +243,14 @@ pub async fn copy_icon_file(path: String, icon_info: IconInfo) -> CmdResult<Stri
|
|||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn notify_ui_ready() -> CmdResult<()> {
|
pub fn notify_ui_ready() -> CmdResult<()> {
|
||||||
logging!(info, Type::Cmd, "前端UI已准备就绪");
|
logging!(info, Type::Cmd, "前端UI已准备就绪");
|
||||||
crate::utils::resolve::ui::mark_ui_ready();
|
ui::mark_ui_ready();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// UI加载阶段
|
/// UI加载阶段
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn update_ui_stage(stage: String) -> CmdResult<()> {
|
pub fn update_ui_stage(stage: UiReadyStage) -> CmdResult<()> {
|
||||||
logging!(info, Type::Cmd, "UI加载阶段更新: {}", stage.as_str());
|
logging!(info, Type::Cmd, "UI加载阶段更新: {:?}", &stage);
|
||||||
|
ui::update_ui_ready_stage(stage);
|
||||||
use crate::utils::resolve::ui::UiReadyStage;
|
|
||||||
|
|
||||||
let stage_enum = match stage.as_str() {
|
|
||||||
"NotStarted" => UiReadyStage::NotStarted,
|
|
||||||
"Loading" => UiReadyStage::Loading,
|
|
||||||
"DomReady" => UiReadyStage::DomReady,
|
|
||||||
"ResourcesLoaded" => UiReadyStage::ResourcesLoaded,
|
|
||||||
"Ready" => UiReadyStage::Ready,
|
|
||||||
_ => {
|
|
||||||
logging!(
|
|
||||||
warn,
|
|
||||||
Type::Cmd,
|
|
||||||
"Warning: 未知的UI加载阶段: {}",
|
|
||||||
stage.as_str()
|
|
||||||
);
|
|
||||||
return Err(format!("未知的UI加载阶段: {}", stage.as_str()).into());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
crate::utils::resolve::ui::update_ui_ready_stage(stage_enum);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
use once_cell::sync::OnceCell;
|
use once_cell::sync::OnceCell;
|
||||||
use parking_lot::RwLock;
|
use serde::{Deserialize, Serialize};
|
||||||
use std::sync::{
|
use std::sync::{
|
||||||
Arc,
|
Arc,
|
||||||
atomic::{AtomicBool, Ordering},
|
atomic::{AtomicBool, AtomicU8, Ordering},
|
||||||
};
|
};
|
||||||
use tokio::sync::Notify;
|
use tokio::sync::Notify;
|
||||||
|
|
||||||
@@ -11,40 +11,27 @@ use crate::{logging, utils::logging::Type};
|
|||||||
// 获取 UI 是否准备就绪的全局状态
|
// 获取 UI 是否准备就绪的全局状态
|
||||||
static UI_READY: AtomicBool = AtomicBool::new(false);
|
static UI_READY: AtomicBool = AtomicBool::new(false);
|
||||||
// 获取UI就绪状态细节
|
// 获取UI就绪状态细节
|
||||||
static UI_READY_STATE: OnceCell<UiReadyState> = OnceCell::new();
|
static UI_READY_STATE: AtomicU8 = AtomicU8::new(0);
|
||||||
// 添加通知机制,用于事件驱动的 UI 就绪检测
|
// 添加通知机制,用于事件驱动的 UI 就绪检测
|
||||||
static UI_READY_NOTIFY: OnceCell<Arc<Notify>> = OnceCell::new();
|
static UI_READY_NOTIFY: OnceCell<Arc<Notify>> = OnceCell::new();
|
||||||
|
|
||||||
// UI就绪阶段状态枚举
|
// UI就绪阶段状态枚举
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[repr(u8)]
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
|
||||||
pub enum UiReadyStage {
|
pub enum UiReadyStage {
|
||||||
NotStarted,
|
NotStarted = 0,
|
||||||
Loading,
|
Loading,
|
||||||
DomReady,
|
DomReady,
|
||||||
ResourcesLoaded,
|
ResourcesLoaded,
|
||||||
Ready,
|
Ready,
|
||||||
}
|
}
|
||||||
|
|
||||||
// UI就绪详细状态
|
|
||||||
#[derive(Debug)]
|
|
||||||
struct UiReadyState {
|
|
||||||
stage: RwLock<UiReadyStage>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for UiReadyState {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
stage: RwLock::new(UiReadyStage::NotStarted),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_ui_ready() -> &'static AtomicBool {
|
pub fn get_ui_ready() -> &'static AtomicBool {
|
||||||
&UI_READY
|
&UI_READY
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_ui_ready_state() -> &'static UiReadyState {
|
fn get_ui_ready_state() -> &'static AtomicU8 {
|
||||||
UI_READY_STATE.get_or_init(UiReadyState::default)
|
&UI_READY_STATE
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_ui_ready_notify() -> &'static Arc<Notify> {
|
fn get_ui_ready_notify() -> &'static Arc<Notify> {
|
||||||
@@ -53,8 +40,7 @@ fn get_ui_ready_notify() -> &'static Arc<Notify> {
|
|||||||
|
|
||||||
// 更新UI准备阶段
|
// 更新UI准备阶段
|
||||||
pub fn update_ui_ready_stage(stage: UiReadyStage) {
|
pub fn update_ui_ready_stage(stage: UiReadyStage) {
|
||||||
let state = get_ui_ready_state();
|
get_ui_ready_state().store(stage as u8, Ordering::Release);
|
||||||
*state.stage.write() = stage;
|
|
||||||
// 如果是最终阶段,标记UI完全就绪
|
// 如果是最终阶段,标记UI完全就绪
|
||||||
if stage == UiReadyStage::Ready {
|
if stage == UiReadyStage::Ready {
|
||||||
mark_ui_ready();
|
mark_ui_ready();
|
||||||
|
|||||||
Reference in New Issue
Block a user