172 lines
5.9 KiB
Rust
172 lines
5.9 KiB
Rust
use galaxy_core::ui::theme::Fill;
|
|
use pathfinder_color::ColorU;
|
|
use warpui::elements::{
|
|
ConstrainedBox, Container, CornerRadius, CrossAxisAlignment, Flex, MouseStateHandle,
|
|
ParentElement, Radius, Shrinkable,
|
|
};
|
|
use warpui::fonts::Weight;
|
|
use warpui::platform::Cursor;
|
|
use warpui::ui_components::button::ButtonVariant;
|
|
use warpui::ui_components::components::{Coords, UiComponent, UiComponentStyles};
|
|
use warpui::ui_components::text_input::TextInput;
|
|
use warpui::{Action, AppContext, Element, SingletonEntity, ViewHandle};
|
|
|
|
use crate::appearance::Appearance;
|
|
use crate::editor::EditorView;
|
|
use crate::ui_components::icons::Icon;
|
|
|
|
pub const INPUT_BOX_FONT_SIZE: f32 = 14.;
|
|
pub const TEAM_BLOCK_INITIAL_HEIGHT: f32 = 92.;
|
|
pub const SKIP_BUTTON_WIDTH: f32 = 60.;
|
|
pub const SKIP_BUTTON_HEIGHT: f32 = 40.;
|
|
const CREATE_BUTTON_WIDTH: f32 = 120.;
|
|
pub const BUTTON_GAP: f32 = 8.;
|
|
|
|
pub fn render_skip_button<A: Action + Clone>(
|
|
action: A,
|
|
mouse_state_handle: MouseStateHandle,
|
|
appearance: &Appearance,
|
|
) -> Box<dyn Element> {
|
|
appearance
|
|
.ui_builder()
|
|
.button(ButtonVariant::Secondary, mouse_state_handle.clone())
|
|
.with_style(UiComponentStyles {
|
|
font_color: Some(appearance.theme().surface_3().into()),
|
|
font_weight: Some(Weight::Medium),
|
|
width: Some(SKIP_BUTTON_WIDTH),
|
|
height: Some(SKIP_BUTTON_HEIGHT),
|
|
font_size: Some(14.),
|
|
..Default::default()
|
|
})
|
|
.with_hovered_styles(UiComponentStyles {
|
|
background: Some(appearance.theme().outline().into()),
|
|
..Default::default()
|
|
})
|
|
.with_centered_text_label("Skip".to_owned())
|
|
.build()
|
|
.with_cursor(Cursor::PointingHand)
|
|
.on_click(move |ctx, _, _| ctx.dispatch_typed_action(action.clone()))
|
|
.finish()
|
|
}
|
|
|
|
pub fn name(app: &AppContext, team_name_editor: ViewHandle<EditorView>) -> Option<String> {
|
|
let name = team_name_editor.as_ref(app).buffer_text(app);
|
|
if !name.trim().is_empty() {
|
|
Some(name)
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
|
|
pub fn render_input_row<A: Action + Clone>(
|
|
create_team_action: A,
|
|
skip_action: A,
|
|
is_block_completed: bool,
|
|
mouse_state_handle_create_team_button: MouseStateHandle,
|
|
mouse_state_handle_skip_button: MouseStateHandle,
|
|
ctx: &AppContext,
|
|
team_name_editor: ViewHandle<EditorView>,
|
|
) -> Box<dyn Element> {
|
|
let appearance = Appearance::as_ref(ctx);
|
|
let background_color = appearance.theme().background();
|
|
let font_color = appearance.theme().main_text_color(background_color);
|
|
let chip_editor_style = UiComponentStyles::default()
|
|
.set_background(background_color.into())
|
|
.set_border_radius(CornerRadius::with_all(Radius::Pixels(3.)))
|
|
.set_border_width(1.)
|
|
.set_border_color(appearance.theme().foreground().with_opacity(20).into())
|
|
.set_padding(Coords::uniform(0.).top(4.).right(5.));
|
|
|
|
let input_box = Container::new(
|
|
TextInput::new(team_name_editor.clone(), chip_editor_style)
|
|
.with_style(UiComponentStyles {
|
|
width: Some(350.),
|
|
border_radius: Some(CornerRadius::with_all(Radius::Pixels(4.))),
|
|
border_width: Some(1.),
|
|
border_color: Some(font_color.into()),
|
|
padding: Some(Coords::uniform(10.)),
|
|
background: Some(background_color.into()),
|
|
..Default::default()
|
|
})
|
|
.build()
|
|
.finish(),
|
|
)
|
|
.with_margin_right(8.)
|
|
.finish();
|
|
|
|
let mut create_team_button = appearance
|
|
.ui_builder()
|
|
.button(
|
|
ButtonVariant::Accent,
|
|
mouse_state_handle_create_team_button.clone(),
|
|
)
|
|
.with_style(UiComponentStyles {
|
|
font_color: Some(
|
|
appearance
|
|
.theme()
|
|
.main_text_color(appearance.theme().accent())
|
|
.into_solid(),
|
|
),
|
|
font_weight: Some(Weight::Medium),
|
|
font_size: Some(14.),
|
|
height: Some(SKIP_BUTTON_HEIGHT),
|
|
..Default::default()
|
|
})
|
|
.with_centered_text_label("Create team".to_owned());
|
|
if name(ctx, team_name_editor).is_none() {
|
|
create_team_button = create_team_button
|
|
.with_style(UiComponentStyles {
|
|
font_color: Some(
|
|
appearance
|
|
.theme()
|
|
.disabled_text_color(appearance.theme().background())
|
|
.into(),
|
|
),
|
|
..Default::default()
|
|
})
|
|
.disabled();
|
|
}
|
|
|
|
let rendered_buttons = if !is_block_completed {
|
|
let mut row = Flex::row();
|
|
row.add_children([
|
|
Container::new(
|
|
ConstrainedBox::new(
|
|
create_team_button
|
|
.build()
|
|
.with_cursor(Cursor::PointingHand)
|
|
.on_click(move |ctx, _, _| {
|
|
ctx.dispatch_typed_action(create_team_action.clone())
|
|
})
|
|
.finish(),
|
|
)
|
|
.with_width(CREATE_BUTTON_WIDTH)
|
|
.finish(),
|
|
)
|
|
.with_margin_right(BUTTON_GAP)
|
|
.finish(),
|
|
render_skip_button(
|
|
skip_action.clone(),
|
|
mouse_state_handle_skip_button.clone(),
|
|
appearance,
|
|
),
|
|
]);
|
|
row.finish()
|
|
} else {
|
|
ConstrainedBox::new(
|
|
Icon::Check
|
|
.to_galaxyui_icon(Fill::Solid(ColorU::new(11, 142, 71, 255)))
|
|
.finish(),
|
|
)
|
|
.with_width(24.)
|
|
.with_height(24.)
|
|
.finish()
|
|
};
|
|
|
|
Flex::row()
|
|
.with_cross_axis_alignment(CrossAxisAlignment::Center)
|
|
.with_child(input_box)
|
|
.with_child(Shrinkable::new(1., rendered_buttons).finish())
|
|
.finish()
|
|
}
|