From 0be58eb61a802022cf2d5f230405817bfd99f05b Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Sat, 9 Dec 2023 12:24:55 +0100 Subject: [PATCH] Add a bunch of tooltips --- crates/search2/src/project_search.rs | 127 ++++++++++++++++++++------- 1 file changed, 95 insertions(+), 32 deletions(-) diff --git a/crates/search2/src/project_search.rs b/crates/search2/src/project_search.rs index b1229b1b9fb3d5a0ddf0d95b8fd27f79d91218dd..82243a69c736c2d78226cb353971c8cbde888f2c 100644 --- a/crates/search2/src/project_search.rs +++ b/crates/search2/src/project_search.rs @@ -38,8 +38,8 @@ use std::{ }; use theme::ActiveTheme; use ui::{ - h_stack, v_stack, Button, Clickable, Color, Disableable, Icon, IconButton, IconElement, Label, - LabelCommon, LabelSize, Selectable, + h_stack, v_stack, Button, ButtonCommon, Clickable, Color, Disableable, Icon, IconButton, + IconElement, Label, LabelCommon, LabelSize, Selectable, Tooltip, }; use util::{paths::PathMatcher, ResultExt as _}; use workspace::{ @@ -1519,10 +1519,12 @@ impl ProjectSearchBar { if let Some(search) = &self.active_project_search { search.update(cx, |this, cx| { this.replace_enabled = !this.replace_enabled; - if !this.replace_enabled { - let editor_handle = this.query_editor.focus_handle(cx); - cx.focus(&editor_handle); - } + let editor_to_focus = if !this.replace_enabled { + this.query_editor.focus_handle(cx) + } else { + this.replacement_editor.focus_handle(cx) + }; + cx.focus(&editor_to_focus); cx.notify(); }); } @@ -1742,34 +1744,80 @@ impl Render for ProjectSearchBar { .on_action(cx.listener(|this, action, cx| { this.toggle_replace(action, cx); })) - .on_action(cx.listener(|this, action: &ActivateTextMode, cx| { + .on_action(cx.listener(|this, _: &ActivateTextMode, cx| { this.activate_search_mode(SearchMode::Text, cx) })) - .on_action(cx.listener(|this, action: &ActivateRegexMode, cx| { + .on_action(cx.listener(|this, _: &ActivateRegexMode, cx| { this.activate_search_mode(SearchMode::Regex, cx) })) .on_action( cx.listener(|this, action, cx| this.previous_history_query(action, cx)), ) .on_action(cx.listener(|this, action, cx| this.next_history_query(action, cx))) + .on_action(cx.listener(|this, action, cx| { + if let Some(search) = this.active_project_search.as_ref() { + search.update(cx, |this, cx| { + this.replace_next(action, cx); + }) + } + })) + .on_action(cx.listener(|this, action, cx| { + if let Some(search) = this.active_project_search.as_ref() { + search.update(cx, |this, cx| { + this.replace_all(action, cx); + }) + } + })) .child(IconElement::new(Icon::MagnifyingGlass)) .child(search.query_editor.clone()) .child( h_stack() .child( IconButton::new("project-search-filter-button", Icon::Filter) + .tooltip(|cx| { + Tooltip::for_action("Toggle filters", &ToggleFilters, cx) + }) .on_click(|_, cx| { cx.dispatch_action(ToggleFilters.boxed_clone()) - }), + }) + .selected( + self.active_project_search + .as_ref() + .map(|search| search.read(cx).filters_enabled) + .unwrap_or_default(), + ), + ) + .child( + IconButton::new( + "project-search-case-sensitive", + Icon::CaseSensitive, + ) + .tooltip(|cx| { + Tooltip::for_action( + "Toggle case sensitive", + &ToggleCaseSensitive, + cx, + ) + }) + .selected(self.is_option_enabled(SearchOptions::CASE_SENSITIVE, cx)) + .on_click(|_, cx| { + cx.dispatch_action(ToggleCaseSensitive.boxed_clone()) + }), ) - .child(IconButton::new( - "project-search-case-sensitive", - Icon::CaseSensitive, - )) - .child(IconButton::new( - "project-search-whole-word", - Icon::WholeWord, - )), + .child( + IconButton::new("project-search-whole-word", Icon::WholeWord) + .tooltip(|cx| { + Tooltip::for_action( + "Toggle whole word", + &ToggleWholeWord, + cx, + ) + }) + .selected(self.is_option_enabled(SearchOptions::WHOLE_WORD, cx)) + .on_click(|_, cx| { + cx.dispatch_action(ToggleWholeWord.boxed_clone()) + }), + ), ) .border_2() .bg(white()) @@ -1806,6 +1854,9 @@ impl Render for ProjectSearchBar { .selected(search.current_mode == SearchMode::Text) .on_click(|_, cx| { cx.dispatch_action(ActivateTextMode.boxed_clone()) + }) + .tooltip(|cx| { + Tooltip::for_action("Toggle text search", &ActivateTextMode, cx) }), ) .child( @@ -1813,15 +1864,22 @@ impl Render for ProjectSearchBar { .selected(search.current_mode == SearchMode::Regex) .on_click(|_, cx| { cx.dispatch_action(ActivateRegexMode.boxed_clone()) + }) + .tooltip(|cx| { + Tooltip::for_action( + "Toggle regular expression search", + &ActivateRegexMode, + cx, + ) }), ), ) .child( - IconButton::new("project-search-toggle-replace", Icon::Replace).on_click( - |_, cx| { + IconButton::new("project-search-toggle-replace", Icon::Replace) + .on_click(|_, cx| { cx.dispatch_action(ToggleReplace.boxed_clone()); - }, - ), + }) + .tooltip(|cx| Tooltip::for_action("Toggle replace", &ToggleReplace, cx)), ), ); let replace_column = if search.replace_enabled { @@ -1839,16 +1897,16 @@ impl Render for ProjectSearchBar { let actions_column = h_stack() .when(search.replace_enabled, |this| { this.children([ - IconButton::new("project-search-replace-next", Icon::ReplaceNext).on_click( - |_, cx| { + IconButton::new("project-search-replace-next", Icon::ReplaceNext) + .on_click(|_, cx| { cx.dispatch_action(ReplaceNext.boxed_clone()); - }, - ), - IconButton::new("project-search-replace-all", Icon::ReplaceAll).on_click( - |_, cx| { + }) + .tooltip(|cx| Tooltip::for_action("Replace next match", &ReplaceNext, cx)), + IconButton::new("project-search-replace-all", Icon::ReplaceAll) + .on_click(|_, cx| { cx.dispatch_action(ReplaceAll.boxed_clone()); - }, - ), + }) + .tooltip(|cx| Tooltip::for_action("Replace all matches", &ReplaceAll, cx)), ]) }) .when_some(search.active_match_index, |this, index| { @@ -1856,17 +1914,22 @@ impl Render for ProjectSearchBar { debug_assert!(match_quantity > index); this.child( IconButton::new("project-search-select-all", Icon::SelectAll) - .on_click(|_, cx| cx.dispatch_action(SelectAll.boxed_clone())), + .on_click(|_, cx| cx.dispatch_action(SelectAll.boxed_clone())) + .tooltip(|cx| Tooltip::for_action("Select all matches", &SelectAll, cx)), ) .child(Label::new(format!("{index}/{match_quantity}"))) }) .children([ IconButton::new("project-search-prev-match", Icon::ChevronLeft) .disabled(search.active_match_index.is_none()) - .on_click(|_, cx| cx.dispatch_action(SelectPrevMatch.boxed_clone())), + .on_click(|_, cx| cx.dispatch_action(SelectPrevMatch.boxed_clone())) + .tooltip(|cx| { + Tooltip::for_action("Go to previous match", &SelectPrevMatch, cx) + }), IconButton::new("project-search-next-match", Icon::ChevronRight) .disabled(search.active_match_index.is_none()) - .on_click(|_, cx| cx.dispatch_action(SelectNextMatch.boxed_clone())), + .on_click(|_, cx| cx.dispatch_action(SelectNextMatch.boxed_clone())) + .tooltip(|cx| Tooltip::for_action("Go to next match", &SelectNextMatch, cx)), ]); h_stack() .key_context(key_context)