blob: c48c45daacf41a784dd88e523407a7eb0bff3b15 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
use gtk;
use gtk::prelude::*;
use std::cell::Cell;
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()));
let selected_mic: Cell<Option<u32>> = Cell::new(None);
try!(gtk::init().map_err(|_| "Failed to initialize GTK."));
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(move |dropdown: >k::ComboBoxText| {
selected_mic.set(dropdown.get_active_id().and_then(|id| id.parse().ok()));
println!("{}", selected_mic.get().unwrap());
});
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();
Inhibit(false)
});
window.show_all();
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: >k::ComboBoxText, microphones: Vec<(u32, String)>) {
for (index, name) in microphones {
dropdown.append(Some(format!("{}", index).as_ref()), name.as_ref());
}
}
|