1use ::settings::Settings;
2use feature_flags::WaitForFlag;
3use futures::{select_biased, FutureExt};
4use git::status::FileStatus;
5use git_panel_settings::GitPanelSettings;
6use gpui::{AppContext, Hsla};
7use ui::{Color, Icon, IconName, IntoElement};
8
9pub mod git_panel;
10mod git_panel_settings;
11pub mod repository_selector;
12
13pub fn init(cx: &mut AppContext) {
14 GitPanelSettings::register(cx);
15}
16
17// TODO: Remove this before launching Git UI
18pub async fn git_ui_enabled(flag: WaitForFlag) -> bool {
19 let mut git_ui_feature_flag = flag.fuse();
20 let mut timeout = FutureExt::fuse(smol::Timer::after(std::time::Duration::from_secs(5)));
21
22 select_biased! {
23 is_git_ui_enabled = git_ui_feature_flag => is_git_ui_enabled,
24 _ = timeout => false,
25 }
26}
27
28const ADDED_COLOR: Hsla = Hsla {
29 h: 142. / 360.,
30 s: 0.68,
31 l: 0.45,
32 a: 1.0,
33};
34const MODIFIED_COLOR: Hsla = Hsla {
35 h: 48. / 360.,
36 s: 0.76,
37 l: 0.47,
38 a: 1.0,
39};
40const REMOVED_COLOR: Hsla = Hsla {
41 h: 355. / 360.,
42 s: 0.65,
43 l: 0.65,
44 a: 1.0,
45};
46
47// TODO: Add updated status colors to theme
48pub fn git_status_icon(status: FileStatus) -> impl IntoElement {
49 let (icon_name, color) = if status.is_conflicted() {
50 (IconName::Warning, REMOVED_COLOR)
51 } else if status.is_deleted() {
52 (IconName::SquareMinus, REMOVED_COLOR)
53 } else if status.is_modified() {
54 (IconName::SquareDot, MODIFIED_COLOR)
55 } else {
56 (IconName::SquarePlus, ADDED_COLOR)
57 };
58 Icon::new(icon_name).color(Color::Custom(color))
59}