switch_demo_v2/
switch_demo_v2.rs

1// Switch 开关组件演示 - 使用新库 API
2// 展示如何创建和使用 Switch(滑动开关)
3// 运行: cargo run --example switch_demo_v2 --release
4
5use termux_gui::{Activity, TextView, Result};
6use termux_gui::connection::read_message;
7
8// 更新状态显示的辅助函数
9fn update_status(
10    activity: &mut Activity,
11    status: &TextView,
12    light: bool,
13    ac: bool,
14    hum: bool,
15    curt: bool,
16    music: bool
17) -> Result<()> {
18    let mut active = Vec::new();
19    if light { active.push("客厅灯"); }
20    if ac { active.push("空调"); }
21    if hum { active.push("加湿器"); }
22    if curt { active.push("窗帘"); }
23    if music { active.push("音乐"); }
24    
25    let text = if active.is_empty() {
26        "已开启: 无".to_string()
27    } else {
28        format!("已开启: {}", active.join(", "))
29    };
30    
31    let count = active.len();
32    let color = if count == 0 {
33        0xFF9E9E9Eu32 as i32  // 灰色
34    } else if count >= 4 {
35        0xFFF44336u32 as i32  // 红色(能耗高)
36    } else if count >= 2 {
37        0xFFFF9800u32 as i32  // 橙色
38    } else {
39        0xFF4CAF50u32 as i32  // 绿色
40    };
41    
42    status.set_text(activity, &text)?;
43    status.set_text_color(activity, color)?;
44    
45    Ok(())
46}
47
48fn main() -> Result<()> {
49    println!("=== Switch 开关演示 (新库版本) ===\n");
50    
51    // 创建 Activity(对话框模式)
52    let mut activity = Activity::new(true)?;
53    println!("✓ 连接建立\n");
54    
55    // 创建主布局
56    let layout = activity.create_linear_layout(None)?;
57    
58    // 创建标题
59    let title = activity.create_text_view("智能家居控制 🏠", Some(layout.id()))?;
60    title.set_text_size(&mut activity, 28)?;
61    title.view().set_margin(&mut activity, 10)?;
62    title.view().set_height_wrap_content(&mut activity)?;
63    title.view().set_linear_layout_params(&mut activity, 0, None)?;
64    
65    // 创建说明
66    let desc = activity.create_text_view("滑动开关控制设备", Some(layout.id()))?;
67    desc.view().set_margin(&mut activity, 5)?;
68    desc.view().set_height_wrap_content(&mut activity)?;
69    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
70    
71    // 创建 Switch 1 - 客厅灯(初始开启)
72    let switch1 = activity.create_switch_checked("💡 客厅灯", Some(layout.id()), true)?;
73    switch1.view().set_margin(&mut activity, 8)?;
74    switch1.view().set_height_wrap_content(&mut activity)?;
75    switch1.view().set_linear_layout_params(&mut activity, 0, None)?;
76    
77    // 创建 Switch 2 - 空调(初始关闭)
78    let switch2 = activity.create_switch_checked("❄️ 空调", Some(layout.id()), false)?;
79    switch2.view().set_margin(&mut activity, 8)?;
80    switch2.view().set_height_wrap_content(&mut activity)?;
81    switch2.view().set_linear_layout_params(&mut activity, 0, None)?;
82    
83    // 创建 Switch 3 - 加湿器(初始关闭)
84    let switch3 = activity.create_switch_checked("💧 加湿器", Some(layout.id()), false)?;
85    switch3.view().set_margin(&mut activity, 8)?;
86    switch3.view().set_height_wrap_content(&mut activity)?;
87    switch3.view().set_linear_layout_params(&mut activity, 0, None)?;
88    
89    // 创建 Switch 4 - 窗帘(初始开启)
90    let switch4 = activity.create_switch_checked("🪟 电动窗帘", Some(layout.id()), true)?;
91    switch4.view().set_margin(&mut activity, 8)?;
92    switch4.view().set_height_wrap_content(&mut activity)?;
93    switch4.view().set_linear_layout_params(&mut activity, 0, None)?;
94    
95    // 创建 Switch 5 - 音乐(初始关闭)
96    let switch5 = activity.create_switch_checked("🎵 背景音乐", Some(layout.id()), false)?;
97    switch5.view().set_margin(&mut activity, 8)?;
98    switch5.view().set_height_wrap_content(&mut activity)?;
99    switch5.view().set_linear_layout_params(&mut activity, 0, None)?;
100    
101    // 创建分隔线
102    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
103    divider.view().set_margin(&mut activity, 10)?;
104    divider.view().set_height_wrap_content(&mut activity)?;
105    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
106    
107    // 创建状态显示
108    let status = activity.create_text_view("已开启: 客厅灯, 窗帘", Some(layout.id()))?;
109    status.set_text_size(&mut activity, 16)?;
110    status.view().set_margin(&mut activity, 10)?;
111    status.view().set_height_wrap_content(&mut activity)?;
112    status.view().set_linear_layout_params(&mut activity, 0, None)?;
113    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
114    
115    // 创建按钮布局(水平)
116    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
117    button_layout.view().set_margin(&mut activity, 10)?;
118    button_layout.view().set_height_wrap_content(&mut activity)?;
119    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
120    
121    // 创建全部开启按钮
122    let all_on_btn = activity.create_button("🔆 全部开启", Some(button_layout.id()))?;
123    all_on_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
124    
125    // 创建全部关闭按钮
126    let all_off_btn = activity.create_button("🌙 全部关闭", Some(button_layout.id()))?;
127    all_off_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
128    
129    println!("✓ 界面创建完成\n");
130    println!("━━━━━━━━━━━━━━━━━━━━━━");
131    println!("提示:");
132    println!("  • 滑动开关切换设备状态");
133    println!("  • 观察状态实时更新");
134    println!("  • 使用 '全部开启/关闭' 按钮");
135    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
136    
137    // 状态跟踪
138    let mut light_on = true;
139    let mut ac_on = false;
140    let mut humidifier_on = false;
141    let mut curtain_on = true;
142    let mut music_on = false;
143    
144    // 事件循环
145    loop {
146        let event = read_message(activity.event_stream())?;
147        let event_type = event["type"].as_str().unwrap_or("");
148        let event_value = &event["value"];
149        
150        match event_type {
151            "destroy" => {
152                // Activity 已被系统销毁,直接退出即可
153                // 不要调用 activity.finish(),因为 Activity 已经不存在了
154                println!("\n✓ Activity 已关闭");
155                return Ok(());
156            },
157            "click" => {
158                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
159                let is_checked = event_value["set"].as_bool().unwrap_or(false);
160                
161                if clicked_id == switch1.id() {
162                    light_on = is_checked;
163                    println!("💡 客厅灯: {}", if is_checked { "开启" } else { "关闭" });
164                } else if clicked_id == switch2.id() {
165                    ac_on = is_checked;
166                    println!("❄️ 空调: {}", if is_checked { "开启" } else { "关闭" });
167                } else if clicked_id == switch3.id() {
168                    humidifier_on = is_checked;
169                    println!("💧 加湿器: {}", if is_checked { "开启" } else { "关闭" });
170                } else if clicked_id == switch4.id() {
171                    curtain_on = is_checked;
172                    println!("🪟 窗帘: {}", if is_checked { "打开" } else { "关闭" });
173                } else if clicked_id == switch5.id() {
174                    music_on = is_checked;
175                    println!("🎵 音乐: {}", if is_checked { "播放" } else { "停止" });
176                } else if clicked_id == all_on_btn.id() {
177                    println!("\n🔆 全部开启");
178                    light_on = true;
179                    ac_on = true;
180                    humidifier_on = true;
181                    curtain_on = true;
182                    music_on = true;
183                    
184                    switch1.set_checked(&mut activity, true)?;
185                    switch2.set_checked(&mut activity, true)?;
186                    switch3.set_checked(&mut activity, true)?;
187                    switch4.set_checked(&mut activity, true)?;
188                    switch5.set_checked(&mut activity, true)?;
189                } else if clicked_id == all_off_btn.id() {
190                    println!("\n🌙 全部关闭");
191                    light_on = false;
192                    ac_on = false;
193                    humidifier_on = false;
194                    curtain_on = false;
195                    music_on = false;
196                    
197                    switch1.set_checked(&mut activity, false)?;
198                    switch2.set_checked(&mut activity, false)?;
199                    switch3.set_checked(&mut activity, false)?;
200                    switch4.set_checked(&mut activity, false)?;
201                    switch5.set_checked(&mut activity, false)?;
202                }
203                
204                update_status(&mut activity, &status, 
205                            light_on, ac_on, humidifier_on, curtain_on, music_on)?;
206            },
207            _ => {}
208        }
209    }
210}