From 52a8c6fe5ccfc4ceec128e0732a154c7a907edf0 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Wed, 11 Oct 2017 15:31:21 +0300 Subject: [PATCH] Getting a hang of list and tree stores. --- hammond-gtk/Cargo.toml | 3 +- hammond-gtk/gtk/foo.ui | 72 ++++++++++++++++++++++++++++------- hammond-gtk/src/main.rs | 84 ++++++++++++++++++++++++++++++++++------- 3 files changed, 131 insertions(+), 28 deletions(-) diff --git a/hammond-gtk/Cargo.toml b/hammond-gtk/Cargo.toml index dec53cd..01e4479 100644 --- a/hammond-gtk/Cargo.toml +++ b/hammond-gtk/Cargo.toml @@ -7,4 +7,5 @@ authors = ["Jordan Petridis "] gtk = { version = "0.2", features = ["v3_22"]} glib = "0.3" gdk-pixbuf = "0.2" -hammond-data = {path = "../hammond-data"} \ No newline at end of file +hammond-data = {path = "../hammond-data"} +diesel = { version = "0.16", features = ["sqlite"] } \ No newline at end of file diff --git a/hammond-gtk/gtk/foo.ui b/hammond-gtk/gtk/foo.ui index 0c2f3f1..2b9eb9d 100644 --- a/hammond-gtk/gtk/foo.ui +++ b/hammond-gtk/gtk/foo.ui @@ -21,20 +21,6 @@ 3 - - - gtk-refresh - True - True - True - True - True - True - - - end - - gtk-add @@ -65,6 +51,21 @@ 2 + + + gtk-refresh + True + True + True + True + True + True + + + end + 1 + + False @@ -131,4 +132,47 @@ + + False + 800 + 400 + + + True + False + vertical + + + True + True + in + + + True + False + + + True + False + vertical + + + + + + + + + + True + True + 0 + + + + + + + + diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index 2097699..30c3c92 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -1,12 +1,15 @@ // extern crate glib; +extern crate diesel; extern crate gtk; // extern crate gdk_pixbuf; extern crate hammond_data; +use diesel::prelude::*; use gtk::prelude::*; use gtk::Orientation; use gtk::IconSize; -// use gtk::{CellRendererText, TreeStore, TreeView, TreeViewColumn}; +use gtk::Type; +use gtk::{CellRendererText, TreeStore, TreeView, TreeViewColumn}; use hammond_data::dbqueries; @@ -23,27 +26,77 @@ fn create_child(name: &str) -> gtk::Box { box_ } +fn create_list_store(connection: &SqliteConnection) -> gtk::ListStore { + let podcast_model = gtk::ListStore::new(&[Type::String, Type::String, Type::String]); + + let podcasts = dbqueries::get_podcasts(connection).unwrap(); + + for pd in &podcasts { + podcast_model.insert_with_values( + None, + &[0, 1, 2], + &[&pd.title(), &pd.description(), &pd.link()], + ); + } + + podcast_model +} + +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. + 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", 0); + tree.append_column(&column); + + let column = TreeViewColumn::new(); + let cell = CellRendererText::new(); + + column.pack_start(&cell, true); + column.add_attribute(&cell, "text", 1); + tree.append_column(&column); + + let column = TreeViewColumn::new(); + let cell = CellRendererText::new(); + + column.pack_start(&cell, true); + column.add_attribute(&cell, "text", 2); + tree.append_column(&column); + + tree +} + fn main() { if gtk::init().is_err() { println!("Failed to initialize GTK."); return; } + hammond_data::init().unwrap(); // Adapted copy of the way gnome-music does albumview let glade_src = include_str!("../gtk/foo.ui"); let builder = gtk::Builder::new_from_string(glade_src); // Get the main window - let window: gtk::Window = builder.get_object("window1").unwrap(); + // let window: gtk::Window = builder.get_object("window1").unwrap(); + let window: gtk::Window = builder.get_object("window2").unwrap(); // Get the headerbar let header: gtk::HeaderBar = builder.get_object("headerbar1").unwrap(); window.set_titlebar(&header); let refresh_button: gtk::Button = builder.get_object("refbutton").unwrap(); // TODO: Have a small dropdown menu - let add_button: gtk::Button = builder.get_object("addbutton").unwrap(); - let search_button: gtk::Button = builder.get_object("searchbutton").unwrap(); - let home_button: gtk::Button = builder.get_object("homebutton").unwrap(); + let _add_button: gtk::Button = builder.get_object("addbutton").unwrap(); + let _search_button: gtk::Button = builder.get_object("searchbutton").unwrap(); + let _home_button: gtk::Button = builder.get_object("homebutton").unwrap(); // FIXME: This locks the ui atm. refresh_button.connect_clicked(|_| { @@ -57,16 +110,21 @@ fn main() { Inhibit(false) }); - let flowbox: gtk::FlowBox = builder.get_object("flowbox1").unwrap(); - - // TODO: This should be in a TreeStore. + // let flowbox: gtk::FlowBox = builder.get_object("flowbox1").unwrap(); let db = hammond_data::establish_connection(); - let podcasts = dbqueries::get_podcasts(&db).unwrap(); + let pd_model = create_list_store(&db); + // let podcasts = dbqueries::get_podcasts(&db).unwrap(); - for pd in &podcasts { - let f = create_child(pd.title()); - flowbox.add(&f); - } + // for pd in &podcasts { + // // TODO: This should be in a TreeStore. + // let f = create_child(pd.title()); + // flowbox.add(&f); + // } + let box2: gtk::Box = builder.get_object("box2").unwrap(); + + let treeview = create_and_setup_view(); + treeview.set_model(Some(&pd_model)); + box2.add(&treeview); window.show_all(); gtk::main();