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