diff --git a/bun.lockb b/bun.lockb index f151ae5..37bb343 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index dc4cae0..4012284 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@supabase/ssr": "^0.5.2", "@tauri-apps/api": "2.1.0", "@tauri-apps/plugin-clipboard-manager": "2.0.0", - "@tauri-apps/plugin-deep-link": "~2", + "@tauri-apps/plugin-deep-link": "~2.2.0", "@tauri-apps/plugin-dialog": "~2.2.0", "@tauri-apps/plugin-fs": "2.0.0", "@tauri-apps/plugin-global-shortcut": "2.0.0", @@ -48,17 +48,17 @@ "zustand": "5.0.1" }, "devDependencies": { - "@tauri-apps/cli": "^2.3.1", + "@tauri-apps/cli": "^2.4.0", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", "@testing-library/user-event": "^14.6.1", "@types/jest": "^29.5.14", - "@types/node": "^22.13.10", + "@types/node": "^22.13.11", "@types/react": "19.0.10", "@types/react-dom": "19.0.4", - "@typescript-eslint/eslint-plugin": "^8.26.1", - "@typescript-eslint/parser": "^8.26.1", + "@typescript-eslint/eslint-plugin": "^8.27.0", + "@typescript-eslint/parser": "^8.27.0", "autoprefixer": "^10.4.21", "clsx": "^2.1.1", "cross-env": "^7.0.3", diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 7679d2e..d415fbd 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -49,7 +49,7 @@ pub fn open_path(path: &str) -> Result<(), String> { } #[tauri::command] -pub fn get_powerplan() -> Result { +pub fn get_powerplan() -> Result { #[cfg(target_os = "windows")] let powerplan = powerplan::get_powerplan()?; @@ -57,11 +57,11 @@ pub fn get_powerplan() -> Result { } #[tauri::command] -pub fn set_powerplan(plan: &str) -> Result { +pub fn set_powerplan(plan: i32) -> Result<(), String> { #[cfg(target_os = "windows")] powerplan::set_powerplan(plan)?; - Ok(format!("Set powerplan to {}", plan)) + Ok(()) } // TODO watch_steam_users diff --git a/src-tauri/src/tool/powerplan.rs b/src-tauri/src/tool/powerplan.rs index d0fb5d7..be70f53 100644 --- a/src-tauri/src/tool/powerplan.rs +++ b/src-tauri/src/tool/powerplan.rs @@ -8,16 +8,31 @@ pub struct PowerPlan { impl PowerPlan { pub fn new() -> Self { let mut power_plan_map = HashMap::new(); - power_plan_map.insert(PowerPlanMode::PowerSaving as i32, "a1841308-3541-4fab-bc81-f71556f20b4a".to_string()); - power_plan_map.insert(PowerPlanMode::Balanced as i32, "381b4222-f694-41f0-9685-ff5bb260df2e".to_string()); - power_plan_map.insert(PowerPlanMode::HighPerformance as i32, "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c".to_string()); - power_plan_map.insert(PowerPlanMode::Extreme as i32, "e9a42b02-d5df-448d-aa00-03f14749eb61".to_string()); + power_plan_map.insert( + PowerPlanMode::PowerSaving as i32, + "a1841308-3541-4fab-bc81-f71556f20b4a".to_string(), + ); + power_plan_map.insert( + PowerPlanMode::Balanced as i32, + "381b4222-f694-41f0-9685-ff5bb260df2e".to_string(), + ); + power_plan_map.insert( + PowerPlanMode::HighPerformance as i32, + "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c".to_string(), + ); + power_plan_map.insert( + PowerPlanMode::Extreme as i32, + "e9a42b02-d5df-448d-aa00-03f14749eb61".to_string(), + ); PowerPlan { power_plan_map } } pub fn set(&self, mode: i32) -> Result<(), String> { - let guid = self.power_plan_map.get(&mode).ok_or("Invalid power plan number (expect from 1 to 4)")?; + let guid = self + .power_plan_map + .get(&mode) + .ok_or("Invalid power plan number (expect from 1 to 4)")?; let output = Command::new("powercfg") .arg("/S") @@ -26,7 +41,10 @@ impl PowerPlan { .map_err(|e| format!("Failed to execute powercfg command: {}", e))?; if !output.status.success() { - return Err(format!("Powercfg command failed: {}", String::from_utf8_lossy(&output.stderr))); + return Err(format!( + "Powercfg command failed: {}", + String::from_utf8_lossy(&output.stderr) + )); } Ok(()) @@ -42,8 +60,13 @@ impl PowerPlan { let re = regex::Regex::new(r"GUID:\s+(\S+)\s+\(\S+\)\s+\*") .map_err(|e| format!("Failed to compile regex: {}", e))?; - let res = re.captures(&output_str).ok_or("No matching power plan found")?; - let guid = res.get(1).ok_or("No GUID found in power plan output")?.as_str(); + let res = re + .captures(&output_str) + .ok_or("No matching power plan found")?; + let guid = res + .get(1) + .ok_or("No GUID found in power plan output")? + .as_str(); for (k, v) in &self.power_plan_map { if guid == v { @@ -64,17 +87,19 @@ pub enum PowerPlanMode { Extreme = 4, } -pub fn get_powerplan() -> Result { +pub fn get_powerplan() -> Result { let power_plan = PowerPlan::new(); let mode = power_plan.get()?; - Ok(mode.to_string()) + Ok(mode) } -pub fn set_powerplan(plan: &str) -> Result { - let mode: i32 = plan.parse().map_err(|_| "Invalid power plan number")?; +pub fn set_powerplan(plan: i32) -> Result<(), String> { + if plan < 0 || plan > 4 { + return Err("Invalid power plan mode".to_string()); + } let power_plan = PowerPlan::new(); - power_plan.set(mode)?; - Ok("Power plan set successfully".to_string()) + power_plan.set(plan)?; + Ok(()) } #[cfg(test)] @@ -103,7 +128,10 @@ mod tests { // 验证返回的模式是否在有效范围内 let mode = result.unwrap(); assert!((1..=4).contains(&mode), "Invalid power plan mode returned"); - println!("Mode: {} - {}", mode, PowerPlan::new().power_plan_map[&mode]); - + println!( + "Mode: {} - {}", + mode, + PowerPlan::new().power_plan_map[&mode] + ); } -} \ No newline at end of file +} diff --git a/src/components/cstb/PowerPlan.tsx b/src/components/cstb/PowerPlan.tsx index 9abf888..6909673 100644 --- a/src/components/cstb/PowerPlan.tsx +++ b/src/components/cstb/PowerPlan.tsx @@ -2,10 +2,16 @@ import { BatteryCharge, Refresh } from "@icon-park/react" import { invoke } from "@tauri-apps/api/core" import { Card, CardBody, CardHeader, CardIcon, CardTool } from "../window/Card" import { ToolButton } from "../window/ToolButton" -import { Tabs, Tab } from "@heroui/react" +import { Tabs, Tab, addToast } from "@heroui/react" import { Key } from "@react-types/shared" +import { useToolStore } from "@/store/tool" +import { useEffect } from "react" const PowerPlans = [ + { + id: "0", + title: "其他", + }, { id: "1", title: "节能", @@ -25,10 +31,30 @@ const PowerPlans = [ ] const PowerPlan = () => { - const handleSelectionChange = (key: Key) => { - console.log(key) + const tool = useToolStore() + const setPowerPlan = async (key: Key) => { + await tool.store.start() + const plan: number = Number(key) + + await invoke("set_powerplan", { plan: plan }) + const current = await invoke("get_powerplan") + tool.setPowerPlan(current) + + addToast({ title: "电源计划已切换 → " + PowerPlans[current].title }) } + const getPowerPlan = async (toast: boolean) => { + await tool.store.start() + const current = await invoke("get_powerplan") + tool.setPowerPlan(current) + + if (toast) addToast({ title: "电源计划已切换 → " + PowerPlans[current].title }) + } + + useEffect(() => { + void getPowerPlan(false) + }, []) + return ( @@ -36,38 +62,23 @@ const PowerPlan = () => { 电源计划 - + getPowerPlan(true)}> 刷新 - {/*
- - - -
*/} - - {PowerPlans.map((item) => ( + + {PowerPlans.slice(1).map((item) => ( ))}