update
This commit is contained in:
@@ -3,8 +3,8 @@ use std::sync::Arc;
|
||||
|
||||
use gpui::prelude::*;
|
||||
use gpui::{
|
||||
AnyElement, App, Context, ElementId, Entity, EventEmitter, FocusHandle, Focusable, Pixels,
|
||||
Render, SharedString, Size, Subscription, WeakEntity, Window, div, px, size,
|
||||
AnyElement, App, Context, Entity, EventEmitter, FocusHandle, Focusable, Pixels, Render,
|
||||
SharedString, Size, Subscription, WeakEntity, Window, div, px, size,
|
||||
};
|
||||
use gpui_component::avatar::Avatar;
|
||||
use gpui_component::dock::{DockArea, DockPlacement, Panel, PanelEvent};
|
||||
@@ -56,13 +56,31 @@ impl RepoListView {
|
||||
}
|
||||
}
|
||||
|
||||
fn open_repo(
|
||||
&mut self,
|
||||
announcement: &Announcement,
|
||||
window: &mut Window,
|
||||
cx: &mut Context<Self>,
|
||||
) {
|
||||
let dock_area = self.dock_area.clone();
|
||||
let detail = cx.new(|cx| RepoDetailView::new(announcement.clone(), window, cx));
|
||||
|
||||
if let Some(dock_area) = dock_area.upgrade() {
|
||||
dock_area.update(cx, |dock_area, cx| {
|
||||
dock_area.add_panel(Arc::new(detail), DockPlacement::Center, None, window, cx);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
fn render_card(
|
||||
&self,
|
||||
ix: usize,
|
||||
announcement: &Announcement,
|
||||
last_activity: Option<Timestamp>,
|
||||
cx: &mut App,
|
||||
cx: &mut Context<Self>,
|
||||
) -> AnyElement {
|
||||
let owner = ProfileStore::global(cx).read(cx).get(&announcement.owner);
|
||||
let profile_store = ProfileStore::global(cx);
|
||||
let owner = profile_store.read(cx).get(&announcement.owner);
|
||||
|
||||
let name = announcement
|
||||
.name
|
||||
@@ -79,34 +97,13 @@ impl RepoListView {
|
||||
.map(|label| SharedString::from(format!("Updated {label}")))
|
||||
.unwrap_or_default();
|
||||
|
||||
// Open the repository in a new center tab when the card is clicked.
|
||||
let dock_area = self.dock_area.clone();
|
||||
let announcement = announcement.clone();
|
||||
|
||||
v_flex()
|
||||
.id(ElementId::from(format!(
|
||||
"repo-card-{}",
|
||||
announcement.addr()
|
||||
)))
|
||||
.id(ix)
|
||||
.px_4()
|
||||
.w_full()
|
||||
.border_b(px(1.))
|
||||
.border_color(cx.theme().border)
|
||||
.cursor_pointer()
|
||||
.on_click(move |_event, window, cx| {
|
||||
let detail = cx.new(|cx| RepoDetailView::new(announcement.clone(), window, cx));
|
||||
if let Some(dock_area) = dock_area.upgrade() {
|
||||
dock_area.update(cx, |dock_area, cx| {
|
||||
dock_area.add_panel(
|
||||
Arc::new(detail),
|
||||
DockPlacement::Center,
|
||||
None,
|
||||
window,
|
||||
cx,
|
||||
);
|
||||
});
|
||||
}
|
||||
})
|
||||
.hover(|this| this.bg(cx.theme().list_hover))
|
||||
.child(
|
||||
h_flex()
|
||||
.h_12()
|
||||
@@ -158,6 +155,12 @@ impl RepoListView {
|
||||
.child(activity),
|
||||
),
|
||||
)
|
||||
.on_click(cx.listener({
|
||||
let announcement = announcement.clone();
|
||||
move |this, _ev, window, cx| {
|
||||
this.open_repo(&announcement, window, cx);
|
||||
}
|
||||
}))
|
||||
.into_any_element()
|
||||
}
|
||||
}
|
||||
@@ -214,23 +217,21 @@ impl Render for RepoListView {
|
||||
)
|
||||
})
|
||||
.when(has_announcements, |this| {
|
||||
let view = cx.entity().clone();
|
||||
let sizes = self.item_sizes.clone();
|
||||
|
||||
this.child(
|
||||
v_virtual_list(
|
||||
cx.entity().clone(),
|
||||
"repos",
|
||||
self.item_sizes.clone(),
|
||||
move |this, range, _window, cx| {
|
||||
let mut items = vec![];
|
||||
v_virtual_list(view, "repos", sizes, move |this, range, _window, cx| {
|
||||
let mut items = vec![];
|
||||
|
||||
for ix in range {
|
||||
let announcement: &Announcement = &announcements[ix];
|
||||
let activity = last_activity.get(&announcement.addr()).copied();
|
||||
items.push(this.render_card(announcement, activity, cx));
|
||||
}
|
||||
for ix in range {
|
||||
let announcement: &Announcement = &announcements[ix];
|
||||
let activity = last_activity.get(&announcement.addr()).copied();
|
||||
items.push(this.render_card(ix, announcement, activity, cx));
|
||||
}
|
||||
|
||||
items
|
||||
},
|
||||
)
|
||||
items
|
||||
})
|
||||
.track_scroll(&self.scroll_handle)
|
||||
.size_full(),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user