mod hiddenprotocol; mod noroom; mod stoneage; use crate::hiddenprotocol::*; use crate::noroom::*; use crate::stoneage::*; //use gdk::prelude::*; use gio::prelude::*; use gtk::prelude::*; use maraiah::durandal::err::*; use maraiah::durandal::image::*; fn hide_on_delete(win: >k::Window, _: &gdk::Event) -> Inhibit { win.hide(); Inhibit(true) } fn mk_draw_area(b: >k::Builder) { let area: gtk::DrawingArea = get_obj(b, "draw-area"); let ax: gtk::Adjustment = get_obj(b, "adj-map-horz"); let ay: gtk::Adjustment = get_obj(b, "adj-map-vert"); area.connect_draw(move |area, cr| { let w = f64::from(area.get_allocated_width()); let h = f64::from(area.get_allocated_height()); ax.set_lower(0.0); ax.set_upper(w); ay.set_lower(0.0); ay.set_upper(h); let d = CairoDrawArea::new(cr.clone(), w, h); d.clear(Color16::new(0, 0, 0)); draw_map_none(&d); Inhibit(true) }); } fn mk_win_map_tools(b: >k::Builder) { let win: gtk::Window = get_obj(b, "win-map-tools"); win.connect_delete_event(hide_on_delete); } fn mk_win_map_view(b: >k::Builder) { let win: gtk::Window = get_obj(b, "win-map-view"); win.connect_delete_event(hide_on_delete); } fn mk_win_about(b: >k::Builder) { let win: gtk::AboutDialog = get_obj(b, "win-about"); win.set_authors(&env!("CARGO_PKG_AUTHORS").split(';').collect::>()); win.set_version(env!("CARGO_PKG_VERSION")); win.set_website(env!("CARGO_PKG_HOMEPAGE")); win.set_logo(&load_img("/net/greyserv/maraiah/tycho/tycho2")); } fn mk_win_main(b: >k::Builder, app: >k::Application) { let win: gtk::Window = get_obj(b, "win-main"); win.set_application(app); win.show_all(); } fn mk_btn_quit(b: >k::Builder, app: gtk::Application) { let btn: gtk::MenuItem = get_obj(b, "btn-quit"); btn.connect_activate(move |_| app.quit()); } fn mk_btn_about(b: >k::Builder) { let btn: gtk::MenuItem = get_obj(b, "btn-about"); let win: gtk::AboutDialog = get_obj(b, "win-about"); btn.connect_activate(move |_| { win.run(); win.hide(); }); } fn mk_btn_show_map_view(b: >k::Builder) { let btn: gtk::MenuItem = get_obj(b, "btn-show-map-view"); let win: gtk::Window = get_obj(b, "win-map-view"); btn.connect_activate(move |_| win.show_all()); } fn mk_btn_show_map_tools(b: >k::Builder) { let btn: gtk::MenuItem = get_obj(b, "btn-show-map-tools"); let win: gtk::Window = get_obj(b, "win-map-tools"); btn.connect_activate(move |_| win.show_all()); } fn run_app(app: >k::Application) { // one fallible call, which should never fail anyhow let b = gtk::Builder::new_from_resource("/net/greyserv/maraiah/tycho/ui"); mk_btn_quit(&b, app.clone()); mk_btn_about(&b); mk_btn_show_map_view(&b); mk_btn_show_map_tools(&b); mk_draw_area(&b); mk_win_map_tools(&b); mk_win_map_view(&b); mk_win_about(&b); mk_win_main(&b, app); } fn load_img(path: &'static str) -> gdk_pixbuf::Pixbuf { gdk_pixbuf::Pixbuf::new_from_resource(path).unwrap() } fn get_obj(b: >k::Builder, name: &str) -> T where T: glib::object::IsA { b.get_object(name).unwrap() } 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(run_app); 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