Implement copy/cut/paste, only use iced_winit

This commit is contained in:
Jeremy Soller 2023-10-31 13:18:43 -06:00
parent 03977fda6a
commit a6976daa25
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
6 changed files with 74 additions and 310 deletions

313
Cargo.lock generated
View file

@ -228,26 +228,6 @@ dependencies = [
"libloading 0.7.4",
]
[[package]]
name = "ashpd"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7370b58af1d7e96df3ca0f454b57e69acf9aa42ed2d7337bd206923bae0d5754"
dependencies = [
"enumflags2",
"futures-channel",
"futures-util",
"once_cell",
"rand",
"serde",
"serde_repr",
"url",
"wayland-backend 0.1.2",
"wayland-client 0.30.2",
"wayland-protocols 0.30.1",
"zbus",
]
[[package]]
name = "async-broadcast"
version = "0.5.1"
@ -308,7 +288,7 @@ dependencies = [
"futures-lite",
"log",
"parking",
"polling 2.8.0",
"polling",
"rustix 0.37.27",
"slab",
"socket2",
@ -621,32 +601,6 @@ dependencies = [
"vec_map",
]
[[package]]
name = "calloop"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b50b5a44d59a98c55a9eeb518f39bf7499ba19fd98ee7d22618687f3f10adbf"
dependencies = [
"bitflags 2.4.1",
"log",
"polling 3.2.0",
"rustix 0.38.21",
"slab",
"thiserror",
]
[[package]]
name = "calloop-wayland-source"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02"
dependencies = [
"calloop 0.12.3",
"rustix 0.38.21",
"wayland-backend 0.3.2",
"wayland-client 0.31.1",
]
[[package]]
name = "cc"
version = "1.0.83"
@ -1058,12 +1012,6 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
[[package]]
name = "cursor-icon"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "740bb192a8e2d1350119916954f4409ee7f62f149b536911eeb78ba5a20526bf"
[[package]]
name = "d3d12"
version = "0.6.0"
@ -1305,17 +1253,6 @@ version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]]
name = "enum-repr"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bad30c9c0fa1aaf1ae5010dab11f1117b15d35faf62cda4bbbc53b9987950f18"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "enumflags2"
version = "0.7.8"
@ -1504,9 +1441,6 @@ name = "float-cmp"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
dependencies = [
"num-traits",
]
[[package]]
name = "float_next_after"
@ -2209,7 +2143,6 @@ dependencies = [
"iced_core",
"iced_futures",
"iced_renderer",
"iced_sctk",
"iced_widget",
"iced_winit",
"image",
@ -2222,7 +2155,6 @@ version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic?branch=menu#4e5e1a7f54ed117c066289758c7b3dfe0487be2c"
dependencies = [
"accesskit",
"accesskit_unix",
"accesskit_winit",
]
@ -2232,11 +2164,9 @@ version = "0.10.0"
source = "git+https://github.com/pop-os/libcosmic?branch=menu#4e5e1a7f54ed117c066289758c7b3dfe0487be2c"
dependencies = [
"bitflags 1.3.2",
"iced_accessibility",
"instant",
"log",
"palette",
"smithay-client-toolkit 0.17.0",
"thiserror",
"twox-hash",
]
@ -2289,37 +2219,11 @@ name = "iced_runtime"
version = "0.1.1"
source = "git+https://github.com/pop-os/libcosmic?branch=menu#4e5e1a7f54ed117c066289758c7b3dfe0487be2c"
dependencies = [
"iced_accessibility",
"iced_core",
"iced_futures",
"smithay-client-toolkit 0.17.0",
"thiserror",
]
[[package]]
name = "iced_sctk"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic?branch=menu#4e5e1a7f54ed117c066289758c7b3dfe0487be2c"
dependencies = [
"enum-repr",
"float-cmp",
"futures",
"iced_futures",
"iced_graphics",
"iced_runtime",
"iced_style",
"itertools",
"lazy_static",
"raw-window-handle 0.5.2",
"smithay-client-toolkit 0.17.0",
"smithay-clipboard",
"thiserror",
"tracing",
"wayland-backend 0.3.2",
"wayland-protocols 0.31.0",
"xkeysym",
]
[[package]]
name = "iced_style"
version = "0.9.0"
@ -2380,7 +2284,6 @@ dependencies = [
"iced_style",
"num-traits",
"ouroboros",
"smithay-client-toolkit 0.17.0",
"thiserror",
"unicode-segmentation",
]
@ -2536,15 +2439,6 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "itertools"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.9"
@ -2657,7 +2551,6 @@ version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic?branch=menu#4e5e1a7f54ed117c066289758c7b3dfe0487be2c"
dependencies = [
"apply",
"ashpd",
"cosmic-config",
"cosmic-theme",
"css-color",
@ -2669,7 +2562,6 @@ dependencies = [
"iced_futures",
"iced_renderer",
"iced_runtime",
"iced_sctk",
"iced_style",
"iced_tiny_skia",
"iced_widget",
@ -2677,7 +2569,6 @@ dependencies = [
"lazy_static",
"palette",
"slotmap",
"smithay-client-toolkit 0.17.0",
"taffy",
"thiserror",
"tracing",
@ -2861,15 +2752,6 @@ dependencies = [
"libc",
]
[[package]]
name = "memmap2"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6"
dependencies = [
"libc",
]
[[package]]
name = "memmap2"
version = "0.8.0"
@ -3662,20 +3544,6 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "polling"
version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62a79e457c9898100b4298d57d69ec53d06f9a6ed352431ce5f377e082d2e846"
dependencies = [
"cfg-if",
"concurrent-queue",
"pin-project-lite",
"rustix 0.38.21",
"tracing",
"windows-sys 0.48.0",
]
[[package]]
name = "powerfmt"
version = "0.2.0"
@ -4188,7 +4056,7 @@ checksum = "61270629cc6b4d77ec1907db1033d5c2e1a404c412743621981a871dc9c12339"
dependencies = [
"crossfont",
"log",
"smithay-client-toolkit 0.16.1",
"smithay-client-toolkit",
"tiny-skia 0.7.0",
]
@ -4201,7 +4069,7 @@ dependencies = [
"ab_glyph",
"log",
"memmap2 0.5.10",
"smithay-client-toolkit 0.16.1",
"smithay-client-toolkit",
"tiny-skia 0.8.4",
]
@ -4372,7 +4240,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9"
dependencies = [
"bitflags 1.3.2",
"calloop 0.10.6",
"calloop",
"dlib",
"lazy_static",
"log",
@ -4380,35 +4248,8 @@ dependencies = [
"nix 0.24.3",
"pkg-config",
"wayland-client 0.29.5",
"wayland-cursor 0.29.5",
"wayland-protocols 0.29.5",
]
[[package]]
name = "smithay-client-toolkit"
version = "0.17.0"
source = "git+https://github.com/smithay/client-toolkit?rev=dc8c4a0#dc8c4a035128208af65141fe12142a1dbc4a32bb"
dependencies = [
"bitflags 2.4.1",
"bytemuck",
"calloop 0.12.3",
"calloop-wayland-source",
"cursor-icon",
"dlib",
"log",
"memmap2 0.7.1",
"nix 0.26.4",
"pkg-config",
"thiserror",
"wayland-backend 0.3.2",
"wayland-client 0.31.1",
"wayland-csd-frame",
"wayland-cursor 0.31.0",
"wayland-protocols 0.31.0",
"wayland-protocols-wlr",
"wayland-scanner 0.31.0",
"xkbcommon",
"xkeysym",
"wayland-cursor",
"wayland-protocols",
]
[[package]]
@ -4417,7 +4258,7 @@ version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8"
dependencies = [
"smithay-client-toolkit 0.16.1",
"smithay-client-toolkit",
"wayland-client 0.29.5",
]
@ -4449,7 +4290,7 @@ dependencies = [
"redox_syscall 0.3.5",
"thiserror",
"wasm-bindgen",
"wayland-backend 0.1.2",
"wayland-backend",
"wayland-client 0.30.2",
"wayland-sys 0.30.1",
"web-sys",
@ -5042,7 +4883,6 @@ dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
"serde",
]
[[package]]
@ -5242,20 +5082,6 @@ dependencies = [
"wayland-sys 0.30.1",
]
[[package]]
name = "wayland-backend"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19152ddd73f45f024ed4534d9ca2594e0ef252c1847695255dae47f34df9fbe4"
dependencies = [
"cc",
"downcast-rs",
"nix 0.26.4",
"scoped-tls",
"smallvec",
"wayland-sys 0.31.1",
]
[[package]]
name = "wayland-client"
version = "0.29.5"
@ -5280,22 +5106,10 @@ checksum = "489c9654770f674fc7e266b3c579f4053d7551df0ceb392f153adb1f9ed06ac8"
dependencies = [
"bitflags 1.3.2",
"nix 0.26.4",
"wayland-backend 0.1.2",
"wayland-backend",
"wayland-scanner 0.30.1",
]
[[package]]
name = "wayland-client"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ca7d52347346f5473bf2f56705f360e8440873052e575e55890c4fa57843ed3"
dependencies = [
"bitflags 2.4.1",
"nix 0.26.4",
"wayland-backend 0.3.2",
"wayland-scanner 0.31.0",
]
[[package]]
name = "wayland-commons"
version = "0.29.5"
@ -5308,17 +5122,6 @@ dependencies = [
"wayland-sys 0.29.5",
]
[[package]]
name = "wayland-csd-frame"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
dependencies = [
"bitflags 2.4.1",
"cursor-icon",
"wayland-backend 0.3.2",
]
[[package]]
name = "wayland-cursor"
version = "0.29.5"
@ -5330,17 +5133,6 @@ dependencies = [
"xcursor",
]
[[package]]
name = "wayland-cursor"
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a44aa20ae986659d6c77d64d808a046996a932aa763913864dc40c359ef7ad5b"
dependencies = [
"nix 0.26.4",
"wayland-client 0.31.1",
"xcursor",
]
[[package]]
name = "wayland-protocols"
version = "0.29.5"
@ -5353,43 +5145,6 @@ dependencies = [
"wayland-scanner 0.29.5",
]
[[package]]
name = "wayland-protocols"
version = "0.30.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b28101e5ca94f70461a6c2d610f76d85ad223d042dd76585ab23d3422dd9b4d"
dependencies = [
"bitflags 1.3.2",
"wayland-backend 0.1.2",
"wayland-client 0.30.2",
"wayland-scanner 0.30.1",
]
[[package]]
name = "wayland-protocols"
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c"
dependencies = [
"bitflags 2.4.1",
"wayland-backend 0.3.2",
"wayland-client 0.31.1",
"wayland-scanner 0.31.0",
]
[[package]]
name = "wayland-protocols-wlr"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
dependencies = [
"bitflags 2.4.1",
"wayland-backend 0.3.2",
"wayland-client 0.31.1",
"wayland-protocols 0.31.0",
"wayland-scanner 0.31.0",
]
[[package]]
name = "wayland-scanner"
version = "0.29.5"
@ -5412,17 +5167,6 @@ dependencies = [
"quote",
]
[[package]]
name = "wayland-scanner"
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb8e28403665c9f9513202b7e1ed71ec56fde5c107816843fb14057910b2c09c"
dependencies = [
"proc-macro2",
"quick-xml 0.30.0",
"quote",
]
[[package]]
name = "wayland-sys"
version = "0.29.5"
@ -5446,17 +5190,6 @@ dependencies = [
"pkg-config",
]
[[package]]
name = "wayland-sys"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af"
dependencies = [
"dlib",
"log",
"pkg-config",
]
[[package]]
name = "web-sys"
version = "0.3.64"
@ -5879,10 +5612,10 @@ dependencies = [
"raw-window-handle 0.4.3",
"raw-window-handle 0.5.2",
"sctk-adwaita 0.4.3",
"smithay-client-toolkit 0.16.1",
"smithay-client-toolkit",
"wasm-bindgen",
"wayland-client 0.29.5",
"wayland-protocols 0.29.5",
"wayland-protocols",
"web-sys",
"windows-sys 0.36.1",
"x11-dl",
@ -5911,11 +5644,11 @@ dependencies = [
"raw-window-handle 0.5.2",
"redox_syscall 0.3.5",
"sctk-adwaita 0.5.4",
"smithay-client-toolkit 0.16.1",
"smithay-client-toolkit",
"wasm-bindgen",
"wayland-client 0.29.5",
"wayland-commons",
"wayland-protocols 0.29.5",
"wayland-protocols",
"wayland-scanner 0.29.5",
"web-sys",
"windows-sys 0.45.0",
@ -6013,25 +5746,6 @@ dependencies = [
"winapi",
]
[[package]]
name = "xkbcommon"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52db25b599e92bf6e3904134618728eeb7b49a5a4f38f107f92399bb9c496b88"
dependencies = [
"libc",
"memmap2 0.7.1",
]
[[package]]
name = "xkeysym"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621"
dependencies = [
"bytemuck",
]
[[package]]
name = "xml-rs"
version = "0.8.19"
@ -6177,7 +5891,6 @@ dependencies = [
"libc",
"serde",
"static_assertions",
"url",
"zvariant_derive",
]

View file

@ -26,9 +26,9 @@ features = ["syntect", "vi"]
git = "https://github.com/pop-os/libcosmic"
branch = "menu"
default-features = false
features = ["winit"]
#path = "../libcosmic"
[features]
default = ["wayland"]
wayland = ["libcosmic/wayland"]
winit = ["libcosmic/winit"]
default = []
vi = []

View file

@ -1,7 +1,7 @@
use cosmic::iced::keyboard::{KeyCode, Modifiers};
use std::{collections::HashMap, fmt};
use crate::{fl, Message};
use crate::Message;
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct KeyBind {
@ -26,6 +26,9 @@ impl KeyBind {
}};
}
bind!(CTRL, X, Cut);
bind!(CTRL, C, Copy);
bind!(CTRL, V, Paste);
bind!(CTRL, N, New);
bind!(CTRL, O, OpenFileDialog);
bind!(CTRL, S, Save);

View file

@ -4,7 +4,7 @@ use cosmic::{
app::{message, Command, Core, Settings},
executor,
iced::{
event, keyboard, subscription,
clipboard, event, keyboard, subscription,
widget::{row, text},
Alignment, Length, Limits,
},
@ -48,7 +48,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
localize::localize();
let settings = Settings::default().size_limits(Limits::NONE.min_width(400.0).min_height(200.0));
let mut settings = Settings::default();
//TODO: fix wayland resize on iced_winit
settings = settings.client_decorations(false);
//TODO: allow size limits on iced_winit
//settings = settings.size_limits(Limits::NONE.min_width(400.0).min_height(200.0));
let flags = ();
cosmic::app::run::<App>(settings, flags)?;
@ -65,12 +72,16 @@ pub struct App {
#[allow(dead_code)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Message {
Cut,
Copy,
KeyBind(KeyBind),
New,
OpenFileDialog,
OpenFile(PathBuf),
OpenProjectDialog,
OpenProject(PathBuf),
Paste,
PasteValue(String),
Save,
TabActivate(segmented_button::Entity),
TabClose(segmented_button::Entity),
@ -383,6 +394,27 @@ impl cosmic::Application for App {
fn update(&mut self, message: Message) -> Command<Message> {
match message {
Message::Cut => match self.active_tab() {
Some(tab) => {
let mut editor = tab.editor.lock().unwrap();
let selection_opt = editor.copy_selection();
editor.delete_selection();
if let Some(selection) = selection_opt {
return clipboard::write(selection);
}
}
None => {}
},
Message::Copy => match self.active_tab() {
Some(tab) => {
let mut editor = tab.editor.lock().unwrap();
let selection_opt = editor.copy_selection();
if let Some(selection) = selection_opt {
return clipboard::write(selection);
}
}
None => {}
},
Message::KeyBind(key_bind) => {
for (config_key_bind, config_message) in self.config.keybinds.iter() {
if config_key_bind == &key_bind {
@ -425,6 +457,22 @@ impl cosmic::Application for App {
Message::OpenProject(path) => {
self.open_project(path);
}
Message::Paste => {
return clipboard::read(|value_opt| match value_opt {
Some(value) => message::app(Message::PasteValue(value)),
None => message::none(),
});
}
Message::PasteValue(value) => {
println!("Paste {:?}", value);
match self.active_tab() {
Some(tab) => {
let mut editor = tab.editor.lock().unwrap();
editor.insert_string(&value, None);
}
None => {}
}
}
Message::Save => {
let mut title_opt = None;

View file

@ -96,9 +96,9 @@ pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> {
menu_key(fl!("undo"), "Ctrl + Z", Message::Todo),
menu_key(fl!("redo"), "Ctrl + Shift + Z", Message::Todo),
MenuTree::new(horizontal_rule(1)),
menu_key(fl!("cut"), "Ctrl + X", Message::Todo),
menu_key(fl!("copy"), "Ctrl + C", Message::Todo),
menu_key(fl!("paste"), "Ctrl + V", Message::Todo),
menu_item(fl!("cut"), Message::Cut),
menu_item(fl!("copy"), Message::Copy),
menu_item(fl!("paste"), Message::Paste),
MenuTree::new(horizontal_rule(1)),
menu_key(fl!("find"), "Ctrl + F", Message::Todo),
menu_key(fl!("replace"), "Ctrl + H", Message::Todo),

View file

@ -32,7 +32,7 @@ impl Tab {
.unwrap();
let mut editor = ViEditor::new(editor);
editor.set_passthrough(false);
editor.set_passthrough(!cfg!(feature = "vi"));
Self {
path_opt: None,