feat: Middle Click (#51)

* paste on middle click

* middle click to close tab

* middle click to reply
This commit is contained in:
reya
2025-05-29 17:24:51 +07:00
committed by GitHub
parent 557ff18714
commit a674ac898a
5 changed files with 162 additions and 101 deletions

216
Cargo.lock generated
View File

@@ -282,9 +282,9 @@ dependencies = [
[[package]] [[package]]
name = "async-process" name = "async-process"
version = "2.3.0" version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc"
dependencies = [ dependencies = [
"async-channel", "async-channel",
"async-io", "async-io",
@@ -295,7 +295,7 @@ dependencies = [
"cfg-if", "cfg-if",
"event-listener", "event-listener",
"futures-lite 2.6.0", "futures-lite 2.6.0",
"rustix 0.38.44", "rustix 1.0.7",
"tracing", "tracing",
] ]
@@ -312,9 +312,9 @@ dependencies = [
[[package]] [[package]]
name = "async-signal" name = "async-signal"
version = "0.2.10" version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d"
dependencies = [ dependencies = [
"async-io", "async-io",
"async-lock", "async-lock",
@@ -322,7 +322,7 @@ dependencies = [
"cfg-if", "cfg-if",
"futures-core", "futures-core",
"futures-io", "futures-io",
"rustix 0.38.44", "rustix 1.0.7",
"signal-hook-registry", "signal-hook-registry",
"slab", "slab",
"windows-sys 0.59.0", "windows-sys 0.59.0",
@@ -417,7 +417,7 @@ dependencies = [
"gpui", "gpui",
"log", "log",
"nostr-sdk", "nostr-sdk",
"reqwest 0.12.15 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.12.18",
"smol", "smol",
"tempfile", "tempfile",
] ]
@@ -1078,7 +1078,7 @@ dependencies = [
[[package]] [[package]]
name = "collections" name = "collections"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"indexmap", "indexmap",
"rustc-hash 2.1.1", "rustc-hash 2.1.1",
@@ -1459,7 +1459,7 @@ dependencies = [
[[package]] [[package]]
name = "derive_refineable" name = "derive_refineable"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1617,9 +1617,9 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]] [[package]]
name = "embed-resource" name = "embed-resource"
version = "3.0.2" version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fbc6e0d8e0c03a655b53ca813f0463d2c956bc4db8138dbc89f120b066551e3" checksum = "e8fe7d068ca6b3a5782ca5ec9afc244acd99dd441e4686a83b1c3973aba1d489"
dependencies = [ dependencies = [
"cc", "cc",
"memchr", "memchr",
@@ -2276,7 +2276,7 @@ dependencies = [
[[package]] [[package]]
name = "gpui" name = "gpui"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"as-raw-xcb-connection", "as-raw-xcb-connection",
@@ -2368,7 +2368,7 @@ dependencies = [
[[package]] [[package]]
name = "gpui_macros" name = "gpui_macros"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
@@ -2597,7 +2597,7 @@ dependencies = [
[[package]] [[package]]
name = "http_client" name = "http_client"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@@ -2614,7 +2614,7 @@ dependencies = [
[[package]] [[package]]
name = "http_client_tls" name = "http_client_tls"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"rustls", "rustls",
"rustls-platform-verifier", "rustls-platform-verifier",
@@ -2683,22 +2683,28 @@ dependencies = [
[[package]] [[package]]
name = "hyper-util" name = "hyper-util"
version = "0.1.12" version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf9f1e950e0d9d1d3c47184416723cf29c0d1f93bd8cccf37e4beb6b44f31710" checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8"
dependencies = [ dependencies = [
"base64",
"bytes", "bytes",
"futures-channel", "futures-channel",
"futures-core",
"futures-util", "futures-util",
"http", "http",
"http-body", "http-body",
"hyper", "hyper",
"ipnet",
"libc", "libc",
"percent-encoding",
"pin-project-lite", "pin-project-lite",
"socket2", "socket2",
"system-configuration",
"tokio", "tokio",
"tower-service", "tower-service",
"tracing", "tracing",
"windows-registry 0.4.0",
] ]
[[package]] [[package]]
@@ -2948,6 +2954,16 @@ version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
[[package]]
name = "iri-string"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
dependencies = [
"memchr",
"serde",
]
[[package]] [[package]]
name = "is-docker" name = "is-docker"
version = "0.2.0" version = "0.2.0"
@@ -3315,7 +3331,7 @@ dependencies = [
[[package]] [[package]]
name = "media" name = "media"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bindgen 0.71.1", "bindgen 0.71.1",
@@ -3517,7 +3533,7 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
[[package]] [[package]]
name = "nostr" name = "nostr"
version = "0.42.1" version = "0.42.1"
source = "git+https://github.com/rust-nostr/nostr#50e48f8fe4624b57a5ee495c0df98020e5208736" source = "git+https://github.com/rust-nostr/nostr#c125038df931689eb11baf434f3b361e04937f5c"
dependencies = [ dependencies = [
"aes", "aes",
"base64", "base64",
@@ -3530,7 +3546,7 @@ dependencies = [
"getrandom 0.2.16", "getrandom 0.2.16",
"instant", "instant",
"regex", "regex",
"reqwest 0.12.15 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.12.18",
"scrypt", "scrypt",
"secp256k1", "secp256k1",
"serde", "serde",
@@ -3542,7 +3558,7 @@ dependencies = [
[[package]] [[package]]
name = "nostr-connect" name = "nostr-connect"
version = "0.42.0" version = "0.42.0"
source = "git+https://github.com/rust-nostr/nostr#50e48f8fe4624b57a5ee495c0df98020e5208736" source = "git+https://github.com/rust-nostr/nostr#c125038df931689eb11baf434f3b361e04937f5c"
dependencies = [ dependencies = [
"async-utility", "async-utility",
"nostr", "nostr",
@@ -3554,7 +3570,7 @@ dependencies = [
[[package]] [[package]]
name = "nostr-database" name = "nostr-database"
version = "0.42.0" version = "0.42.0"
source = "git+https://github.com/rust-nostr/nostr#50e48f8fe4624b57a5ee495c0df98020e5208736" source = "git+https://github.com/rust-nostr/nostr#c125038df931689eb11baf434f3b361e04937f5c"
dependencies = [ dependencies = [
"flatbuffers", "flatbuffers",
"lru", "lru",
@@ -3565,7 +3581,7 @@ dependencies = [
[[package]] [[package]]
name = "nostr-lmdb" name = "nostr-lmdb"
version = "0.42.0" version = "0.42.0"
source = "git+https://github.com/rust-nostr/nostr#50e48f8fe4624b57a5ee495c0df98020e5208736" source = "git+https://github.com/rust-nostr/nostr#c125038df931689eb11baf434f3b361e04937f5c"
dependencies = [ dependencies = [
"async-utility", "async-utility",
"heed", "heed",
@@ -3578,7 +3594,7 @@ dependencies = [
[[package]] [[package]]
name = "nostr-relay-pool" name = "nostr-relay-pool"
version = "0.42.0" version = "0.42.0"
source = "git+https://github.com/rust-nostr/nostr#50e48f8fe4624b57a5ee495c0df98020e5208736" source = "git+https://github.com/rust-nostr/nostr#c125038df931689eb11baf434f3b361e04937f5c"
dependencies = [ dependencies = [
"async-utility", "async-utility",
"async-wsocket", "async-wsocket",
@@ -3594,7 +3610,7 @@ dependencies = [
[[package]] [[package]]
name = "nostr-sdk" name = "nostr-sdk"
version = "0.42.0" version = "0.42.0"
source = "git+https://github.com/rust-nostr/nostr#50e48f8fe4624b57a5ee495c0df98020e5208736" source = "git+https://github.com/rust-nostr/nostr#c125038df931689eb11baf434f3b361e04937f5c"
dependencies = [ dependencies = [
"async-utility", "async-utility",
"nostr", "nostr",
@@ -4599,9 +4615,9 @@ dependencies = [
[[package]] [[package]]
name = "read-fonts" name = "read-fonts"
version = "0.29.1" version = "0.29.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e85935612710191461ec9df47b4b5880dd6359d4fad3b2f2ed696215f6f3146" checksum = "6f96bfbb7df43d34a2b7b8582fcbcb676ba02a763265cb90bc8aabfd62b57d64"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"font-types", "font-types",
@@ -4630,7 +4646,7 @@ dependencies = [
[[package]] [[package]]
name = "refineable" name = "refineable"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"derive_refineable", "derive_refineable",
"workspace-hack", "workspace-hack",
@@ -4665,59 +4681,6 @@ version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "reqwest"
version = "0.12.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb"
dependencies = [
"base64",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
"h2",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
"hyper-tls",
"hyper-util",
"ipnet",
"js-sys",
"log",
"mime",
"mime_guess",
"native-tls",
"once_cell",
"percent-encoding",
"pin-project-lite",
"quinn",
"rustls",
"rustls-pemfile",
"rustls-pki-types",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"system-configuration",
"tokio",
"tokio-native-tls",
"tokio-rustls",
"tokio-socks",
"tokio-util",
"tower",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-streams",
"web-sys",
"webpki-roots 0.26.11",
"windows-registry 0.4.0",
]
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.12.15" version = "0.12.15"
@@ -4766,10 +4729,61 @@ dependencies = [
"windows-registry 0.4.0", "windows-registry 0.4.0",
] ]
[[package]]
name = "reqwest"
version = "0.12.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5"
dependencies = [
"base64",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
"h2",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
"hyper-tls",
"hyper-util",
"ipnet",
"js-sys",
"log",
"mime",
"mime_guess",
"native-tls",
"once_cell",
"percent-encoding",
"pin-project-lite",
"quinn",
"rustls",
"rustls-pki-types",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tokio-native-tls",
"tokio-rustls",
"tokio-socks",
"tokio-util",
"tower",
"tower-http",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-streams",
"web-sys",
"webpki-roots 1.0.0",
]
[[package]] [[package]]
name = "reqwest_client" name = "reqwest_client"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@@ -4778,7 +4792,7 @@ dependencies = [
"http_client_tls", "http_client_tls",
"log", "log",
"regex", "regex",
"reqwest 0.12.15 (git+https://github.com/zed-industries/reqwest.git?rev=951c770a32f1998d6e999cef3e59e0013e6c4415)", "reqwest 0.12.15",
"serde", "serde",
"smol", "smol",
"tokio", "tokio",
@@ -5240,7 +5254,7 @@ checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749"
[[package]] [[package]]
name = "semantic_version" name = "semantic_version"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"serde", "serde",
@@ -5435,9 +5449,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]] [[package]]
name = "skrifa" name = "skrifa"
version = "0.31.1" version = "0.31.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9c3bb8cab5196b98d70c866ce1ea81ab516104d5b396f84ae80f8766b5d5b4e" checksum = "dbeb4ca4399663735553a09dd17ce7e49a0a0203f03b706b39628c4d913a8607"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"read-fonts", "read-fonts",
@@ -5592,7 +5606,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]] [[package]]
name = "sum_tree" name = "sum_tree"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
"log", "log",
@@ -6157,6 +6171,24 @@ dependencies = [
"tower-service", "tower-service",
] ]
[[package]]
name = "tower-http"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e"
dependencies = [
"bitflags 2.9.1",
"bytes",
"futures-util",
"http",
"http-body",
"iri-string",
"pin-project-lite",
"tower",
"tower-layer",
"tower-service",
]
[[package]] [[package]]
name = "tower-layer" name = "tower-layer"
version = "0.3.3" version = "0.3.3"
@@ -6489,7 +6521,7 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]] [[package]]
name = "util" name = "util"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/zed-industries/zed#2a8242ac909ff5572d1ff5bb3e33ecb9337b456c" source = "git+https://github.com/zed-industries/zed#f9407db7d6eb7d5c2a3d79350662030bd83e748d"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-fs", "async-fs",
@@ -6513,8 +6545,6 @@ dependencies = [
"tempfile", "tempfile",
"tendril", "tendril",
"unicase", "unicase",
"unicode-script",
"unicode-segmentation",
"walkdir", "walkdir",
"workspace-hack", "workspace-hack",
] ]
@@ -7468,12 +7498,12 @@ dependencies = [
[[package]] [[package]]
name = "winreg" name = "winreg"
version = "0.52.0" version = "0.55.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-sys 0.48.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]

View File

@@ -713,6 +713,15 @@ impl Chat {
})], })],
cx, cx,
)) ))
.on_mouse_down(
gpui::MouseButton::Middle,
cx.listener({
let message = message.clone();
move |this, _, _window, cx| {
this.reply(message.clone(), cx);
}
}),
)
.hover(|this| this.bg(cx.theme().surface_background)) .hover(|this| this.bg(cx.theme().surface_background))
} }
} }

View File

@@ -1,7 +1,7 @@
use gpui::{ use gpui::{
div, prelude::FluentBuilder, px, rems, App, AppContext, Context, Corner, DefiniteLength, div, prelude::FluentBuilder, px, rems, App, AppContext, Context, Corner, DefiniteLength,
DismissEvent, DragMoveEvent, Empty, Entity, EventEmitter, FocusHandle, Focusable, DismissEvent, DragMoveEvent, Empty, Entity, EventEmitter, FocusHandle, Focusable,
InteractiveElement as _, IntoElement, ParentElement, Pixels, Render, ScrollHandle, InteractiveElement as _, IntoElement, MouseButton, ParentElement, Pixels, Render, ScrollHandle,
SharedString, StatefulInteractiveElement, Styled, WeakEntity, Window, SharedString, StatefulInteractiveElement, Styled, WeakEntity, Window,
}; };
use std::sync::Arc; use std::sync::Arc;
@@ -295,24 +295,26 @@ impl TabPanel {
/// Remove a panel from the tab panel /// Remove a panel from the tab panel
pub fn remove_panel( pub fn remove_panel(
&mut self, &mut self,
panel: Arc<dyn PanelView>, panel: &Arc<dyn PanelView>,
window: &mut Window, window: &mut Window,
cx: &mut Context<Self>, cx: &mut Context<Self>,
) { ) {
self.detach_panel(panel, window, cx); self.detach_panel(panel, window, cx);
self.remove_self_if_empty(window, cx); self.remove_self_if_empty(window, cx);
cx.emit(PanelEvent::ZoomOut); cx.emit(PanelEvent::ZoomOut);
cx.emit(PanelEvent::LayoutChanged); cx.emit(PanelEvent::LayoutChanged);
} }
fn detach_panel( fn detach_panel(
&mut self, &mut self,
panel: Arc<dyn PanelView>, panel: &Arc<dyn PanelView>,
window: &mut Window, window: &mut Window,
cx: &mut Context<Self>, cx: &mut Context<Self>,
) { ) {
let panel_view = panel.view(); let panel_view = panel.view();
self.panels.retain(|p| p.view() != panel_view); self.panels.retain(|p| p.view() != panel_view);
if self.active_ix >= self.panels.len() { if self.active_ix >= self.panels.len() {
self.set_active_ix(self.panels.len().saturating_sub(1), window, cx) self.set_active_ix(self.panels.len().saturating_sub(1), window, cx)
} }
@@ -623,7 +625,16 @@ impl TabPanel {
.selected(active) .selected(active)
.disabled(disabled) .disabled(disabled)
.when(!disabled, |this| { .when(!disabled, |this| {
this.on_click(cx.listener(move |view, _, window, cx| { this.on_mouse_down(
MouseButton::Middle,
cx.listener({
let panel = panel.clone();
move |view, _, window, cx| {
view.remove_panel(&panel, window, cx);
}
}),
)
.on_click(cx.listener(move |view, _, window, cx| {
view.set_active_ix(ix, window, cx); view.set_active_ix(ix, window, cx);
})) }))
.when(state.draggable, |this| { .when(state.draggable, |this| {
@@ -820,10 +831,10 @@ impl TabPanel {
// We must to split it to remove_panel, unless it will be crash by error: // We must to split it to remove_panel, unless it will be crash by error:
// Cannot update ui::dock::tab_panel::TabPanel while it is already being updated // Cannot update ui::dock::tab_panel::TabPanel while it is already being updated
if is_same_tab { if is_same_tab {
self.detach_panel(panel.clone(), window, cx); self.detach_panel(&panel, window, cx);
} else { } else {
drag.tab_panel.update(cx, |view, cx| { drag.tab_panel.update(cx, |view, cx| {
view.detach_panel(panel.clone(), window, cx); view.detach_panel(&panel, window, cx);
view.remove_self_if_empty(window, cx); view.remove_self_if_empty(window, cx);
}); });
} }
@@ -1004,7 +1015,7 @@ impl TabPanel {
cx: &mut Context<Self>, cx: &mut Context<Self>,
) { ) {
if let Some(panel) = self.active_panel(cx) { if let Some(panel) = self.active_panel(cx) {
self.remove_panel(panel, window, cx); self.remove_panel(&panel, window, cx);
} }
} }
} }

View File

@@ -1136,8 +1136,14 @@ impl InputState {
window: &mut Window, window: &mut Window,
cx: &mut Context<Self>, cx: &mut Context<Self>,
) { ) {
if event.button == MouseButton::Middle {
self.paste(&Paste, window, cx);
return;
}
self.selecting = true; self.selecting = true;
let offset = self.index_for_mouse_position(event.position, window, cx); let offset = self.index_for_mouse_position(event.position, window, cx);
// Double click to select word // Double click to select word
if event.button == MouseButton::Left && event.click_count == 2 { if event.button == MouseButton::Left && event.click_count == 2 {
self.select_word(offset, window, cx); self.select_word(offset, window, cx);
@@ -1213,9 +1219,10 @@ impl InputState {
self.replace_text_in_range(None, "", window, cx); self.replace_text_in_range(None, "", window, cx);
} }
pub(super) fn paste(&mut self, _: &Paste, window: &mut Window, cx: &mut Context<Self>) { pub(super) fn paste(&mut self, _paste: &Paste, window: &mut Window, cx: &mut Context<Self>) {
if let Some(clipboard) = cx.read_from_clipboard() { if let Some(clipboard) = cx.read_from_clipboard() {
let mut new_text = clipboard.text().unwrap_or_default(); let mut new_text = clipboard.text().unwrap_or_default();
if !self.is_multi_line() { if !self.is_multi_line() {
new_text = new_text.replace('\n', ""); new_text = new_text.replace('\n', "");
} }

View File

@@ -218,6 +218,10 @@ impl RenderOnce for TextInput {
MouseButton::Left, MouseButton::Left,
window.listener_for(&self.state, InputState::on_mouse_down), window.listener_for(&self.state, InputState::on_mouse_down),
) )
.on_mouse_down(
MouseButton::Middle,
window.listener_for(&self.state, InputState::on_mouse_down),
)
.on_mouse_up( .on_mouse_up(
MouseButton::Left, MouseButton::Left,
window.listener_for(&self.state, InputState::on_mouse_up), window.listener_for(&self.state, InputState::on_mouse_up),