update gtk 0.9.1 and gstreamer 0.23.1

The biggest change of this update was the
use of glib::clone! macros.
This commit is contained in:
Stéphane Cerveau 2024-09-10 15:29:20 +02:00
parent b1f581c2fd
commit 7b6c351033
8 changed files with 529 additions and 441 deletions

455
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -7,9 +7,9 @@ rust-version = "1.70.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
gtk = { version = "0.8.2", package = "gtk4" }
gst = { package = "gstreamer", version = "0.22.2" }
gst-plugin-gtk4 = { version = "0.12.1", optional=true }
gtk = { version = "0.9.1", package = "gtk4" }
gst = { package = "gstreamer", version = "0.23.1" }
gst-plugin-gtk4 = { version = "0.13.1", optional=true }
anyhow = "1"
log = "0.4.11"
once_cell = "1.7.2"

View file

@ -208,10 +208,14 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
close_button.add_css_class("image-button");
close_button.add_css_class("flat");
let app_weak = app.downgrade();
close_button.connect_clicked(glib::clone!(@weak graphbook => move |_| {
close_button.connect_clicked(glib::clone!(
#[weak]
graphbook,
move |_| {
let app = upgrade_weak!(app_weak);
graphbook.remove_page(Some(current_graphtab(&app).id()));
}));
}
));
tab_box.append(&close_button);
graphbook.append_page(&scrollwindow, Some(&tab_box));
graphbook.set_tab_reorderable(&scrollwindow, true);
@ -219,7 +223,7 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
gt.graphview().connect_local(
"graph-updated",
false,
glib::clone!(@weak graphbook => @default-return None, move |values: &[Value]| {
glib::clone!(move |values: &[Value]| {
let app = upgrade_weak!(app_weak, None);
let id = values[1].get::<u32>().expect("id in args[1]");
GPS_DEBUG!("Graph updated id={}", id);
@ -238,7 +242,7 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
gt.graphview().connect_local(
"node-added",
false,
glib::clone!(@weak graphbook => @default-return None, move |values: &[Value]| {
glib::clone!(move |values: &[Value]| {
let app = upgrade_weak!(app_weak, None);
let graph_id = values[1].get::<u32>().expect("graph id in args[1]");
let node_id = values[2].get::<u32>().expect("node id in args[2]");
@ -251,7 +255,11 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
}
for port in node.all_ports(GM::PortDirection::All) {
let caps = PropertyExt::property(&port, "_caps");
GPS_DEBUG!("caps={} for port id {}", caps.clone().unwrap_or_else(|| "caps unknown".to_string()), port.id());
GPS_DEBUG!(
"caps={} for port id {}",
caps.clone().unwrap_or_else(|| "caps unknown".to_string()),
port.id()
);
port.set_tooltip_markup(caps.as_deref());
}
}
@ -263,16 +271,25 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
gt.graphview().connect_local(
"port-added",
false,
glib::clone!(@weak graphbook => @default-return None, move |values: &[Value]| {
glib::clone!(move |values: &[Value]| {
let app = upgrade_weak!(app_weak, None);
let graph_id = values[1].get::<u32>().expect("graph id in args[1]");
let node_id = values[2].get::<u32>().expect("node id in args[2]");
let port_id = values[3].get::<u32>().expect("port id in args[3]");
GPS_DEBUG!("Port added port id={} to node id={} in graph id={}", port_id, node_id, graph_id);
GPS_DEBUG!(
"Port added port id={} to node id={} in graph id={}",
port_id,
node_id,
graph_id
);
if let Some(node) = current_graphtab(&app).graphview().node(node_id) {
if let Some(port) = node.port(port_id) {
let caps = PropertyExt::property(&port, "_caps");
GPS_DEBUG!("caps={} for port id {}", caps.clone().unwrap_or_else(|| "caps unknown".to_string()), port.id());
GPS_DEBUG!(
"caps={} for port id {}",
caps.clone().unwrap_or_else(|| "caps unknown".to_string()),
port.id()
);
port.set_tooltip_markup(caps.as_deref());
}
}
@ -281,45 +298,57 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
);
// When user clicks on port with right button
let app_weak = app.downgrade();
gt.graphview()
.connect_local(
gt.graphview().connect_local(
"graph-right-clicked",
false,
glib::clone!(@weak graphbook => @default-return None, move |values: &[Value]| {
glib::clone!(move |values: &[Value]| {
let app = upgrade_weak!(app_weak, None);
let point = values[1].get::<graphene::Point>().expect("point in args[2]");
let pop_menu = app.app_pop_menu_at_position(&*current_graphtab(&app).graphview(), point.to_vec2().x() as f64, point.to_vec2().y() as f64);
let point = values[1]
.get::<graphene::Point>()
.expect("point in args[2]");
let pop_menu = app.app_pop_menu_at_position(
&*current_graphtab(&app).graphview(),
point.to_vec2().x() as f64,
point.to_vec2().y() as f64,
);
let menu: gio::MenuModel = app
.builder
.object("graph_menu")
.expect("Couldn't graph_menu");
pop_menu.set_menu_model(Some(&menu));
let app_weak = app.downgrade();
app.connect_app_menu_action("graph.clear",
move |_,_| {
app.connect_app_menu_action("graph.clear", move |_, _| {
let app = upgrade_weak!(app_weak);
current_graphtab(&app).graphview().clear();
}
);
});
let app_weak = app.downgrade();
app.connect_app_menu_action("graph.check",
move |_,_| {
app.connect_app_menu_action("graph.check", move |_, _| {
let app = upgrade_weak!(app_weak);
let render_parse_launch = current_graphtab(&app).player().pipeline_description_from_graphview(&current_graphtab(&app).graphview());
if current_graphtab(&app).player().create_pipeline(&render_parse_launch).is_ok() {
GPSUI::message::display_message_dialog(&render_parse_launch,gtk::MessageType::Info, |_| {});
} else {
GPSUI::message::display_error_dialog(false, &format!("Unable to render:\n\n{render_parse_launch}"));
}
}
let render_parse_launch = current_graphtab(&app)
.player()
.pipeline_description_from_graphview(&current_graphtab(&app).graphview());
if current_graphtab(&app)
.player()
.create_pipeline(&render_parse_launch)
.is_ok()
{
GPSUI::message::display_message_dialog(
&render_parse_launch,
gtk::MessageType::Info,
|_| {},
);
} else {
GPSUI::message::display_error_dialog(
false,
&format!("Unable to render:\n\n{render_parse_launch}"),
);
}
});
let app_weak = app.downgrade();
app.connect_app_menu_action("graph.pipeline_details",
move |_,_| {
app.connect_app_menu_action("graph.pipeline_details", move |_, _| {
let app = upgrade_weak!(app_weak);
GPSUI::properties::display_pipeline_details(&app);
}
);
});
pop_menu.show();
None
}),
@ -382,81 +411,90 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
// When user clicks on node with right button
let app_weak = app.downgrade();
gt.graphview()
.connect_local(
gt.graphview().connect_local(
"node-right-clicked",
false,
glib::clone!(@weak graphbook => @default-return None, move |values: &[Value]| {
glib::clone!(move |values: &[Value]| {
let app = upgrade_weak!(app_weak, None);
let node_id = values[1].get::<u32>().expect("node id args[1]");
let node = current_graphtab(&app).graphview().node(node_id).unwrap();
let element_exists = GPS::ElementInfo::element_factory_exists(&node.name());
let point = values[2].get::<graphene::Point>().expect("point in args[2]");
let pop_menu = app.app_pop_menu_at_position(&*current_graphtab(&app).graphview(), point.to_vec2().x() as f64, point.to_vec2().y() as f64);
let point = values[2]
.get::<graphene::Point>()
.expect("point in args[2]");
let pop_menu = app.app_pop_menu_at_position(
&*current_graphtab(&app).graphview(),
point.to_vec2().x() as f64,
point.to_vec2().y() as f64,
);
let menu: gio::MenuModel = app
.builder
.object("node_menu")
.expect("Couldn't get menu model for node");
pop_menu.set_menu_model(Some(&menu));
let app_weak = app.downgrade();
app.connect_app_menu_action("node.delete",
move |_,_| {
app.connect_app_menu_action("node.delete", move |_, _| {
let app = upgrade_weak!(app_weak);
GPS_DEBUG!("node.delete id: {}", node_id);
current_graphtab(&app).graphview().remove_node(node_id);
}
);
});
if element_exists {
let app_weak = app.downgrade();
app.connect_app_menu_action("node.add-to-favorite",
move |_,_| {
app.connect_app_menu_action("node.add-to-favorite", move |_, _| {
let app = upgrade_weak!(app_weak);
GPS_DEBUG!("node.add-to-favorite id: {}", node_id);
if let Some(node) = current_graphtab(&app).graphview().node(node_id) {
GPSUI::elements::add_to_favorite_list(&app, node.name());
};
}
);
});
let node = app.node(node_id);
if let Some(input) = GPS::ElementInfo::element_supports_new_pad_request(&node.name(), GM::PortDirection::Input) {
if let Some(input) = GPS::ElementInfo::element_supports_new_pad_request(
&node.name(),
GM::PortDirection::Input,
) {
let app_weak = app.downgrade();
app.connect_app_menu_action("node.request-pad-input",
move |_,_| {
app.connect_app_menu_action("node.request-pad-input", move |_, _| {
let app = upgrade_weak!(app_weak);
GPS_DEBUG!("node.request-pad-input id: {}", node_id);
app.create_port_with_caps(node_id, GM::PortDirection::Input, GM::PortPresence::Sometimes, input.caps().to_string());
}
app.create_port_with_caps(
node_id,
GM::PortDirection::Input,
GM::PortPresence::Sometimes,
input.caps().to_string(),
);
});
} else {
app.disconnect_app_menu_action("node.request-pad-input");
}
let node = app.node(node_id);
if let Some(output) = GPS::ElementInfo::element_supports_new_pad_request(&node.name(), GM::PortDirection::Output) {
if let Some(output) = GPS::ElementInfo::element_supports_new_pad_request(
&node.name(),
GM::PortDirection::Output,
) {
let app_weak = app.downgrade();
app.connect_app_menu_action("node.request-pad-output",
move |_,_| {
app.connect_app_menu_action("node.request-pad-output", move |_, _| {
let app = upgrade_weak!(app_weak);
GPS_DEBUG!("node.request-pad-output id: {}", node_id);
app.create_port_with_caps(node_id, GM::PortDirection::Output, GM::PortPresence::Sometimes, output.caps().to_string());
}
app.create_port_with_caps(
node_id,
GM::PortDirection::Output,
GM::PortPresence::Sometimes,
output.caps().to_string(),
);
});
} else {
app.disconnect_app_menu_action("node.request-pad-output");
}
let app_weak = app.downgrade();
app.connect_app_menu_action("node.properties",
move |_,_| {
app.connect_app_menu_action("node.properties", move |_, _| {
let app = upgrade_weak!(app_weak);
GPS_DEBUG!("node.properties id {}", node_id);
let node = current_graphtab(&app).graphview().node(node_id).unwrap();
GPSUI::properties::display_plugin_properties(&app, &node.name(), node_id);
}
);
});
}
pop_menu.show();
None
@ -467,7 +505,7 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
gt.graphview().connect_local(
"node-double-clicked",
false,
glib::clone!(@weak graphbook => @default-return None, move |values: &[Value]| {
glib::clone!(move |values: &[Value]| {
let app = upgrade_weak!(app_weak, None);
let node_id = values[1].get::<u32>().expect("node id args[1]");
GPS_TRACE!("Node double clicked id={}", node_id);
@ -482,7 +520,7 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
gt.graphview().connect_local(
"link-double-clicked",
false,
glib::clone!(@weak graphbook => @default-return None, move |values: &[Value]| {
glib::clone!(move |values: &[Value]| {
let app = upgrade_weak!(app_weak, None);
let link_id = values[1].get::<u32>().expect("link id args[1]");
GPS_TRACE!("link double clicked id={}", link_id);
@ -493,7 +531,9 @@ pub fn create_graphtab(app: &GPSApp, id: u32, name: Option<&str>) {
&link.name(),
&app,
move |app, link_desc| {
current_graphtab(&app).graphview().set_link_name(link.id(), link_desc.as_str());
current_graphtab(&app)
.graphview()
.set_link_name(link.id(), link_desc.as_str());
GPS_DEBUG!("link double clicked id={} name={}", link.id(), link.name());
},
);

View file

@ -23,10 +23,14 @@ pub fn create_dialog<F: Fn(GPSApp, gtk::Dialog) + 'static>(
dialog.set_default_size(640, 480);
dialog.set_modal(true);
let app_weak = app.downgrade();
dialog.connect_response(glib::clone!(@weak dialog => move |_,_| {
dialog.connect_response(glib::clone!(
#[weak]
dialog,
move |_, _| {
let app = upgrade_weak!(app_weak);
f(app, dialog)
}));
}
));
let scrolledwindow = gtk::ScrolledWindow::builder()
.hexpand(true)
@ -84,13 +88,17 @@ pub fn create_input_dialog<F: Fn(GPSApp, String) + 'static>(
content_area.append(&label);
content_area.append(&entry);
let app_weak = app.downgrade();
dialog.connect_response(glib::clone!(@weak entry => move |dialog, response_type| {
dialog.connect_response(glib::clone!(
#[weak]
entry,
move |dialog, response_type| {
let app = upgrade_weak!(app_weak);
if response_type == gtk::ResponseType::Apply {
f(app, entry.text().to_string());
}
dialog.close()
}));
}
));
dialog.show();
}

View file

@ -54,14 +54,15 @@ pub fn setup_favorite_list(app: &GPSApp) {
let gesture = gtk::GestureClick::new();
gesture.set_button(0);
let app_weak = app.downgrade();
gesture.connect_pressed(
glib::clone!(@weak favorite_list => move |gesture, _n_press, x, y| {
gesture.connect_pressed(glib::clone!(
#[weak]
favorite_list,
move |gesture, _n_press, x, y| {
let app = upgrade_weak!(app_weak);
if gesture.current_button() == BUTTON_SECONDARY {
let selection = favorite_list.selection();
if let Some((model, iter)) = selection.selected() {
let element_name = model
.get::<String>(&iter, 0);
let element_name = model.get::<String>(&iter, 0);
GPS_DEBUG!("Element {} selected", element_name);
let pop_menu = app.app_pop_menu_at_position(&favorite_list, x, y);
@ -71,19 +72,16 @@ pub fn setup_favorite_list(app: &GPSApp) {
.expect("Couldn't get fav_menu model");
pop_menu.set_menu_model(Some(&menu));
app.connect_app_menu_action("favorite.remove",
move |_,_| {
app.connect_app_menu_action("favorite.remove", move |_, _| {
Settings::remove_favorite(&element_name);
reset_favorite_list(&favorite_list);
}
);
});
pop_menu.show();
}
}
}),
);
}
));
favorite_list.add_controller(gesture);
}

View file

@ -55,8 +55,10 @@ pub fn setup_logger_list(app: &GPSApp, logger_name: &str, log_type: logger::LogT
let gesture = gtk::GestureClick::new();
gesture.set_button(0);
let app_weak = app.downgrade();
gesture.connect_pressed(
glib::clone!(@weak logger_list => move |gesture, _n_press, x, y| {
gesture.connect_pressed(glib::clone!(
#[weak]
logger_list,
move |gesture, _n_press, x, y| {
let app = upgrade_weak!(app_weak);
if gesture.current_button() == gtk::gdk::BUTTON_SECONDARY {
let pop_menu = app.app_pop_menu_at_position(&logger_list, x, y);
@ -66,16 +68,14 @@ pub fn setup_logger_list(app: &GPSApp, logger_name: &str, log_type: logger::LogT
.expect("Couldn't get fav_menu model");
pop_menu.set_menu_model(Some(&menu));
app.connect_app_menu_action("logger.clear",
move |_,_| {
app.connect_app_menu_action("logger.clear", move |_, _| {
reset_logger_list(&logger_list);
}
);
});
pop_menu.show();
}
}),
);
}
));
logger_list.add_controller(gesture);
}

View file

@ -41,9 +41,11 @@ pub fn display_settings(app: &GPSApp) {
.parse::<bool>()
.expect("Should a boolean value"),
);
widget.connect_toggled(glib::clone!(@weak widget => move |c| {
widget.connect_toggled(glib::clone!(move |c| {
let mut settings = settings::Settings::load_settings();
settings.preferences.insert("use_gtk4_sink".to_string(), c.is_active().to_string());
settings
.preferences
.insert("use_gtk4_sink".to_string(), c.is_active().to_string());
settings::Settings::save_settings(&settings);
}));
@ -66,9 +68,11 @@ pub fn display_settings(app: &GPSApp) {
.parse::<f64>()
.expect("Should a f64 value"),
);
widget.connect_value_changed(glib::clone!(@weak widget => move |c| {
widget.connect_value_changed(glib::clone!(move |c| {
let mut settings = settings::Settings::load_settings();
settings.preferences.insert("log_level".to_string(), c.value().to_string());
settings
.preferences
.insert("log_level".to_string(), c.value().to_string());
logger::set_log_level(logger::LogLevel::from_u32(c.value() as u32));
settings::Settings::save_settings(&settings);
}));
@ -84,9 +88,11 @@ pub fn display_settings(app: &GPSApp) {
let widget = gtk::Entry::new();
widget.set_text(settings::Settings::gst_log_level().as_str());
widget.connect_changed(glib::clone!(@weak widget => move |c| {
widget.connect_changed(glib::clone!(move |c| {
let mut settings = settings::Settings::load_settings();
settings.preferences.insert("gst_log_level".to_string(), c.text().to_string());
settings
.preferences
.insert("gst_log_level".to_string(), c.text().to_string());
settings::Settings::save_settings(&settings);
}));
let widget = widget

View file

@ -46,7 +46,7 @@ pub fn property_to_widget<F: Fn(String, String) + 'static>(
} else if let Some(value) = common::value_as_str(param.default_value()) {
check_button.set_active(value.parse::<bool>().unwrap_or(false));
}
check_button.connect_toggled(glib::clone!(@weak check_button => move |c| {
check_button.connect_toggled(glib::clone!(move |c| {
f(c.widget_name().to_string(), c.is_active().to_string());
}));
Some(check_button.upcast::<gtk::Widget>())
@ -79,7 +79,7 @@ pub fn property_to_widget<F: Fn(String, String) + 'static>(
entry.set_text(&value);
}
entry.connect_changed(glib::clone!(@weak entry=> move |e| {
entry.connect_changed(glib::clone!(move |e| {
f(e.widget_name().to_string(), e.text().to_string())
}));
Some(entry.upcast::<gtk::Widget>())
@ -182,10 +182,14 @@ pub fn display_plugin_properties(app: &GPSApp, element_name: &str, node_id: u32)
element_name,
name,
param,
glib::clone!(@strong update_properties => move |name, value| {
glib::clone!(
#[strong]
update_properties,
move |name, value| {
GPS_INFO!("property changed: {}:{}", name, value);
update_properties.borrow_mut().insert(name, value);
}),
}
),
);
if let Some(widget) = widget {
let label = gtk::Label::builder()
@ -204,10 +208,14 @@ pub fn display_plugin_properties(app: &GPSApp, element_name: &str, node_id: u32)
&format!("{element_name} properties"),
app,
&grid,
glib::clone!(@strong update_properties => move |app, dialog| {
glib::clone!(
#[strong]
update_properties,
move |app, dialog| {
app.update_element_properties(node_id, &update_properties.borrow());
dialog.close();
}),
}
),
);
dialog.show();
@ -240,11 +248,20 @@ pub fn display_pad_properties(
let property_value = gtk::Entry::new();
property_value.set_width_request(150);
property_value.set_text(&value);
property_value.connect_changed(
glib::clone!(@weak property_name, @weak property_value, @strong update_properties=> move |_| {
update_properties.borrow_mut().insert(property_name.text().to_string(), property_value.text().to_string());
}),
property_value.connect_changed(glib::clone!(
#[weak]
property_name,
#[weak]
property_value,
#[strong]
update_properties,
move |_| {
update_properties.borrow_mut().insert(
property_name.text().to_string(),
property_value.text().to_string(),
);
}
));
grid.attach(&property_name, 0, i, 1, 1);
grid.attach(&property_value, 1, i, 1, 1);
i += 1;
@ -263,17 +280,35 @@ pub fn display_pad_properties(
let property_value = gtk::Entry::new();
property_value.set_width_request(150);
property_name.connect_changed(
glib::clone!(@weak property_name, @weak property_value, @strong update_properties=> move |_| {
update_properties.borrow_mut().insert(property_name.text().to_string(), property_value.text().to_string());
}),
property_name.connect_changed(glib::clone!(
#[weak]
property_name,
#[weak]
property_value,
#[strong]
update_properties,
move |_| {
update_properties.borrow_mut().insert(
property_name.text().to_string(),
property_value.text().to_string(),
);
}
));
property_value.connect_changed(
glib::clone!(@weak property_name, @weak property_value, @strong update_properties=> move |_| {
update_properties.borrow_mut().insert(property_name.text().to_string(), property_value.text().to_string());
}),
property_value.connect_changed(glib::clone!(
#[weak]
property_name,
#[weak]
property_value,
#[strong]
update_properties,
move |_| {
update_properties.borrow_mut().insert(
property_name.text().to_string(),
property_value.text().to_string(),
);
}
));
grid.attach(&label, 0, i, 1, 1);
grid.attach(&property_name, 1, i, 1, 1);
grid.attach(&property_value, 2, i, 1, 1);
@ -284,13 +319,17 @@ pub fn display_pad_properties(
&format!("{port_name} properties from {element_name}"),
app,
&grid,
glib::clone!(@strong update_properties => move |app, dialog| {
glib::clone!(
#[strong]
update_properties,
move |app, dialog| {
for p in update_properties.borrow().values() {
GPS_INFO!("updated properties {}", p);
}
app.update_pad_properties(node_id, port_id, &update_properties.borrow());
dialog.close();
}),
}
),
);
dialog.show();