git_ui.rs

 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}