174 lines
4.1 KiB
Rust
174 lines
4.1 KiB
Rust
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::<Vec<_>>());
|
|
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<T>(b: >k::Builder, name: &str) -> T
|
|
where T: glib::object::IsA<glib::object::Object>
|
|
{
|
|
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
|