mirror of
https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio.git
synced 2024-12-19 22:46:28 +00:00
app: add an element notebook for all and favorites
Can now see all elements and favorites from the main window
This commit is contained in:
parent
8f83721047
commit
7f4a4b438d
4 changed files with 99 additions and 31 deletions
65
src/app.rs
65
src/app.rs
|
@ -22,9 +22,9 @@ use glib::Value;
|
||||||
use gtk::gdk::Rectangle;
|
use gtk::gdk::Rectangle;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::{
|
use gtk::{
|
||||||
gdk::BUTTON_SECONDARY, Application, ApplicationWindow, Builder, Button, CellRendererText,
|
gdk::BUTTON_SECONDARY, Application, ApplicationWindow, Box, Builder, Button, CellRendererText,
|
||||||
FileChooserAction, FileChooserDialog, ListStore, Paned, PopoverMenu, ResponseType, Statusbar,
|
FileChooserAction, FileChooserDialog, ListStore, Paned, PopoverMenu, ResponseType, Statusbar,
|
||||||
TreeView, TreeViewColumn, Viewport, Widget,
|
TextView, TreeView, TreeViewColumn, Viewport, Widget,
|
||||||
};
|
};
|
||||||
use gtk::{gio, gio::SimpleAction, glib, graphene};
|
use gtk::{gio, gio::SimpleAction, glib, graphene};
|
||||||
use log::error;
|
use log::error;
|
||||||
|
@ -415,19 +415,19 @@ impl GPSApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_favorite_list(&self, application: &Application) {
|
fn setup_favorite_list(&self) {
|
||||||
let favorite_list: TreeView = self
|
let favorite_list: TreeView = self
|
||||||
.builder
|
.builder
|
||||||
.object("treeview-favorites")
|
.object("treeview-favorites")
|
||||||
.expect("Couldn't get treeview-favorites");
|
.expect("Couldn't get treeview-favorites");
|
||||||
self.add_column_to_treeview("treeview-favorites", "Element", 0);
|
self.add_column_to_treeview("treeview-favorites", "Name", 0);
|
||||||
self.reset_favorite_list(&favorite_list);
|
self.reset_favorite_list(&favorite_list);
|
||||||
let app_weak = self.downgrade();
|
let app_weak = self.downgrade();
|
||||||
favorite_list.connect_row_activated(move |tree_view, _tree_path, _tree_column| {
|
favorite_list.connect_row_activated(move |tree_view, _tree_path, _tree_column| {
|
||||||
let app = upgrade_weak!(app_weak);
|
let app = upgrade_weak!(app_weak);
|
||||||
let selection = tree_view.selection();
|
let selection = tree_view.selection();
|
||||||
if let Some((model, iter)) = selection.selected() {
|
if let Some((model, iter)) = selection.selected() {
|
||||||
let element_name = model.get::<String>(&iter, 1);
|
let element_name = model.get::<String>(&iter, 0);
|
||||||
GPS_DEBUG!("{} selected", element_name);
|
GPS_DEBUG!("{} selected", element_name);
|
||||||
app.add_new_element(&element_name);
|
app.add_new_element(&element_name);
|
||||||
}
|
}
|
||||||
|
@ -436,13 +436,13 @@ impl GPSApp {
|
||||||
gesture.set_button(0);
|
gesture.set_button(0);
|
||||||
let app_weak = self.downgrade();
|
let app_weak = self.downgrade();
|
||||||
gesture.connect_pressed(
|
gesture.connect_pressed(
|
||||||
glib::clone!(@weak favorite_list, @weak application => move |gesture, _n_press, x, y| {
|
glib::clone!(@weak favorite_list => move |gesture, _n_press, x, y| {
|
||||||
let app = upgrade_weak!(app_weak);
|
let app = upgrade_weak!(app_weak);
|
||||||
if gesture.current_button() == BUTTON_SECONDARY {
|
if gesture.current_button() == BUTTON_SECONDARY {
|
||||||
let selection = favorite_list.selection();
|
let selection = favorite_list.selection();
|
||||||
if let Some((model, iter)) = selection.selected() {
|
if let Some((model, iter)) = selection.selected() {
|
||||||
let element_name = model
|
let element_name = model
|
||||||
.get::<String>(&iter, 1);
|
.get::<String>(&iter, 0);
|
||||||
GPS_DEBUG!("Element {} selected", element_name);
|
GPS_DEBUG!("Element {} selected", element_name);
|
||||||
|
|
||||||
let pop_menu = app.app_pop_menu_at_position(&favorite_list, x, y);
|
let pop_menu = app.app_pop_menu_at_position(&favorite_list, x, y);
|
||||||
|
@ -487,6 +487,53 @@ impl GPSApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn reset_elements_list(&self, elements_list: &TreeView) {
|
||||||
|
let model = ListStore::new(&[String::static_type()]);
|
||||||
|
elements_list.set_model(Some(&model));
|
||||||
|
let elements = ElementInfo::elements_list().expect("Unable to obtain element's list");
|
||||||
|
for element in elements {
|
||||||
|
model.insert_with_values(None, &[(0, &element.name)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn setup_elements_list(&self) {
|
||||||
|
let tree: TreeView = self
|
||||||
|
.builder
|
||||||
|
.object("treeview-elements")
|
||||||
|
.expect("Couldn't get treeview-elements");
|
||||||
|
self.add_column_to_treeview("treeview-elements", "Name", 0);
|
||||||
|
self.reset_elements_list(&tree);
|
||||||
|
let app_weak = self.downgrade();
|
||||||
|
tree.connect_row_activated(move |tree_view, _tree_path, _tree_column| {
|
||||||
|
let app = upgrade_weak!(app_weak);
|
||||||
|
let selection = tree_view.selection();
|
||||||
|
if let Some((model, iter)) = selection.selected() {
|
||||||
|
let element_name = model.get::<String>(&iter, 0);
|
||||||
|
GPS_DEBUG!("{} selected", element_name);
|
||||||
|
app.add_new_element(&element_name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let app_weak = self.downgrade();
|
||||||
|
tree.connect_cursor_changed(move |tree_view| {
|
||||||
|
let selection = tree_view.selection();
|
||||||
|
if let Some((model, iter)) = selection.selected() {
|
||||||
|
let element_name = model.get::<String>(&iter, 0);
|
||||||
|
let description = ElementInfo::element_description(&element_name)
|
||||||
|
.expect("Unable to get element description from GStreamer");
|
||||||
|
let app = upgrade_weak!(app_weak);
|
||||||
|
let box_property: Box = app
|
||||||
|
.builder
|
||||||
|
.object("box-property")
|
||||||
|
.expect("Couldn't get treeview-elements");
|
||||||
|
let text_view = TextView::new();
|
||||||
|
let text_buffer = text_view.buffer();
|
||||||
|
text_buffer.set_text("");
|
||||||
|
text_buffer.insert_markup(&mut text_buffer.end_iter(), &description);
|
||||||
|
box_property.append(&text_view);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
pub fn display_plugin_list(app: &GPSApp) {
|
pub fn display_plugin_list(app: &GPSApp) {
|
||||||
let elements = ElementInfo::elements_list().expect("Unable to obtain element's list");
|
let elements = ElementInfo::elements_list().expect("Unable to obtain element's list");
|
||||||
plugindialogs::display_plugin_list(app, &elements);
|
plugindialogs::display_plugin_list(app, &elements);
|
||||||
|
@ -791,7 +838,9 @@ impl GPSApp {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Setup the favorite list
|
// Setup the favorite list
|
||||||
self.setup_favorite_list(application);
|
self.setup_favorite_list();
|
||||||
|
// Setup the favorite list
|
||||||
|
self.setup_elements_list();
|
||||||
|
|
||||||
let _ = self
|
let _ = self
|
||||||
.load_graph(
|
.load_graph(
|
||||||
|
|
40
src/gps.ui
40
src/gps.ui
|
@ -271,13 +271,45 @@
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="position">400</property>
|
<property name="position">400</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkScrolledWindow">
|
<object class="GtkNotebook" id="notebook-elements">
|
||||||
<property name="hexpand">True</property>
|
<child>
|
||||||
<property name="vexpand">True</property>
|
<object class="GtkNotebookPage">
|
||||||
<property name="child">
|
<property name="child">
|
||||||
<object class="GtkTreeView" id="treeview-favorites">
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="vexpand">True</property>
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkTreeView" id="treeview-elements">
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
</object>
|
</object>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="tab">
|
||||||
|
<object class="GtkLabel" id="label-page-elements">
|
||||||
|
<property name="label" translatable="1">Elements</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkNotebookPage">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="vexpand">True</property>
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkTreeView" id="treeview-favorites">
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<property name="tab">
|
||||||
|
<object class="GtkLabel" id="label-page-favorites">
|
||||||
|
<property name="label" translatable="1">Favorites</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|
|
@ -27,22 +27,13 @@ use gst::prelude::*;
|
||||||
use gstreamer as gst;
|
use gstreamer as gst;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)]
|
#[derive(Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
|
||||||
pub struct ElementInfo {
|
pub struct ElementInfo {
|
||||||
pub name: Option<String>,
|
pub name: String,
|
||||||
plugin_name: Option<String>,
|
plugin_name: String,
|
||||||
rank: i32,
|
rank: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for ElementInfo {
|
|
||||||
fn default() -> ElementInfo {
|
|
||||||
ElementInfo {
|
|
||||||
name: None,
|
|
||||||
plugin_name: None,
|
|
||||||
rank: -1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl ElementInfo {
|
impl ElementInfo {
|
||||||
pub fn elements_list() -> anyhow::Result<Vec<ElementInfo>> {
|
pub fn elements_list() -> anyhow::Result<Vec<ElementInfo>> {
|
||||||
let registry = gst::Registry::get();
|
let registry = gst::Registry::get();
|
||||||
|
@ -56,9 +47,8 @@ impl ElementInfo {
|
||||||
if let Ok(factory) = feature.downcast::<gst::ElementFactory>() {
|
if let Ok(factory) = feature.downcast::<gst::ElementFactory>() {
|
||||||
let feature = factory.upcast::<gst::PluginFeature>();
|
let feature = factory.upcast::<gst::PluginFeature>();
|
||||||
|
|
||||||
element.name = Some(gst::PluginFeature::name(&feature).as_str().to_owned());
|
element.name = gst::PluginFeature::name(&feature).as_str().to_owned();
|
||||||
element.plugin_name =
|
element.plugin_name = gst::Plugin::plugin_name(&plugin).as_str().to_owned();
|
||||||
Some(gst::Plugin::plugin_name(&plugin).as_str().to_owned());
|
|
||||||
elements.push(element);
|
elements.push(element);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,10 +37,7 @@ fn create_and_fill_model(elements: &[ElementInfo]) -> ListStore {
|
||||||
|
|
||||||
// Filling up the tree view.
|
// Filling up the tree view.
|
||||||
for (i, entry) in elements.iter().enumerate() {
|
for (i, entry) in elements.iter().enumerate() {
|
||||||
model.insert_with_values(
|
model.insert_with_values(None, &[(0, &(i as u32 + 1)), (1, &entry.name)]);
|
||||||
None,
|
|
||||||
&[(0, &(i as u32 + 1)), (1, &entry.name.as_ref().unwrap())],
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
model
|
model
|
||||||
|
|
Loading…
Reference in a new issue