Move mode rendering to a search_bar module

This commit is contained in:
Piotr Osiewicz 2023-08-08 15:11:32 +02:00
parent 31a56720d9
commit 7547fa2679
2 changed files with 129 additions and 102 deletions

View file

@ -1,8 +1,7 @@
use crate::{
elements::ButtonSide,
history::SearchHistory,
mode::{SearchMode, Side},
search_bar::render_nav_button,
mode::SearchMode,
search_bar::{render_nav_button, render_search_mode_button},
ActivateRegexMode, CycleMode, NextHistoryQuery, PreviousHistoryQuery, SearchOptions,
SelectNextMatch, SelectPrevMatch, ToggleCaseSensitive, ToggleWholeWord,
};
@ -1358,90 +1357,6 @@ impl ProjectSearchBar {
.into_any()
}
fn render_search_mode_button(
&self,
mode: SearchMode,
cx: &mut ViewContext<Self>,
) -> AnyElement<Self> {
let tooltip_style = theme::current(cx).tooltip.clone();
let is_active = if let Some(search) = self.active_project_search.as_ref() {
let search = search.read(cx);
search.current_mode == mode
} else {
false
};
enum SearchModeButton {}
MouseEventHandler::<SearchModeButton, _>::new(mode.region_id(), cx, |state, cx| {
let theme = theme::current(cx);
let mut style = theme
.search
.mode_button
.in_state(is_active)
.style_for(state)
.clone();
let label = Label::new(mode.label(), style.text.clone())
.contained()
.with_style(style.container);
if let Some(button_side) = mode.button_side() {
style.container.border.left = mode.border_left();
style.container.border.right = mode.border_right();
if button_side == Side::Left {
Flex::row()
.align_children_center()
.with_child(
ButtonSide::left(
style
.container
.background_color
.unwrap_or_else(gpui::color::Color::transparent_black),
)
.with_border(style.container.border.width, style.container.border.color)
.contained()
.constrained()
.with_max_width(theme.search.mode_filling_width),
)
.with_child(label)
.into_any()
} else {
Flex::row()
.align_children_center()
.with_child(label)
.with_child(
ButtonSide::right(
style
.container
.background_color
.unwrap_or_else(gpui::color::Color::transparent_black),
)
.with_border(style.container.border.width, style.container.border.color)
.contained()
.constrained()
.with_max_width(theme.search.mode_filling_width),
)
.into_any()
}
} else {
label.into_any()
}
})
.on_click(MouseButton::Left, move |_, this, cx| {
this.activate_search_mode(mode, cx);
})
.with_cursor_style(CursorStyle::PointingHand)
.with_tooltip::<SearchModeButton>(
mode.region_id(),
mode.tooltip_text().to_owned(),
Some(mode.activate_action()),
tooltip_style,
cx,
)
.into_any()
}
fn activate_search_mode(&self, mode: SearchMode, cx: &mut ViewContext<Self>) {
// Update Current Mode
if let Some(search_view) = self.active_project_search.as_ref() {
@ -1660,21 +1575,38 @@ impl View for ProjectSearchBar {
.flex(1., false),
)
});
let semantic_index = SemanticIndex::enabled(cx)
.then(|| self.render_search_mode_button(SearchMode::Semantic, cx));
let mut nav_button_for_direction = |label, direction| {
render_nav_button(
label,
direction,
let search_button_for_mode = |mode, cx: &mut ViewContext<ProjectSearchBar>| {
let is_active = if let Some(search) = self.active_project_search.as_ref() {
let search = search.read(cx);
search.current_mode == mode
} else {
false
};
render_search_mode_button(
mode,
is_active,
move |_, this, cx| {
if let Some(search) = this.active_project_search.as_ref() {
search.update(cx, |search, cx| search.select_match(direction, cx));
}
this.activate_search_mode(mode, cx);
},
cx,
)
};
let semantic_index = SemanticIndex::enabled(cx)
.then(|| search_button_for_mode(SearchMode::Semantic, cx));
let nav_button_for_direction =
|label, direction, cx: &mut ViewContext<ProjectSearchBar>| {
render_nav_button(
label,
direction,
move |_, this, cx| {
if let Some(search) = this.active_project_search.as_ref() {
search.update(cx, |search, cx| search.select_match(direction, cx));
}
},
cx,
)
};
Flex::row()
.with_child(
Flex::column()
@ -1683,8 +1615,16 @@ impl View for ProjectSearchBar {
.align_children_center()
.with_child(
Flex::row()
.with_child(nav_button_for_direction("<", Direction::Prev))
.with_child(nav_button_for_direction(">", Direction::Next))
.with_child(nav_button_for_direction(
"<",
Direction::Prev,
cx,
))
.with_child(nav_button_for_direction(
">",
Direction::Next,
cx,
))
.aligned(),
)
.with_children(matches)
@ -1726,9 +1666,9 @@ impl View for ProjectSearchBar {
.with_child(
Flex::row()
.align_children_center()
.with_child(self.render_search_mode_button(SearchMode::Text, cx))
.with_child(search_button_for_mode(SearchMode::Text, cx))
.with_children(semantic_index)
.with_child(self.render_search_mode_button(SearchMode::Regex, cx))
.with_child(search_button_for_mode(SearchMode::Regex, cx))
.with_child(super::search_bar::render_close_button(
&theme.search,
cx,

View file

@ -6,7 +6,11 @@ use gpui::{
};
use workspace::searchable::Direction;
use crate::{elements::ButtonSide, SelectNextMatch, SelectPrevMatch};
use crate::{
elements::ButtonSide,
mode::{SearchMode, Side},
SelectNextMatch, SelectPrevMatch,
};
pub(super) fn render_close_button<V: View>(
theme: &theme::Search,
@ -123,3 +127,86 @@ pub(super) fn render_nav_button<V: View>(
)
.into_any()
}
pub(crate) fn render_search_mode_button<V: View>(
mode: SearchMode,
is_active: bool,
on_click: impl Fn(MouseClick, &mut V, &mut EventContext<V>) + 'static,
cx: &mut ViewContext<V>,
) -> AnyElement<V> {
let tooltip_style = theme::current(cx).tooltip.clone();
// let is_active = if let Some(search) = self.active_project_search.as_ref() {
// let search = search.read(cx);
// search.current_mode == mode
// } else {
// false
// };
enum SearchModeButton {}
MouseEventHandler::<SearchModeButton, _>::new(mode.region_id(), cx, |state, cx| {
let theme = theme::current(cx);
let mut style = theme
.search
.mode_button
.in_state(is_active)
.style_for(state)
.clone();
let label = Label::new(mode.label(), style.text.clone())
.contained()
.with_style(style.container);
if let Some(button_side) = mode.button_side() {
style.container.border.left = mode.border_left();
style.container.border.right = mode.border_right();
if button_side == Side::Left {
Flex::row()
.align_children_center()
.with_child(
ButtonSide::left(
style
.container
.background_color
.unwrap_or_else(gpui::color::Color::transparent_black),
)
.with_border(style.container.border.width, style.container.border.color)
.contained()
.constrained()
.with_max_width(theme.search.mode_filling_width),
)
.with_child(label)
.into_any()
} else {
Flex::row()
.align_children_center()
.with_child(label)
.with_child(
ButtonSide::right(
style
.container
.background_color
.unwrap_or_else(gpui::color::Color::transparent_black),
)
.with_border(style.container.border.width, style.container.border.color)
.contained()
.constrained()
.with_max_width(theme.search.mode_filling_width),
)
.into_any()
}
} else {
label.into_any()
}
})
.on_click(MouseButton::Left, on_click)
.with_cursor_style(CursorStyle::PointingHand)
.with_tooltip::<SearchModeButton>(
mode.region_id(),
mode.tooltip_text().to_owned(),
Some(mode.activate_action()),
tooltip_style,
cx,
)
.into_any()
}