branches: Add a modal branch list.

Extract branch list into a separate vcs_menu crate akin to recent_projects.
Add current bind for a modal branch to branch popover's tooltip.

Z-2555
This commit is contained in:
Piotr Osiewicz 2023-07-10 17:18:12 +02:00
parent 6739c31594
commit e00e73f608
9 changed files with 71 additions and 11 deletions

14
Cargo.lock generated
View file

@ -1491,6 +1491,7 @@ dependencies = [
"theme", "theme",
"theme_selector", "theme_selector",
"util", "util",
"vcs_menu",
"workspace", "workspace",
"zed-actions", "zed-actions",
] ]
@ -8377,6 +8378,19 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "vcs_menu"
version = "0.1.0"
dependencies = [
"anyhow",
"fuzzy",
"gpui",
"picker",
"theme",
"util",
"workspace",
]
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.4" version = "0.9.4"

View file

@ -64,6 +64,7 @@ members = [
"crates/theme_selector", "crates/theme_selector",
"crates/util", "crates/util",
"crates/vim", "crates/vim",
"crates/vcs_menu",
"crates/workspace", "crates/workspace",
"crates/welcome", "crates/welcome",
"crates/xtask", "crates/xtask",

View file

@ -39,6 +39,7 @@
"cmd-shift-n": "workspace::NewWindow", "cmd-shift-n": "workspace::NewWindow",
"cmd-o": "workspace::Open", "cmd-o": "workspace::Open",
"alt-cmd-o": "projects::OpenRecent", "alt-cmd-o": "projects::OpenRecent",
"alt-cmd-b": "branches::OpenRecent",
"ctrl-~": "workspace::NewTerminal", "ctrl-~": "workspace::NewTerminal",
"ctrl-`": "terminal_panel::ToggleFocus", "ctrl-`": "terminal_panel::ToggleFocus",
"shift-escape": "workspace::ToggleZoom" "shift-escape": "workspace::ToggleZoom"

View file

@ -2,6 +2,7 @@
{ {
"bindings": { "bindings": {
"cmd-shift-o": "projects::OpenRecent", "cmd-shift-o": "projects::OpenRecent",
"cmd-shift-b": "branches::OpenRecent",
"cmd-alt-tab": "project_panel::ToggleFocus" "cmd-alt-tab": "project_panel::ToggleFocus"
} }
}, },

View file

@ -39,6 +39,7 @@ recent_projects = {path = "../recent_projects"}
settings = { path = "../settings" } settings = { path = "../settings" }
theme = { path = "../theme" } theme = { path = "../theme" }
theme_selector = { path = "../theme_selector" } theme_selector = { path = "../theme_selector" }
vcs_menu = { path = "../vcs_menu" }
util = { path = "../util" } util = { path = "../util" }
workspace = { path = "../workspace" } workspace = { path = "../workspace" }
zed-actions = {path = "../zed-actions"} zed-actions = {path = "../zed-actions"}

View file

@ -1,8 +1,5 @@
use crate::{ use crate::{
branch_list::{build_branch_list, BranchList}, contact_notification::ContactNotification, contacts_popover, face_pile::FacePile,
contact_notification::ContactNotification,
contacts_popover,
face_pile::FacePile,
toggle_deafen, toggle_mute, toggle_screen_sharing, LeaveCall, ToggleDeafen, ToggleMute, toggle_deafen, toggle_mute, toggle_screen_sharing, LeaveCall, ToggleDeafen, ToggleMute,
ToggleScreenSharing, ToggleScreenSharing,
}; };
@ -27,6 +24,7 @@ use recent_projects::{build_recent_projects, RecentProjects};
use std::{ops::Range, sync::Arc}; use std::{ops::Range, sync::Arc};
use theme::{AvatarStyle, Theme}; use theme::{AvatarStyle, Theme};
use util::ResultExt; use util::ResultExt;
use vcs_menu::{build_branch_list, BranchList, OpenRecent as ToggleVcsMenu};
use workspace::{FollowNextCollaborator, Workspace, WORKSPACE_DB}; use workspace::{FollowNextCollaborator, Workspace, WORKSPACE_DB};
const MAX_PROJECT_NAME_LENGTH: usize = 40; const MAX_PROJECT_NAME_LENGTH: usize = 40;
@ -37,7 +35,6 @@ actions!(
[ [
ToggleContactsMenu, ToggleContactsMenu,
ToggleUserMenu, ToggleUserMenu,
ToggleVcsMenu,
ToggleProjectMenu, ToggleProjectMenu,
SwitchBranch, SwitchBranch,
ShareProject, ShareProject,
@ -286,7 +283,7 @@ impl CollabTitlebarItem {
.with_tooltip::<BranchPopoverTooltip>( .with_tooltip::<BranchPopoverTooltip>(
0, 0,
"Recent branches".into(), "Recent branches".into(),
None, Some(Box::new(ToggleVcsMenu)),
theme.tooltip.clone(), theme.tooltip.clone(),
cx, cx,
) )

View file

@ -1,4 +1,3 @@
mod branch_list;
mod collab_titlebar_item; mod collab_titlebar_item;
mod contact_finder; mod contact_finder;
mod contact_list; mod contact_list;
@ -29,7 +28,7 @@ actions!(
); );
pub fn init(app_state: &Arc<AppState>, cx: &mut AppContext) { pub fn init(app_state: &Arc<AppState>, cx: &mut AppContext) {
branch_list::init(cx); vcs_menu::init(cx);
collab_titlebar_item::init(cx); collab_titlebar_item::init(cx);
contact_list::init(cx); contact_list::init(cx);
contact_finder::init(cx); contact_finder::init(cx);

View file

@ -0,0 +1,16 @@
[package]
name = "vcs_menu"
version = "0.1.0"
edition = "2021"
publish = false
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
fuzzy = {path = "../fuzzy"}
gpui = {path = "../gpui"}
picker = {path = "../picker"}
util = {path = "../util"}
theme = {path = "../theme"}
workspace = {path = "../workspace"}
anyhow.workspace = true

View file

@ -1,15 +1,17 @@
use anyhow::{anyhow, bail}; use anyhow::{anyhow, bail, Result};
use fuzzy::{StringMatch, StringMatchCandidate}; use fuzzy::{StringMatch, StringMatchCandidate};
use gpui::{elements::*, AppContext, MouseState, Task, ViewContext, ViewHandle}; use gpui::{actions, elements::*, AppContext, MouseState, Task, ViewContext, ViewHandle};
use picker::{Picker, PickerDelegate, PickerEvent}; use picker::{Picker, PickerDelegate, PickerEvent};
use std::{ops::Not, sync::Arc}; use std::{ops::Not, sync::Arc};
use util::ResultExt; use util::ResultExt;
use workspace::{Toast, Workspace}; use workspace::{Toast, Workspace};
actions!(branches, [OpenRecent]);
pub fn init(cx: &mut AppContext) { pub fn init(cx: &mut AppContext) {
Picker::<BranchListDelegate>::init(cx); Picker::<BranchListDelegate>::init(cx);
cx.add_async_action(toggle);
} }
pub type BranchList = Picker<BranchListDelegate>; pub type BranchList = Picker<BranchListDelegate>;
pub fn build_branch_list( pub fn build_branch_list(
@ -28,6 +30,34 @@ pub fn build_branch_list(
.with_theme(|theme| theme.picker.clone()) .with_theme(|theme| theme.picker.clone())
} }
fn toggle(
_: &mut Workspace,
_: &OpenRecent,
cx: &mut ViewContext<Workspace>,
) -> Option<Task<Result<()>>> {
Some(cx.spawn(|workspace, mut cx| async move {
workspace.update(&mut cx, |workspace, cx| {
workspace.toggle_modal(cx, |_, cx| {
let workspace = cx.handle();
cx.add_view(|cx| {
Picker::new(
BranchListDelegate {
matches: vec![],
workspace,
selected_index: 0,
last_query: String::default(),
},
cx,
)
.with_theme(|theme| theme.picker.clone())
.with_max_size(800., 1200.)
})
});
})?;
Ok(())
}))
}
pub struct BranchListDelegate { pub struct BranchListDelegate {
matches: Vec<StringMatch>, matches: Vec<StringMatch>,
workspace: ViewHandle<Workspace>, workspace: ViewHandle<Workspace>,