diff options
| author | 2023-02-04 07:33:33 +0100 | |
|---|---|---|
| committer | 2023-02-24 13:28:24 +0100 | |
| commit | b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb (patch) | |
| tree | e100af1dd98d23b29046bc951b04b440d2aa5bc2 /native | |
| parent | a7580e0696a1a0ba76a89db3f78bc99ba3fbb361 (diff) | |
| download | iced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.tar.gz iced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.tar.bz2 iced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.zip | |
Overhaul `Font` type to allow font family selection
Diffstat (limited to 'native')
| -rw-r--r-- | native/src/overlay/menu.rs | 12 | ||||
| -rw-r--r-- | native/src/renderer/null.rs | 8 | ||||
| -rw-r--r-- | native/src/text.rs | 5 | ||||
| -rw-r--r-- | native/src/widget/checkbox.rs | 13 | ||||
| -rw-r--r-- | native/src/widget/pick_list.rs | 25 | ||||
| -rw-r--r-- | native/src/widget/radio.rs | 11 | ||||
| -rw-r--r-- | native/src/widget/text.rs | 20 | ||||
| -rw-r--r-- | native/src/widget/text_input.rs | 39 | ||||
| -rw-r--r-- | native/src/widget/toggler.rs | 13 | 
9 files changed, 83 insertions, 63 deletions
| diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index 50f741ef..9c3a8a44 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -31,7 +31,7 @@ where      width: f32,      padding: Padding,      text_size: Option<f32>, -    font: Renderer::Font, +    font: Option<Renderer::Font>,      style: <Renderer::Theme as StyleSheet>::Style,  } @@ -58,7 +58,7 @@ where              width: 0.0,              padding: Padding::ZERO,              text_size: None, -            font: Default::default(), +            font: None,              style: Default::default(),          }      } @@ -82,8 +82,8 @@ where      }      /// Sets the font of the [`Menu`]. -    pub fn font(mut self, font: Renderer::Font) -> Self { -        self.font = font; +    pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self { +        self.font = Some(font.into());          self      } @@ -311,7 +311,7 @@ where      last_selection: &'a mut Option<T>,      padding: Padding,      text_size: Option<f32>, -    font: Renderer::Font, +    font: Option<Renderer::Font>,      style: <Renderer::Theme as StyleSheet>::Style,  } @@ -491,7 +491,7 @@ where                      ..bounds                  },                  size: text_size, -                font: self.font.clone(), +                font: self.font.unwrap_or_else(|| renderer.default_font()),                  color: if is_selected {                      appearance.selected_text_color                  } else { diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs index 9376d540..50d7d6d6 100644 --- a/native/src/renderer/null.rs +++ b/native/src/renderer/null.rs @@ -40,12 +40,16 @@ impl Renderer for Null {  impl text::Renderer for Null {      type Font = Font; -    const ICON_FONT: Font = Font::Default; +    const ICON_FONT: Font = Font::SansSerif;      const CHECKMARK_ICON: char = '0';      const ARROW_DOWN_ICON: char = '0'; +    fn default_font(&self) -> Self::Font { +        Font::SansSerif +    } +      fn default_size(&self) -> f32 { -        20.0 +        16.0      }      fn measure( diff --git a/native/src/text.rs b/native/src/text.rs index 55c3cfd3..b7915a55 100644 --- a/native/src/text.rs +++ b/native/src/text.rs @@ -57,7 +57,7 @@ impl Hit {  /// A renderer capable of measuring and drawing [`Text`].  pub trait Renderer: crate::Renderer {      /// The font type used. -    type Font: Default + Clone; +    type Font: Copy;      /// The icon font of the backend.      const ICON_FONT: Self::Font; @@ -72,6 +72,9 @@ pub trait Renderer: crate::Renderer {      /// [`ICON_FONT`]: Self::ICON_FONT      const ARROW_DOWN_ICON: char; +    /// Returns the default [`Font`]. +    fn default_font(&self) -> Self::Font; +      /// Returns the default size of [`Text`].      fn default_size(&self) -> f32; diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index 9b69e574..138c458c 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -55,7 +55,7 @@ where      size: f32,      spacing: f32,      text_size: Option<f32>, -    font: Renderer::Font, +    font: Option<Renderer::Font>,      icon: Icon<Renderer::Font>,      style: <Renderer::Theme as StyleSheet>::Style,  } @@ -91,7 +91,7 @@ where              size: Self::DEFAULT_SIZE,              spacing: Self::DEFAULT_SPACING,              text_size: None, -            font: Renderer::Font::default(), +            font: None,              icon: Icon {                  font: Renderer::ICON_FONT,                  code_point: Renderer::CHECKMARK_ICON, @@ -128,8 +128,8 @@ where      /// Sets the [`Font`] of the text of the [`Checkbox`].      ///      /// [`Font`]: crate::text::Renderer::Font -    pub fn font(mut self, font: Renderer::Font) -> Self { -        self.font = font; +    pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self { +        self.font = Some(font.into());          self      } @@ -175,7 +175,7 @@ where              .push(Row::new().width(self.size).height(self.size))              .push(                  Text::new(&self.label) -                    .font(self.font.clone()) +                    .font(self.font.unwrap_or_else(|| renderer.default_font()))                      .width(self.width)                      .size(                          self.text_size @@ -288,6 +288,7 @@ where          {              let label_layout = children.next().unwrap(); +            let font = self.font.unwrap_or_else(|| renderer.default_font());              widget::text::draw(                  renderer, @@ -295,7 +296,7 @@ where                  label_layout,                  &self.label,                  self.text_size, -                self.font.clone(), +                font,                  widget::text::Appearance {                      color: custom_style.text_color,                  }, diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index a128d1ae..c1ff0004 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -35,7 +35,7 @@ where      width: Length,      padding: Padding,      text_size: Option<f32>, -    font: Renderer::Font, +    font: Option<Renderer::Font>,      handle: Handle<Renderer::Font>,      style: <Renderer::Theme as StyleSheet>::Style,  } @@ -70,7 +70,7 @@ where              width: Length::Shrink,              padding: Self::DEFAULT_PADDING,              text_size: None, -            font: Default::default(), +            font: None,              handle: Default::default(),              style: Default::default(),          } @@ -101,8 +101,8 @@ where      }      /// Sets the font of the [`PickList`]. -    pub fn font(mut self, font: Renderer::Font) -> Self { -        self.font = font; +    pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self { +        self.font = Some(font.into());          self      } @@ -163,7 +163,7 @@ where              self.width,              self.padding,              self.text_size, -            &self.font, +            self.font.unwrap_or_else(|| renderer.default_font()),              self.placeholder.as_deref(),              &self.options,          ) @@ -212,6 +212,7 @@ where          cursor_position: Point,          _viewport: &Rectangle,      ) { +        let font = self.font.unwrap_or_else(|| renderer.default_font());          draw(              renderer,              theme, @@ -219,7 +220,7 @@ where              cursor_position,              self.padding,              self.text_size, -            &self.font, +            font,              self.placeholder.as_deref(),              self.selected.as_ref(),              &self.handle, @@ -232,7 +233,7 @@ where          &'b mut self,          tree: &'b mut Tree,          layout: Layout<'_>, -        _renderer: &Renderer, +        renderer: &Renderer,      ) -> Option<overlay::Element<'b, Message, Renderer>> {          let state = tree.state.downcast_mut::<State<T>>(); @@ -241,7 +242,7 @@ where              state,              self.padding,              self.text_size, -            self.font.clone(), +            self.font.unwrap_or_else(|| renderer.default_font()),              &self.options,              self.style.clone(),          ) @@ -343,7 +344,7 @@ pub fn layout<Renderer, T>(      width: Length,      padding: Padding,      text_size: Option<f32>, -    font: &Renderer::Font, +    font: Renderer::Font,      placeholder: Option<&str>,      options: &[T],  ) -> layout::Node @@ -362,7 +363,7 @@ where                  let (width, _) = renderer.measure(                      label,                      text_size, -                    font.clone(), +                    font,                      Size::new(f32::INFINITY, f32::INFINITY),                  ); @@ -560,7 +561,7 @@ pub fn draw<'a, T, Renderer>(      cursor_position: Point,      padding: Padding,      text_size: Option<f32>, -    font: &Renderer::Font, +    font: Renderer::Font,      placeholder: Option<&str>,      selected: Option<&T>,      handle: &Handle<Renderer::Font>, @@ -637,7 +638,7 @@ pub fn draw<'a, T, Renderer>(          renderer.fill_text(Text {              content: label,              size: text_size, -            font: font.clone(), +            font,              color: if is_selected {                  style.text_color              } else { diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 9daddfbc..bd803910 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -53,7 +53,7 @@ where      size: f32,      spacing: f32,      text_size: Option<f32>, -    font: Renderer::Font, +    font: Option<Renderer::Font>,      style: <Renderer::Theme as StyleSheet>::Style,  } @@ -95,7 +95,7 @@ where              size: Self::DEFAULT_SIZE,              spacing: Self::DEFAULT_SPACING, //15              text_size: None, -            font: Default::default(), +            font: None,              style: Default::default(),          }      } @@ -125,8 +125,8 @@ where      }      /// Sets the text font of the [`Radio`] button. -    pub fn font(mut self, font: Renderer::Font) -> Self { -        self.font = font; +    pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self { +        self.font = Some(font.into());          self      } @@ -268,6 +268,7 @@ where          {              let label_layout = children.next().unwrap(); +            let font = self.font.unwrap_or(renderer.default_font());              widget::text::draw(                  renderer, @@ -275,7 +276,7 @@ where                  label_layout,                  &self.label,                  self.text_size, -                self.font.clone(), +                font,                  widget::text::Appearance {                      color: custom_style.text_color,                  }, diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs index 3fee48f2..235a027e 100644 --- a/native/src/widget/text.rs +++ b/native/src/widget/text.rs @@ -37,7 +37,7 @@ where      height: Length,      horizontal_alignment: alignment::Horizontal,      vertical_alignment: alignment::Vertical, -    font: Renderer::Font, +    font: Option<Renderer::Font>,      style: <Renderer::Theme as StyleSheet>::Style,  } @@ -51,7 +51,7 @@ where          Text {              content: content.into(),              size: None, -            font: Default::default(), +            font: None,              width: Length::Shrink,              height: Length::Shrink,              horizontal_alignment: alignment::Horizontal::Left, @@ -70,7 +70,7 @@ where      ///      /// [`Font`]: crate::text::Renderer::Font      pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self { -        self.font = font.into(); +        self.font = Some(font.into());          self      } @@ -138,8 +138,12 @@ where          let bounds = limits.max(); -        let (width, height) = -            renderer.measure(&self.content, size, self.font.clone(), bounds); +        let (width, height) = renderer.measure( +            &self.content, +            size, +            self.font.unwrap_or_else(|| renderer.default_font()), +            bounds, +        );          let size = limits.resolve(Size::new(width, height)); @@ -156,13 +160,15 @@ where          _cursor_position: Point,          _viewport: &Rectangle,      ) { +        let font = self.font.unwrap_or_else(|| renderer.default_font()); +          draw(              renderer,              style,              layout,              &self.content,              self.size, -            self.font.clone(), +            font,              theme.appearance(self.style),              self.horizontal_alignment,              self.vertical_alignment, @@ -242,7 +248,7 @@ where              height: self.height,              horizontal_alignment: self.horizontal_alignment,              vertical_alignment: self.vertical_alignment, -            font: self.font.clone(), +            font: self.font,              style: self.style,          }      } diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 5e198b8f..e6b70db2 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -61,7 +61,7 @@ where      placeholder: String,      value: Value,      is_secure: bool, -    font: Renderer::Font, +    font: Option<Renderer::Font>,      width: Length,      padding: Padding,      size: Option<f32>, @@ -92,7 +92,7 @@ where              placeholder: String::from(placeholder),              value: Value::new(value),              is_secure: false, -            font: Default::default(), +            font: None,              width: Length::Fill,              padding: Padding::new(5.0),              size: None, @@ -129,7 +129,7 @@ where      ///      /// [`Font`]: text::Renderer::Font      pub fn font(mut self, font: Renderer::Font) -> Self { -        self.font = font; +        self.font = Some(font);          self      }      /// Sets the width of the [`TextInput`]. @@ -179,6 +179,8 @@ where          cursor_position: Point,          value: Option<&Value>,      ) { +        let font = self.font.unwrap_or(renderer.default_font()); +          draw(              renderer,              theme, @@ -188,7 +190,7 @@ where              value.unwrap_or(&self.value),              &self.placeholder,              self.size, -            &self.font, +            font,              self.is_secure,              &self.style,          ) @@ -258,7 +260,7 @@ where              shell,              &mut self.value,              self.size, -            &self.font, +            self.font.unwrap_or(renderer.default_font()),              self.is_secure,              self.on_change.as_ref(),              self.on_paste.as_deref(), @@ -277,6 +279,8 @@ where          cursor_position: Point,          _viewport: &Rectangle,      ) { +        let font = self.font.unwrap_or(renderer.default_font()); +          draw(              renderer,              theme, @@ -286,7 +290,7 @@ where              &self.value,              &self.placeholder,              self.size, -            &self.font, +            font,              self.is_secure,              &self.style,          ) @@ -410,7 +414,7 @@ pub fn update<'a, Message, Renderer>(      shell: &mut Shell<'_, Message>,      value: &mut Value,      size: Option<f32>, -    font: &Renderer::Font, +    font: Renderer::Font,      is_secure: bool,      on_change: &dyn Fn(String) -> Message,      on_paste: Option<&dyn Fn(String) -> Message>, @@ -459,7 +463,7 @@ where                              find_cursor_position(                                  renderer,                                  text_layout.bounds(), -                                font.clone(), +                                font,                                  size,                                  &value,                                  state, @@ -487,7 +491,7 @@ where                              let position = find_cursor_position(                                  renderer,                                  text_layout.bounds(), -                                font.clone(), +                                font,                                  size,                                  value,                                  state, @@ -536,7 +540,7 @@ where                  let position = find_cursor_position(                      renderer,                      text_layout.bounds(), -                    font.clone(), +                    font,                      size,                      &value,                      state, @@ -816,7 +820,7 @@ pub fn draw<Renderer>(      value: &Value,      placeholder: &str,      size: Option<f32>, -    font: &Renderer::Font, +    font: Renderer::Font,      is_secure: bool,      style: &<Renderer::Theme as StyleSheet>::Style,  ) where @@ -862,7 +866,7 @@ pub fn draw<Renderer>(                          value,                          size,                          position, -                        font.clone(), +                        font,                      );                  let is_cursor_visible = ((focus.now - focus.updated_at) @@ -903,7 +907,7 @@ pub fn draw<Renderer>(                          value,                          size,                          left, -                        font.clone(), +                        font,                      );                  let (right_position, right_offset) = @@ -913,7 +917,7 @@ pub fn draw<Renderer>(                          value,                          size,                          right, -                        font.clone(), +                        font,                      );                  let width = right_position - left_position; @@ -948,7 +952,7 @@ pub fn draw<Renderer>(      let text_width = renderer.measure_width(          if text.is_empty() { placeholder } else { &text },          size, -        font.clone(), +        font,      );      let render = |renderer: &mut Renderer| { @@ -963,7 +967,7 @@ pub fn draw<Renderer>(              } else {                  theme.value_color(style)              }, -            font: font.clone(), +            font: font,              bounds: Rectangle {                  y: text_bounds.center_y(),                  width: f32::INFINITY, @@ -1195,8 +1199,7 @@ where  {      let size = size.unwrap_or_else(|| renderer.default_size()); -    let offset = -        offset(renderer, text_bounds, font.clone(), size, value, state); +    let offset = offset(renderer, text_bounds, font, size, value, state);      renderer          .hit_test( diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index a434af65..495406db 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -42,7 +42,7 @@ where      text_size: Option<f32>,      text_alignment: alignment::Horizontal,      spacing: f32, -    font: Renderer::Font, +    font: Option<Renderer::Font>,      style: <Renderer::Theme as StyleSheet>::Style,  } @@ -79,7 +79,7 @@ where              text_size: None,              text_alignment: alignment::Horizontal::Left,              spacing: 0.0, -            font: Renderer::Font::default(), +            font: None,              style: Default::default(),          }      } @@ -117,8 +117,8 @@ where      /// Sets the [`Font`] of the text of the [`Toggler`]      ///      /// [`Font`]: crate::text::Renderer::Font -    pub fn font(mut self, font: Renderer::Font) -> Self { -        self.font = font; +    pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self { +        self.font = Some(font.into());          self      } @@ -160,7 +160,7 @@ where              row = row.push(                  Text::new(label)                      .horizontal_alignment(self.text_alignment) -                    .font(self.font.clone()) +                    .font(self.font.unwrap_or_else(|| renderer.default_font()))                      .width(self.width)                      .size(                          self.text_size @@ -236,6 +236,7 @@ where          if let Some(label) = &self.label {              let label_layout = children.next().unwrap(); +            let font = self.font.unwrap_or_else(|| renderer.default_font());              crate::widget::text::draw(                  renderer, @@ -243,7 +244,7 @@ where                  label_layout,                  label,                  self.text_size, -                self.font.clone(), +                font,                  Default::default(),                  self.text_alignment,                  alignment::Vertical::Center, | 
