Skip to content

Commit 2bf3df0

Browse files
committed
Vary row colors in search results to help differentiate individual results and the search messages.
1 parent 6a0031b commit 2bf3df0

File tree

4 files changed

+184
-146
lines changed

4 files changed

+184
-146
lines changed

src/appearance/theme/container.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ pub fn table(theme: &Theme, idx: usize) -> Style {
9494
}
9595
}
9696

97+
pub fn table_header(theme: &Theme) -> Style {
98+
let buffer = theme.styles().buffer;
99+
100+
Style {
101+
background: Some(Background::Color(buffer.background_title_bar)),
102+
text_color: Some(theme.styles().text.primary.color),
103+
..Default::default()
104+
}
105+
}
106+
97107
pub fn none(_theme: &Theme) -> Style {
98108
Style {
99109
background: None,

src/buffer/message_view.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ impl<'a> ChannelQueryLayout<'a> {
769769

770770
impl<'a> LayoutMessage<'a> for ChannelQueryLayout<'a> {
771771
fn format(
772-
&self,
772+
&mut self,
773773
message: &'a data::Message,
774774
right_aligned_width: Option<f32>,
775775
max_prefix_width: Option<f32>,

src/buffer/scroll_view.rs

Lines changed: 151 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ impl From<Kind<'_>> for history::Kind {
134134

135135
pub trait LayoutMessage<'a> {
136136
fn format(
137-
&self,
137+
&mut self,
138138
message: &'a data::Message,
139139
right_aligned_width: Option<f32>,
140140
max_prefix_width: Option<f32>,
@@ -145,7 +145,7 @@ pub trait LayoutMessage<'a> {
145145

146146
impl<'a, T> LayoutMessage<'a> for T
147147
where
148-
T: Fn(
148+
T: FnMut(
149149
&'a data::Message,
150150
Option<f32>,
151151
Option<f32>,
@@ -154,7 +154,7 @@ where
154154
) -> Option<Element<'a, Message>>,
155155
{
156156
fn format(
157-
&self,
157+
&mut self,
158158
message: &'a data::Message,
159159
right_aligned_width: Option<f32>,
160160
max_prefix_width: Option<f32>,
@@ -252,7 +252,7 @@ pub fn view<'a>(
252252
reserve_bottom_line_for_typing: bool,
253253
config: &'a Config,
254254
theme: &'a Theme,
255-
formatter: impl LayoutMessage<'a> + 'a,
255+
mut formatter: impl LayoutMessage<'a> + 'a,
256256
) -> Element<'a, Message> {
257257
let divider_font_size =
258258
config.font.size.map_or(theme::TEXT_SIZE, f32::from) - 1.0;
@@ -345,29 +345,31 @@ pub fn view<'a>(
345345
let max_prefix_width = max_prefix_chars
346346
.map(|len| font::width_from_chars(len, &config.font) + 1.0);
347347

348-
let message_rows = |last_date: Option<NaiveDate>,
349-
messages: &[&'a data::Message]| {
350-
messages
351-
.iter()
352-
.scan(Option::<&data::Message>::None, |prev_message, message| {
353-
let hide_timestamp =
354-
if let HideConsecutiveEnabled::Enabled(duration) =
355-
config.buffer.timestamp.hide_consecutive.enabled
356-
{
357-
is_consecutive_user_message(
358-
message,
359-
*prev_message,
360-
duration,
361-
)
362-
} else {
363-
false
364-
};
348+
let mut message_rows =
349+
|last_date: Option<NaiveDate>, messages: &[&'a data::Message]| {
350+
messages
351+
.iter()
352+
.scan(
353+
Option::<&data::Message>::None,
354+
|prev_message, message| {
355+
let hide_timestamp =
356+
if let HideConsecutiveEnabled::Enabled(duration) =
357+
config.buffer.timestamp.hide_consecutive.enabled
358+
{
359+
is_consecutive_user_message(
360+
message,
361+
*prev_message,
362+
duration,
363+
)
364+
} else {
365+
false
366+
};
365367

366-
let hide_nickname =
367-
if let HideConsecutiveEnabled::Enabled(duration) =
368-
config.buffer.nickname.hide_consecutive.enabled
369-
{
370-
!config.buffer.nickname.alignment.is_top()
368+
let hide_nickname =
369+
if let HideConsecutiveEnabled::Enabled(duration) =
370+
config.buffer.nickname.hide_consecutive.enabled
371+
{
372+
!config.buffer.nickname.alignment.is_top()
371373
&& is_consecutive_user_message(
372374
message,
373375
*prev_message,
@@ -387,149 +389,156 @@ pub fn view<'a>(
387389
&visible_for_source,
388390
)
389391
}))
390-
} else {
391-
false
392-
};
393-
394-
*prev_message = Some(message);
395-
396-
Some(
397-
formatter
398-
.format(
399-
message,
400-
right_aligned_width,
401-
max_prefix_width,
402-
hide_timestamp,
403-
hide_nickname,
392+
} else {
393+
false
394+
};
395+
396+
*prev_message = Some(message);
397+
398+
Some(
399+
formatter
400+
.format(
401+
message,
402+
right_aligned_width,
403+
max_prefix_width,
404+
hide_timestamp,
405+
hide_nickname,
406+
)
407+
.map(|element| (message, element)),
404408
)
405-
.map(|element| (message, element)),
409+
},
406410
)
407-
})
408-
.flatten()
409-
.scan(last_date, |last_date, (message, element)| {
410-
let date =
411-
message.server_time.with_timezone(&Local).date_naive();
411+
.flatten()
412+
.scan(last_date, |last_date, (message, element)| {
413+
let date =
414+
message.server_time.with_timezone(&Local).date_naive();
412415

413-
let is_new_day = last_date.is_none_or(|prev| date != prev);
416+
let is_new_day = last_date.is_none_or(|prev| date != prev);
414417

415-
*last_date = Some(date);
418+
*last_date = Some(date);
416419

417-
let content = if let (
418-
message::Content::Fragments(fragments),
419-
Some(previews),
420-
) = (&message.content, previews)
421-
{
422-
let urls = eligible_preview_urls(
423-
fragments
424-
.iter()
425-
.filter_map(message::Fragment::url)
426-
.cloned(),
427-
&message.hidden_urls,
428-
config.preview.max_per_message,
429-
);
420+
let content = if let (
421+
message::Content::Fragments(fragments),
422+
Some(previews),
423+
) = (&message.content, previews)
424+
{
425+
let urls = eligible_preview_urls(
426+
fragments
427+
.iter()
428+
.filter_map(message::Fragment::url)
429+
.cloned(),
430+
&message.hidden_urls,
431+
config.preview.max_per_message,
432+
);
430433

431-
if !urls.is_empty() {
432-
let is_message_visible = state
433-
.visible_url_messages
434-
.contains_key(&message.hash);
434+
if !urls.is_empty() {
435+
let is_message_visible = state
436+
.visible_url_messages
437+
.contains_key(&message.hash);
435438

436-
let mut column = column![element].spacing(2);
439+
let mut column = column![element].spacing(2);
437440

438-
for (idx, url) in urls.iter().enumerate() {
439-
if let (
440-
true,
441-
Some(preview::State::Loaded(preview)),
442-
) = (is_message_visible, previews.get(url))
443-
{
444-
let is_hovered =
445-
state.hovered_preview.is_some_and(
446-
|(a, b)| a == message.hash && b == idx,
447-
);
441+
for (idx, url) in urls.iter().enumerate() {
442+
if let (
443+
true,
444+
Some(preview::State::Loaded(preview)),
445+
) = (is_message_visible, previews.get(url))
446+
{
447+
let is_hovered = state
448+
.hovered_preview
449+
.is_some_and(|(a, b)| {
450+
a == message.hash && b == idx
451+
});
452+
453+
let is_visible_for_source =
454+
if let Some(visible_for_source) =
455+
&visible_for_source
456+
{
457+
visible_for_source(
458+
preview,
459+
message.target.source(),
460+
)
461+
} else {
462+
true
463+
};
448464

449-
let is_visible_for_source =
450-
if let Some(visible_for_source) =
451-
&visible_for_source
452-
{
453-
visible_for_source(
465+
if is_visible_for_source {
466+
column = column.push(preview_row(
467+
message,
454468
preview,
455-
message.target.source(),
456-
)
457-
} else {
458-
true
459-
};
460-
461-
if is_visible_for_source {
462-
column = column.push(preview_row(
463-
message,
464-
preview,
465-
url,
466-
idx,
467-
right_aligned_width,
468-
max_prefix_width,
469-
is_hovered,
470-
config,
471-
theme,
472-
));
469+
url,
470+
idx,
471+
right_aligned_width,
472+
max_prefix_width,
473+
is_hovered,
474+
config,
475+
theme,
476+
));
477+
}
473478
}
474479
}
475-
}
476480

477-
if is_message_visible {
478-
notify_visibility(
479-
column,
480-
2000.0,
481-
notify_visibility::When::NotVisible,
482-
message.hash,
483-
Message::ExitingViewport(message.hash),
484-
)
481+
if is_message_visible {
482+
notify_visibility(
483+
column,
484+
2000.0,
485+
notify_visibility::When::NotVisible,
486+
message.hash,
487+
Message::ExitingViewport(message.hash),
488+
)
489+
} else {
490+
notify_visibility(
491+
column,
492+
1000.0,
493+
notify_visibility::When::Visible,
494+
message.hash,
495+
Message::EnteringViewport(
496+
message.hash,
497+
urls,
498+
),
499+
)
500+
}
485501
} else {
486-
notify_visibility(
487-
column,
488-
1000.0,
489-
notify_visibility::When::Visible,
490-
message.hash,
491-
Message::EnteringViewport(message.hash, urls),
492-
)
502+
element
493503
}
494504
} else {
495505
element
496-
}
497-
} else {
498-
element
499-
};
506+
};
500507

501-
let content = if is_new_day
502-
&& config.buffer.date_separators.show
503-
{
504-
column![
505-
row![
506-
container(rule::horizontal(1))
507-
.width(Length::Fill)
508-
.padding(padding::right(6)),
509-
text(config.buffer.format_date_separator(&date))
508+
let content = if is_new_day
509+
&& config.buffer.date_separators.show
510+
{
511+
column![
512+
row![
513+
container(rule::horizontal(1))
514+
.width(Length::Fill)
515+
.padding(padding::right(6)),
516+
text(
517+
config.buffer.format_date_separator(&date)
518+
)
510519
.size(divider_font_size)
511520
.style(theme::text::secondary)
512521
.font_maybe(
513522
theme::font_style::secondary(theme)
514523
.map(font::get)
515524
),
516-
container(rule::horizontal(1))
517-
.width(Length::Fill)
518-
.padding(padding::left(6))
525+
container(rule::horizontal(1))
526+
.width(Length::Fill)
527+
.padding(padding::left(6))
528+
]
529+
.padding(2)
530+
.align_y(iced::Alignment::Center),
531+
content
519532
]
520-
.padding(2)
521-
.align_y(iced::Alignment::Center),
533+
.into()
534+
} else {
522535
content
523-
]
524-
.into()
525-
} else {
526-
content
527-
};
536+
};
528537

529-
Some(keyed(keyed::Key::message(message), content))
530-
})
531-
.collect::<Vec<_>>()
532-
};
538+
Some(keyed(keyed::Key::message(message), content))
539+
})
540+
.collect::<Vec<_>>()
541+
};
533542

534543
let line_spacing = config.buffer.line_spacing;
535544

0 commit comments

Comments
 (0)