mirror of
https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio.git
synced 2024-11-25 02:21:00 +00:00
GPS: Add a dialog to select the elements
This dialog allows to select and see element and its details.
This commit is contained in:
parent
859f936796
commit
6351f1f43f
4 changed files with 127 additions and 57 deletions
51
src/gps.ui
51
src/gps.ui
|
@ -36,57 +36,6 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkDialog" id="dialog-add-plugin">
|
|
||||||
<property name="can-focus">False</property>
|
|
||||||
<property name="default-width">320</property>
|
|
||||||
<property name="default-height">260</property>
|
|
||||||
<property name="type-hint">dialog</property>
|
|
||||||
<child internal-child="vbox">
|
|
||||||
<object class="GtkBox">
|
|
||||||
<property name="can-focus">False</property>
|
|
||||||
<property name="orientation">vertical</property>
|
|
||||||
<property name="spacing">2</property>
|
|
||||||
<child internal-child="action_area">
|
|
||||||
<object class="GtkButtonBox">
|
|
||||||
<property name="can-focus">False</property>
|
|
||||||
<property name="layout-style">end</property>
|
|
||||||
<child>
|
|
||||||
<placeholder/>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<placeholder/>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkScrolledWindow">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can-focus">True</property>
|
|
||||||
<property name="shadow-type">in</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkTreeView">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can-focus">True</property>
|
|
||||||
<child internal-child="selection">
|
|
||||||
<object class="GtkTreeSelection"/>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<object class="GtkFileChooserDialog" id="dialog-open-file">
|
<object class="GtkFileChooserDialog" id="dialog-open-file">
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="type-hint">dialog</property>
|
<property name="type-hint">dialog</property>
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
mod mainwindow;
|
mod mainwindow;
|
||||||
mod pipeline;
|
mod pipeline;
|
||||||
|
mod pluginlistwindow;
|
||||||
|
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -9,6 +9,7 @@ use std::cell::RefCell;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use crate::pipeline::Pipeline;
|
use crate::pipeline::Pipeline;
|
||||||
|
use crate::pluginlistwindow;
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
struct Element {
|
struct Element {
|
||||||
name: String,
|
name: String,
|
||||||
|
@ -68,15 +69,12 @@ pub fn build_ui(application: >k::Application) {
|
||||||
let add_button: Button = builder
|
let add_button: Button = builder
|
||||||
.object("button-add-plugin")
|
.object("button-add-plugin")
|
||||||
.expect("Couldn't get app_button");
|
.expect("Couldn't get app_button");
|
||||||
let add_dialog: Dialog = builder
|
|
||||||
.object("dialog-add-plugin")
|
|
||||||
.expect("Couldn't get window");
|
|
||||||
add_button.connect_clicked(glib::clone!(@weak window => move |_| {
|
add_button.connect_clicked(glib::clone!(@weak window => move |_| {
|
||||||
// entry.set_text("Clicked!");
|
// entry.set_text("Clicked!");
|
||||||
let pipeline = Pipeline::new();
|
let pipeline = Pipeline::new();
|
||||||
Pipeline::get_elements_list().expect("cocuou");
|
let elements = Pipeline::get_elements_list().expect("cocuou");
|
||||||
add_dialog.connect_response(|dialog, _| dialog.close());
|
pluginlistwindow::build_plugin_list(&window, &elements);
|
||||||
add_dialog.show_all();
|
|
||||||
}));
|
}));
|
||||||
// Create a dialog to open a file
|
// Create a dialog to open a file
|
||||||
let open_button: Button = builder
|
let open_button: Button = builder
|
||||||
|
|
121
src/pluginlistwindow.rs
Normal file
121
src/pluginlistwindow.rs
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
use crate::pipeline::ElementInfo;
|
||||||
|
use gtk::{
|
||||||
|
glib::{self, clone},
|
||||||
|
prelude::*,
|
||||||
|
ResponseType,
|
||||||
|
};
|
||||||
|
|
||||||
|
use gtk::{
|
||||||
|
ApplicationWindow, CellRendererText, Dialog, Label, ListStore, Orientation, TreeView,
|
||||||
|
TreeViewColumn, WindowPosition,
|
||||||
|
};
|
||||||
|
|
||||||
|
fn create_and_fill_model(elements: &Vec<ElementInfo>) -> ListStore {
|
||||||
|
// Creation of a model with two rows.
|
||||||
|
let model = ListStore::new(&[u32::static_type(), String::static_type()]);
|
||||||
|
|
||||||
|
// Filling up the tree view.
|
||||||
|
for (i, entry) in elements.iter().enumerate() {
|
||||||
|
model.insert_with_values(
|
||||||
|
None,
|
||||||
|
&[(0, &(i as u32 + 1)), (1, &entry.name.as_ref().unwrap())],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
model
|
||||||
|
}
|
||||||
|
|
||||||
|
fn append_column(tree: &TreeView, id: i32) {
|
||||||
|
let column = TreeViewColumn::new();
|
||||||
|
let cell = CellRendererText::new();
|
||||||
|
|
||||||
|
column.pack_start(&cell, true);
|
||||||
|
// Association of the view's column with the model's `id` column.
|
||||||
|
column.add_attribute(&cell, "text", id);
|
||||||
|
tree.append_column(&column);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_and_setup_view() -> TreeView {
|
||||||
|
// Creating the tree view.
|
||||||
|
let tree = TreeView::new();
|
||||||
|
|
||||||
|
tree.set_headers_visible(false);
|
||||||
|
// Creating the two columns inside the view.
|
||||||
|
append_column(&tree, 0);
|
||||||
|
append_column(&tree, 1);
|
||||||
|
tree
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build_plugin_list(window: &ApplicationWindow, elements: &Vec<ElementInfo>) {
|
||||||
|
let dialog = gtk::Dialog::with_buttons(
|
||||||
|
Some("Edit Item"),
|
||||||
|
Some(window),
|
||||||
|
gtk::DialogFlags::MODAL,
|
||||||
|
&[("Close", ResponseType::Close)],
|
||||||
|
);
|
||||||
|
dialog.set_title("Plugin list");
|
||||||
|
dialog.set_position(WindowPosition::Center);
|
||||||
|
dialog.set_default_size(640, 480);
|
||||||
|
|
||||||
|
// Creating a vertical layout to place both tree view and label in the window.
|
||||||
|
let vertical_layout = gtk::Box::new(Orientation::Vertical, 0);
|
||||||
|
|
||||||
|
// Creation of the label.
|
||||||
|
let label = Label::new(Some(""));
|
||||||
|
|
||||||
|
let tree = create_and_setup_view();
|
||||||
|
|
||||||
|
let model = create_and_fill_model(elements);
|
||||||
|
// Setting the model into the view.
|
||||||
|
tree.set_model(Some(&model));
|
||||||
|
|
||||||
|
// Adding the view to the layout.
|
||||||
|
vertical_layout.add(&tree);
|
||||||
|
// Same goes for the label.
|
||||||
|
vertical_layout.add(&label);
|
||||||
|
|
||||||
|
// The closure responds to selection changes by connection to "::cursor-changed" signal,
|
||||||
|
// that gets emitted when the cursor moves (focus changes).
|
||||||
|
tree.connect_cursor_changed(clone!(@weak dialog => move |tree_view| {
|
||||||
|
let selection = tree_view.selection();
|
||||||
|
if let Some((model, iter)) = selection.selected() {
|
||||||
|
// Now getting back the values from the row corresponding to the
|
||||||
|
// iterator `iter`.
|
||||||
|
//
|
||||||
|
// The `get_value` method do the conversion between the gtk type and Rust.
|
||||||
|
label.set_text(&format!(
|
||||||
|
"Hello '{}' from row {}",
|
||||||
|
model
|
||||||
|
.value(&iter, 1)
|
||||||
|
.get::<String>()
|
||||||
|
.expect("Treeview selection, column 1"),
|
||||||
|
model
|
||||||
|
.value(&iter, 0)
|
||||||
|
.get::<u32>()
|
||||||
|
.expect("Treeview selection, column 0"),
|
||||||
|
));
|
||||||
|
println!(
|
||||||
|
"{}",
|
||||||
|
model
|
||||||
|
.value(&iter, 1)
|
||||||
|
.get::<String>()
|
||||||
|
.expect("Treeview selection, column 1")
|
||||||
|
);
|
||||||
|
|
||||||
|
let element_name = model
|
||||||
|
.value(&iter, 1)
|
||||||
|
.get::<String>()
|
||||||
|
.expect("Treeview selection, column 1");
|
||||||
|
//dialog.close();
|
||||||
|
println!("{}", element_name);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Adding the layout to the window.
|
||||||
|
let content_area = dialog.content_area();
|
||||||
|
let scrolled_window = gtk::ScrolledWindow::new(gtk::NONE_ADJUSTMENT, gtk::NONE_ADJUSTMENT);
|
||||||
|
scrolled_window.add(&vertical_layout);
|
||||||
|
content_area.add(&scrolled_window);
|
||||||
|
|
||||||
|
dialog.connect_response(|dialog, _| dialog.close());
|
||||||
|
dialog.show_all();
|
||||||
|
}
|
Loading…
Reference in a new issue