Add a bunch of tooltips

Piotr Osiewicz created

Change summary

crates/search2/src/project_search.rs | 127 ++++++++++++++++++++++-------
1 file changed, 95 insertions(+), 32 deletions(-)

Detailed changes

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)