aboutsummaryrefslogtreecommitdiff
path: root/src/client/mod.rs
diff options
context:
space:
mode:
authorArne Dußin2021-01-27 14:01:50 +0100
committerArne Dußin2021-02-02 22:16:15 +0100
commitf92e9f6f07b1e3834c2ca58ce3510734819d08e4 (patch)
tree20e3d3afce342a56ae98f6c20491482ccd2b5c6b /src/client/mod.rs
parentc60a6d07efb120724b308e29e8e70f27c87c952d (diff)
downloadgraf_karto-f92e9f6f07b1e3834c2ca58ce3510734819d08e4.tar.gz
graf_karto-f92e9f6f07b1e3834c2ca58ce3510734819d08e4.zip
Rework graf karto to fit the client/server structure
Diffstat (limited to 'src/client/mod.rs')
-rw-r--r--src/client/mod.rs137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/client/mod.rs b/src/client/mod.rs
new file mode 100644
index 0000000..9151d82
--- /dev/null
+++ b/src/client/mod.rs
@@ -0,0 +1,137 @@
+pub mod cli;
+pub mod colours;
+pub mod config;
+pub mod editor;
+pub mod grid;
+pub mod gui;
+pub mod input;
+pub mod map;
+pub mod snapping;
+pub mod svg;
+pub mod tool;
+pub mod transform;
+
+use crate::net::Connection;
+use cli::CLI;
+use config::Config;
+use editor::Editor;
+use float_cmp::F64Margin;
+use gui::{DimensionIndicator, ToolSidebar};
+use input::Input;
+use raylib::prelude::*;
+use snapping::Snapper;
+use std::ffi::CString;
+use std::io;
+use std::net::{SocketAddr, TcpStream};
+use transform::Transform;
+
+/// Location of the file containing the style used for the raylib user interface.
+pub const GUI_STYLE: &str = "assets/style/cyber.rgs";
+/// Location of the graf karto configuration options file.
+pub const CONFIG_FILE: &str = "config.ron";
+
+/// The acceptable error that is used throughout the project for two floats to be considered equal.
+/// If it is set too low, the editor might not work properly, if set too high, the granularity may
+/// become too low for certain purposes.
+pub const FLOAT_MARGIN: F64Margin = F64Margin {
+ epsilon: 10000. * f64::EPSILON,
+ ulps: 0,
+};
+
+pub fn run(server_address: SocketAddr) {
+ let (mut rl, thread) = raylib::init().resizable().title("Hello there!").build();
+ rl.set_target_fps(120);
+ rl.set_exit_key(None);
+
+ // Load the configuration file, if available.
+ let config = match Config::from_file(CONFIG_FILE) {
+ Ok(config) => config,
+ Err(err) => {
+ /* Create a default config file if it doesn't exist, otherwise leave the incorrectly
+ * formatted/corrupted or otherwise unreadable file alone.
+ */
+ let config = Config::default();
+ if err.kind() == io::ErrorKind::NotFound {
+ warn!("Could not find a configuration file. Creating default.");
+ config
+ .write_file(CONFIG_FILE)
+ .expect("Could not write config file.");
+ } else {
+ error!(
+ "Could not read configuration file: {}\nUsing defaults for this run.",
+ err
+ );
+ }
+
+ config
+ }
+ };
+
+ // Load the preferred gui style
+ rl.gui_load_style(Some(
+ &CString::new(GUI_STYLE).expect("Could not create C string from style file name"),
+ ));
+
+ // Connect to the server at the given address.
+ let server = TcpStream::connect(server_address).expect("Unable to connect to the server.");
+ info!(
+ "Connection to server on `{:?}` established",
+ server.peer_addr()
+ );
+ let server = Connection::new(server);
+
+ let mut input = Input::new(&rl);
+ config::register_bindings(&config, &mut input);
+ let mut editor = Editor::new(&mut rl, &thread, config, server);
+ let mut dimension_indicator = DimensionIndicator::new();
+ let mut tool_sidebar = ToolSidebar::new(&mut rl, &thread, &mut input);
+ let mut snapper = Snapper::default();
+ let mut cli = CLI::new(&mut input);
+
+ let mut transform = Transform::new();
+ let mut last_mouse_pos = rl.get_mouse_position();
+ while !rl.window_should_close() {
+ let screen_width = rl.get_screen_width();
+ let screen_height = rl.get_screen_height();
+
+ input.update(&mut rl);
+
+ // Move the canvas together with the mouse
+ if rl.is_mouse_button_down(MouseButton::MOUSE_MIDDLE_BUTTON) {
+ transform.move_by_px(&(rl.get_mouse_position() - last_mouse_pos).into());
+ }
+ // Update the last mouse position
+ last_mouse_pos = rl.get_mouse_position();
+
+ let mouse_wheel_move = rl.get_mouse_wheel_move();
+ if mouse_wheel_move != 0. {
+ // Zoom in for positive and zoom out for negative mouse wheel rotations.
+ let scale_factor = if mouse_wheel_move > 0. { 1.2 } else { 1. / 1.2 };
+ transform.try_zoom(
+ &rl.get_mouse_position().into(),
+ mouse_wheel_move.abs() as f64 * scale_factor,
+ );
+ }
+
+ cli.update(&mut editor, &mut input);
+ dimension_indicator.update(&mut editor, &mut rl);
+ snapper.update(&mut rl, cli.active());
+ editor.update(&mut rl, &transform, &snapper, &mut input);
+ tool_sidebar.update(screen_height as u16, &mut input);
+
+ // Drawing section
+ {
+ let mut d = rl.begin_drawing(&thread);
+ d.clear_background(Color::BLACK);
+ grid::draw_grid(&mut d, screen_width, screen_height, &transform);
+ editor.map().draw(&mut d, &transform);
+
+ editor.draw_tools(&mut d, &transform);
+ tool_sidebar.draw(&mut d, &mut editor);
+ snapper.draw(&mut d);
+ gui::position_indicator_draw(&mut d, last_mouse_pos.into(), &transform, &snapper);
+ dimension_indicator.draw(&mut d, &transform);
+ cli.draw(&mut d);
+ }
+ }
+}