search.rs

 1use bitflags::bitflags;
 2pub use buffer_search::BufferSearchBar;
 3use gpui::{actions, Action, AppContext};
 4pub use mode::SearchMode;
 5use project::search::SearchQuery;
 6pub use project_search::{ProjectSearchBar, ProjectSearchView};
 7
 8pub mod buffer_search;
 9mod elements;
10mod history;
11mod mode;
12pub mod project_search;
13pub(crate) mod search_bar;
14
15pub fn init(cx: &mut AppContext) {
16    buffer_search::init(cx);
17    project_search::init(cx);
18}
19
20actions!(
21    search,
22    [
23        CycleMode,
24        ToggleWholeWord,
25        ToggleCaseSensitive,
26        SelectNextMatch,
27        SelectPrevMatch,
28        SelectAllMatches,
29        NextHistoryQuery,
30        PreviousHistoryQuery,
31        ActivateTextMode,
32        ActivateSemanticMode,
33        ActivateRegexMode
34    ]
35);
36
37bitflags! {
38    #[derive(Default)]
39    pub struct SearchOptions: u8 {
40        const NONE = 0b000;
41        const WHOLE_WORD = 0b001;
42        const CASE_SENSITIVE = 0b010;
43    }
44}
45
46impl SearchOptions {
47    pub fn label(&self) -> &'static str {
48        match *self {
49            SearchOptions::WHOLE_WORD => "Match Whole Word",
50            SearchOptions::CASE_SENSITIVE => "Match Case",
51            _ => panic!("{:?} is not a named SearchOption", self),
52        }
53    }
54
55    pub fn to_toggle_action(&self) -> Box<dyn Action> {
56        match *self {
57            SearchOptions::WHOLE_WORD => Box::new(ToggleWholeWord),
58            SearchOptions::CASE_SENSITIVE => Box::new(ToggleCaseSensitive),
59            _ => panic!("{:?} is not a named SearchOption", self),
60        }
61    }
62
63    pub fn none() -> SearchOptions {
64        SearchOptions::NONE
65    }
66
67    pub fn from_query(query: &SearchQuery) -> SearchOptions {
68        let mut options = SearchOptions::NONE;
69        options.set(SearchOptions::WHOLE_WORD, query.whole_word());
70        options.set(SearchOptions::CASE_SENSITIVE, query.case_sensitive());
71        options
72    }
73}