@@ -7,8 +7,8 @@ use async_tar::Archive;
|
||||
use collections::{HashMap, HashSet};
|
||||
use futures::{channel::oneshot, future::Shared, Future, FutureExt, TryFutureExt};
|
||||
use gpui::{
|
||||
AppContext, AsyncAppContext, Context, Entity, EntityId, EventEmitter, Model, ModelContext,
|
||||
Task, WeakModel,
|
||||
actions, AppContext, AsyncAppContext, Context, Entity, EntityId, EventEmitter, Model,
|
||||
ModelContext, Task, WeakModel,
|
||||
};
|
||||
use language::{
|
||||
language_settings::{all_language_settings, language_settings},
|
||||
@@ -34,19 +34,11 @@ use util::{
|
||||
|
||||
// todo!()
|
||||
// const COPILOT_AUTH_NAMESPACE: &'static str = "copilot_auth";
|
||||
// actions!(copilot_auth, [SignIn, SignOut]);
|
||||
actions!(SignIn, SignOut);
|
||||
|
||||
// todo!()
|
||||
// const COPILOT_NAMESPACE: &'static str = "copilot";
|
||||
// actions!(
|
||||
// copilot,
|
||||
// [Suggest, NextSuggestion, PreviousSuggestion, Reinstall]
|
||||
// );
|
||||
//
|
||||
pub struct Suggest;
|
||||
pub struct NextSuggestion;
|
||||
pub struct PreviousSuggestion;
|
||||
pub struct Reinstall;
|
||||
actions!(Suggest, NextSuggestion, PreviousSuggestion, Reinstall);
|
||||
|
||||
pub fn init(
|
||||
new_server_id: LanguageServerId,
|
||||
|
||||
+3828
-3812
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,10 @@ use crate::{
|
||||
display_map::{BlockStyle, DisplaySnapshot, FoldStatus, HighlightedChunk, ToDisplayPoint},
|
||||
editor_settings::ShowScrollbar,
|
||||
git::{diff_hunk_to_display, DisplayDiffHunk},
|
||||
scroll::scroll_amount::ScrollAmount,
|
||||
CursorShape, DisplayPoint, Editor, EditorMode, EditorSettings, EditorSnapshot, EditorStyle,
|
||||
MoveDown, Point, Selection, SoftWrap, ToPoint, MAX_LINE_LEN,
|
||||
HalfPageDown, HalfPageUp, LineDown, LineUp, MoveDown, PageDown, PageUp, Point, Selection,
|
||||
SoftWrap, ToPoint, MAX_LINE_LEN,
|
||||
};
|
||||
use anyhow::Result;
|
||||
use collections::{BTreeMap, HashMap};
|
||||
@@ -31,6 +33,7 @@ use std::{
|
||||
};
|
||||
use sum_tree::Bias;
|
||||
use theme::{ActiveTheme, PlayerColor};
|
||||
use util::ResultExt;
|
||||
use workspace::item::Item;
|
||||
|
||||
enum FoldMarkers {}
|
||||
@@ -2562,6 +2565,153 @@ impl Element<Editor> for EditorElement {
|
||||
build_action_listener(Editor::move_right),
|
||||
build_action_listener(Editor::move_down),
|
||||
build_action_listener(Editor::move_up),
|
||||
// build_action_listener(Editor::new_file), todo!()
|
||||
// build_action_listener(Editor::new_file_in_direction), todo!()
|
||||
build_action_listener(Editor::cancel),
|
||||
build_action_listener(Editor::newline),
|
||||
build_action_listener(Editor::newline_above),
|
||||
build_action_listener(Editor::newline_below),
|
||||
build_action_listener(Editor::backspace),
|
||||
build_action_listener(Editor::delete),
|
||||
build_action_listener(Editor::tab),
|
||||
build_action_listener(Editor::tab_prev),
|
||||
build_action_listener(Editor::indent),
|
||||
build_action_listener(Editor::outdent),
|
||||
build_action_listener(Editor::delete_line),
|
||||
build_action_listener(Editor::join_lines),
|
||||
build_action_listener(Editor::sort_lines_case_sensitive),
|
||||
build_action_listener(Editor::sort_lines_case_insensitive),
|
||||
build_action_listener(Editor::reverse_lines),
|
||||
build_action_listener(Editor::shuffle_lines),
|
||||
build_action_listener(Editor::convert_to_upper_case),
|
||||
build_action_listener(Editor::convert_to_lower_case),
|
||||
build_action_listener(Editor::convert_to_title_case),
|
||||
build_action_listener(Editor::convert_to_snake_case),
|
||||
build_action_listener(Editor::convert_to_kebab_case),
|
||||
build_action_listener(Editor::convert_to_upper_camel_case),
|
||||
build_action_listener(Editor::convert_to_lower_camel_case),
|
||||
build_action_listener(Editor::delete_to_previous_word_start),
|
||||
build_action_listener(Editor::delete_to_previous_subword_start),
|
||||
build_action_listener(Editor::delete_to_next_word_end),
|
||||
build_action_listener(Editor::delete_to_next_subword_end),
|
||||
build_action_listener(Editor::delete_to_beginning_of_line),
|
||||
build_action_listener(Editor::delete_to_end_of_line),
|
||||
build_action_listener(Editor::cut_to_end_of_line),
|
||||
build_action_listener(Editor::duplicate_line),
|
||||
build_action_listener(Editor::move_line_up),
|
||||
build_action_listener(Editor::move_line_down),
|
||||
build_action_listener(Editor::transpose),
|
||||
build_action_listener(Editor::cut),
|
||||
build_action_listener(Editor::copy),
|
||||
build_action_listener(Editor::paste),
|
||||
build_action_listener(Editor::undo),
|
||||
build_action_listener(Editor::redo),
|
||||
build_action_listener(Editor::move_page_up),
|
||||
build_action_listener(Editor::move_page_down),
|
||||
build_action_listener(Editor::next_screen),
|
||||
build_action_listener(Editor::scroll_cursor_top),
|
||||
build_action_listener(Editor::scroll_cursor_center),
|
||||
build_action_listener(Editor::scroll_cursor_bottom),
|
||||
build_action_listener(|editor, _: &LineDown, cx| {
|
||||
editor.scroll_screen(&ScrollAmount::Line(1.), cx)
|
||||
}),
|
||||
build_action_listener(|editor, _: &LineUp, cx| {
|
||||
editor.scroll_screen(&ScrollAmount::Line(-1.), cx)
|
||||
}),
|
||||
build_action_listener(|editor, _: &HalfPageDown, cx| {
|
||||
editor.scroll_screen(&ScrollAmount::Page(0.5), cx)
|
||||
}),
|
||||
build_action_listener(|editor, _: &HalfPageUp, cx| {
|
||||
editor.scroll_screen(&ScrollAmount::Page(-0.5), cx)
|
||||
}),
|
||||
build_action_listener(|editor, _: &PageDown, cx| {
|
||||
editor.scroll_screen(&ScrollAmount::Page(1.), cx)
|
||||
}),
|
||||
build_action_listener(|editor, _: &PageUp, cx| {
|
||||
editor.scroll_screen(&ScrollAmount::Page(-1.), cx)
|
||||
}),
|
||||
build_action_listener(Editor::move_to_previous_word_start),
|
||||
build_action_listener(Editor::move_to_previous_subword_start),
|
||||
build_action_listener(Editor::move_to_next_word_end),
|
||||
build_action_listener(Editor::move_to_next_subword_end),
|
||||
build_action_listener(Editor::move_to_beginning_of_line),
|
||||
build_action_listener(Editor::move_to_end_of_line),
|
||||
build_action_listener(Editor::move_to_start_of_paragraph),
|
||||
build_action_listener(Editor::move_to_end_of_paragraph),
|
||||
build_action_listener(Editor::move_to_beginning),
|
||||
build_action_listener(Editor::move_to_end),
|
||||
build_action_listener(Editor::select_up),
|
||||
build_action_listener(Editor::select_down),
|
||||
build_action_listener(Editor::select_left),
|
||||
build_action_listener(Editor::select_right),
|
||||
build_action_listener(Editor::select_to_previous_word_start),
|
||||
build_action_listener(Editor::select_to_previous_subword_start),
|
||||
build_action_listener(Editor::select_to_next_word_end),
|
||||
build_action_listener(Editor::select_to_next_subword_end),
|
||||
build_action_listener(Editor::select_to_beginning_of_line),
|
||||
build_action_listener(Editor::select_to_end_of_line),
|
||||
build_action_listener(Editor::select_to_start_of_paragraph),
|
||||
build_action_listener(Editor::select_to_end_of_paragraph),
|
||||
build_action_listener(Editor::select_to_beginning),
|
||||
build_action_listener(Editor::select_to_end),
|
||||
build_action_listener(Editor::select_all),
|
||||
build_action_listener(|editor, action, cx| {
|
||||
editor.select_all_matches(action, cx).log_err();
|
||||
}),
|
||||
build_action_listener(Editor::select_line),
|
||||
build_action_listener(Editor::split_selection_into_lines),
|
||||
build_action_listener(Editor::add_selection_above),
|
||||
build_action_listener(Editor::add_selection_below),
|
||||
build_action_listener(|editor, action, cx| {
|
||||
editor.select_next(action, cx).log_err();
|
||||
}),
|
||||
build_action_listener(|editor, action, cx| {
|
||||
editor.select_previous(action, cx).log_err();
|
||||
}),
|
||||
build_action_listener(Editor::toggle_comments),
|
||||
build_action_listener(Editor::select_larger_syntax_node),
|
||||
build_action_listener(Editor::select_smaller_syntax_node),
|
||||
build_action_listener(Editor::move_to_enclosing_bracket),
|
||||
build_action_listener(Editor::undo_selection),
|
||||
build_action_listener(Editor::redo_selection),
|
||||
build_action_listener(Editor::go_to_diagnostic),
|
||||
build_action_listener(Editor::go_to_prev_diagnostic),
|
||||
build_action_listener(Editor::go_to_hunk),
|
||||
build_action_listener(Editor::go_to_prev_hunk),
|
||||
build_action_listener(Editor::go_to_definition),
|
||||
build_action_listener(Editor::go_to_definition_split),
|
||||
build_action_listener(Editor::go_to_type_definition),
|
||||
build_action_listener(Editor::go_to_type_definition_split),
|
||||
build_action_listener(Editor::fold),
|
||||
build_action_listener(Editor::fold_at),
|
||||
build_action_listener(Editor::unfold_lines),
|
||||
build_action_listener(Editor::unfold_at),
|
||||
// build_action_listener(Editor::gutter_hover), todo!()
|
||||
build_action_listener(Editor::fold_selected_ranges),
|
||||
build_action_listener(Editor::show_completions),
|
||||
// build_action_listener(Editor::toggle_code_actions), todo!()
|
||||
// build_action_listener(Editor::open_excerpts), todo!()
|
||||
build_action_listener(Editor::toggle_soft_wrap),
|
||||
build_action_listener(Editor::toggle_inlay_hints),
|
||||
build_action_listener(Editor::reveal_in_finder),
|
||||
build_action_listener(Editor::copy_path),
|
||||
build_action_listener(Editor::copy_relative_path),
|
||||
build_action_listener(Editor::copy_highlight_json),
|
||||
build_action_listener(|editor, action, cx| {
|
||||
editor
|
||||
.format(action, cx)
|
||||
.map(|task| task.detach_and_log_err(cx));
|
||||
}),
|
||||
build_action_listener(Editor::restart_language_server),
|
||||
build_action_listener(Editor::show_character_palette),
|
||||
// build_action_listener(Editor::confirm_completion), todo!()
|
||||
// build_action_listener(Editor::confirm_code_action), todo!()
|
||||
// build_action_listener(Editor::rename), todo!()
|
||||
// build_action_listener(Editor::confirm_rename), todo!()
|
||||
// build_action_listener(Editor::find_all_references), todo!()
|
||||
build_action_listener(Editor::next_copilot_suggestion),
|
||||
build_action_listener(Editor::previous_copilot_suggestion),
|
||||
build_action_listener(Editor::copilot_suggest),
|
||||
build_key_listener(
|
||||
move |editor, key_down: &KeyDownEvent, dispatch_context, phase, cx| {
|
||||
if phase == DispatchPhase::Bubble {
|
||||
|
||||
@@ -288,16 +288,15 @@ impl ScrollManager {
|
||||
}
|
||||
}
|
||||
|
||||
// todo!()
|
||||
impl Editor {
|
||||
// pub fn vertical_scroll_margin(&mut self) -> usize {
|
||||
// self.scroll_manager.vertical_scroll_margin as usize
|
||||
// }
|
||||
pub fn vertical_scroll_margin(&mut self) -> usize {
|
||||
self.scroll_manager.vertical_scroll_margin as usize
|
||||
}
|
||||
|
||||
// pub fn set_vertical_scroll_margin(&mut self, margin_rows: usize, cx: &mut ViewContext<Self>) {
|
||||
// self.scroll_manager.vertical_scroll_margin = margin_rows as f32;
|
||||
// cx.notify();
|
||||
// }
|
||||
pub fn set_vertical_scroll_margin(&mut self, margin_rows: usize, cx: &mut ViewContext<Self>) {
|
||||
self.scroll_manager.vertical_scroll_margin = margin_rows as f32;
|
||||
cx.notify();
|
||||
}
|
||||
|
||||
pub fn visible_line_count(&self) -> Option<f32> {
|
||||
self.scroll_manager.visible_line_count
|
||||
@@ -349,11 +348,9 @@ impl Editor {
|
||||
self.refresh_inlay_hints(InlayHintRefreshReason::NewLinesShown, cx);
|
||||
}
|
||||
|
||||
pub fn scroll_position(&self, cx: &mut ViewContext<Self>) -> gpui::Point<Pixels> {
|
||||
pub fn scroll_position(&self, cx: &mut ViewContext<Self>) -> gpui::Point<f32> {
|
||||
let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx));
|
||||
// todo!() Should `self.scroll_manager.anchor.scroll_position()` return `Pixels`?
|
||||
// self.scroll_manager.anchor.scroll_position(&display_map)
|
||||
todo!()
|
||||
self.scroll_manager.anchor.scroll_position(&display_map)
|
||||
}
|
||||
|
||||
pub fn set_scroll_anchor(&mut self, scroll_anchor: ScrollAnchor, cx: &mut ViewContext<Self>) {
|
||||
@@ -382,50 +379,50 @@ impl Editor {
|
||||
.set_anchor(scroll_anchor, top_row, false, false, workspace_id, cx);
|
||||
}
|
||||
|
||||
// pub fn scroll_screen(&mut self, amount: &ScrollAmount, cx: &mut ViewContext<Self>) {
|
||||
// if matches!(self.mode, EditorMode::SingleLine) {
|
||||
// cx.propagate_action();
|
||||
// return;
|
||||
// }
|
||||
pub fn scroll_screen(&mut self, amount: &ScrollAmount, cx: &mut ViewContext<Self>) {
|
||||
if matches!(self.mode, EditorMode::SingleLine) {
|
||||
cx.propagate();
|
||||
return;
|
||||
}
|
||||
|
||||
// if self.take_rename(true, cx).is_some() {
|
||||
// return;
|
||||
// }
|
||||
if self.take_rename(true, cx).is_some() {
|
||||
return;
|
||||
}
|
||||
|
||||
// let cur_position = self.scroll_position(cx);
|
||||
// let new_pos = cur_position + point(0., amount.lines(self));
|
||||
// self.set_scroll_position(new_pos, cx);
|
||||
// }
|
||||
let cur_position = self.scroll_position(cx);
|
||||
let new_pos = cur_position + point(0., amount.lines(self));
|
||||
self.set_scroll_position(new_pos, cx);
|
||||
}
|
||||
|
||||
// /// Returns an ordering. The newest selection is:
|
||||
// /// Ordering::Equal => on screen
|
||||
// /// Ordering::Less => above the screen
|
||||
// /// Ordering::Greater => below the screen
|
||||
// pub fn newest_selection_on_screen(&self, cx: &mut AppContext) -> Ordering {
|
||||
// let snapshot = self.display_map.update(cx, |map, cx| map.snapshot(cx));
|
||||
// let newest_head = self
|
||||
// .selections
|
||||
// .newest_anchor()
|
||||
// .head()
|
||||
// .to_display_point(&snapshot);
|
||||
// let screen_top = self
|
||||
// .scroll_manager
|
||||
// .anchor
|
||||
// .anchor
|
||||
// .to_display_point(&snapshot);
|
||||
/// Returns an ordering. The newest selection is:
|
||||
/// Ordering::Equal => on screen
|
||||
/// Ordering::Less => above the screen
|
||||
/// Ordering::Greater => below the screen
|
||||
pub fn newest_selection_on_screen(&self, cx: &mut AppContext) -> Ordering {
|
||||
let snapshot = self.display_map.update(cx, |map, cx| map.snapshot(cx));
|
||||
let newest_head = self
|
||||
.selections
|
||||
.newest_anchor()
|
||||
.head()
|
||||
.to_display_point(&snapshot);
|
||||
let screen_top = self
|
||||
.scroll_manager
|
||||
.anchor
|
||||
.anchor
|
||||
.to_display_point(&snapshot);
|
||||
|
||||
// if screen_top > newest_head {
|
||||
// return Ordering::Less;
|
||||
// }
|
||||
if screen_top > newest_head {
|
||||
return Ordering::Less;
|
||||
}
|
||||
|
||||
// if let Some(visible_lines) = self.visible_line_count() {
|
||||
// if newest_head.row() < screen_top.row() + visible_lines as u32 {
|
||||
// return Ordering::Equal;
|
||||
// }
|
||||
// }
|
||||
if let Some(visible_lines) = self.visible_line_count() {
|
||||
if newest_head.row() < screen_top.row() + visible_lines as u32 {
|
||||
return Ordering::Equal;
|
||||
}
|
||||
}
|
||||
|
||||
// Ordering::Greater
|
||||
// }
|
||||
Ordering::Greater
|
||||
}
|
||||
|
||||
pub fn read_scroll_position_from_db(
|
||||
&mut self,
|
||||
|
||||
@@ -1,66 +1,27 @@
|
||||
use super::Axis;
|
||||
use crate::Editor;
|
||||
use gpui::{AppContext, Point, ViewContext};
|
||||
|
||||
// actions!(
|
||||
// editor,
|
||||
// [
|
||||
// LineDown,
|
||||
// LineUp,
|
||||
// HalfPageDown,
|
||||
// HalfPageUp,
|
||||
// PageDown,
|
||||
// PageUp,
|
||||
// NextScreen,
|
||||
// ScrollCursorTop,
|
||||
// ScrollCursorCenter,
|
||||
// ScrollCursorBottom,
|
||||
// ]
|
||||
// );
|
||||
|
||||
pub fn init(cx: &mut AppContext) {
|
||||
// todo!()
|
||||
// cx.add_action(Editor::next_screen);
|
||||
// cx.add_action(Editor::scroll_cursor_top);
|
||||
// cx.add_action(Editor::scroll_cursor_center);
|
||||
// cx.add_action(Editor::scroll_cursor_bottom);
|
||||
// cx.add_action(|this: &mut Editor, _: &LineDown, cx| {
|
||||
// this.scroll_screen(&ScrollAmount::Line(1.), cx)
|
||||
// });
|
||||
// cx.add_action(|this: &mut Editor, _: &LineUp, cx| {
|
||||
// this.scroll_screen(&ScrollAmount::Line(-1.), cx)
|
||||
// });
|
||||
// cx.add_action(|this: &mut Editor, _: &HalfPageDown, cx| {
|
||||
// this.scroll_screen(&ScrollAmount::Page(0.5), cx)
|
||||
// });
|
||||
// cx.add_action(|this: &mut Editor, _: &HalfPageUp, cx| {
|
||||
// this.scroll_screen(&ScrollAmount::Page(-0.5), cx)
|
||||
// });
|
||||
// cx.add_action(|this: &mut Editor, _: &PageDown, cx| {
|
||||
// this.scroll_screen(&ScrollAmount::Page(1.), cx)
|
||||
// });
|
||||
// cx.add_action(|this: &mut Editor, _: &PageUp, cx| {
|
||||
// this.scroll_screen(&ScrollAmount::Page(-1.), cx)
|
||||
// });
|
||||
}
|
||||
use crate::{
|
||||
Autoscroll, Bias, Editor, EditorMode, NextScreen, ScrollAnchor, ScrollCursorBottom,
|
||||
ScrollCursorCenter, ScrollCursorTop,
|
||||
};
|
||||
use gpui::{actions, AppContext, Point, ViewContext};
|
||||
|
||||
impl Editor {
|
||||
// pub fn next_screen(&mut self, _: &NextScreen, cx: &mut ViewContext<Editor>) -> Option<()> {
|
||||
// if self.take_rename(true, cx).is_some() {
|
||||
// return None;
|
||||
// }
|
||||
pub fn next_screen(&mut self, _: &NextScreen, cx: &mut ViewContext<Editor>) {
|
||||
if self.take_rename(true, cx).is_some() {
|
||||
return;
|
||||
}
|
||||
|
||||
// if self.mouse_context_menu.read(cx).visible() {
|
||||
// return None;
|
||||
// }
|
||||
// todo!()
|
||||
// if self.mouse_context_menu.read(cx).visible() {
|
||||
// return None;
|
||||
// }
|
||||
|
||||
// if matches!(self.mode, EditorMode::SingleLine) {
|
||||
// cx.propagate_action();
|
||||
// return None;
|
||||
// }
|
||||
// self.request_autoscroll(Autoscroll::Next, cx);
|
||||
// Some(())
|
||||
// }
|
||||
if matches!(self.mode, EditorMode::SingleLine) {
|
||||
cx.propagate();
|
||||
return;
|
||||
}
|
||||
self.request_autoscroll(Autoscroll::Next, cx);
|
||||
}
|
||||
|
||||
pub fn scroll(
|
||||
&mut self,
|
||||
@@ -72,79 +33,71 @@ impl Editor {
|
||||
self.set_scroll_position(scroll_position, cx);
|
||||
}
|
||||
|
||||
// fn scroll_cursor_top(editor: &mut Editor, _: &ScrollCursorTop, cx: &mut ViewContext<Editor>) {
|
||||
// let snapshot = editor.snapshot(cx).display_snapshot;
|
||||
// let scroll_margin_rows = editor.vertical_scroll_margin() as u32;
|
||||
pub fn scroll_cursor_top(&mut self, _: &ScrollCursorTop, cx: &mut ViewContext<Editor>) {
|
||||
let snapshot = self.snapshot(cx).display_snapshot;
|
||||
let scroll_margin_rows = self.vertical_scroll_margin() as u32;
|
||||
|
||||
// let mut new_screen_top = editor.selections.newest_display(cx).head();
|
||||
// *new_screen_top.row_mut() = new_screen_top.row().saturating_sub(scroll_margin_rows);
|
||||
// *new_screen_top.column_mut() = 0;
|
||||
// let new_screen_top = new_screen_top.to_offset(&snapshot, Bias::Left);
|
||||
// let new_anchor = snapshot.buffer_snapshot.anchor_before(new_screen_top);
|
||||
let mut new_screen_top = self.selections.newest_display(cx).head();
|
||||
*new_screen_top.row_mut() = new_screen_top.row().saturating_sub(scroll_margin_rows);
|
||||
*new_screen_top.column_mut() = 0;
|
||||
let new_screen_top = new_screen_top.to_offset(&snapshot, Bias::Left);
|
||||
let new_anchor = snapshot.buffer_snapshot.anchor_before(new_screen_top);
|
||||
|
||||
// editor.set_scroll_anchor(
|
||||
// ScrollAnchor {
|
||||
// anchor: new_anchor,
|
||||
// offset: Default::default(),
|
||||
// },
|
||||
// cx,
|
||||
// )
|
||||
// }
|
||||
self.set_scroll_anchor(
|
||||
ScrollAnchor {
|
||||
anchor: new_anchor,
|
||||
offset: Default::default(),
|
||||
},
|
||||
cx,
|
||||
)
|
||||
}
|
||||
|
||||
// fn scroll_cursor_center(
|
||||
// editor: &mut Editor,
|
||||
// _: &ScrollCursorCenter,
|
||||
// cx: &mut ViewContext<Editor>,
|
||||
// ) {
|
||||
// let snapshot = editor.snapshot(cx).display_snapshot;
|
||||
// let visible_rows = if let Some(visible_rows) = editor.visible_line_count() {
|
||||
// visible_rows as u32
|
||||
// } else {
|
||||
// return;
|
||||
// };
|
||||
pub fn scroll_cursor_center(&mut self, _: &ScrollCursorCenter, cx: &mut ViewContext<Editor>) {
|
||||
let snapshot = self.snapshot(cx).display_snapshot;
|
||||
let visible_rows = if let Some(visible_rows) = self.visible_line_count() {
|
||||
visible_rows as u32
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
// let mut new_screen_top = editor.selections.newest_display(cx).head();
|
||||
// *new_screen_top.row_mut() = new_screen_top.row().saturating_sub(visible_rows / 2);
|
||||
// *new_screen_top.column_mut() = 0;
|
||||
// let new_screen_top = new_screen_top.to_offset(&snapshot, Bias::Left);
|
||||
// let new_anchor = snapshot.buffer_snapshot.anchor_before(new_screen_top);
|
||||
let mut new_screen_top = self.selections.newest_display(cx).head();
|
||||
*new_screen_top.row_mut() = new_screen_top.row().saturating_sub(visible_rows / 2);
|
||||
*new_screen_top.column_mut() = 0;
|
||||
let new_screen_top = new_screen_top.to_offset(&snapshot, Bias::Left);
|
||||
let new_anchor = snapshot.buffer_snapshot.anchor_before(new_screen_top);
|
||||
|
||||
// editor.set_scroll_anchor(
|
||||
// ScrollAnchor {
|
||||
// anchor: new_anchor,
|
||||
// offset: Default::default(),
|
||||
// },
|
||||
// cx,
|
||||
// )
|
||||
// }
|
||||
self.set_scroll_anchor(
|
||||
ScrollAnchor {
|
||||
anchor: new_anchor,
|
||||
offset: Default::default(),
|
||||
},
|
||||
cx,
|
||||
)
|
||||
}
|
||||
|
||||
// fn scroll_cursor_bottom(
|
||||
// editor: &mut Editor,
|
||||
// _: &ScrollCursorBottom,
|
||||
// cx: &mut ViewContext<Editor>,
|
||||
// ) {
|
||||
// let snapshot = editor.snapshot(cx).display_snapshot;
|
||||
// let scroll_margin_rows = editor.vertical_scroll_margin() as u32;
|
||||
// let visible_rows = if let Some(visible_rows) = editor.visible_line_count() {
|
||||
// visible_rows as u32
|
||||
// } else {
|
||||
// return;
|
||||
// };
|
||||
pub fn scroll_cursor_bottom(&mut self, _: &ScrollCursorBottom, cx: &mut ViewContext<Editor>) {
|
||||
let snapshot = self.snapshot(cx).display_snapshot;
|
||||
let scroll_margin_rows = self.vertical_scroll_margin() as u32;
|
||||
let visible_rows = if let Some(visible_rows) = self.visible_line_count() {
|
||||
visible_rows as u32
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
// let mut new_screen_top = editor.selections.newest_display(cx).head();
|
||||
// *new_screen_top.row_mut() = new_screen_top
|
||||
// .row()
|
||||
// .saturating_sub(visible_rows.saturating_sub(scroll_margin_rows));
|
||||
// *new_screen_top.column_mut() = 0;
|
||||
// let new_screen_top = new_screen_top.to_offset(&snapshot, Bias::Left);
|
||||
// let new_anchor = snapshot.buffer_snapshot.anchor_before(new_screen_top);
|
||||
let mut new_screen_top = self.selections.newest_display(cx).head();
|
||||
*new_screen_top.row_mut() = new_screen_top
|
||||
.row()
|
||||
.saturating_sub(visible_rows.saturating_sub(scroll_margin_rows));
|
||||
*new_screen_top.column_mut() = 0;
|
||||
let new_screen_top = new_screen_top.to_offset(&snapshot, Bias::Left);
|
||||
let new_anchor = snapshot.buffer_snapshot.anchor_before(new_screen_top);
|
||||
|
||||
// editor.set_scroll_anchor(
|
||||
// ScrollAnchor {
|
||||
// anchor: new_anchor,
|
||||
// offset: Default::default(),
|
||||
// },
|
||||
// cx,
|
||||
// )
|
||||
// }
|
||||
self.set_scroll_anchor(
|
||||
ScrollAnchor {
|
||||
anchor: new_anchor,
|
||||
offset: Default::default(),
|
||||
},
|
||||
cx,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -302,39 +302,39 @@ impl SelectionsCollection {
|
||||
.collect()
|
||||
}
|
||||
|
||||
// pub fn build_columnar_selection(
|
||||
// &mut self,
|
||||
// display_map: &DisplaySnapshot,
|
||||
// row: u32,
|
||||
// positions: &Range<Pixels>,
|
||||
// reversed: bool,
|
||||
// text_layout_details: &TextLayoutDetails,
|
||||
// ) -> Option<Selection<Point>> {
|
||||
// let is_empty = positions.start == positions.end;
|
||||
// let line_len = display_map.line_len(row);
|
||||
pub fn build_columnar_selection(
|
||||
&mut self,
|
||||
display_map: &DisplaySnapshot,
|
||||
row: u32,
|
||||
positions: &Range<Pixels>,
|
||||
reversed: bool,
|
||||
text_layout_details: &TextLayoutDetails,
|
||||
) -> Option<Selection<Point>> {
|
||||
let is_empty = positions.start == positions.end;
|
||||
let line_len = display_map.line_len(row);
|
||||
|
||||
// let layed_out_line = display_map.lay_out_line_for_row(row, &text_layout_details);
|
||||
let layed_out_line = display_map.lay_out_line_for_row(row, &text_layout_details);
|
||||
|
||||
// let start_col = layed_out_line.closest_index_for_x(positions.start) as u32;
|
||||
// if start_col < line_len || (is_empty && positions.start == layed_out_line.width()) {
|
||||
// let start = DisplayPoint::new(row, start_col);
|
||||
// let end_col = layed_out_line.closest_index_for_x(positions.end) as u32;
|
||||
// let end = DisplayPoint::new(row, end_col);
|
||||
let start_col = layed_out_line.closest_index_for_x(positions.start) as u32;
|
||||
if start_col < line_len || (is_empty && positions.start == layed_out_line.width) {
|
||||
let start = DisplayPoint::new(row, start_col);
|
||||
let end_col = layed_out_line.closest_index_for_x(positions.end) as u32;
|
||||
let end = DisplayPoint::new(row, end_col);
|
||||
|
||||
// Some(Selection {
|
||||
// id: post_inc(&mut self.next_selection_id),
|
||||
// start: start.to_point(display_map),
|
||||
// end: end.to_point(display_map),
|
||||
// reversed,
|
||||
// goal: SelectionGoal::HorizontalRange {
|
||||
// start: positions.start,
|
||||
// end: positions.end,
|
||||
// },
|
||||
// })
|
||||
// } else {
|
||||
// None
|
||||
// }
|
||||
// }
|
||||
Some(Selection {
|
||||
id: post_inc(&mut self.next_selection_id),
|
||||
start: start.to_point(display_map),
|
||||
end: end.to_point(display_map),
|
||||
reversed,
|
||||
goal: SelectionGoal::HorizontalRange {
|
||||
start: positions.start.into(),
|
||||
end: positions.end.into(),
|
||||
},
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn change_with<R>(
|
||||
&mut self,
|
||||
|
||||
@@ -87,7 +87,7 @@ impl MetalRenderer {
|
||||
MTLResourceOptions::StorageModeManaged,
|
||||
);
|
||||
|
||||
let paths_rasterization_pipeline_state = build_pipeline_state(
|
||||
let paths_rasterization_pipeline_state = build_path_rasterization_pipeline_state(
|
||||
&device,
|
||||
&library,
|
||||
"paths_rasterization",
|
||||
@@ -823,7 +823,40 @@ fn build_pipeline_state(
|
||||
color_attachment.set_source_alpha_blend_factor(metal::MTLBlendFactor::One);
|
||||
color_attachment.set_destination_rgb_blend_factor(metal::MTLBlendFactor::OneMinusSourceAlpha);
|
||||
color_attachment.set_destination_alpha_blend_factor(metal::MTLBlendFactor::One);
|
||||
descriptor.set_depth_attachment_pixel_format(MTLPixelFormat::Invalid);
|
||||
|
||||
device
|
||||
.new_render_pipeline_state(&descriptor)
|
||||
.expect("could not create render pipeline state")
|
||||
}
|
||||
|
||||
fn build_path_rasterization_pipeline_state(
|
||||
device: &metal::DeviceRef,
|
||||
library: &metal::LibraryRef,
|
||||
label: &str,
|
||||
vertex_fn_name: &str,
|
||||
fragment_fn_name: &str,
|
||||
pixel_format: metal::MTLPixelFormat,
|
||||
) -> metal::RenderPipelineState {
|
||||
let vertex_fn = library
|
||||
.get_function(vertex_fn_name, None)
|
||||
.expect("error locating vertex function");
|
||||
let fragment_fn = library
|
||||
.get_function(fragment_fn_name, None)
|
||||
.expect("error locating fragment function");
|
||||
|
||||
let descriptor = metal::RenderPipelineDescriptor::new();
|
||||
descriptor.set_label(label);
|
||||
descriptor.set_vertex_function(Some(vertex_fn.as_ref()));
|
||||
descriptor.set_fragment_function(Some(fragment_fn.as_ref()));
|
||||
let color_attachment = descriptor.color_attachments().object_at(0).unwrap();
|
||||
color_attachment.set_pixel_format(pixel_format);
|
||||
color_attachment.set_blending_enabled(true);
|
||||
color_attachment.set_rgb_blend_operation(metal::MTLBlendOperation::Add);
|
||||
color_attachment.set_alpha_blend_operation(metal::MTLBlendOperation::Add);
|
||||
color_attachment.set_source_rgb_blend_factor(metal::MTLBlendFactor::One);
|
||||
color_attachment.set_source_alpha_blend_factor(metal::MTLBlendFactor::One);
|
||||
color_attachment.set_destination_rgb_blend_factor(metal::MTLBlendFactor::One);
|
||||
color_attachment.set_destination_alpha_blend_factor(metal::MTLBlendFactor::One);
|
||||
|
||||
device
|
||||
.new_render_pipeline_state(&descriptor)
|
||||
|
||||
@@ -608,6 +608,10 @@ impl<'a> WindowContext<'a> {
|
||||
.find(|display| display.id() == self.window.display_id)
|
||||
}
|
||||
|
||||
pub fn show_character_palette(&self) {
|
||||
self.window.platform_window.show_character_palette();
|
||||
}
|
||||
|
||||
/// The scale factor of the display associated with the window. For example, it could
|
||||
/// return 2.0 for a "retina" display, indicating that each logical pixel should actually
|
||||
/// be rendered as two pixels on screen.
|
||||
|
||||
@@ -31,20 +31,21 @@ pub fn action(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||
#[derive(gpui::serde::Deserialize, std::cmp::PartialEq, std::clone::Clone, std::default::Default, std::fmt::Debug)]
|
||||
#(#attrs)*
|
||||
};
|
||||
let visibility = input.vis;
|
||||
|
||||
let output = match input.data {
|
||||
syn::Data::Struct(ref struct_data) => {
|
||||
let fields = &struct_data.fields;
|
||||
quote! {
|
||||
#attributes
|
||||
struct #name { #fields }
|
||||
#visibility struct #name #fields
|
||||
}
|
||||
}
|
||||
syn::Data::Enum(ref enum_data) => {
|
||||
let variants = &enum_data.variants;
|
||||
quote! {
|
||||
#attributes
|
||||
enum #name { #variants }
|
||||
#visibility enum #name { #variants }
|
||||
}
|
||||
}
|
||||
_ => panic!("Expected a struct or an enum."),
|
||||
|
||||
@@ -18,7 +18,7 @@ use syn::{parse_macro_input, DeriveInput};
|
||||
pub fn register_action(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||
let input = parse_macro_input!(item as DeriveInput);
|
||||
let type_name = &input.ident;
|
||||
let ctor_fn_name = format_ident!("register_{}_builder", type_name);
|
||||
let ctor_fn_name = format_ident!("register_{}_builder", type_name.to_string().to_lowercase());
|
||||
|
||||
let expanded = quote! {
|
||||
#input
|
||||
@@ -28,5 +28,6 @@ pub fn register_action(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||
gpui::register_action::<#type_name>()
|
||||
}
|
||||
};
|
||||
|
||||
TokenStream::from(expanded)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user