feat: 标题栏钉子按钮交互
补上前一提交的按钮本体:Pin/PinOff 图标随置顶状态切换, 切换失败(句柄不可得等)弹错误通知。随 C3 的 sysmon::set_topmost 使用。
This commit is contained in:
@@ -225,6 +225,15 @@ impl MqttXApp {
|
||||
|
||||
let search = cx.new(|cx| InputState::new(window, cx).placeholder("搜索连接…"));
|
||||
|
||||
// 自验后门:MQTTX_OPEN_RESMON=1 启动时直接打开资源监控
|
||||
// (与 MQTTX_VERSION_OVERRIDE 同类的测试入口,供自动化验证 UI)。
|
||||
// defer 到 effects 阶段执行,避免在 MqttXApp 构造借用内嵌套打开
|
||||
if std::env::var("MQTTX_OPEN_RESMON").as_deref() == Ok("1") {
|
||||
cx.defer_in(window, move |_, window, cx| {
|
||||
crate::ui::resource_dialog::open(cx.entity(), window, cx);
|
||||
});
|
||||
}
|
||||
|
||||
// 「跟随系统」:监听系统外观(深浅色)变化,仅在设置为 System 时重应用主题。
|
||||
// 订阅需随实体存活,dropped 即取消,故存入字段。
|
||||
let appearance_weak = cx.entity().downgrade();
|
||||
@@ -1061,6 +1070,33 @@ impl MqttXApp {
|
||||
this.open_connection_form(None, window, cx);
|
||||
})),
|
||||
)
|
||||
.child(
|
||||
Button::new("pin-window")
|
||||
.icon(if self.pinned {
|
||||
IconName::PinOff
|
||||
} else {
|
||||
IconName::Pin
|
||||
})
|
||||
.ghost()
|
||||
.small()
|
||||
.tooltip(if self.pinned {
|
||||
"取消窗口置顶"
|
||||
} else {
|
||||
"窗口置顶"
|
||||
})
|
||||
.on_click(cx.listener(|this, _, window, cx| {
|
||||
let next = !this.pinned;
|
||||
if crate::sysmon::set_topmost(window, next) {
|
||||
this.pinned = next;
|
||||
cx.notify();
|
||||
} else {
|
||||
window.push_notification(
|
||||
Notification::error("置顶操作失败"),
|
||||
cx,
|
||||
);
|
||||
}
|
||||
})),
|
||||
)
|
||||
.child(self.render_theme_toggle(cx))
|
||||
.child(
|
||||
Button::new("more-menu")
|
||||
|
||||
Reference in New Issue
Block a user