summaryrefslogtreecommitdiff
path: root/src/gui.rs
diff options
context:
space:
mode:
authorJustin Worthe <justin.worthe@gmail.com>2016-10-23 14:01:46 +0200
committerJustin Worthe <justin.worthe@gmail.com>2016-10-23 14:01:46 +0200
commit3b264ac05a532828e3ce8c035249903ca0a51ecd (patch)
treef08407e9a56bd406a6753bbb51f29c40f20fdfc3 /src/gui.rs
parent605095f3522bb2111de8dd3b9b2b9474549d9572 (diff)
Changed gui to use xml
Diffstat (limited to 'src/gui.rs')
-rw-r--r--src/gui.rs69
1 files changed, 52 insertions, 17 deletions
diff --git a/src/gui.rs b/src/gui.rs
index de8a322..bae29c2 100644
--- a/src/gui.rs
+++ b/src/gui.rs
@@ -1,29 +1,64 @@
use gtk;
use gtk::prelude::*;
+const GUI_XML: &'static str = r#"
+<interface>
+ <object class="GtkWindow" id="window">
+ <property name="title">Rusty Microphone</property>
+ <child>
+ <object class="GtkComboBoxText" id="dropdown">
+ </object>
+ </child>
+ </object>
+</interface>
+"#;
+
pub fn start_gui() -> Result<(), String> {
+ let pa = try!(::audio::init().map_err(|e| e.to_string()));
+ let microphones = try!(::audio::get_device_list(&pa).map_err(|e| e.to_string()));
+
try!(gtk::init().map_err(|_| "Failed to initialize GTK."));
-
- // Create the main window.
- let window = gtk::Window::new(gtk::WindowType::Toplevel);
- window.set_title("Musician Training");
-
- let pa = ::audio::init().expect("Could not init portaudio");
- let audio_devices = try!(::audio::get_device_list(&pa).map_err(|e| e.to_string()));
- let dropdown = gtk::ComboBoxText::new();
- for (index, name) in audio_devices {
- dropdown.append(Some(format!("{}", index).as_ref()), name.as_ref());
- }
- window.add(&dropdown);
- window.set_default_size(300, 300);
- window.show_all();
+ let gtk_builder = try!(create_window(microphones));
+
+ let dropdown: gtk::ComboBoxText = try!(
+ gtk_builder.get_object("dropdown")
+ .ok_or("GUI does not contain an object with id 'dropdown'")
+ );
+ dropdown.connect_changed(|ref dropdown| {
+ println!("{}", dropdown.get_active_id().unwrap());
+ //This callback can now mutate state on the same level as our
+ //other logic to get the list of microphones
+ });
+
+ gtk::main();
+ Ok(())
+}
+fn create_window(microphones: Vec<(u32, String)>) -> Result<gtk::Builder, String> {
+ let gtk_builder = gtk::Builder::new_from_string(GUI_XML);
+ let window: gtk::Window = try!(
+ gtk_builder.get_object("window")
+ .ok_or("GUI does not contain an object with id 'window'")
+ );
+ window.set_default_size(300, 300);
window.connect_delete_event(|_, _| {
gtk::main_quit();
- gtk::prelude::Inhibit(false)
+ Inhibit(false)
});
+ window.show_all();
- gtk::main();
- Ok(())
+ let dropdown: gtk::ComboBoxText = try!(
+ gtk_builder.get_object("dropdown")
+ .ok_or("GUI does not contain an object with id 'dropdown'")
+ );
+ set_dropdown_items(&dropdown, microphones);
+
+ Ok(gtk_builder)
+}
+
+fn set_dropdown_items(dropdown: &gtk::ComboBoxText, microphones: Vec<(u32, String)>) {
+ for (index, name) in microphones {
+ dropdown.append(Some(format!("{}", index).as_ref()), name.as_ref());
+ }
}