Clipboard
Clipboard 组件提供了一个简单的复制按钮,可将文本或其它数据复制到用户剪贴板。它默认显示复制图标,在复制成功后会切换为勾选图标。组件既支持静态值,也支持通过回调动态生成复制内容。
导入
rust
use gpui_component::clipboard::Clipboard;用法
基础 Clipboard
rust
Clipboard::new("my-clipboard")
.value("Text to copy")
.on_copied(|value, window, cx| {
window.push_notification(format!("Copied: {}", value), cx)
})动态值
value_fn 允许你在用户点击复制按钮时再动态生成内容:
- 适合依赖当前应用状态的值
- 也适合那些计算开销较大、不想在每次渲染时都计算的内容
rust
let state = some_state.clone();
Clipboard::new("dynamic-clipboard")
.value_fn(move |_, cx| {
state.read(cx).get_current_value()
})
.on_copied(|value, window, cx| {
window.push_notification(format!("Copied: {}", value), cx)
})自定义组合内容
rust
use gpui_component::label::Label;
h_flex()
.gap_2()
.child(Label::new("Share URL"))
.child(Icon::new(IconName::Share))
.child(
Clipboard::new("custom-clipboard")
.value("https://example.com")
)用在输入框中
Clipboard 很适合作为输入框后缀:
rust
use gpui_component::input::{InputState, Input};
let url_state = cx.new(|cx| InputState::new(window, cx).default_value("https://github.com"));
Input::new(&url_state)
.suffix(
Clipboard::new("url-clipboard")
.value_fn({
let state = url_state.clone();
move |_, cx| state.read(cx).value()
})
.on_copied(|value, window, cx| {
window.push_notification(format!("URL copied: {}", value), cx)
})
)API 参考
示例
复制简单文本
rust
Clipboard::new("simple")
.value("Hello, World!")带反馈提示
rust
h_flex()
.gap_2()
.child(Label::new("Your API Key:"))
.child(
Clipboard::new("feedback")
.value("sk-1234567890abcdef")
.on_copied(|_, window, cx| {
window.push_notification("API key copied to clipboard", cx)
})
)表单字段集成
rust
use gpui_component::{
input::{InputState, Input},
h_flex, label::Label
};
let api_key = "sk-1234567890abcdef";
h_flex()
.gap_2()
.items_center()
.child(Label::new("API Key:"))
.child(
Input::new(&input_state)
.value(api_key)
.readonly(true)
.suffix(
Clipboard::new("api-key-copy")
.value(api_key)
.on_copied(|_, window, cx| {
window.push_notification("API key copied!", cx)
})
)
)复制动态内容
rust
struct AppState {
current_url: String,
}
let app_state = cx.new(|_| AppState {
current_url: "https://example.com".to_string()
});
Clipboard::new("current-url")
.value_fn({
let state = app_state.clone();
move |_, cx| {
SharedString::from(state.read(cx).current_url.clone())
}
})
.on_copied(|url, window, cx| {
window.push_notification(format!("Shared: {}", url), cx)
})数据类型
Clipboard 当前主要支持复制文本字符串,内部使用 GPUI 的 ClipboardItem::new_string(),可处理:
- 纯文本
- UTF-8 编码内容
- 跨平台剪贴板写入