mirror of
https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio.git
synced 2024-11-25 18:41:03 +00:00
GPS: introduce the graph object
The graph object stores information about the graphical representation of a gst pipeline including the element box, the pads and the connections.
This commit is contained in:
parent
05749a7009
commit
0851f0545b
4 changed files with 76 additions and 27 deletions
46
src/app.rs
46
src/app.rs
|
@ -27,14 +27,17 @@ use std::cell::RefCell;
|
||||||
use std::rc::{Rc, Weak};
|
use std::rc::{Rc, Weak};
|
||||||
use std::{error, ops};
|
use std::{error, ops};
|
||||||
|
|
||||||
|
use crate::graph::{Element, Graph};
|
||||||
use crate::pipeline::Pipeline;
|
use crate::pipeline::Pipeline;
|
||||||
use crate::pluginlistwindow;
|
use crate::pluginlistwindow;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct GPSAppInner {
|
pub struct GPSAppInner {
|
||||||
pub window: gtk::ApplicationWindow,
|
pub window: gtk::ApplicationWindow,
|
||||||
|
pub drawing_area: DrawingArea,
|
||||||
pub builder: Builder,
|
pub builder: Builder,
|
||||||
pipeline: Pipeline,
|
pub pipeline: RefCell<Pipeline>,
|
||||||
|
pub graph: RefCell<Graph>,
|
||||||
}
|
}
|
||||||
|
|
||||||
// This represents our main application window.
|
// This represents our main application window.
|
||||||
|
@ -63,12 +66,6 @@ impl GPSAppWeak {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
|
||||||
struct Element {
|
|
||||||
name: String,
|
|
||||||
position: (f64, f64),
|
|
||||||
size: (f64, f64),
|
|
||||||
}
|
|
||||||
fn draw_elements(elements: &Vec<Element>, c: &Context) {
|
fn draw_elements(elements: &Vec<Element>, c: &Context) {
|
||||||
for element in elements {
|
for element in elements {
|
||||||
c.rectangle(element.position.0, element.position.1, 80.0, 45.0);
|
c.rectangle(element.position.0, element.position.1, 80.0, 45.0);
|
||||||
|
@ -86,11 +83,13 @@ impl GPSApp {
|
||||||
window.set_position(WindowPosition::Center);
|
window.set_position(WindowPosition::Center);
|
||||||
window.set_size_request(800, 600);
|
window.set_size_request(800, 600);
|
||||||
let pipeline = Pipeline::new().expect("Unable to initialize the pipeline");
|
let pipeline = Pipeline::new().expect("Unable to initialize the pipeline");
|
||||||
|
let drawing_area = DrawingArea::new();
|
||||||
let app = GPSApp(Rc::new(GPSAppInner {
|
let app = GPSApp(Rc::new(GPSAppInner {
|
||||||
window,
|
window,
|
||||||
|
drawing_area,
|
||||||
builder,
|
builder,
|
||||||
pipeline,
|
pipeline: RefCell::new(pipeline),
|
||||||
|
graph: RefCell::new(Graph::default()),
|
||||||
}));
|
}));
|
||||||
Ok(app)
|
Ok(app)
|
||||||
}
|
}
|
||||||
|
@ -126,29 +125,31 @@ impl GPSApp {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_ui(&self) {
|
pub fn build_ui(&self) {
|
||||||
let drawing_area = DrawingArea::new();
|
|
||||||
let view_port: Viewport = self
|
let view_port: Viewport = self
|
||||||
.builder
|
.builder
|
||||||
.object("drawing_area")
|
.object("drawing_area")
|
||||||
.expect("Couldn't get window");
|
.expect("Couldn't get window");
|
||||||
let event_box = EventBox::new();
|
let event_box = EventBox::new();
|
||||||
event_box.add(&drawing_area);
|
event_box.add(&self.drawing_area);
|
||||||
view_port.add(&event_box);
|
view_port.add(&event_box);
|
||||||
let elements: Rc<RefCell<Vec<Element>>> = Rc::new(RefCell::new(vec![]));
|
|
||||||
let e_clone = elements.clone();
|
let app_weak = self.downgrade();
|
||||||
drawing_area.connect_draw(move |w, c| {
|
self.drawing_area.connect_draw(move |w, c| {
|
||||||
println!("w: {} c:{} e: {:?}", w, c, e_clone);
|
let app = upgrade_weak!(app_weak, gtk::Inhibit(false));
|
||||||
draw_elements(&e_clone.borrow().to_vec(), c);
|
println!("w: {} c:{}", w, c);
|
||||||
|
let mut graph = app.graph.borrow_mut();
|
||||||
|
let elements = graph.elements();
|
||||||
|
draw_elements(&elements, c);
|
||||||
gtk::Inhibit(false)
|
gtk::Inhibit(false)
|
||||||
});
|
});
|
||||||
|
let app_weak = self.downgrade();
|
||||||
event_box.connect_button_release_event(move |_w, evt| {
|
event_box.connect_button_release_event(move |_w, evt| {
|
||||||
let mut elements = elements.borrow_mut();
|
let app = upgrade_weak!(app_weak, gtk::Inhibit(false));
|
||||||
let mut element: Element = Default::default();
|
let mut element: Element = Default::default();
|
||||||
element.position.0 = evt.position().0;
|
element.position.0 = evt.position().0;
|
||||||
element.position.1 = evt.position().1;
|
element.position.1 = evt.position().1;
|
||||||
elements.push(element);
|
app.add_new_element(element);
|
||||||
drawing_area.queue_draw();
|
app.drawing_area.queue_draw();
|
||||||
gtk::Inhibit(false)
|
gtk::Inhibit(false)
|
||||||
});
|
});
|
||||||
let window = &self.window;
|
let window = &self.window;
|
||||||
|
@ -235,4 +236,9 @@ impl GPSApp {
|
||||||
|
|
||||||
// Called when the application shuts down. We drop our app struct here
|
// Called when the application shuts down. We drop our app struct here
|
||||||
fn drop(self) {}
|
fn drop(self) {}
|
||||||
|
|
||||||
|
pub fn add_new_element(&self, element: Element) {
|
||||||
|
self.graph.borrow_mut().add_element(element);
|
||||||
|
self.drawing_area.queue_draw();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
36
src/graph.rs
Normal file
36
src/graph.rs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#[derive(Debug, Clone, Default)]
|
||||||
|
pub struct Element {
|
||||||
|
pub name: String,
|
||||||
|
pub position: (f64, f64),
|
||||||
|
pub size: (f64, f64),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Graph {
|
||||||
|
elements: Vec<Element>,
|
||||||
|
last_x_position: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Graph {
|
||||||
|
fn default() -> Graph {
|
||||||
|
Graph {
|
||||||
|
elements: vec![],
|
||||||
|
last_x_position: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Graph {
|
||||||
|
pub fn elements(&mut self) -> &Vec<Element> {
|
||||||
|
&self.elements
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_element(&mut self, element: Element) {
|
||||||
|
self.elements.push(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn remove_element(&mut self, name: &str) {
|
||||||
|
let index = self.elements.iter().position(|x| x.name == name).unwrap();
|
||||||
|
self.elements.remove(index);
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,7 @@
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod macros;
|
mod macros;
|
||||||
mod app;
|
mod app;
|
||||||
|
mod graph;
|
||||||
mod pipeline;
|
mod pipeline;
|
||||||
mod pluginlistwindow;
|
mod pluginlistwindow;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::app::GPSApp;
|
use crate::app::GPSApp;
|
||||||
|
use crate::graph::Element;
|
||||||
use crate::pipeline::ElementInfo;
|
use crate::pipeline::ElementInfo;
|
||||||
use gtk::{
|
use gtk::{
|
||||||
glib::{self, clone},
|
glib::{self, clone},
|
||||||
|
@ -75,7 +76,9 @@ pub fn build_plugin_list(app: &GPSApp, elements: &Vec<ElementInfo>) {
|
||||||
|
|
||||||
// The closure responds to selection changes by connection to "::cursor-changed" signal,
|
// The closure responds to selection changes by connection to "::cursor-changed" signal,
|
||||||
// that gets emitted when the cursor moves (focus changes).
|
// that gets emitted when the cursor moves (focus changes).
|
||||||
|
let app_weak = app.downgrade();
|
||||||
tree.connect_cursor_changed(clone!(@weak dialog => move |tree_view| {
|
tree.connect_cursor_changed(clone!(@weak dialog => move |tree_view| {
|
||||||
|
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() {
|
||||||
// Now getting back the values from the row corresponding to the
|
// Now getting back the values from the row corresponding to the
|
||||||
|
@ -93,18 +96,21 @@ pub fn build_plugin_list(app: &GPSApp, elements: &Vec<ElementInfo>) {
|
||||||
.get::<u32>()
|
.get::<u32>()
|
||||||
.expect("Treeview selection, column 0"),
|
.expect("Treeview selection, column 0"),
|
||||||
));
|
));
|
||||||
println!(
|
let element = Element {
|
||||||
"{}",
|
name: model
|
||||||
model
|
|
||||||
.value(&iter, 1)
|
.value(&iter, 1)
|
||||||
.get::<String>()
|
.get::<String>()
|
||||||
.expect("Treeview selection, column 1")
|
.expect("Treeview selection, column 1"),
|
||||||
);
|
position: (100.0,100.0),
|
||||||
|
size: (100.0,100.0),
|
||||||
|
};
|
||||||
|
|
||||||
let element_name = model
|
let element_name = model
|
||||||
.value(&iter, 1)
|
.value(&iter, 1)
|
||||||
.get::<String>()
|
.get::<String>()
|
||||||
.expect("Treeview selection, column 1");
|
.expect("Treeview selection, column 1");
|
||||||
|
app.add_new_element(element);
|
||||||
|
|
||||||
//dialog.close();
|
//dialog.close();
|
||||||
println!("{}", element_name);
|
println!("{}", element_name);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue