diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index e4cccf3fc5607937a2a82b2ab1089e00bbda6fa7..32ab7952533529836356d076c566fe6dfe572c1a 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -8606,6 +8606,14 @@ impl Editor { ) } + pub fn point_for_position(&self, position: gpui::Point) -> Option { + Some( + self.last_position_map + .as_ref()? + .point_for_position(position), + ) + } + fn is_cmd_or_ctrl_pressed(modifiers: &Modifiers, cx: &mut Context) -> bool { match EditorSettings::get_global(cx).multi_cursor_modifier { MultiCursorModifier::Alt => modifiers.secondary(), diff --git a/crates/git_graph/src/git_graph.rs b/crates/git_graph/src/git_graph.rs index c56fb051b896f32ac364cd15e73ae8708498ca5a..411a47332f8719ca6cd4da87e61da8048c91e483 100644 --- a/crates/git_graph/src/git_graph.rs +++ b/crates/git_graph/src/git_graph.rs @@ -137,6 +137,7 @@ impl ChangedFileEntry { workspace.clone(), None, Some(self.repo_path.clone()), + None, window, cx, ); @@ -1607,6 +1608,7 @@ impl GitGraph { self.workspace.clone(), None, None, + None, window, cx, ); diff --git a/crates/git_ui/src/blame_ui.rs b/crates/git_ui/src/blame_ui.rs index 47d781c4870ade9688b93b75db5a68dd26865ca8..a3d3d50e83a54f7f2401751e7f0aea3ed9ba6412 100644 --- a/crates/git_ui/src/blame_ui.rs +++ b/crates/git_ui/src/blame_ui.rs @@ -107,13 +107,14 @@ impl BlameRenderer for GitBlameRenderer { let blame_entry = blame_entry.clone(); let repository = repository.clone(); let workspace = workspace.clone(); - move |_, window, cx| { + move |e, window, cx| { CommitView::open( blame_entry.sha.to_string(), repository.downgrade(), workspace.clone(), None, None, + e.mouse_position(), window, cx, ) @@ -352,6 +353,7 @@ impl BlameRenderer for GitBlameRenderer { workspace.clone(), None, None, + None, window, cx, ); @@ -385,6 +387,7 @@ impl BlameRenderer for GitBlameRenderer { workspace, None, None, + None, window, cx, ) diff --git a/crates/git_ui/src/commit_tooltip.rs b/crates/git_ui/src/commit_tooltip.rs index b22fcee7e2de5273983b6959f8c52511b877eeaf..1d83a81af67b271437445bcfb712a911645fb986 100644 --- a/crates/git_ui/src/commit_tooltip.rs +++ b/crates/git_ui/src/commit_tooltip.rs @@ -366,6 +366,7 @@ impl Render for CommitTooltip { workspace.clone(), None, None, + None, window, cx, ); diff --git a/crates/git_ui/src/commit_view.rs b/crates/git_ui/src/commit_view.rs index aac44c7f9c6eaf6f18c72bea390c0a0b7ad1a4bd..2eef10ceef895ea5ff4ffb05256f87bfb87bff1e 100644 --- a/crates/git_ui/src/commit_view.rs +++ b/crates/git_ui/src/commit_view.rs @@ -2,7 +2,11 @@ use anyhow::{Context as _, Result}; use buffer_diff::BufferDiff; use collections::HashMap; use editor::display_map::{BlockPlacement, BlockProperties, BlockStyle}; -use editor::{Addon, Editor, EditorEvent, ExcerptRange, MultiBuffer, multibuffer_context_lines}; +use editor::scroll::Autoscroll; +use editor::{ + Addon, BufferOffset, Editor, EditorEvent, ExcerptRange, MultiBuffer, MultiBufferOffset, + SelectionEffects, ToOffset, multibuffer_context_lines, +}; use git::repository::{CommitDetails, CommitDiff, RepoPath, is_binary_content}; use git::status::{FileStatus, StatusCode, TrackedStatus}; use git::{ @@ -18,7 +22,7 @@ use language::{ Anchor, Buffer, Capability, DiskState, File, LanguageRegistry, LineEnding, OffsetRangeExt as _, Point, ReplicaId, Rope, TextBuffer, }; -use multi_buffer::PathKey; +use multi_buffer::{MultiBufferRow, PathKey}; use project::{Project, WorktreeId, git_store::Repository}; use std::{ any::{Any, TypeId}, @@ -104,6 +108,7 @@ impl CommitView { workspace: WeakEntity, stash: Option, file_filter: Option, + clicked_point: Option>, window: &mut Window, cx: &mut App, ) { @@ -129,29 +134,132 @@ impl CommitView { workspace .update_in(cx, |workspace, window, cx| { - let project = workspace.project(); - let commit_view = cx.new(|cx| { - CommitView::new( - commit_details, - commit_diff, - repo, - project.clone(), - stash, - window, - cx, - ) - }); - let pane = workspace.active_pane(); pane.update(cx, |pane, cx| { + let target_buffer = pane + .active_item() + .and_then(|item| item.act_as::(cx)) + .zip(clicked_point) + .and_then(|(e, clicked_point)| { + e.update(cx, |e, cx| { + let snapshot = e.snapshot(window, cx); + e.point_for_position(clicked_point) + .and_then(|p| p.as_valid()) + .map(|a| a.to_point(&snapshot)) + .and_then(|multi_buffer_point| { + snapshot.buffer().buffer_line_for_row( + MultiBufferRow(multi_buffer_point.row), + ) + }) + .and_then(|(buffer_snasphot, buffer_range)| { + // TODO kb consider remotes either! + Some(( + buffer_range.start.row, + buffer_snasphot + .file()? + .as_local()? + .abs_path(cx), + )) + }) + }) + }); + let ix = pane.items().position(|item| { let commit_view = item.downcast::(); + // TODO kb later, generic code commit_view .is_some_and(|view| view.read(cx).commit.sha == commit_sha) }); if let Some(ix) = ix { pane.activate_item(ix, true, true, window, cx); } else { + let project = workspace.project(); + let commit_view = cx.new(|cx| { + CommitView::new( + commit_details, + commit_diff, + repo, + project.clone(), + stash, + window, + cx, + ) + }); + + if let Some((target_buffer_row, target_buffer_path)) = + dbg!(target_buffer) + { + let commit_view_editor = commit_view.read(cx).editor.clone(); + cx.defer_in(window, move |_, window, cx| { + commit_view_editor.update(cx, |editor, cx| { + let multi_buffer_snapshot = + editor.buffer().read(cx).snapshot(cx); + let target_anchors = multi_buffer_snapshot + .map_excerpt_ranges( + MultiBufferOffset(0) + ..multi_buffer_snapshot.len(), + |buffer, _, buffer_range| { + dbg!( + // TODO kb what to do next??? this is None for the git-history ones!! + buffer.file().is_some(), + &buffer_range + ); + if buffer.file().and_then(|f| { + Some(dbg!(f.as_local()?.abs_path(cx))) + }) == Some(target_buffer_path) + { + let excerpt_point_range = + buffer_range.to_point(buffer); + dbg!(&excerpt_point_range); + if excerpt_point_range.start.row + >= target_buffer_row + && excerpt_point_range.end.row + < target_buffer_row + { + let buffer_offset = BufferOffset( + buffer.point_to_offset( + Point::new( + target_buffer_row, + 0, + ), + ), + ); + return vec![( + buffer_offset..buffer_offset, + (), + )]; + } + } + Vec::new() + }, + ) + .unwrap_or_default(); + if let Some((target_multi_buffer_offset, _)) = + dbg!(target_anchors.first()) + { + let target_point_start = multi_buffer_snapshot + .offset_to_point( + target_multi_buffer_offset.start, + ); + let target_point_end = multi_buffer_snapshot + .offset_to_point( + target_multi_buffer_offset.end, + ); + editor.change_selections( + SelectionEffects::scroll(Autoscroll::center()), + window, + cx, + |s| { + s.select_ranges([ + target_point_start..target_point_end + ]) + }, + ); + } + }); + }); + } + pane.add_item(Box::new(commit_view), true, true, None, window, cx); } }) diff --git a/crates/git_ui/src/file_history_view.rs b/crates/git_ui/src/file_history_view.rs index e0cee4ef1d66b7c09ff249d2323fc9fa72abbd7c..c5c79cd488febcb23f89b7c6b402faf0a88e303b 100644 --- a/crates/git_ui/src/file_history_view.rs +++ b/crates/git_ui/src/file_history_view.rs @@ -264,6 +264,7 @@ impl FileHistoryView { self.workspace.clone(), None, Some(self.history.path.clone()), + None, window, cx, ); diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index 5b40c4bffc3a492f0113a8c5e45b2cfc1763d380..e99c2b27536f50971ca000d8a80612475756d37e 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -4559,6 +4559,7 @@ impl GitPanel { workspace.clone(), None, None, + None, window, cx, ); diff --git a/crates/git_ui/src/stash_picker.rs b/crates/git_ui/src/stash_picker.rs index 2d3515e833e4d353c323f533f1f0f39bb1d76561..2fc7e38b07e2d840ffac1a7090ba6e9f263d443d 100644 --- a/crates/git_ui/src/stash_picker.rs +++ b/crates/git_ui/src/stash_picker.rs @@ -308,6 +308,7 @@ impl StashListDelegate { self.workspace.clone(), Some(stash_index), None, + None, window, cx, ); diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 8e98a5ad93bdbec4aceb68ba9fff95688777d863..a1ad553c028543c822dd9404075eb9136b9b4239 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -5526,6 +5526,7 @@ impl MultiBufferSnapshot { return None; } let excerpt = cursor.excerpt()?; + dbg!(&excerpt.path_key); let excerpt_start = *cursor.excerpts.start(); let input_buffer_start = cursor.buffer_position_at(&position.start)?; diff --git a/crates/time_format/src/time_format.rs b/crates/time_format/src/time_format.rs index bbf214623eb4b5b9dd978a675551c25f5e937a8d..309a7ceb988dbc743779a4eb116b9b58ec2e7bc4 100644 --- a/crates/time_format/src/time_format.rs +++ b/crates/time_format/src/time_format.rs @@ -24,21 +24,18 @@ pub fn format_localized_timestamp( ) -> String { let timestamp_local = timestamp.to_offset(timezone); let reference_local = reference.to_offset(timezone); - format_local_timestamp(timestamp_local, reference_local, format) -} - -/// Formats a timestamp, which respects the user's date and time preferences/custom format. -pub fn format_local_timestamp( - timestamp: OffsetDateTime, - reference: OffsetDateTime, - format: TimestampFormat, -) -> String { match format { - TimestampFormat::Absolute => format_absolute_timestamp(timestamp, reference, false), - TimestampFormat::EnhancedAbsolute => format_absolute_timestamp(timestamp, reference, true), - TimestampFormat::MediumAbsolute => format_absolute_timestamp_medium(timestamp, reference), - TimestampFormat::Relative => format_relative_time(timestamp, reference) - .unwrap_or_else(|| format_relative_date(timestamp, reference)), + TimestampFormat::Absolute => { + format_absolute_timestamp(timestamp_local, reference_local, false) + } + TimestampFormat::EnhancedAbsolute => { + format_absolute_timestamp(timestamp_local, reference_local, true) + } + TimestampFormat::MediumAbsolute => { + format_absolute_timestamp_medium(timestamp_local, reference_local) + } + TimestampFormat::Relative => format_relative_time(timestamp_local, reference_local) + .unwrap_or_else(|| format_relative_date(timestamp_local, reference_local)), } } diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 303f21b8ffa62f9d9f380d9c18beecd77775df20..89a05e5ffcfd0a457cddfaeee4694be4cfebc552 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -1174,6 +1174,7 @@ fn handle_open_request(request: OpenRequest, app_state: Arc, cx: &mut workspace.weak_handle(), None, None, + None, window, cx, );