Skip to content

Commit babb582

Browse files
committed
Vary row colors in search results to help differentiate individual results and the search messages.
1 parent 3a56755 commit babb582

File tree

4 files changed

+181
-143
lines changed

4 files changed

+181
-143
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
@@ -801,7 +801,7 @@ impl<'a> ChannelQueryLayout<'a> {
801801

802802
impl<'a> LayoutMessage<'a> for ChannelQueryLayout<'a> {
803803
fn format(
804-
&self,
804+
&mut self,
805805
message: &'a data::Message,
806806
right_aligned_width: Option<f32>,
807807
max_prefix_width: Option<f32>,

src/buffer/scroll_view.rs

Lines changed: 148 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ impl From<Kind<'_>> for history::Kind {
136136

137137
pub trait LayoutMessage<'a> {
138138
fn format(
139-
&self,
139+
&mut self,
140140
message: &'a data::Message,
141141
right_aligned_width: Option<f32>,
142142
max_prefix_width: Option<f32>,
@@ -147,7 +147,7 @@ pub trait LayoutMessage<'a> {
147147

148148
impl<'a, T> LayoutMessage<'a> for T
149149
where
150-
T: Fn(
150+
T: FnMut(
151151
&'a data::Message,
152152
Option<f32>,
153153
Option<f32>,
@@ -156,7 +156,7 @@ where
156156
) -> Option<Element<'a, Message>>,
157157
{
158158
fn format(
159-
&self,
159+
&mut self,
160160
message: &'a data::Message,
161161
right_aligned_width: Option<f32>,
162162
max_prefix_width: Option<f32>,
@@ -255,7 +255,7 @@ pub fn view<'a>(
255255
reserve_bottom_line_for_typing: bool,
256256
config: &'a Config,
257257
theme: &'a Theme,
258-
formatter: impl LayoutMessage<'a> + 'a,
258+
mut formatter: impl LayoutMessage<'a> + 'a,
259259
) -> Element<'a, Message> {
260260
let divider_font_size =
261261
config.font.size.map_or(theme::TEXT_SIZE, f32::from) - 1.0;
@@ -348,29 +348,31 @@ pub fn view<'a>(
348348
let max_prefix_width = max_prefix_chars
349349
.map(|len| font::width_from_chars(len, &config.font) + 1.0);
350350

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

369-
let hide_nickname =
370-
if let HideConsecutiveEnabled::Enabled(duration) =
371-
config.buffer.nickname.hide_consecutive.enabled
372-
{
373-
!config.buffer.nickname.alignment.is_top()
371+
let hide_nickname =
372+
if let HideConsecutiveEnabled::Enabled(duration) =
373+
config.buffer.nickname.hide_consecutive.enabled
374+
{
375+
!config.buffer.nickname.alignment.is_top()
374376
&& is_consecutive_user_message(
375377
message,
376378
*prev_message,
@@ -390,146 +392,153 @@ pub fn view<'a>(
390392
&visible_for_source,
391393
)
392394
}))
393-
} else {
394-
false
395-
};
396-
397-
*prev_message = Some(message);
398-
399-
Some(
400-
formatter
401-
.format(
402-
message,
403-
right_aligned_width,
404-
max_prefix_width,
405-
hide_timestamp,
406-
hide_nickname,
395+
} else {
396+
false
397+
};
398+
399+
*prev_message = Some(message);
400+
401+
Some(
402+
formatter
403+
.format(
404+
message,
405+
right_aligned_width,
406+
max_prefix_width,
407+
hide_timestamp,
408+
hide_nickname,
409+
)
410+
.map(|element| (message, element)),
407411
)
408-
.map(|element| (message, element)),
412+
},
409413
)
410-
})
411-
.flatten()
412-
.scan(last_date, |last_date, (message, element)| {
413-
let date =
414-
message.server_time.with_timezone(&Local).date_naive();
414+
.flatten()
415+
.scan(last_date, |last_date, (message, element)| {
416+
let date =
417+
message.server_time.with_timezone(&Local).date_naive();
415418

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

418-
*last_date = Some(date);
421+
*last_date = Some(date);
419422

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.iter().filter_map(message::Fragment::url),
427-
&message.hidden_urls,
428-
config.preview.max_per_message,
429-
);
423+
let content = if let (
424+
message::Content::Fragments(fragments),
425+
Some(previews),
426+
) = (&message.content, previews)
427+
{
428+
let urls = eligible_preview_urls(
429+
fragments.iter().filter_map(message::Fragment::url),
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)