Skip to content

Commit 17b99cd

Browse files
authored
Merge pull request #1280 from Cheong-Lau/replace-arc
perf: use `Rc<RefCell>` for `ArcElementWrapper`
2 parents c89978b + f78d4a4 commit 17b99cd

File tree

1 file changed

+25
-33
lines changed

1 file changed

+25
-33
lines changed

src/tab.rs

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ use ordermap::OrderMap;
5353
use serde::{Deserialize, Serialize};
5454
use std::{
5555
borrow::Cow,
56-
cell::Cell,
56+
cell::{Cell, RefCell},
5757
cmp::Ordering,
5858
collections::HashMap,
5959
error::Error,
@@ -63,7 +63,8 @@ use std::{
6363
io::{BufRead, BufReader},
6464
os::unix::fs::MetadataExt,
6565
path::{Path, PathBuf},
66-
sync::{Arc, LazyLock, Mutex, RwLock, atomic},
66+
rc::Rc,
67+
sync::{Arc, LazyLock, RwLock, atomic},
6768
time::{Duration, Instant, SystemTime},
6869
};
6970
use tempfile::NamedTempFile;
@@ -5449,7 +5450,7 @@ impl Tab {
54495450
let view = self.config.view;
54505451
let item_view = match drag_list {
54515452
Some(drag_list) if self.selected_clicked => {
5452-
let drag_list = ArcElementWrapper::<Message>(Arc::new(Mutex::new(drag_list)));
5453+
let drag_list = RcElementWrapper::<Message>(Rc::new(RefCell::new(drag_list)));
54535454
item_view
54545455
.drag_content(move || {
54555456
ClipboardCopy::new(crate::clipboard::ClipboardKind::Copy, &files)
@@ -5913,15 +5914,15 @@ pub fn respond_to_scroll_direction(delta: ScrollDelta, modifiers: Modifiers) ->
59135914
}
59145915

59155916
#[derive(Clone)]
5916-
pub struct ArcElementWrapper<M>(pub Arc<Mutex<Element<'static, M>>>);
5917+
pub struct RcElementWrapper<M>(pub Rc<RefCell<Element<'static, M>>>);
59175918

5918-
impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for ArcElementWrapper<M> {
5919+
impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for RcElementWrapper<M> {
59195920
fn size(&self) -> Size<Length> {
5920-
self.0.lock().unwrap().as_widget().size()
5921+
self.0.borrow().as_widget().size()
59215922
}
59225923

59235924
fn size_hint(&self) -> Size<Length> {
5924-
self.0.lock().unwrap().as_widget().size_hint()
5925+
self.0.borrow().as_widget().size_hint()
59255926
}
59265927

59275928
fn layout(
@@ -5930,11 +5931,7 @@ impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for ArcElementWrapper<M> {
59305931
renderer: &cosmic::Renderer,
59315932
limits: &cosmic::iced_core::layout::Limits,
59325933
) -> cosmic::iced_core::layout::Node {
5933-
self.0
5934-
.lock()
5935-
.unwrap()
5936-
.as_widget_mut()
5937-
.layout(tree, renderer, limits)
5934+
self.0.borrow().as_widget().layout(tree, renderer, limits)
59385935
}
59395936

59405937
fn draw(
@@ -5948,26 +5945,25 @@ impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for ArcElementWrapper<M> {
59485945
viewport: &Rectangle,
59495946
) {
59505947
self.0
5951-
.lock()
5952-
.unwrap()
5948+
.borrow()
59535949
.as_widget()
59545950
.draw(tree, renderer, theme, style, layout, cursor, viewport)
59555951
}
59565952

59575953
fn tag(&self) -> tree::Tag {
5958-
self.0.lock().unwrap().as_widget().tag()
5954+
self.0.borrow().as_widget().tag()
59595955
}
59605956

59615957
fn state(&self) -> tree::State {
5962-
self.0.lock().unwrap().as_widget().state()
5958+
self.0.borrow().as_widget().state()
59635959
}
59645960

59655961
fn children(&self) -> Vec<tree::Tree> {
5966-
self.0.lock().unwrap().as_widget().children()
5962+
self.0.borrow().as_widget().children()
59675963
}
59685964

59695965
fn diff(&mut self, tree: &mut tree::Tree) {
5970-
self.0.lock().unwrap().as_widget_mut().diff(tree)
5966+
self.0.borrow_mut().as_widget_mut().diff(tree)
59715967
}
59725968

59735969
fn operate(
@@ -5978,8 +5974,7 @@ impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for ArcElementWrapper<M> {
59785974
operation: &mut dyn widget::Operation,
59795975
) {
59805976
self.0
5981-
.lock()
5982-
.unwrap()
5977+
.borrow()
59835978
.as_widget()
59845979
.operate(state, layout, renderer, operation)
59855980
}
@@ -5995,7 +5990,7 @@ impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for ArcElementWrapper<M> {
59955990
_shell: &mut cosmic::iced_core::Shell<'_, M>,
59965991
_viewport: &Rectangle,
59975992
) -> event::Status {
5998-
self.0.lock().unwrap().as_widget_mut().on_event(
5993+
self.0.borrow_mut().as_widget_mut().on_event(
59995994
_state, _event, _layout, _cursor, _renderer, _clipboard, _shell, _viewport,
60005995
)
60015996
}
@@ -6009,8 +6004,7 @@ impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for ArcElementWrapper<M> {
60096004
_renderer: &cosmic::Renderer,
60106005
) -> cosmic::iced_core::mouse::Interaction {
60116006
self.0
6012-
.lock()
6013-
.unwrap()
6007+
.borrow()
60146008
.as_widget()
60156009
.mouse_interaction(_state, _layout, _cursor, _viewport, _renderer)
60166010
}
@@ -6027,11 +6021,11 @@ impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for ArcElementWrapper<M> {
60276021
}
60286022

60296023
fn id(&self) -> Option<Id> {
6030-
self.0.lock().unwrap().as_widget().id()
6024+
self.0.borrow().as_widget().id()
60316025
}
60326026

60336027
fn set_id(&mut self, _id: Id) {
6034-
self.0.lock().unwrap().as_widget_mut().set_id(_id)
6028+
self.0.borrow_mut().as_widget_mut().set_id(_id)
60356029
}
60366030

60376031
fn drag_destinations(
@@ -6041,17 +6035,15 @@ impl<M> Widget<M, cosmic::Theme, cosmic::Renderer> for ArcElementWrapper<M> {
60416035
renderer: &cosmic::Renderer,
60426036
_dnd_rectangles: &mut cosmic::iced_core::clipboard::DndDestinationRectangles,
60436037
) {
6044-
self.0.lock().unwrap().as_widget().drag_destinations(
6045-
_state,
6046-
_layout,
6047-
renderer,
6048-
_dnd_rectangles,
6049-
)
6038+
self.0
6039+
.borrow()
6040+
.as_widget()
6041+
.drag_destinations(_state, _layout, renderer, _dnd_rectangles)
60506042
}
60516043
}
60526044

6053-
impl<Message: 'static> From<ArcElementWrapper<Message>> for Element<'static, Message> {
6054-
fn from(wrapper: ArcElementWrapper<Message>) -> Self {
6045+
impl<Message: 'static> From<RcElementWrapper<Message>> for Element<'static, Message> {
6046+
fn from(wrapper: RcElementWrapper<Message>) -> Self {
60556047
Element::new(wrapper)
60566048
}
60576049
}

0 commit comments

Comments
 (0)