pnmixer-rust/src/app_state.rs

107 lines
2.6 KiB
Rust
Raw Normal View History

2017-07-01 22:03:21 +00:00
use audio::Audio;
2017-07-05 22:14:24 +00:00
use gtk;
use prefs::Prefs;
2017-07-04 19:15:11 +00:00
use ui_tray_icon::TrayIcon;
2017-07-05 22:14:24 +00:00
use std::cell::RefCell;
2017-07-02 16:11:56 +00:00
2017-06-27 22:23:12 +00:00
2017-06-28 15:53:19 +00:00
2017-06-30 15:24:26 +00:00
// TODO: destructors
2017-06-29 12:55:07 +00:00
2017-06-29 13:50:24 +00:00
// TODO: glade stuff, config, alsacard
2017-06-27 22:23:12 +00:00
pub struct AppS {
2017-06-30 15:24:26 +00:00
pub gui: Gui,
2017-07-01 22:03:21 +00:00
pub audio: Audio,
2017-07-05 22:14:24 +00:00
pub prefs: RefCell<Prefs>,
2017-06-30 15:24:26 +00:00
}
impl AppS {
pub fn new() -> AppS {
2017-07-06 14:53:19 +00:00
let builder_popup_window = gtk::Builder::new_from_string(include_str!(
"../data/ui/popup-window.glade"
));
let builder_popup_menu = gtk::Builder::new_from_string(
include_str!("../data/ui/popup-menu.glade"),
);
2017-07-05 22:14:24 +00:00
let prefs = RefCell::new(Prefs::new().unwrap());
let gui =
Gui::new(builder_popup_window, builder_popup_menu, &prefs.borrow());
2017-07-02 17:08:17 +00:00
2017-06-30 15:24:26 +00:00
return AppS {
2017-07-06 14:53:19 +00:00
gui: gui,
audio: Audio::new(None, Some(String::from("Master"))).unwrap(),
prefs: prefs,
};
2017-06-30 15:24:26 +00:00
}
}
pub struct Gui {
2017-07-04 19:15:11 +00:00
pub tray_icon: TrayIcon,
2017-06-30 15:24:26 +00:00
pub popup_window: PopupWindow,
2017-07-06 14:53:19 +00:00
pub popup_menu: PopupMenu,
/* prefs_dialog is dynamically created and destroyed,
* not part of the global app-state */
pub prefs_dialog: RefCell<Option<PrefsDialog>>,
2017-06-30 15:24:26 +00:00
}
impl Gui {
2017-07-06 14:53:19 +00:00
pub fn new(
builder_popup_window: gtk::Builder,
builder_popup_menu: gtk::Builder,
prefs: &Prefs,
) -> Gui {
2017-06-30 15:24:26 +00:00
return Gui {
2017-07-06 14:53:19 +00:00
tray_icon: TrayIcon::new(prefs).unwrap(),
popup_window: PopupWindow::new(builder_popup_window),
popup_menu: PopupMenu::new(builder_popup_menu),
prefs_dialog: RefCell::new(None),
};
2017-06-30 15:24:26 +00:00
}
}
2017-07-06 14:53:19 +00:00
create_builder_item!(
PopupWindow,
popup_window: gtk::Window,
vol_scale_adj: gtk::Adjustment,
vol_scale: gtk::Scale,
mute_check: gtk::CheckButton
);
2017-07-02 16:11:56 +00:00
2017-07-06 14:53:19 +00:00
create_builder_item!(
PopupMenu,
menu_window: gtk::Window,
menubar: gtk::MenuBar,
menu: gtk::Menu,
about_item: gtk::MenuItem,
prefs_item: gtk::MenuItem
);
pub struct PrefsDialog {
pub prefs_dialog: gtk::Dialog,
pub card_combo: gtk::ComboBoxText,
pub chan_combo: gtk::ComboBoxText,
pub response_callback: Box<Fn(PrefsDialog, i64)>,
}
impl PrefsDialog {
pub fn new(
response_callback: Box<Fn(PrefsDialog, i64)>,
) -> PrefsDialog {
let builder = gtk::Builder::new_from_string(
include_str!("../data/ui/prefs-dialog.glade"),
);
return PrefsDialog {
prefs_dialog: builder.get_object("prefs_dialog").unwrap(),
card_combo: builder.get_object("card_combo").unwrap(),
chan_combo: builder.get_object("chan_combo").unwrap(),
response_callback,
};
}
}