From 4c179875ab5b120a871bfb853aa6969fa8779478 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 6 Mar 2023 10:39:35 -0800 Subject: [PATCH] Add png image loading to gpui add zed logo into welcome experience Co-authored-by: Nathan --- assets/images/zed-logo-90x90.png | Bin 0 -> 12413 bytes crates/collab_ui/src/collab_titlebar_item.rs | 2 +- crates/collab_ui/src/contact_finder.rs | 2 +- crates/collab_ui/src/contact_list.rs | 6 +- .../src/incoming_call_notification.rs | 2 +- crates/collab_ui/src/notifications.rs | 2 +- .../src/project_shared_notification.rs | 2 +- crates/gpui/src/assets.rs | 21 ++++++- crates/gpui/src/elements/image.rs | 56 +++++++++++++----- crates/project_panel/src/project_panel.rs | 2 +- crates/welcome/src/welcome.rs | 14 ++--- 11 files changed, 76 insertions(+), 33 deletions(-) create mode 100644 assets/images/zed-logo-90x90.png diff --git a/assets/images/zed-logo-90x90.png b/assets/images/zed-logo-90x90.png new file mode 100644 index 0000000000000000000000000000000000000000..17f92d2c1afbb8459fd31bfdc7ace50a412ce0a8 GIT binary patch literal 12413 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 WubU>a9)CZGQhKiXtn?`~@c#k#=|!0U literal 0 HcmV?d00001 diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index f9f5738ad26762dd9e4fc5c08c6cf48439b90e67..a16c31595fa116c7128baa618b7c7cf16604c52d 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -823,7 +823,7 @@ impl CollabTitlebarItem { avatar_style: AvatarStyle, background_color: Color, ) -> ElementBox { - Image::new(avatar) + Image::from_data(avatar) .with_style(avatar_style.image) .aligned() .contained() diff --git a/crates/collab_ui/src/contact_finder.rs b/crates/collab_ui/src/contact_finder.rs index 98f70e83f0ecf1eb3c312429a8461a35b028199e..cb55669ab0a29230c2aa06a09ac6cd1718b68221 100644 --- a/crates/collab_ui/src/contact_finder.rs +++ b/crates/collab_ui/src/contact_finder.rs @@ -128,7 +128,7 @@ impl PickerDelegate for ContactFinder { .style_for(mouse_state, selected); Flex::row() .with_children(user.avatar.clone().map(|avatar| { - Image::new(avatar) + Image::from_data(avatar) .with_style(theme.contact_finder.contact_avatar) .aligned() .left() diff --git a/crates/collab_ui/src/contact_list.rs b/crates/collab_ui/src/contact_list.rs index 3bb036d3366a4de8f4bb8e8253ae4470ce86edbc..203d130b5b48d481797390dd3491f3d6e9d28314 100644 --- a/crates/collab_ui/src/contact_list.rs +++ b/crates/collab_ui/src/contact_list.rs @@ -726,7 +726,7 @@ impl ContactList { ) -> ElementBox { Flex::row() .with_children(user.avatar.clone().map(|avatar| { - Image::new(avatar) + Image::from_data(avatar) .with_style(theme.contact_avatar) .aligned() .left() @@ -1080,7 +1080,7 @@ impl ContactList { }; Stack::new() .with_child( - Image::new(avatar) + Image::from_data(avatar) .with_style(theme.contact_avatar) .aligned() .left() @@ -1173,7 +1173,7 @@ impl ContactList { let mut row = Flex::row() .with_children(user.avatar.clone().map(|avatar| { - Image::new(avatar) + Image::from_data(avatar) .with_style(theme.contact_avatar) .aligned() .left() diff --git a/crates/collab_ui/src/incoming_call_notification.rs b/crates/collab_ui/src/incoming_call_notification.rs index a0f54abe386ca56ef416f051dc2474e1736cc332..6fb0278218987d0e50ea7acc8792a24258426702 100644 --- a/crates/collab_ui/src/incoming_call_notification.rs +++ b/crates/collab_ui/src/incoming_call_notification.rs @@ -108,7 +108,7 @@ impl IncomingCallNotification { .unwrap_or(&default_project); Flex::row() .with_children(self.call.calling_user.avatar.clone().map(|avatar| { - Image::new(avatar) + Image::from_data(avatar) .with_style(theme.caller_avatar) .aligned() .boxed() diff --git a/crates/collab_ui/src/notifications.rs b/crates/collab_ui/src/notifications.rs index 06b6cf2a90984fe57b932892f94fda83bb06b369..21c2d2c2185ed69d6c19ad85be51cff1231d5bcb 100644 --- a/crates/collab_ui/src/notifications.rs +++ b/crates/collab_ui/src/notifications.rs @@ -24,7 +24,7 @@ pub fn render_user_notification( .with_child( Flex::row() .with_children(user.avatar.clone().map(|avatar| { - Image::new(avatar) + Image::from_data(avatar) .with_style(theme.header_avatar) .aligned() .constrained() diff --git a/crates/collab_ui/src/project_shared_notification.rs b/crates/collab_ui/src/project_shared_notification.rs index edf0354eec0d53be306e613697962a72cc34a683..b24f3492da933f4a868be65cfb2f3344679fc6c6 100644 --- a/crates/collab_ui/src/project_shared_notification.rs +++ b/crates/collab_ui/src/project_shared_notification.rs @@ -108,7 +108,7 @@ impl ProjectSharedNotification { let theme = &cx.global::().theme.project_shared_notification; Flex::row() .with_children(self.owner.avatar.clone().map(|avatar| { - Image::new(avatar) + Image::from_data(avatar) .with_style(theme.owner_avatar) .aligned() .boxed() diff --git a/crates/gpui/src/assets.rs b/crates/gpui/src/assets.rs index ac0d72dee97a8d5553963c4677bc3f6051fbaf34..2170d215af078257326c258c7502f4c90c84e19e 100644 --- a/crates/gpui/src/assets.rs +++ b/crates/gpui/src/assets.rs @@ -1,5 +1,8 @@ use anyhow::{anyhow, Result}; -use std::{borrow::Cow, cell::RefCell, collections::HashMap}; +use image::ImageFormat; +use std::{borrow::Cow, cell::RefCell, collections::HashMap, sync::Arc}; + +use crate::ImageData; pub trait AssetSource: 'static + Send + Sync { fn load(&self, path: &str) -> Result>; @@ -22,6 +25,7 @@ impl AssetSource for () { pub struct AssetCache { source: Box, svgs: RefCell>, + pngs: RefCell>>, } impl AssetCache { @@ -29,6 +33,7 @@ impl AssetCache { Self { source: Box::new(source), svgs: RefCell::new(HashMap::new()), + pngs: RefCell::new(HashMap::new()), } } @@ -43,4 +48,18 @@ impl AssetCache { Ok(svg) } } + + pub fn png(&self, path: &str) -> Result> { + let mut pngs = self.pngs.borrow_mut(); + if let Some(png) = pngs.get(path) { + Ok(png.clone()) + } else { + let bytes = self.source.load(path)?; + let image = ImageData::new( + image::load_from_memory_with_format(&bytes, ImageFormat::Png)?.into_bgra8(), + ); + pngs.insert(path.to_string(), image.clone()); + Ok(image) + } + } } diff --git a/crates/gpui/src/elements/image.rs b/crates/gpui/src/elements/image.rs index 37cb01ace8a6c43e0add3d366d888f06b4b0225e..cc49308e15011b317840da086170c28d1132996d 100644 --- a/crates/gpui/src/elements/image.rs +++ b/crates/gpui/src/elements/image.rs @@ -11,8 +11,13 @@ use crate::{ use serde::Deserialize; use std::{ops::Range, sync::Arc}; +enum ImageSource { + Path(&'static str), + Data(Arc), +} + pub struct Image { - data: Arc, + source: ImageSource, style: ImageStyle, } @@ -31,9 +36,16 @@ pub struct ImageStyle { } impl Image { - pub fn new(data: Arc) -> Self { + pub fn new(asset_path: &'static str) -> Self { + Self { + source: ImageSource::Path(asset_path), + style: Default::default(), + } + } + + pub fn from_data(data: Arc) -> Self { Self { - data, + source: ImageSource::Data(data), style: Default::default(), } } @@ -45,39 +57,53 @@ impl Image { } impl Element for Image { - type LayoutState = (); + type LayoutState = Option>; type PaintState = (); fn layout( &mut self, constraint: SizeConstraint, - _: &mut LayoutContext, + cx: &mut LayoutContext, ) -> (Vector2F, Self::LayoutState) { + let data = match &self.source { + ImageSource::Path(path) => match cx.asset_cache.png(path) { + Ok(data) => data, + Err(error) => { + log::error!("could not load image: {}", error); + return (Vector2F::zero(), None); + } + }, + ImageSource::Data(data) => data.clone(), + }; + let desired_size = vec2f( self.style.width.unwrap_or_else(|| constraint.max.x()), self.style.height.unwrap_or_else(|| constraint.max.y()), ); let size = constrain_size_preserving_aspect_ratio( constraint.constrain(desired_size), - self.data.size().to_f32(), + data.size().to_f32(), ); - (size, ()) + + (size, Some(data)) } fn paint( &mut self, bounds: RectF, _: RectF, - _: &mut Self::LayoutState, + layout: &mut Self::LayoutState, cx: &mut PaintContext, ) -> Self::PaintState { - cx.scene.push_image(scene::Image { - bounds, - border: self.style.border, - corner_radius: self.style.corner_radius, - grayscale: self.style.grayscale, - data: self.data.clone(), - }); + if let Some(data) = layout { + cx.scene.push_image(scene::Image { + bounds, + border: self.style.border, + corner_radius: self.style.corner_radius, + grayscale: self.style.grayscale, + data: data.clone(), + }); + } } fn rect_for_text_range( diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 1cefc558f00d3f5e3c4f3c73987a42f8b4755652..9df6581d209c47b4e3763ca9acf12da1ce378189 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -1325,7 +1325,7 @@ impl View for ProjectPanel { Canvas::new(|bounds, _visible_bounds, cx| { cx.scene.push_quad(gpui::Quad { bounds, - background: Some(Color::red()), + background: Some(Color::transparent_black()), ..Default::default() }) }) diff --git a/crates/welcome/src/welcome.rs b/crates/welcome/src/welcome.rs index 7bf6c263023470ca784f7d4f1e05283a9926cfd3..232fd1bcb732aeda9cdace32a48e303f2dd36e78 100644 --- a/crates/welcome/src/welcome.rs +++ b/crates/welcome/src/welcome.rs @@ -1,14 +1,13 @@ use std::borrow::Cow; use gpui::{ - color::Color, - elements::{Canvas, Empty, Flex, Label, MouseEventHandler, ParentElement, Stack, Svg}, + elements::{Canvas, Empty, Flex, Image, Label, MouseEventHandler, ParentElement, Stack}, geometry::rect::RectF, Action, Element, ElementBox, Entity, MouseButton, MouseRegion, MutableAppContext, RenderContext, Subscription, View, ViewContext, }; use settings::{settings_file::SettingsFile, Settings, SettingsFileContent}; -use theme::{CheckboxStyle, ContainedText, Interactive}; +use theme::CheckboxStyle; use workspace::{item::Item, Welcome, Workspace}; pub fn init(cx: &mut MutableAppContext) { @@ -72,15 +71,14 @@ impl View for WelcomePage { .with_children([ Flex::row() .with_children([ - Svg::new("icons/terminal_16.svg") - .with_color(Color::red()) + Image::new("images/zed-logo-90x90.png") .constrained() - .with_width(100.) - .with_height(100.) + .with_width(90.) + .with_height(90.) .aligned() .contained() .boxed(), - Label::new("Zed", theme.editor.hover_popover.prose.clone()).boxed(), + // Label::new("Zed", theme.editor.hover_popover.prose.clone()).boxed(), ]) .boxed(), Label::new(