From bdf2c0c95443ee0c245b744d698c3e5baf33cf35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Wo=C5=BAniak?= Date: Fri, 31 May 2019 20:49:38 +0200 Subject: [PATCH] Add settings icon --- rider-config/src/config.rs | 2 +- rider-editor/src/app/application.rs | 42 +++---- rider-editor/src/ui/menu_bar.rs | 32 +++-- rider-editor/src/ui/mod.rs | 2 + rider-editor/src/ui/save_button.rs | 13 ++- rider-editor/src/ui/settings_button.rs | 109 ++++++++++++++++++ .../themes/default/images/directory-48x48.png | Bin 2004 -> 2004 bytes .../themes/default/images/directory-64x64.png | Bin 2322 -> 2322 bytes .../themes/default/images/file-48x48.png | Bin 866 -> 866 bytes .../themes/default/images/file-64x64.png | Bin 929 -> 2761 bytes .../themes/default/images/save-32x32.png | Bin 0 -> 1892 bytes .../themes/default/images/save-64x64.png | Bin 1598 -> 2302 bytes .../themes/railscasts/images/save-32x32.png | Bin 0 -> 1892 bytes .../themes/railscasts/images/save-64x64.png | Bin 1598 -> 2302 bytes .../railscasts/images/settings-16x16.png | Bin 0 -> 856 bytes rider-generator/src/images.rs | 25 +++- rider-themes/src/images.rs | 50 +++++++- rider-themes/src/predef/railscasts.rs | 3 +- 18 files changed, 232 insertions(+), 46 deletions(-) create mode 100644 rider-editor/src/ui/settings_button.rs create mode 100644 rider-generator/assets/themes/default/images/save-32x32.png create mode 100644 rider-generator/assets/themes/railscasts/images/save-32x32.png create mode 100644 rider-generator/assets/themes/railscasts/images/settings-16x16.png diff --git a/rider-config/src/config.rs b/rider-config/src/config.rs index ba417e9..017873f 100644 --- a/rider-config/src/config.rs +++ b/rider-config/src/config.rs @@ -32,7 +32,7 @@ impl Config { Self { width: 1024, height: 860, - menu_height: 60, + menu_height: 40, theme: Theme::default(), editor_config, extensions_mapping, diff --git a/rider-editor/src/app/application.rs b/rider-editor/src/app/application.rs index 0275850..d2a2d6b 100644 --- a/rider-editor/src/app/application.rs +++ b/rider-editor/src/app/application.rs @@ -151,11 +151,9 @@ impl Application { UpdateResult::DeleteBack => { app_state.file_editor_mut().delete_back(&mut renderer); } - UpdateResult::Input(text) => { - app_state - .file_editor_mut() - .insert_text(text.clone(), &mut renderer); - } + UpdateResult::Input(text) => app_state + .file_editor_mut() + .insert_text(text.clone(), &mut renderer), UpdateResult::InsertNewLine => { app_state.file_editor_mut().insert_new_line(&mut renderer); } @@ -174,20 +172,18 @@ impl Application { UpdateResult::Scroll { x, y } => { app_state.scroll_by(-x.clone(), -y.clone()); } - UpdateResult::WindowResize { width, height } => { - app_state - .config() - .write() - .map(|ref mut c| { - if *width > 0 { - c.set_width(*width as u32); - } - if *height > 0 { - c.set_height(*height as u32); - } - }) - .unwrap_or_else(|_| println!("Failed to update window size")); - } + UpdateResult::WindowResize { width, height } => app_state + .config() + .write() + .map(|ref mut c| { + if *width > 0 { + c.set_width(*width as u32); + } + if *height > 0 { + c.set_height(*height as u32); + } + }) + .unwrap_or_else(|_| println!("Failed to update window size")), UpdateResult::RefreshFsTree => unimplemented!(), UpdateResult::OpenFile(file_path) => { app_state.open_file(file_path.clone(), &mut renderer); @@ -206,11 +202,9 @@ impl Application { UpdateResult::MouseDragStart(_point) => (), UpdateResult::MouseDragStop(_point) => (), UpdateResult::FileDropped(_path) => (), - UpdateResult::SaveCurrentFile => { - app_state - .save_file() - .unwrap_or_else(|e| eprintln!("Failed to save {:?}", e)); - } + UpdateResult::SaveCurrentFile => app_state + .save_file() + .unwrap_or_else(|e| eprintln!("Failed to save {:?}", e)), } } self.tasks = new_tasks; diff --git a/rider-editor/src/ui/menu_bar.rs b/rider-editor/src/ui/menu_bar.rs index d1c9e80..36376ec 100644 --- a/rider-editor/src/ui/menu_bar.rs +++ b/rider-editor/src/ui/menu_bar.rs @@ -6,7 +6,7 @@ use sdl2::pixels::Color; use sdl2::rect::{Point, Rect}; const SAVE_BUTTON_OFFSET_LEFT: i32 = 16; -const SAVE_BUTTON_OFFSET_TOP: i32 = 16; +const SAVE_BUTTON_OFFSET_TOP: i32 = 10; pub struct MenuBar { border_color: Color, @@ -14,6 +14,7 @@ pub struct MenuBar { dest: Rect, config: ConfigAccess, save_button: SaveButton, + settings_button: SettingsButton, } impl MenuBar { @@ -32,6 +33,7 @@ impl MenuBar { background_color, dest: Rect::new(0, 0, w as u32, h as u32), save_button: SaveButton::new(config.clone()), + settings_button: SettingsButton::new(config.clone()), config, } } @@ -75,6 +77,11 @@ impl MenuBar { relative_position.offset(SAVE_BUTTON_OFFSET_LEFT, SAVE_BUTTON_OFFSET_TOP), ); self.save_button.render(canvas, renderer, &context); + + let context = RenderContext::RelativePosition( + relative_position.offset(SAVE_BUTTON_OFFSET_LEFT * 2, SAVE_BUTTON_OFFSET_TOP), + ); + self.settings_button.render(canvas, renderer, &context); } pub fn prepare_ui(&mut self) { @@ -85,9 +92,12 @@ impl MenuBar { } impl Update for MenuBar { - fn update(&mut self, _ticks: i32, _context: &UpdateContext) -> UR { - let config = self.config.read().unwrap(); - self.dest.set_width(config.width()); + fn update(&mut self, ticks: i32, context: &UpdateContext) -> UR { + if let Ok(config) = self.config.read() { + self.dest.set_width(config.width()); + self.save_button.update(ticks, context); + self.settings_button.update(ticks, context); + } UR::NoOp } } @@ -106,15 +116,21 @@ impl ClickHandler for MenuBar { if self.save_button.is_left_click_target(point, &context) { return self.save_button.on_left_click(point, &context); } + let context = UpdateContext::ParentPosition( + relative_position.offset(SAVE_BUTTON_OFFSET_LEFT * 2, SAVE_BUTTON_OFFSET_TOP), + ); + if self.settings_button.is_left_click_target(point, &context) { + return self.settings_button.on_left_click(point, &context); + } UR::NoOp } fn is_left_click_target(&self, point: &Point, context: &UpdateContext) -> bool { - let rect = match *context { + match *context { UpdateContext::ParentPosition(p) => move_render_point(p.clone(), &self.dest), - _ => self.dest(), - }; - rect.contains_point(point.clone()) + _ => self.dest, + } + .contains_point(point.clone()) } } diff --git a/rider-editor/src/ui/mod.rs b/rider-editor/src/ui/mod.rs index 1993988..92c5964 100644 --- a/rider-editor/src/ui/mod.rs +++ b/rider-editor/src/ui/mod.rs @@ -17,6 +17,7 @@ pub mod modal; pub mod project_tree; pub mod save_button; pub mod scroll_bar; +pub mod settings_button; pub mod text_character; pub use crate::ui::caret::*; @@ -28,6 +29,7 @@ pub use crate::ui::modal::*; pub use crate::ui::project_tree::*; pub use crate::ui::save_button::*; pub use crate::ui::scroll_bar::*; +pub use crate::ui::settings_button::*; pub use crate::ui::text_character::*; #[derive(Debug)] diff --git a/rider-editor/src/ui/save_button.rs b/rider-editor/src/ui/save_button.rs index 2834fd4..e4079c6 100644 --- a/rider-editor/src/ui/save_button.rs +++ b/rider-editor/src/ui/save_button.rs @@ -5,10 +5,10 @@ use crate::ui::{ }; use sdl2::rect::{Point, Rect}; -const ICON_DEST_WIDTH: u32 = 32; -const ICON_DEST_HEIGHT: u32 = 32; -const ICON_SRC_WIDTH: u32 = 64; -const ICON_SRC_HEIGHT: u32 = 64; +const ICON_DEST_WIDTH: u32 = 16; +const ICON_DEST_HEIGHT: u32 = 16; +const ICON_SRC_WIDTH: u32 = 32; +const ICON_SRC_HEIGHT: u32 = 32; pub struct SaveButton { source: Rect, @@ -36,7 +36,10 @@ impl SaveButton { _ => self.dest.clone(), }; - canvas.set_clipping(dest.clone()); + let mut clipping = dest.clone(); + clipping.set_width(clipping.width() + ICON_DEST_WIDTH); + clipping.set_height(clipping.height() + ICON_DEST_HEIGHT); + canvas.set_clipping(clipping); let save_texture_path = { let c = self.config.read().unwrap(); let mut themes_dir = c.directories().themes_dir.clone(); diff --git a/rider-editor/src/ui/settings_button.rs b/rider-editor/src/ui/settings_button.rs new file mode 100644 index 0000000..c230ca3 --- /dev/null +++ b/rider-editor/src/ui/settings_button.rs @@ -0,0 +1,109 @@ +use crate::app::{ConfigAccess, ConfigHolder, UpdateResult as UR}; +use crate::renderer::Renderer; +use crate::ui::{ + move_render_point, CanvasAccess, ClickHandler, RenderBox, RenderContext, Update, UpdateContext, +}; +use sdl2::rect::{Point, Rect}; + +const ICON_DEST_WIDTH: u32 = 16; +const ICON_DEST_HEIGHT: u32 = 16; +const ICON_SRC_WIDTH: u32 = 16; +const ICON_SRC_HEIGHT: u32 = 16; + +pub struct SettingsButton { + source: Rect, + dest: Rect, + config: ConfigAccess, +} + +impl SettingsButton { + pub fn new(config: ConfigAccess) -> Self { + Self { + dest: Rect::new(0, 0, ICON_DEST_WIDTH, ICON_DEST_HEIGHT), + source: Rect::new(0, 0, ICON_SRC_WIDTH, ICON_SRC_HEIGHT), + config, + } + } + + pub fn render(&self, canvas: &mut C, renderer: &mut R, context: &RenderContext) + where + C: CanvasAccess, + R: Renderer, + { + use std::borrow::*; + let mut dest = match context { + &RenderContext::RelativePosition(p) => move_render_point(p.clone(), &self.dest), + _ => self.dest.clone(), + }; + + let mut clipping = dest.clone(); + clipping.set_width(clipping.width() + ICON_DEST_WIDTH); + clipping.set_height(clipping.height() + ICON_DEST_HEIGHT); + canvas.set_clipping(clipping); + let settings_texture_path = { + let c = self.config.read().unwrap(); + let mut themes_dir = c.directories().themes_dir.clone(); + let path = c.theme().images().settings_icon(); + themes_dir.push(path); + themes_dir.to_str().unwrap().to_owned() + }; + let maybe_tex = renderer.load_image(settings_texture_path.clone()); + if let Ok(texture) = maybe_tex { + dest.set_width(ICON_DEST_WIDTH); + dest.set_height(ICON_DEST_HEIGHT); + canvas + .render_image(texture, self.source.clone(), dest.clone()) + .unwrap_or_else(|_| panic!("Failed to draw directory entry texture")); + } + } + + pub fn prepare_ui<'l, T>(&mut self, _renderer: &mut T) + where + T: ConfigHolder + Renderer, + { + } + + pub fn source(&self) -> &Rect { + &self.source + } + + pub fn set_dest(&mut self, rect: &Rect) { + self.dest = rect.clone(); + } + + pub fn set_source(&mut self, rect: &Rect) { + self.source = rect.clone(); + } +} + +impl Update for SettingsButton { + fn update(&mut self, _ticks: i32, _context: &UpdateContext) -> UR { + let config = self.config.read().unwrap(); + self.dest.set_width(config.width()); + UR::NoOp + } +} + +impl ClickHandler for SettingsButton { + fn on_left_click(&mut self, _point: &Point, _context: &UpdateContext) -> UR { + UR::NoOp + } + + fn is_left_click_target(&self, point: &Point, context: &UpdateContext) -> bool { + match *context { + UpdateContext::ParentPosition(p) => move_render_point(p.clone(), &self.dest), + _ => self.dest(), + } + .contains_point(point.clone()) + } +} + +impl RenderBox for SettingsButton { + fn render_start_point(&self) -> Point { + self.dest.top_left() + } + + fn dest(&self) -> Rect { + self.dest + } +} diff --git a/rider-generator/assets/themes/default/images/directory-48x48.png b/rider-generator/assets/themes/default/images/directory-48x48.png index d1d5462af2d6e8a9688197615ab45a9f93cedf1c..d4c959d9ffe33a05413623579f3afc24bff803d2 100644 GIT binary patch delta 26 icmcb@e}#WTCp({+m4UIgfuWUw!K%iq?vtmp+X4V~pa{bN delta 26 hcmcb@e}#WTCp(|1m8r3|fuWUw0cTi(!sO}fwg7D?2VVdH diff --git a/rider-generator/assets/themes/default/images/directory-64x64.png b/rider-generator/assets/themes/default/images/directory-64x64.png index e18109b514961fc8beebcb2b0a5bcd799a65dfb5..d6ee7c3ccef7e3cd219b5505fb705075195101e8 100644 GIT binary patch delta 26 icmbOvG)ZW~aSlE+D+6O~14AnVgH?@J-6vn=umu2cG6=%} delta 26 hcmbOvG)ZW~aSlFHD^p`_14AnV1J1Ang~?YrYyoDv2VVdH diff --git a/rider-generator/assets/themes/default/images/file-48x48.png b/rider-generator/assets/themes/default/images/file-48x48.png index 7e0d8a52383e7163472cbcfc297d70f7277a0a15..721382a440e1ca09a0b125111a7054b1609443c2 100644 GIT binary patch delta 26 hcmaFF_K0nRI5VG_m4UIgfuWUw!K%iq?vquSZ2@eg2jKt! delta 26 hcmaFF_K0nRI5VHAm8r3|fuWUw0cTi(!emuuTL5D$27Lek diff --git a/rider-generator/assets/themes/default/images/file-64x64.png b/rider-generator/assets/themes/default/images/file-64x64.png index 63a2ea503d4e59cf6103b9b5ae4c4a9a5e013e72..34030e8319acd9f6534c36fd277ed773946a09a2 100644 GIT binary patch delta 2478 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 delta 639 zcmX>px{!T>asY!uvPY0F14ES>14Ba#1H&%{ApL@Yq11qZ;Z*_ygVhWM2JwP9y8>+( z7#PI^d_r7-3d|jR%^iHq?S0IE$idgl-q+OLSJ}kb+}?NcMvkBLv!A@k0V<0w3GxdD z(on!;>F;OH#=hy-x7Rr=J3r;#O-?C#evDWA`lDA%W0x?;urM-yWMpIkQj8HVPG)89 z{+E9K$Jf7mIM~b_9Xu}X<>Wqi=yqIu+KtV>ci4mk+cD?()rSGiW=!&ScZqp*gJC+5 z!&%@FIr%)NR6Q4iiGlx>t3YXKPZ!6Kh{JEM9S>r16lr~!$HLqr=+Uv>Rso$3}HoM3qNY3zxmbXbl`35(pT^PHC}xs za3KHH$CvvLY-TfAz{p#l;lM0);lK*Ui|v;*_U}nEhZtA_6xM1BS8VDNPHb6Mw<&;$V6bnA8i diff --git a/rider-generator/assets/themes/default/images/save-32x32.png b/rider-generator/assets/themes/default/images/save-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3b76e831733c66b8867b5d7ee27761b5f9af3f GIT binary patch literal 1892 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 Q@4S5h@UACZgg7GaZ|6s%*Z=?k diff --git a/rider-generator/assets/themes/railscasts/images/save-32x32.png b/rider-generator/assets/themes/railscasts/images/save-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3b76e831733c66b8867b5d7ee27761b5f9af3f GIT binary patch literal 1892 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 Q@4S5h@UACZgg7GaZ|6s%*Z=?k diff --git a/rider-generator/assets/themes/railscasts/images/settings-16x16.png b/rider-generator/assets/themes/railscasts/images/settings-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c830a16c10ed73edb8740edf377f9d08d3b10d65 GIT binary patch literal 856 zcmV-e1E>6nP)EX>4Tx04R}tkv&MmKpe$iQ%j3f1nnRyn4vmZ5EXIMDionYs1;guFuC+YXws0h zxHt-~1qVMCs}3&Cx;nTDg5U>;i>s5OigYb ziotoGIKqmuN_z1bM0hc>K-;*JmvLpFv3i&+nen#Jv1$u9R&Q-U!<~~jzfHZZLya5gl zfsq1buX(&X)ZW{_XPW)}07gf0m0G_Z9smFU24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jc}F5)CtnLSt|M000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0003mNklV|DBR9J$Ikjf&&#xJ1A zl3Sz@(Jr-}m};^gL8eUS7qAj-ECO5PrN|cA1d{YB79o`ewh-5Ab64)Y-0SKCQ_Pt& z|2gO3Oe0NG5JK>XUSKZ9cwRo3sJYz5C4OTE4V;G%TIIya!C+AJ;t(IuMuPYFi=Vw- zPp8uU`0JGS_DSqK24l5u@889k+Iv0D5 zU3{tV=B5tNsz_d`i2bW;;RwgZ>#7bg#0I{N0jy%C;B1dSAo^&hQ7Dc$ww& zk;E9U9{{CkY~n6kBfY`*oY{T6jWPaz06gJ8EaP*|@E=GDfN=^Ttl std::io::Result<()> { Ok(()) } +fn create_default_save_icon(dir: &PathBuf) -> std::io::Result<()> { + let blob = include_bytes!("../assets/themes/default/images/save-32x32.png"); + write_bytes_to(dir, "save-32x32.png", blob)?; + Ok(()) +} + +fn create_default_settings_icon(dir: &PathBuf) -> std::io::Result<()> { + let blob = include_bytes!("../assets/themes/default/images/settings-16x16.png"); + write_bytes_to(dir, "settings-16x16.png", blob)?; + Ok(()) +} + fn default_theme(directories: &Directories) -> std::io::Result<()> { let mut dir = PathBuf::new(); dir.push(directories.themes_dir.clone()); @@ -32,6 +44,8 @@ fn default_theme(directories: &Directories) -> std::io::Result<()> { create_default_directory_icon(&dir)?; create_default_file_icon(&dir)?; + create_default_save_icon(&dir)?; + create_default_settings_icon(&dir)?; Ok(()) } @@ -48,8 +62,14 @@ fn create_railscasts_file_icon(dir: &PathBuf) -> std::io::Result<()> { } fn create_railscasts_save_icon(dir: &PathBuf) -> std::io::Result<()> { - let blob = include_bytes!("../assets/themes/railscasts/images/save-64x64.png"); - write_bytes_to(dir, "save-64x64.png", blob)?; + let blob = include_bytes!("../assets/themes/railscasts/images/save-32x32.png"); + write_bytes_to(dir, "save-32x32.png", blob)?; + Ok(()) +} + +fn create_railscasts_settings_icon(dir: &PathBuf) -> std::io::Result<()> { + let blob = include_bytes!("../assets/themes/railscasts/images/settings-16x16.png"); + write_bytes_to(dir, "settings-16x16.png", blob)?; Ok(()) } @@ -62,6 +82,7 @@ fn railscasts_theme(directories: &Directories) -> std::io::Result<()> { create_railscasts_directory_icon(&dir)?; create_railscasts_file_icon(&dir)?; create_railscasts_save_icon(&dir)?; + create_railscasts_settings_icon(&dir)?; Ok(()) } diff --git a/rider-themes/src/images.rs b/rider-themes/src/images.rs index 46148e7..c140014 100644 --- a/rider-themes/src/images.rs +++ b/rider-themes/src/images.rs @@ -3,14 +3,21 @@ pub struct ThemeImages { directory_icon: String, file_icon: String, save_icon: String, + settings_icon: String, } impl ThemeImages { - pub fn new(directory_icon: String, file_icon: String, save_icon: String) -> Self { + pub fn new( + directory_icon: String, + file_icon: String, + save_icon: String, + settings_icon: String, + ) -> Self { Self { file_icon, directory_icon, save_icon, + settings_icon, } } @@ -25,6 +32,10 @@ impl ThemeImages { pub fn save_icon(&self) -> String { self.save_icon.clone() } + + pub fn settings_icon(&self) -> String { + self.settings_icon.clone() + } } impl Default for ThemeImages { @@ -32,7 +43,8 @@ impl Default for ThemeImages { Self { directory_icon: "default/images/directory-64x64.png".to_string(), file_icon: "default/images/file-64x64.png".to_string(), - save_icon: "default/images/save-64x64.png".to_string(), + save_icon: "default/images/save-16x16.png".to_string(), + settings_icon: "default/images/settings-16x16.png".to_string(), } } } @@ -43,7 +55,12 @@ mod test { #[test] fn assert_directory_icon() { - let config = ThemeImages::new("foo".to_owned(), "bar".to_owned(), "baz".to_owned()); + let config = ThemeImages::new( + "foo".to_owned(), + "bar".to_owned(), + "baz".to_owned(), + "foz".to_owned(), + ); let result = config.directory_icon(); let expected = "foo".to_owned(); assert_eq!(result, expected); @@ -51,7 +68,12 @@ mod test { #[test] fn assert_file_icon() { - let config = ThemeImages::new("foo".to_owned(), "bar".to_owned(), "baz".to_owned()); + let config = ThemeImages::new( + "foo".to_owned(), + "bar".to_owned(), + "baz".to_owned(), + "foz".to_owned(), + ); let result = config.file_icon(); let expected = "bar".to_owned(); assert_eq!(result, expected); @@ -59,9 +81,27 @@ mod test { #[test] fn assert_save_icon() { - let config = ThemeImages::new("foo".to_owned(), "bar".to_owned(), "baz".to_owned()); + let config = ThemeImages::new( + "foo".to_owned(), + "bar".to_owned(), + "baz".to_owned(), + "foz".to_owned(), + ); let result = config.save_icon(); let expected = "baz".to_owned(); assert_eq!(result, expected); } + + #[test] + fn assert_settings_icon() { + let config = ThemeImages::new( + "foo".to_owned(), + "bar".to_owned(), + "baz".to_owned(), + "foz".to_owned(), + ); + let result = config.settings_icon(); + let expected = "foz".to_owned(); + assert_eq!(result, expected); + } } diff --git a/rider-themes/src/predef/railscasts.rs b/rider-themes/src/predef/railscasts.rs index 9959bb3..873d0ec 100644 --- a/rider-themes/src/predef/railscasts.rs +++ b/rider-themes/src/predef/railscasts.rs @@ -44,7 +44,8 @@ pub fn build_theme() -> Theme { ThemeImages::new( "railscasts/images/directory-64x64.png".to_owned(), "railscasts/images/file-64x64.png".to_owned(), - "railscasts/images/save-64x64.png".to_owned(), + "railscasts/images/save-32x32.png".to_owned(), + "railscasts/images/settings-16x16.png".to_owned(), ), ) }