Maraiah/src/tycho/main.rs

102 lines
3.1 KiB
Rust

use gtk::prelude::*;
use gio::prelude::*;
use maraiah::durandal::err::*;
fn run_app(app: &gtk::Application) -> ResultS<()>
{
fn load_img(path: &'static str) -> ResultS<gdk_pixbuf::Pixbuf>
{
Ok(gdk_pixbuf::Pixbuf::new_from_resource(path)?)
}
fn get_obj<T>(b: &gtk::Builder, name: &str) -> ResultS<T>
where T: glib::object::IsA<glib::object::Object>
{
match b.get_object(name) {
Some(w) => Ok(w),
None => Err(err_msg("no object")),
}
}
let b = gtk::Builder::new_from_resource("/net/greyserv/maraiah/tycho/ui");
let win_menus: gtk::Window = get_obj(&b, "win_menus")?;
let win_tools: gtk::Window = get_obj(&b, "win_tools")?;
let win_about: gtk::AboutDialog = get_obj(&b, "win_about")?;
let btn_about: gtk::MenuItem = get_obj(&b, "btn_about")?;
//t draw_area: gtk::DrawingArea = get_obj(&b, "draw_area")?;
//t btn_point: gtk::ToolButton = get_obj(&b, "btn_point")?;
//t btn_lines: gtk::ToolButton = get_obj(&b, "btn_lines")?;
//t btn_polys: gtk::ToolButton = get_obj(&b, "btn_polys")?;
let authors: Vec<_> = env!("CARGO_PKG_AUTHORS").split(';').collect();
win_about.set_authors(&authors);
win_about.set_version(env!("CARGO_PKG_VERSION"));
win_about.set_website(env!("CARGO_PKG_HOMEPAGE"));
win_about.set_logo(&load_img("/net/greyserv/maraiah/tycho/tycho2")?);
btn_about.connect_activate(move |_| {
win_about.run();
win_about.hide();
});
win_tools.set_deletable(false);
win_tools.show_all();
win_menus.set_application(app);
win_menus.show_all();
Ok(())
}
fn main() -> ResultS<()>
{
// get jacked, punk. opaque data structures are for nerds.
const RESOURCE_DATA: &'static [u8] = include_bytes!("data/tycho.res");
let mut static_resource =
gio_sys::GStaticResource{data: RESOURCE_DATA.as_ptr(),
data_len: RESOURCE_DATA.len(),
resource: std::ptr::null_mut(),
next: std::ptr::null_mut(),
padding: std::ptr::null_mut()};
unsafe {
gio_sys::g_static_resource_init(&mut static_resource);
}
let app = gtk::Application::new("net.greyserv.maraiah.tycho",
gio::ApplicationFlags::empty())?;
app.connect_activate(|app| {
match run_app(app) {
Ok(()) => (),
Err(e) => {
// print out an error if init failed somehow, otherwise the main
// loop will proceed as normal (this is just to prevent panics in
// weird circumstances such as breaking the builder while devving)
gtk::MessageDialog::new(None::<&gtk::Window>,
gtk::DialogFlags::empty(),
gtk::MessageType::Error,
gtk::ButtonsType::Ok,
&format!("{:?}", e)).run();
}
}
});
let ret = if app.run(&[]) == 0 {
Ok(())
} else {
Err(err_msg("bad return"))
};
unsafe {
gio_sys::g_static_resource_fini(&mut static_resource);
}
ret
}
// EOF