Skip to content

Commit

Permalink
refactor: port to new clone macro syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
SeaDve committed Jul 17, 2024
1 parent 9809770 commit 411ffd4
Show file tree
Hide file tree
Showing 8 changed files with 317 additions and 188 deletions.
48 changes: 30 additions & 18 deletions src/application.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,11 +158,15 @@ impl Application {
}

pub fn quit(&self) {
glib::spawn_future_local(clone!(@weak self as obj => async move {
if obj.quit_request().await.is_proceed() {
ApplicationExt::quit(&obj);
glib::spawn_future_local(clone!(
#[weak(rename_to = obj)]
self,
async move {
if obj.quit_request().await.is_proceed() {
ApplicationExt::quit(&obj);
}
}
}));
));
}

async fn quit_request(&self) -> glib::Propagation {
Expand All @@ -182,28 +186,36 @@ impl Application {
.parameter_type(Some(&String::static_variant_type()))
.activate(|obj: &Self, _, param| {
let uri = param.unwrap().get::<String>().unwrap();
glib::spawn_future_local(clone!(@strong obj => async move {
if let Err(err) = gtk::FileLauncher::new(Some(&gio::File::for_uri(&uri)))
.launch_future(obj.active_window().as_ref())
.await
{
tracing::error!("Failed to launch uri `{}`: {:?}", uri, err);
glib::spawn_future_local(clone!(
#[strong]
obj,
async move {
if let Err(err) = gtk::FileLauncher::new(Some(&gio::File::for_uri(&uri)))
.launch_future(obj.active_window().as_ref())
.await
{
tracing::error!("Failed to launch uri `{}`: {:?}", uri, err);
}
}
}));
));
})
.build();
let show_in_files_action = gio::ActionEntry::builder("show-in-files")
.parameter_type(Some(&String::static_variant_type()))
.activate(|obj: &Self, _, param| {
let uri = param.unwrap().get::<String>().unwrap();
glib::spawn_future_local(clone!(@strong obj => async move {
if let Err(err) = gtk::FileLauncher::new(Some(&gio::File::for_uri(&uri)))
.open_containing_folder_future(obj.active_window().as_ref())
.await
{
tracing::warn!("Failed to show `{}` in files: {:?}", uri, err);
glib::spawn_future_local(clone!(
#[strong]
obj,
async move {
if let Err(err) = gtk::FileLauncher::new(Some(&gio::File::for_uri(&uri)))
.open_containing_folder_future(obj.active_window().as_ref())
.await
{
tracing::warn!("Failed to show `{}` in files: {:?}", uri, err);
}
}
}));
));
})
.build();
let quit_action = gio::ActionEntry::builder("quit")
Expand Down
29 changes: 18 additions & 11 deletions src/area_selector/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,21 @@ mod imp {

let obj = self.obj();

self.view_port
.connect_selection_notify(clone!(@weak obj => move |_| {
self.view_port.connect_selection_notify(clone!(
#[weak]
obj,
move |_| {
obj.update_selection_ui();
}));
}
));

self.view_port
.connect_paintable_rect_notify(clone!(@weak obj => move |_| {
self.view_port.connect_paintable_rect_notify(clone!(
#[weak]
obj,
move |_| {
obj.update_selection_ui();
}));
}
));

obj.update_selection_ui();
}
Expand Down Expand Up @@ -248,11 +254,12 @@ impl AreaSelector {
let bus_watch_guard = pipeline
.bus()
.unwrap()
.add_watch_local(
clone!(@weak this as obj => @default-return glib::ControlFlow::Break, move |_, message| {
obj.handle_bus_message(message)
}),
)
.add_watch_local(clone!(
#[weak]
this,
#[upgrade_or_panic]
move |_, message| this.handle_bus_message(message)
))
.unwrap();
imp.bus_watch_guard.set(bus_watch_guard).unwrap();

Expand Down
20 changes: 12 additions & 8 deletions src/area_selector/view_port.rs
Original file line number Diff line number Diff line change
Expand Up @@ -372,16 +372,20 @@ mod imp {
}

if let Some(paintable) = paintable {
handler_ids.push(paintable.connect_invalidate_contents(
clone!(@weak obj => move |_| {
handler_ids.push(paintable.connect_invalidate_contents(clone!(
#[weak]
obj,
move |_| {
obj.queue_draw();
}),
));
handler_ids.push(
paintable.connect_invalidate_size(clone!(@weak obj => move |_| {
}
)));
handler_ids.push(paintable.connect_invalidate_size(clone!(
#[weak]
obj,
move |_| {
obj.queue_resize();
})),
);
}
)));
}

self.paintable_rect.set(None);
Expand Down
191 changes: 116 additions & 75 deletions src/preferences_dialog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,39 +100,57 @@ mod imp {
settings
.bind_record_delay(&self.delay_row.get(), "value")
.build();
settings.connect_saving_location_changed(clone!(@weak obj => move |_| {
obj.update_file_chooser_label();
}));
settings.connect_profile_changed(clone!(@weak obj => move |_| {
obj.update_profile_row_selected();
}));
settings.connect_framerate_changed(clone!(@weak obj => move |_| {
obj.update_framerate_row_selected();
}));
settings.connect_saving_location_changed(clone!(
#[weak]
obj,
move |_| {
obj.update_file_chooser_label();
}
));
settings.connect_profile_changed(clone!(
#[weak]
obj,
move |_| {
obj.update_profile_row_selected();
}
));
settings.connect_framerate_changed(clone!(
#[weak]
obj,
move |_| {
obj.update_framerate_row_selected();
}
));

obj.update_file_chooser_label();
obj.update_profile_row_selected();
obj.update_framerate_row_selected();

// Load last active value first in `update_*_row` before connecting to
// the signal to avoid unnecessary updates.
self.profile_row
.connect_selected_item_notify(clone!(@weak obj => move |row| {
self.profile_row.connect_selected_item_notify(clone!(
#[weak]
obj,
move |row| {
if let Some(item) = row.selected_item() {
let profile = profile_from_obj(&item);
obj.settings().set_profile(profile);
}
}));
self.framerate_row
.connect_selected_item_notify(clone!(@weak obj => move |row| {
}
));
self.framerate_row.connect_selected_item_notify(clone!(
#[weak]
obj,
move |row| {
if let Some(item) = row.selected_item() {
let framerate = item
.downcast_ref::<BoxedAnyObject>()
.unwrap()
.borrow::<gst::Fraction>();
obj.settings().set_framerate(*framerate);
}
}));
}
));
}
}

Expand Down Expand Up @@ -217,37 +235,47 @@ impl PreferencesDialog {
imp.framerate_row.set_factory(Some(&row_factory(
&imp.framerate_row,
&gettext("This frame rate may cause performance issues on the selected format."),
clone!(@strong settings => move |list_item| {
let item = list_item.item().unwrap();
let item_row = list_item.child().unwrap().downcast::<ItemRow>().unwrap();

let framerate = item
.downcast_ref::<BoxedAnyObject>()
.unwrap()
.borrow::<gst::Fraction>();
item_row.set_title(format::framerate(*framerate));
clone!(
#[strong]
settings,
move |list_item| {
let item = list_item.item().unwrap();
let item_row = list_item.child().unwrap().downcast::<ItemRow>().unwrap();

let framerate = item
.downcast_ref::<BoxedAnyObject>()
.unwrap()
.borrow::<gst::Fraction>();
item_row.set_title(format::framerate(*framerate));

unsafe {
list_item.set_data(
SETTINGS_PROFILE_CHANGED_HANDLER_ID_KEY,
settings.connect_profile_changed(clone!(
#[weak]
list_item,
move |settings| {
update_framerate_row_shows_warning_icon(settings, &list_item);
}
)),
);
}

unsafe {
list_item.set_data(
SETTINGS_PROFILE_CHANGED_HANDLER_ID_KEY,
settings.connect_profile_changed(
clone!(@weak list_item => move |settings| {
update_framerate_row_shows_warning_icon(settings, &list_item);
}),
),
);
update_framerate_row_shows_warning_icon(&settings, list_item);
}

update_framerate_row_shows_warning_icon(&settings, list_item);
}),
clone!(@strong settings => move |list_item| {
unsafe {
let handler_id = list_item
.steal_data(SETTINGS_PROFILE_CHANGED_HANDLER_ID_KEY)
.unwrap();
settings.disconnect(handler_id);
),
clone!(
#[strong]
settings,
move |list_item| {
unsafe {
let handler_id = list_item
.steal_data(SETTINGS_PROFILE_CHANGED_HANDLER_ID_KEY)
.unwrap();
settings.disconnect(handler_id);
}
}
}),
),
)));

let framerate_model = {
Expand Down Expand Up @@ -323,56 +351,69 @@ fn row_factory(
let factory = gtk::SignalListItemFactory::new();

let warning_tooltip_text = warning_tooltip_text.to_string();
factory.connect_setup(clone!(@weak row => move |_, list_item| {
factory.connect_setup(move |_, list_item| {
let list_item = list_item.downcast_ref::<gtk::ListItem>().unwrap();

let item_row = ItemRow::new();
item_row.set_warning_tooltip_text(warning_tooltip_text.as_str());

list_item.set_child(Some(&item_row));
}));
});

factory.connect_bind(clone!(@weak row => move |_, list_item| {
let list_item = list_item.downcast_ref::<gtk::ListItem>().unwrap();
factory.connect_bind(clone!(
#[weak]
row,
move |_, list_item| {
let list_item = list_item.downcast_ref::<gtk::ListItem>().unwrap();

let item_row = list_item.child().unwrap().downcast::<ItemRow>().unwrap();
let item_row = list_item.child().unwrap().downcast::<ItemRow>().unwrap();

// Only show the selected icon when it is inside the given row's popover. This assumes that
// the parent of the given row is not a popover, so we can tell which is which.
if item_row.ancestor(gtk::Popover::static_type()).is_some() {
debug_assert!(row.ancestor(gtk::Popover::static_type()).is_none());
// Only show the selected icon when it is inside the given row's popover. This assumes that
// the parent of the given row is not a popover, so we can tell which is which.
if item_row.ancestor(gtk::Popover::static_type()).is_some() {
debug_assert!(row.ancestor(gtk::Popover::static_type()).is_none());

item_row.set_is_on_popover(true);
item_row.set_is_on_popover(true);

unsafe {
list_item.set_data(
ROW_SELECTED_ITEM_NOTIFY_HANDLER_ID_KEY,
row.connect_selected_item_notify(clone!(@weak list_item => move |row| {
update_item_row_is_selected(row, &list_item);
})),
);
unsafe {
list_item.set_data(
ROW_SELECTED_ITEM_NOTIFY_HANDLER_ID_KEY,
row.connect_selected_item_notify(clone!(
#[weak]
list_item,
move |row| {
update_item_row_is_selected(row, &list_item);
}
)),
);
}

update_item_row_is_selected(&row, list_item);
} else {
item_row.set_is_on_popover(false);
}

update_item_row_is_selected(&row, list_item);
} else {
item_row.set_is_on_popover(false);
bind_cb(list_item);
}
));

bind_cb(list_item);
}));

factory.connect_unbind(clone!(@weak row => move |_, list_item| {
let list_item = list_item.downcast_ref::<gtk::ListItem>().unwrap();
factory.connect_unbind(clone!(
#[weak]
row,
move |_, list_item| {
let list_item = list_item.downcast_ref::<gtk::ListItem>().unwrap();

unsafe {
if let Some(handler_id) = list_item.steal_data(ROW_SELECTED_ITEM_NOTIFY_HANDLER_ID_KEY)
{
row.disconnect(handler_id);
unsafe {
if let Some(handler_id) =
list_item.steal_data(ROW_SELECTED_ITEM_NOTIFY_HANDLER_ID_KEY)
{
row.disconnect(handler_id);
}
}
}

unbind_cb(list_item);
}));
unbind_cb(list_item);
}
));

factory
}
Expand Down
Loading

0 comments on commit 411ffd4

Please sign in to comment.