Do not preset padding when input with affix (#70)
This commit is contained in:
parent
7489a4ffdd
commit
f02c2a82b1
6 changed files with 39 additions and 20 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
use gpui::{
|
use gpui::{
|
||||||
actions, AppContext, FocusHandle, InteractiveElement, IntoElement, KeyBinding,
|
actions, div, AppContext, FocusHandle, InteractiveElement, IntoElement, KeyBinding,
|
||||||
ParentElement as _, Render, SharedString, Styled, View, ViewContext, VisualContext,
|
ParentElement as _, Render, SharedString, Styled, View, ViewContext, VisualContext,
|
||||||
WindowContext,
|
WindowContext,
|
||||||
};
|
};
|
||||||
|
|
@ -68,21 +68,21 @@ impl InputStory {
|
||||||
|
|
||||||
let prefix_input1 = cx.new_view(|cx| {
|
let prefix_input1 = cx.new_view(|cx| {
|
||||||
TextInput::new(cx)
|
TextInput::new(cx)
|
||||||
.prefix(|_| IconName::Search)
|
.prefix(|_| div().child(IconName::Search).ml_3())
|
||||||
.placeholder("Search some thing...")
|
.placeholder("Search some thing...")
|
||||||
.cleanable(true)
|
.cleanable(true)
|
||||||
});
|
});
|
||||||
let suffix_input1 = cx.new_view(|cx| {
|
let suffix_input1 = cx.new_view(|cx| {
|
||||||
TextInput::new(cx)
|
TextInput::new(cx)
|
||||||
.suffix(|_| IconName::Info)
|
.suffix(|_| div().child(IconName::Info).mr_3())
|
||||||
.placeholder("This input only support [a-zA-Z0-9] characters.")
|
.placeholder("This input only support [a-zA-Z0-9] characters.")
|
||||||
.pattern(regex::Regex::new(r"^[a-zA-Z0-9]*$").unwrap())
|
.pattern(regex::Regex::new(r"^[a-zA-Z0-9]*$").unwrap())
|
||||||
.cleanable(true)
|
.cleanable(true)
|
||||||
});
|
});
|
||||||
let both_input1 = cx.new_view(|cx| {
|
let both_input1 = cx.new_view(|cx| {
|
||||||
TextInput::new(cx)
|
TextInput::new(cx)
|
||||||
.prefix(|_| IconName::Search)
|
.prefix(|_| div().child(IconName::Search).ml_3())
|
||||||
.suffix(|_| IconName::Info)
|
.suffix(|_| div().child(IconName::Info).mr_3())
|
||||||
.cleanable(true)
|
.cleanable(true)
|
||||||
.placeholder("This input have prefix and suffix.")
|
.placeholder("This input have prefix and suffix.")
|
||||||
});
|
});
|
||||||
|
|
@ -198,7 +198,7 @@ impl Render for InputStory {
|
||||||
.gap_3()
|
.gap_3()
|
||||||
.items_start()
|
.items_start()
|
||||||
.child(
|
.child(
|
||||||
section("Preifx and Suffix", cx)
|
section("Prefix and Suffix", cx)
|
||||||
.child(self.prefix_input1.clone())
|
.child(self.prefix_input1.clone())
|
||||||
.child(self.both_input1.clone())
|
.child(self.both_input1.clone())
|
||||||
.child(self.suffix_input1.clone()),
|
.child(self.suffix_input1.clone()),
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ use crate::{
|
||||||
button::{Button, ButtonStyle},
|
button::{Button, ButtonStyle},
|
||||||
h_flex,
|
h_flex,
|
||||||
list::{self, List, ListDelegate, ListItem},
|
list::{self, List, ListDelegate, ListItem},
|
||||||
styled_ext::Sizeful,
|
styled_ext::StyleSized,
|
||||||
theme::ActiveTheme as _,
|
theme::ActiveTheme as _,
|
||||||
Clickable as _, Icon, IconName, Size, StyledExt,
|
Clickable as _, Icon, IconName, Size, StyledExt,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use gpui::{ClickEvent, Focusable, InteractiveElement, WindowContext};
|
use gpui::{ClickEvent, Focusable, InteractiveElement, WindowContext};
|
||||||
|
|
||||||
pub trait InterativeElementExt: InteractiveElement {
|
pub trait InteractiveElementExt: InteractiveElement {
|
||||||
/// Set the listener for a double click event.
|
/// Set the listener for a double click event.
|
||||||
fn on_double_click(
|
fn on_double_click(
|
||||||
mut self,
|
mut self,
|
||||||
|
|
@ -18,9 +18,9 @@ pub trait InterativeElementExt: InteractiveElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<E: InteractiveElement> InterativeElementExt for Focusable<E> {}
|
impl<E: InteractiveElement> InteractiveElementExt for Focusable<E> {}
|
||||||
|
|
||||||
// impl<E> InterativeElementExt for Stateful<E>
|
// impl<E> InteractiveElementExt for Stateful<E>
|
||||||
// where
|
// where
|
||||||
// E: Element,
|
// E: Element,
|
||||||
// Self: InteractiveElement,
|
// Self: InteractiveElement,
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ use super::blink_cursor::BlinkCursor;
|
||||||
use super::history::History;
|
use super::history::History;
|
||||||
use crate::button::{Button, ButtonStyle};
|
use crate::button::{Button, ButtonStyle};
|
||||||
use crate::indicator::Indicator;
|
use crate::indicator::Indicator;
|
||||||
use crate::styled_ext::Sizeful;
|
use crate::styled_ext::StyleSized;
|
||||||
use crate::theme::ActiveTheme;
|
use crate::theme::ActiveTheme;
|
||||||
use crate::{event::InterativeElementExt as _, Size};
|
use crate::{event::InteractiveElementExt as _, Size};
|
||||||
use crate::{Clickable, IconName, StyledExt as _};
|
use crate::{Clickable, IconName, StyledExt as _};
|
||||||
use gpui::prelude::FluentBuilder as _;
|
use gpui::prelude::FluentBuilder as _;
|
||||||
use gpui::{
|
use gpui::{
|
||||||
|
|
@ -821,7 +821,7 @@ impl Element for TextElement {
|
||||||
let cursor = input.cursor_offset();
|
let cursor = input.cursor_offset();
|
||||||
let style = cx.text_style();
|
let style = cx.text_style();
|
||||||
|
|
||||||
let (disaplay_text, text_color) = if text.is_empty() {
|
let (display_text, text_color) = if text.is_empty() {
|
||||||
(placeholder, cx.theme().muted_foreground)
|
(placeholder, cx.theme().muted_foreground)
|
||||||
} else if input.masked {
|
} else if input.masked {
|
||||||
(
|
(
|
||||||
|
|
@ -833,7 +833,7 @@ impl Element for TextElement {
|
||||||
};
|
};
|
||||||
|
|
||||||
let run = TextRun {
|
let run = TextRun {
|
||||||
len: disaplay_text.len(),
|
len: display_text.len(),
|
||||||
font: style.font(),
|
font: style.font(),
|
||||||
color: text_color,
|
color: text_color,
|
||||||
background_color: None,
|
background_color: None,
|
||||||
|
|
@ -857,7 +857,7 @@ impl Element for TextElement {
|
||||||
..run.clone()
|
..run.clone()
|
||||||
},
|
},
|
||||||
TextRun {
|
TextRun {
|
||||||
len: disaplay_text.len() - marked_range.end,
|
len: display_text.len() - marked_range.end,
|
||||||
..run.clone()
|
..run.clone()
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
@ -871,7 +871,7 @@ impl Element for TextElement {
|
||||||
let font_size = style.font_size.to_pixels(cx.rem_size());
|
let font_size = style.font_size.to_pixels(cx.rem_size());
|
||||||
let line = cx
|
let line = cx
|
||||||
.text_system()
|
.text_system()
|
||||||
.shape_line(disaplay_text, font_size, &runs)
|
.shape_line(display_text, font_size, &runs)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// Calculate the scroll offset to keep the cursor in view
|
// Calculate the scroll offset to keep the cursor in view
|
||||||
|
|
@ -1036,7 +1036,8 @@ impl Render for TextInput {
|
||||||
.rounded(px(cx.theme().radius))
|
.rounded(px(cx.theme().radius))
|
||||||
.shadow_sm()
|
.shadow_sm()
|
||||||
.when(focused, |this| this.outline(cx))
|
.when(focused, |this| this.outline(cx))
|
||||||
.input_px(self.size)
|
.when(prefix.is_none(), |this| this.input_pl(self.size))
|
||||||
|
.when(suffix.is_none(), |this| this.input_pr(self.size))
|
||||||
.bg(if self.disabled {
|
.bg(if self.disabled {
|
||||||
cx.theme().muted
|
cx.theme().muted
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ pub use wry;
|
||||||
|
|
||||||
pub use clickable::Clickable;
|
pub use clickable::Clickable;
|
||||||
pub use disableable::Disableable;
|
pub use disableable::Disableable;
|
||||||
pub use event::InterativeElementExt;
|
pub use event::InteractiveElementExt;
|
||||||
pub use focusable::FocusableCycle;
|
pub use focusable::FocusableCycle;
|
||||||
pub use selectable::{Selectable, Selection};
|
pub use selectable::{Selectable, Selection};
|
||||||
pub use styled_ext::{Size, StyledExt};
|
pub use styled_ext::{Size, StyledExt};
|
||||||
|
|
|
||||||
|
|
@ -195,18 +195,36 @@ impl From<Pixels> for Size {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub trait Sizeful<T: Styled> {
|
pub trait StyleSized<T: Styled> {
|
||||||
fn input_size(self, size: Size) -> Self;
|
fn input_size(self, size: Size) -> Self;
|
||||||
|
fn input_pl(self, size: Size) -> Self;
|
||||||
|
fn input_pr(self, size: Size) -> Self;
|
||||||
fn input_px(self, size: Size) -> Self;
|
fn input_px(self, size: Size) -> Self;
|
||||||
fn input_py(self, size: Size) -> Self;
|
fn input_py(self, size: Size) -> Self;
|
||||||
fn input_h(self, size: Size) -> Self;
|
fn input_h(self, size: Size) -> Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Styled> Sizeful<T> for T {
|
impl<T: Styled> StyleSized<T> for T {
|
||||||
fn input_size(self, size: Size) -> Self {
|
fn input_size(self, size: Size) -> Self {
|
||||||
self.input_px(size).input_py(size).input_h(size)
|
self.input_px(size).input_py(size).input_h(size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn input_pl(self, size: Size) -> Self {
|
||||||
|
match size {
|
||||||
|
Size::Large => self.pl_5(),
|
||||||
|
Size::Medium => self.pl_3(),
|
||||||
|
_ => self.pl_2(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn input_pr(self, size: Size) -> Self {
|
||||||
|
match size {
|
||||||
|
Size::Large => self.pr_5(),
|
||||||
|
Size::Medium => self.pr_3(),
|
||||||
|
_ => self.pr_2(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn input_px(self, size: Size) -> Self {
|
fn input_px(self, size: Size) -> Self {
|
||||||
match size {
|
match size {
|
||||||
Size::Large => self.px_5(),
|
Size::Large => self.px_5(),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue