Skip to content

Commit b300242

Browse files
authored
Merge pull request #1246 from squidowl/dim-server-messages
2 parents e0bf909 + edfeee3 commit b300242

4 files changed

Lines changed: 74 additions & 18 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Added:
99
- Support for USERINFO CTCP query
1010
- Configurable anti-flood protection for servers that do not advertise SAFERATE
1111
- Channel modes will be retrieved on joining a channel (to be shown in the pane title bar)
12-
- Display own nickname next to text input field
12+
- Server messages can be dimmed (enabled by default), to lessen their visual impact relative to user messages
1313

1414
Fixed:
1515

book/src/configuration/buffer.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,19 @@ If you pass `["#halloy"]`, the channel `#halloy` will receive the server message
752752
include = ["#halloy"]
753753
```
754754

755+
### `dimmed`
756+
757+
Dim condensed server message. Either automatically, based on text/background colors (by setting to `true`), or specify a dimming value in the range `0.0` (transparent) to `1.0` (no dimming).
758+
759+
```toml
760+
# Type: bool or float
761+
# Values: true, false, or float
762+
# Default: true
763+
764+
[buffer.server_messages.<server_message>]
765+
dimmed = true
766+
```
767+
755768
### `username_format`
756769

757770
Adjust the amount of information displayed for a username in server messages. If you choose `"short"`, only the nickname will be shown. If you choose `"full"`, the nickname, username, and hostname (if available) will be displayed.
@@ -800,7 +813,7 @@ Dim condensed messages. Either automatically, based on text/background colors (
800813
```toml
801814
# Type: bool or float
802815
# Values: true, false, or float
803-
# Default: false
816+
# Default: true
804817

805818
[buffer.server_messages.condense]
806819
dimmed = true

data/src/config/buffer.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,15 @@ impl ServerMessages {
259259
source::server::Kind::ChangeTopic => Some(&self.change_topic),
260260
}
261261
}
262+
263+
pub fn dimmed(&self, server: Option<&source::Server>) -> Option<&Dimmed> {
264+
server.and_then(|server| {
265+
self.get(server).and_then(|kind| kind.dimmed.as_ref())
266+
})
267+
}
262268
}
263269

264-
#[derive(Debug, Default, Clone, Deserialize)]
270+
#[derive(Debug, Clone, Deserialize)]
265271
#[serde(default)]
266272
pub struct Condensation {
267273
pub messages: HashSet<CondensationMessage>,
@@ -270,6 +276,16 @@ pub struct Condensation {
270276
pub dimmed: Option<Dimmed>,
271277
}
272278

279+
impl Default for Condensation {
280+
fn default() -> Self {
281+
Self {
282+
messages: HashSet::new(),
283+
format: CondensationFormat::default(),
284+
dimmed: Some(Dimmed(None)),
285+
}
286+
}
287+
}
288+
273289
impl Condensation {
274290
pub fn kind(&self, server: &source::Server) -> bool {
275291
match server.kind() {
@@ -328,6 +344,8 @@ pub struct ServerMessage {
328344
pub username_format: UsernameFormat,
329345
pub exclude: Vec<String>,
330346
pub include: Vec<String>,
347+
#[serde(deserialize_with = "deserialize_dimmed_maybe")]
348+
pub dimmed: Option<Dimmed>,
331349
}
332350

333351
impl Default for ServerMessage {
@@ -338,6 +356,7 @@ impl Default for ServerMessage {
338356
username_format: UsernameFormat::default(),
339357
exclude: Vec::default(),
340358
include: Vec::default(),
359+
dimmed: Some(Dimmed(None)),
341360
}
342361
}
343362
}

src/buffer/message_view.rs

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use data::config::buffer::nickname::ShownStatus;
22
use data::isupport::{CaseMap, PrefixMap};
33
use data::server::Server;
4-
use data::target::{self};
54
use data::user::ChannelUsers;
6-
use data::{Config, User, message};
5+
use data::{Config, User, message, target};
76
use iced::Color;
87
use iced::advanced::text;
98
use iced::widget::{column, container, row};
@@ -245,54 +244,79 @@ impl<'a> ChannelQueryLayout<'a> {
245244
max_nick_width: Option<f32>,
246245
server: Option<&'a message::source::Server>,
247246
) -> (Element<'a, Message>, Element<'a, Message>) {
247+
let formatter = *self;
248+
249+
let dimmed = formatter.config.buffer.server_messages.dimmed(server);
250+
248251
let message_style = move |message_theme: &Theme| {
249-
theme::selectable_text::server(message_theme, server)
252+
let mut style =
253+
theme::selectable_text::server(message_theme, server);
254+
255+
if let Some(dimmed) = dimmed {
256+
style.color = style.color.map(|color| {
257+
dimmed.transform_color(
258+
color,
259+
formatter.theme.styles().buffer.background,
260+
)
261+
});
262+
}
263+
264+
style
250265
};
251266
let message_font_style = move |message_theme: &Theme| {
252267
theme::font_style::server(message_theme, server)
253268
};
269+
254270
let marker = message_marker(
255271
max_nick_width,
256272
self.theme,
257273
message_style,
258274
message_font_style,
259275
);
260276

261-
let fm = *self;
262277
let message_content = message_content::with_context(
263278
&message.content,
264-
fm.chantypes,
265-
fm.casemapping,
279+
formatter.chantypes,
280+
formatter.casemapping,
266281
self.theme,
267282
Message::Link,
268283
message_style,
269284
message_font_style,
270-
Option::<fn(Color) -> Color>::None,
285+
Some(|color: Color| -> Color {
286+
if let Some(dimmed) = dimmed {
287+
dimmed.transform_color(
288+
color,
289+
formatter.theme.styles().buffer.background,
290+
)
291+
} else {
292+
color
293+
}
294+
}),
271295
move |link| match link {
272296
message::Link::User(_) => context_menu::Entry::user_list(
273-
fm.target.is_channel(),
274-
fm.target.our_user(),
297+
formatter.target.is_channel(),
298+
formatter.target.our_user(),
275299
),
276300
message::Link::Url(_) => context_menu::Entry::url_list(),
277301
_ => vec![],
278302
},
279303
move |link, entry, length| {
280304
let user = link.user();
281305
let current_user = user.and_then(|u| {
282-
fm.target.users().and_then(|users| users.resolve(u))
306+
formatter.target.users().and_then(|users| users.resolve(u))
283307
});
284308

285309
entry
286310
.view(
287-
fm.server,
288-
fm.prefix,
289-
fm.target.channel(),
311+
formatter.server,
312+
formatter.prefix,
313+
formatter.target.channel(),
290314
user,
291315
current_user,
292316
link.url(),
293317
length,
294-
fm.config,
295-
fm.theme,
318+
formatter.config,
319+
formatter.theme,
296320
)
297321
.map(Message::ContextMenu)
298322
},

0 commit comments

Comments
 (0)