chore: Update getter method to return reference to view components. (#827)
This commit is contained in:
parent
3a915dba89
commit
38d9c24af5
10 changed files with 116 additions and 24 deletions
|
|
@ -14,11 +14,10 @@ log = "0.4"
|
||||||
serde = "1.0.203"
|
serde = "1.0.203"
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
smallvec = "1"
|
smallvec = "1"
|
||||||
windows = { version = "0.58.0", features = [
|
|
||||||
"Wdk",
|
[workspace.dependencies.windows]
|
||||||
"Wdk_System",
|
version = "0.58.0"
|
||||||
"Wdk_System_SystemServices",
|
features = ["Wdk", "Wdk_System", "Wdk_System_SystemServices"]
|
||||||
] }
|
|
||||||
|
|
||||||
[workspace.lints.clippy]
|
[workspace.lints.clippy]
|
||||||
almost_complete_range = "allow"
|
almost_complete_range = "allow"
|
||||||
|
|
|
||||||
78
crates/story/src/color_picker_story.rs
Normal file
78
crates/story/src/color_picker_story.rs
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
use gpui::{
|
||||||
|
prelude::FluentBuilder as _, App, AppContext, Context, Entity, Focusable, Hsla, IntoElement,
|
||||||
|
ParentElement as _, Render, Styled as _, Subscription, Window,
|
||||||
|
};
|
||||||
|
use gpui_component::{
|
||||||
|
blue_500,
|
||||||
|
color_picker::{ColorPicker, ColorPickerEvent},
|
||||||
|
green_500, red_500, v_flex, yellow_500, Colorize,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::section;
|
||||||
|
|
||||||
|
pub struct ColorPickerStory {
|
||||||
|
color_picker: Entity<ColorPicker>,
|
||||||
|
selected_color: Option<Hsla>,
|
||||||
|
|
||||||
|
_subscriptions: Vec<Subscription>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl super::Story for ColorPickerStory {
|
||||||
|
fn title() -> &'static str {
|
||||||
|
"ColorPicker"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn description() -> &'static str {
|
||||||
|
"A color picker to select color."
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_view(window: &mut Window, cx: &mut App) -> Entity<impl Render + Focusable> {
|
||||||
|
Self::view(window, cx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ColorPickerStory {
|
||||||
|
pub fn view(window: &mut Window, cx: &mut App) -> Entity<Self> {
|
||||||
|
cx.new(|cx| Self::new(window, cx))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new(window: &mut Window, cx: &mut Context<Self>) -> Self {
|
||||||
|
let color_picker = cx.new(|cx| {
|
||||||
|
ColorPicker::new("1", window, cx)
|
||||||
|
.default_value(red_500())
|
||||||
|
.featured_colors(vec![red_500(), blue_500(), green_500(), yellow_500()])
|
||||||
|
});
|
||||||
|
|
||||||
|
let _subscriptions = vec![cx.subscribe(&color_picker, |this, _, ev, _| match ev {
|
||||||
|
ColorPickerEvent::Change(color) => {
|
||||||
|
this.selected_color = *color;
|
||||||
|
println!("Color changed to: {:?}", color);
|
||||||
|
}
|
||||||
|
})];
|
||||||
|
|
||||||
|
Self {
|
||||||
|
color_picker,
|
||||||
|
selected_color: Some(red_500()),
|
||||||
|
_subscriptions,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Focusable for ColorPickerStory {
|
||||||
|
fn focus_handle(&self, cx: &gpui::App) -> gpui::FocusHandle {
|
||||||
|
self.color_picker.focus_handle(cx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Render for ColorPickerStory {
|
||||||
|
fn render(&mut self, _: &mut Window, _: &mut Context<Self>) -> impl IntoElement {
|
||||||
|
v_flex().gap_3().child(
|
||||||
|
section("Normal")
|
||||||
|
.max_w_md()
|
||||||
|
.child(self.color_picker.clone())
|
||||||
|
.when_some(self.selected_color, |this, color| {
|
||||||
|
this.child(color.to_hex())
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ mod button_story;
|
||||||
mod calendar_story;
|
mod calendar_story;
|
||||||
mod checkbox_story;
|
mod checkbox_story;
|
||||||
mod clipboard_story;
|
mod clipboard_story;
|
||||||
|
mod color_picker_story;
|
||||||
mod date_picker_story;
|
mod date_picker_story;
|
||||||
mod drawer_story;
|
mod drawer_story;
|
||||||
mod dropdown_story;
|
mod dropdown_story;
|
||||||
|
|
@ -55,6 +56,7 @@ pub use button_story::ButtonStory;
|
||||||
pub use calendar_story::CalendarStory;
|
pub use calendar_story::CalendarStory;
|
||||||
pub use checkbox_story::CheckboxStory;
|
pub use checkbox_story::CheckboxStory;
|
||||||
pub use clipboard_story::ClipboardStory;
|
pub use clipboard_story::ClipboardStory;
|
||||||
|
pub use color_picker_story::ColorPickerStory;
|
||||||
pub use date_picker_story::DatePickerStory;
|
pub use date_picker_story::DatePickerStory;
|
||||||
pub use drawer_story::DrawerStory;
|
pub use drawer_story::DrawerStory;
|
||||||
pub use dropdown_story::DropdownStory;
|
pub use dropdown_story::DropdownStory;
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ impl Gallery {
|
||||||
StoryContainer::panel::<CalendarStory>(window, cx),
|
StoryContainer::panel::<CalendarStory>(window, cx),
|
||||||
StoryContainer::panel::<CheckboxStory>(window, cx),
|
StoryContainer::panel::<CheckboxStory>(window, cx),
|
||||||
StoryContainer::panel::<ClipboardStory>(window, cx),
|
StoryContainer::panel::<ClipboardStory>(window, cx),
|
||||||
|
StoryContainer::panel::<ColorPickerStory>(window, cx),
|
||||||
StoryContainer::panel::<DatePickerStory>(window, cx),
|
StoryContainer::panel::<DatePickerStory>(window, cx),
|
||||||
StoryContainer::panel::<DropdownStory>(window, cx),
|
StoryContainer::panel::<DropdownStory>(window, cx),
|
||||||
StoryContainer::panel::<DrawerStory>(window, cx),
|
StoryContainer::panel::<DrawerStory>(window, cx),
|
||||||
|
|
|
||||||
|
|
@ -134,11 +134,22 @@ impl ColorPicker {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set default color value.
|
||||||
|
pub fn default_value(mut self, value: Hsla) -> Self {
|
||||||
|
self.value = Some(value);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Set current color value.
|
/// Set current color value.
|
||||||
pub fn set_value(&mut self, value: Hsla, window: &mut Window, cx: &mut Context<Self>) {
|
pub fn set_value(&mut self, value: Hsla, window: &mut Window, cx: &mut Context<Self>) {
|
||||||
self.update_value(Some(value), false, window, cx)
|
self.update_value(Some(value), false, window, cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get current color value.
|
||||||
|
pub fn value(&self) -> Option<Hsla> {
|
||||||
|
self.value
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the size of the color picker, default is `Size::Medium`.
|
/// Set the size of the color picker, default is `Size::Medium`.
|
||||||
pub fn size(mut self, size: Size) -> Self {
|
pub fn size(mut self, size: Size) -> Self {
|
||||||
self.size = size;
|
self.size = size;
|
||||||
|
|
|
||||||
|
|
@ -91,8 +91,8 @@ impl OtpInput {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the value of the OTP Input.
|
/// Return the value of the OTP Input.
|
||||||
pub fn value(&self) -> SharedString {
|
pub fn value(&self) -> &SharedString {
|
||||||
self.value.clone()
|
&self.value
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set masked to true use masked input.
|
/// Set masked to true use masked input.
|
||||||
|
|
|
||||||
|
|
@ -95,15 +95,15 @@ impl Slider {
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_thumb_pos(&mut self) {
|
|
||||||
self.percentage = self.value.clamp(self.min, self.max) / self.max;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the value of the slider.
|
/// Get the value of the slider.
|
||||||
pub fn value(&self) -> f32 {
|
pub fn value(&self) -> f32 {
|
||||||
self.value
|
self.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn update_thumb_pos(&mut self) {
|
||||||
|
self.percentage = self.value.clamp(self.min, self.max) / self.max;
|
||||||
|
}
|
||||||
|
|
||||||
/// Update value by mouse position
|
/// Update value by mouse position
|
||||||
fn update_value_by_position(
|
fn update_value_by_position(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ use gpui::{
|
||||||
};
|
};
|
||||||
use std::{cell::RefCell, rc::Rc, time::Duration};
|
use std::{cell::RefCell, rc::Rc, time::Duration};
|
||||||
|
|
||||||
|
/// A Switch element that can be toggled on or off.
|
||||||
pub struct Switch {
|
pub struct Switch {
|
||||||
id: ElementId,
|
id: ElementId,
|
||||||
base: Div,
|
base: Div,
|
||||||
|
|
|
||||||
|
|
@ -343,7 +343,11 @@ pub trait TableDelegate: Sized + 'static {
|
||||||
fn load_more(&mut self, window: &mut Window, cx: &mut Context<Table<Self>>) {}
|
fn load_more(&mut self, window: &mut Window, cx: &mut Context<Table<Self>>) {}
|
||||||
|
|
||||||
/// Render the last empty column, default to empty.
|
/// Render the last empty column, default to empty.
|
||||||
fn render_last_empty_col(&mut self, window: &mut Window, cx: &mut Context<Table<Self>>) -> Div {
|
fn render_last_empty_col(
|
||||||
|
&mut self,
|
||||||
|
window: &mut Window,
|
||||||
|
cx: &mut Context<Table<Self>>,
|
||||||
|
) -> impl IntoElement {
|
||||||
h_flex().w_3().h_full().flex_shrink_0()
|
h_flex().w_3().h_full().flex_shrink_0()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -650,11 +654,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Scroll table when mouse position is near the edge of the table bounds.
|
/// Scroll table when mouse position is near the edge of the table bounds.
|
||||||
fn scroll_table_by_col_resizing(
|
fn scroll_table_by_col_resizing(&mut self, mouse_position: Point<Pixels>, col_group: ColGroup) {
|
||||||
&mut self,
|
|
||||||
mouse_position: Point<Pixels>,
|
|
||||||
col_group: ColGroup,
|
|
||||||
) {
|
|
||||||
// Do nothing if pos out of the table bounds right for avoid scroll to the right.
|
// Do nothing if pos out of the table bounds right for avoid scroll to the right.
|
||||||
if mouse_position.x > self.bounds.right() {
|
if mouse_position.x > self.bounds.right() {
|
||||||
return;
|
return;
|
||||||
|
|
@ -663,9 +663,12 @@ where
|
||||||
let mut offset = self.horizontal_scroll_handle.offset();
|
let mut offset = self.horizontal_scroll_handle.offset();
|
||||||
let col_bounds = col_group.bounds;
|
let col_bounds = col_group.bounds;
|
||||||
|
|
||||||
if mouse_position.x < self.bounds.left() && col_bounds.right() < self.bounds.left() + px(20.) {
|
if mouse_position.x < self.bounds.left()
|
||||||
|
&& col_bounds.right() < self.bounds.left() + px(20.)
|
||||||
|
{
|
||||||
offset.x += px(1.);
|
offset.x += px(1.);
|
||||||
} else if mouse_position.x > self.bounds.right() && col_bounds.right() > self.bounds.right() - px(20.)
|
} else if mouse_position.x > self.bounds.right()
|
||||||
|
&& col_bounds.right() > self.bounds.right() - px(20.)
|
||||||
{
|
{
|
||||||
offset.x -= px(1.);
|
offset.x -= px(1.);
|
||||||
}
|
}
|
||||||
|
|
@ -973,10 +976,7 @@ where
|
||||||
);
|
);
|
||||||
|
|
||||||
// scroll the table if the drag is near the edge
|
// scroll the table if the drag is near the edge
|
||||||
view.scroll_table_by_col_resizing(
|
view.scroll_table_by_col_resizing(e.event.position, col_group);
|
||||||
e.event.position,
|
|
||||||
col_group,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ impl TagVariant {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tag is a small status indicator for UI elements.
|
/// Tag is a small status indicator.
|
||||||
///
|
///
|
||||||
/// Only support: Medium, Small
|
/// Only support: Medium, Small
|
||||||
#[derive(IntoElement)]
|
#[derive(IntoElement)]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue