From 789e3de93fa308dc142cdfdc18513923178597f6 Mon Sep 17 00:00:00 2001 From: Marrub Date: Fri, 1 Mar 2019 04:25:31 -0500 Subject: [PATCH] more tycho stuff --- .gitignore | 2 +- src/tycho/Cargo.toml | 2 +- src/tycho/buttons.rs | 48 ++++++++++ src/tycho/data/tycho.res | Bin 47160 -> 0 bytes src/tycho/data/tycho.xml | 197 ++++++++++++++++++++------------------- src/tycho/main.rs | 85 ++++++----------- src/tycho/map_draw.rs | 71 ++++++++++++++ src/tycho/windows.rs | 39 ++++++++ 8 files changed, 290 insertions(+), 154 deletions(-) create mode 100644 src/tycho/buttons.rs delete mode 100644 src/tycho/data/tycho.res create mode 100644 src/tycho/map_draw.rs create mode 100644 src/tycho/windows.rs diff --git a/.gitignore b/.gitignore index ed1e5e0..c445795 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ /target /out -data/*.res +*.res **/*.rs.bk Cargo.lock perf.data* diff --git a/src/tycho/Cargo.toml b/src/tycho/Cargo.toml index a06f161..3903586 100644 --- a/src/tycho/Cargo.toml +++ b/src/tycho/Cargo.toml @@ -21,7 +21,7 @@ gio-sys = "0.8" glib = "0.7" glib-sys = "0.8" gobject-sys = "0.8" -gtk = "0.6" +gtk = {version = "0.6", features = ["v3_16"]} gtk-sys = "0.8" pango = "0.6" pango-sys = "0.8" diff --git a/src/tycho/buttons.rs b/src/tycho/buttons.rs new file mode 100644 index 0000000..e38e715 --- /dev/null +++ b/src/tycho/buttons.rs @@ -0,0 +1,48 @@ +fn mk_btn_new(b: >k::Builder) +{ + let btn: gtk::MenuItem = get_obj(b, "btn-new"); + let tools: gtk::Window = get_obj(b, "win-map-tools"); + let view: gtk::Window = get_obj(b, "win-map-view"); + + btn.connect_activate(move |_| { + // TODO: actually make a new document + tools.show_all(); + view.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()); +} + +// EOF diff --git a/src/tycho/data/tycho.res b/src/tycho/data/tycho.res deleted file mode 100644 index 4d3ec3a3df24512b19b562364965a7982c97f77a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47160 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 - + - + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + False + Map View + 600 + 400 + + + + + + True + True + always + always + top-right + False + + + True + False + adj-map-horz + adj-map-vert + + + True + False + + + + + + + + True False /net/greyserv/maraiah/tycho/lines - + True False /net/greyserv/maraiah/tycho/points - + True False /net/greyserv/maraiah/tycho/polys - + False Tool Palette 250 True - True @@ -68,14 +110,14 @@ Author: Alison Sanderson False Geometry - + True False Points True - im_points + img-points - + Points Tool The tool that modifies points in the map. push-button @@ -87,14 +129,14 @@ Author: Alison Sanderson - + True False Lines True - im_lines + img-lines - + Lines Tool The tool which modifies line segments on the map. push-button @@ -107,14 +149,14 @@ Author: Alison Sanderson - + True False Polygons True - im_polys + img-polys - + Polygon Tool The tool which modifies polygon shapes on the map. push-button @@ -141,17 +183,16 @@ Author: Alison Sanderson - + Tycho Tool Palette Tycho's tool palette window. window - + False True - True dialog Tycho Map Editor Copyright © 2018-2019 Alison Sanderson @@ -184,18 +225,19 @@ Author: Alison Sanderson - + About Screen The about screen for Tycho. dialog - + False Tycho + False + 120 250 - True @@ -215,39 +257,30 @@ Author: Alison Sanderson True False - - gtk-new + True False + Create a new project. + _New Project True - True - - gtk-open + True False + Opens any type of project file. + _Open True - True - - gtk-save + True False + Saves the currently open project. + _Save True - True - - - - - gtk-save-as - True - False - True - True @@ -257,62 +290,12 @@ Author: Alison Sanderson - - gtk-quit + True False + Quit the application. + _Quit True - True - - - - - - - - - True - False - _Edit - True - - - True - False - - - gtk-cut - True - False - True - True - - - - - gtk-copy - True - False - True - True - - - - - gtk-paste - True - False - True - True - - - - - gtk-delete - True - False - True - True @@ -325,6 +308,30 @@ Author: Alison Sanderson False _View True + + + True + False + + + True + False + Opens the map view window. + Show _Map View + True + + + + + True + False + Opens the map toolbox window. + Show Map _Tools + True + + + + @@ -345,12 +352,12 @@ Author: Alison Sanderson True False - - gtk-about + True False + Opens a window with information about this program. + _About True - True diff --git a/src/tycho/main.rs b/src/tycho/main.rs index 204a322..54680c1 100644 --- a/src/tycho/main.rs +++ b/src/tycho/main.rs @@ -1,53 +1,38 @@ -use gtk::prelude::*; +use gdk::prelude::*; use gio::prelude::*; +use gtk::prelude::*; use maraiah::durandal::err::*; -fn run_app(app: >k::Application) -> ResultS<()> +include!("windows.rs"); +include!("buttons.rs"); +include!("map_draw.rs"); + +fn run_app(app: >k::Application) { - fn load_img(path: &'static str) -> ResultS - { - Ok(gdk_pixbuf::Pixbuf::new_from_resource(path)?) - } - - fn get_obj(b: >k::Builder, name: &str) -> ResultS - where T: glib::object::IsA - { - match b.get_object(name) { - Some(w) => Ok(w), - None => Err(err_msg("no object")), - } - } - + // one fallible call, which should never fail anyhow 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")?; + mk_btn_new(&b); + 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); +} - let authors: Vec<_> = env!("CARGO_PKG_AUTHORS").split(';').collect(); +fn load_img(path: &'static str) -> gdk_pixbuf::Pixbuf +{ + gdk_pixbuf::Pixbuf::new_from_resource(path).unwrap() +} - 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 get_obj(b: >k::Builder, name: &str) -> T + where T: glib::object::IsA +{ + b.get_object(name).unwrap() } fn main() -> ResultS<()> @@ -69,21 +54,7 @@ fn main() -> ResultS<()> 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::<>k::Window>, - gtk::DialogFlags::empty(), - gtk::MessageType::Error, - gtk::ButtonsType::Ok, - &format!("{:?}", e)).run(); - } - } - }); + app.connect_activate(run_app); let ret = if app.run(&[]) == 0 { Ok(()) diff --git a/src/tycho/map_draw.rs b/src/tycho/map_draw.rs new file mode 100644 index 0000000..626c3c5 --- /dev/null +++ b/src/tycho/map_draw.rs @@ -0,0 +1,71 @@ +fn draw_clear(cr: &cairo::Context, w: f64, h: f64) +{ + use cairo::{FontSlant, FontWeight}; + + // set up for text + cr.select_font_face("Sans", FontSlant::Normal, FontWeight::Normal); + cr.set_font_size(14.0); + + // clear view + cr.set_source_rgb(0.0, 0.0, 0.0); + cr.rectangle(0.0, 0.0, w, h); + cr.fill(); +} + +fn draw_map_none(cr: &cairo::Context, im: &gdk_pixbuf::Pixbuf, w: f64, h: f64) +{ + let im_w = f64::from(im.get_width()); + let im_h = f64::from(im.get_height()); + + // draw middle image + cr.set_source_pixbuf(im, w / 2.0 - im_w / 2.0, h / 2.0 - im_h / 2.0); + cr.paint(); + + // draw top border (these are separate so the bottom draws over the top) + cr.set_source_rgb(0.28, 0.0, 0.0); + cr.rectangle(0.0, 0.0, w, 18.0); + cr.fill(); + + // draw top text + cr.set_source_rgb(1.0, 0.0, 0.0); + cr.move_to(4.0, 14.0); + cr.show_text("Map Required To Proceed"); + + // draw bottom border + cr.set_source_rgb(0.28, 0.0, 0.0); + cr.rectangle(0.0, h - 18.0, w, h); + cr.fill(); + + // draw bottom text + cr.set_source_rgb(1.0, 0.0, 0.0); + cr.move_to(4.0, h - 4.0); + cr.show_text("CAS.qterm//CyberAcme Systems Inc."); +} + +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"); + + let im = load_img("/net/greyserv/maraiah/tycho/tycho1"); + + 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); + + draw_clear(&cr, w, h); + draw_map_none(&cr, &im, w, h); + + Inhibit(true) + }); +} + +// EOF diff --git a/src/tycho/windows.rs b/src/tycho/windows.rs new file mode 100644 index 0000000..a995238 --- /dev/null +++ b/src/tycho/windows.rs @@ -0,0 +1,39 @@ +fn hide_on_delete(win: >k::Window, _: &gdk::Event) -> Inhibit +{ + win.hide(); + 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(); +} + +// EOF