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}