dev-prepare #2
10
package.json
10
package.json
@@ -22,7 +22,7 @@
|
|||||||
"@supabase/ssr": "^0.5.2",
|
"@supabase/ssr": "^0.5.2",
|
||||||
"@tauri-apps/api": "2.1.0",
|
"@tauri-apps/api": "2.1.0",
|
||||||
"@tauri-apps/plugin-clipboard-manager": "2.0.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-dialog": "~2.2.0",
|
||||||
"@tauri-apps/plugin-fs": "2.0.0",
|
"@tauri-apps/plugin-fs": "2.0.0",
|
||||||
"@tauri-apps/plugin-global-shortcut": "2.0.0",
|
"@tauri-apps/plugin-global-shortcut": "2.0.0",
|
||||||
@@ -48,17 +48,17 @@
|
|||||||
"zustand": "5.0.1"
|
"zustand": "5.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tauri-apps/cli": "^2.3.1",
|
"@tauri-apps/cli": "^2.4.0",
|
||||||
"@testing-library/dom": "^10.4.0",
|
"@testing-library/dom": "^10.4.0",
|
||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.6.3",
|
||||||
"@testing-library/react": "^16.2.0",
|
"@testing-library/react": "^16.2.0",
|
||||||
"@testing-library/user-event": "^14.6.1",
|
"@testing-library/user-event": "^14.6.1",
|
||||||
"@types/jest": "^29.5.14",
|
"@types/jest": "^29.5.14",
|
||||||
"@types/node": "^22.13.10",
|
"@types/node": "^22.13.11",
|
||||||
"@types/react": "19.0.10",
|
"@types/react": "19.0.10",
|
||||||
"@types/react-dom": "19.0.4",
|
"@types/react-dom": "19.0.4",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
"@typescript-eslint/eslint-plugin": "^8.27.0",
|
||||||
"@typescript-eslint/parser": "^8.26.1",
|
"@typescript-eslint/parser": "^8.27.0",
|
||||||
"autoprefixer": "^10.4.21",
|
"autoprefixer": "^10.4.21",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ pub fn open_path(path: &str) -> Result<(), String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn get_powerplan() -> Result<String, String> {
|
pub fn get_powerplan() -> Result<i32, String> {
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
let powerplan = powerplan::get_powerplan()?;
|
let powerplan = powerplan::get_powerplan()?;
|
||||||
|
|
||||||
@@ -57,11 +57,11 @@ pub fn get_powerplan() -> Result<String, String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn set_powerplan(plan: &str) -> Result<String, String> {
|
pub fn set_powerplan(plan: i32) -> Result<(), String> {
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
powerplan::set_powerplan(plan)?;
|
powerplan::set_powerplan(plan)?;
|
||||||
|
|
||||||
Ok(format!("Set powerplan to {}", plan))
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO watch_steam_users
|
// TODO watch_steam_users
|
||||||
|
|||||||
@@ -8,16 +8,31 @@ pub struct PowerPlan {
|
|||||||
impl PowerPlan {
|
impl PowerPlan {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
let mut power_plan_map = HashMap::new();
|
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(
|
||||||
power_plan_map.insert(PowerPlanMode::Balanced as i32, "381b4222-f694-41f0-9685-ff5bb260df2e".to_string());
|
PowerPlanMode::PowerSaving as i32,
|
||||||
power_plan_map.insert(PowerPlanMode::HighPerformance as i32, "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c".to_string());
|
"a1841308-3541-4fab-bc81-f71556f20b4a".to_string(),
|
||||||
power_plan_map.insert(PowerPlanMode::Extreme as i32, "e9a42b02-d5df-448d-aa00-03f14749eb61".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 }
|
PowerPlan { power_plan_map }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set(&self, mode: i32) -> Result<(), String> {
|
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")
|
let output = Command::new("powercfg")
|
||||||
.arg("/S")
|
.arg("/S")
|
||||||
@@ -26,7 +41,10 @@ impl PowerPlan {
|
|||||||
.map_err(|e| format!("Failed to execute powercfg command: {}", e))?;
|
.map_err(|e| format!("Failed to execute powercfg command: {}", e))?;
|
||||||
|
|
||||||
if !output.status.success() {
|
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(())
|
Ok(())
|
||||||
@@ -42,8 +60,13 @@ impl PowerPlan {
|
|||||||
let re = regex::Regex::new(r"GUID:\s+(\S+)\s+\(\S+\)\s+\*")
|
let re = regex::Regex::new(r"GUID:\s+(\S+)\s+\(\S+\)\s+\*")
|
||||||
.map_err(|e| format!("Failed to compile regex: {}", e))?;
|
.map_err(|e| format!("Failed to compile regex: {}", e))?;
|
||||||
|
|
||||||
let res = re.captures(&output_str).ok_or("No matching power plan found")?;
|
let res = re
|
||||||
let guid = res.get(1).ok_or("No GUID found in power plan output")?.as_str();
|
.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 {
|
for (k, v) in &self.power_plan_map {
|
||||||
if guid == v {
|
if guid == v {
|
||||||
@@ -64,17 +87,19 @@ pub enum PowerPlanMode {
|
|||||||
Extreme = 4,
|
Extreme = 4,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_powerplan() -> Result<String, String> {
|
pub fn get_powerplan() -> Result<i32, String> {
|
||||||
let power_plan = PowerPlan::new();
|
let power_plan = PowerPlan::new();
|
||||||
let mode = power_plan.get()?;
|
let mode = power_plan.get()?;
|
||||||
Ok(mode.to_string())
|
Ok(mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_powerplan(plan: &str) -> Result<String, String> {
|
pub fn set_powerplan(plan: i32) -> Result<(), String> {
|
||||||
let mode: i32 = plan.parse().map_err(|_| "Invalid power plan number")?;
|
if plan < 0 || plan > 4 {
|
||||||
|
return Err("Invalid power plan mode".to_string());
|
||||||
|
}
|
||||||
let power_plan = PowerPlan::new();
|
let power_plan = PowerPlan::new();
|
||||||
power_plan.set(mode)?;
|
power_plan.set(plan)?;
|
||||||
Ok("Power plan set successfully".to_string())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -103,7 +128,10 @@ mod tests {
|
|||||||
// 验证返回的模式是否在有效范围内
|
// 验证返回的模式是否在有效范围内
|
||||||
let mode = result.unwrap();
|
let mode = result.unwrap();
|
||||||
assert!((1..=4).contains(&mode), "Invalid power plan mode returned");
|
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]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,10 +2,16 @@ import { BatteryCharge, Refresh } from "@icon-park/react"
|
|||||||
import { invoke } from "@tauri-apps/api/core"
|
import { invoke } from "@tauri-apps/api/core"
|
||||||
import { Card, CardBody, CardHeader, CardIcon, CardTool } from "../window/Card"
|
import { Card, CardBody, CardHeader, CardIcon, CardTool } from "../window/Card"
|
||||||
import { ToolButton } from "../window/ToolButton"
|
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 { Key } from "@react-types/shared"
|
||||||
|
import { useToolStore } from "@/store/tool"
|
||||||
|
import { useEffect } from "react"
|
||||||
|
|
||||||
const PowerPlans = [
|
const PowerPlans = [
|
||||||
|
{
|
||||||
|
id: "0",
|
||||||
|
title: "其他",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "1",
|
id: "1",
|
||||||
title: "节能",
|
title: "节能",
|
||||||
@@ -25,10 +31,30 @@ const PowerPlans = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
const PowerPlan = () => {
|
const PowerPlan = () => {
|
||||||
const handleSelectionChange = (key: Key) => {
|
const tool = useToolStore()
|
||||||
console.log(key)
|
const setPowerPlan = async (key: Key) => {
|
||||||
|
await tool.store.start()
|
||||||
|
const plan: number = Number(key)
|
||||||
|
|
||||||
|
await invoke("set_powerplan", { plan: plan })
|
||||||
|
const current = await invoke<number>("get_powerplan")
|
||||||
|
tool.setPowerPlan(current)
|
||||||
|
|
||||||
|
addToast({ title: "电源计划已切换 → " + PowerPlans[current].title })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getPowerPlan = async (toast: boolean) => {
|
||||||
|
await tool.store.start()
|
||||||
|
const current = await invoke<number>("get_powerplan")
|
||||||
|
tool.setPowerPlan(current)
|
||||||
|
|
||||||
|
if (toast) addToast({ title: "电源计划已切换 → " + PowerPlans[current].title })
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
void getPowerPlan(false)
|
||||||
|
}, [])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
@@ -36,38 +62,23 @@ const PowerPlan = () => {
|
|||||||
<BatteryCharge /> 电源计划
|
<BatteryCharge /> 电源计划
|
||||||
</CardIcon>
|
</CardIcon>
|
||||||
<CardTool>
|
<CardTool>
|
||||||
<ToolButton>
|
<ToolButton onClick={() => getPowerPlan(true)}>
|
||||||
<Refresh />
|
<Refresh />
|
||||||
刷新
|
刷新
|
||||||
</ToolButton>
|
</ToolButton>
|
||||||
</CardTool>
|
</CardTool>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardBody>
|
<CardBody>
|
||||||
{/* <div className="flex p-0.5 bg-black/5 gap-2 rounded-full">
|
<Tabs
|
||||||
<button
|
selectedKey={String(tool.state.powerPlan)}
|
||||||
type="button"
|
onSelectionChange={setPowerPlan}
|
||||||
onClick={() => invoke("set_power_plan", { index: 1 })}
|
aria-label="Power Plan Tabs"
|
||||||
className="flex-1 px-2 py-1 transition rounded-full select-none bg-black/5"
|
size="md"
|
||||||
>
|
radius="full"
|
||||||
高性能
|
fullWidth
|
||||||
</button>
|
defaultSelectedKey="0"
|
||||||
<button
|
>
|
||||||
type="button"
|
{PowerPlans.slice(1).map((item) => (
|
||||||
onClick={() => invoke("set_power_plan", { index: 2 })}
|
|
||||||
className="flex-1 px-2 py-1 transition rounded-full select-none"
|
|
||||||
>
|
|
||||||
平衡
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={() => invoke("set_power_plan", { index: 3 })}
|
|
||||||
className="flex-1 px-2 py-1 transition rounded-full select-none"
|
|
||||||
>
|
|
||||||
节能
|
|
||||||
</button>
|
|
||||||
</div> */}
|
|
||||||
<Tabs aria-label="Power Plan Tabs" size="md" radius="full" fullWidth defaultSelectedKey="0" onSelectionChange={handleSelectionChange}>
|
|
||||||
{PowerPlans.map((item) => (
|
|
||||||
<Tab key={item.id} title={item.title}></Tab>
|
<Tab key={item.id} title={item.title}></Tab>
|
||||||
))}
|
))}
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|||||||
Reference in New Issue
Block a user