Skip to content

Commit

Permalink
Merge pull request #377 from squidowl/feat/overwrite-server-messages-…
Browse files Browse the repository at this point in the history
…color

feat: overwrite server & internal messages color
  • Loading branch information
casperstorm committed May 14, 2024
2 parents e48ad4b + 34155a3 commit d50bef5
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 37 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Added:

- Ability to overwrite nickname colors by providing a hex string (see [buffer configuration](https://halloy.squidowl.org/configuration/buffer.html#buffernicknamecolor-section)).
- Ability to overwrite server & internal message colors by providing a hex string (see [buffer configuration](https://halloy.squidowl.org/configuration/buffer.html#bufferserver_messages-section)).

# 2024.7 (2024-05-05)

Expand Down
16 changes: 12 additions & 4 deletions book/src/configuration/buffer.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,10 @@ enabled = true | false
position = "left" | "right"
```

| Key | Description | Default |
| ---------- | ------------------------------------------------ | ---------- |
| `enabled` | Control if nicklist should be shown or not | `true` |
| `position` | Nicklist position. Can be `"left"` or `"right"`. | `"right"` |
| Key | Description | Default |
| ---------- | ------------------------------------------------ | --------- |
| `enabled` | Control if nicklist should be shown or not | `true` |
| `position` | Nicklist position. Can be `"left"` or `"right"`. | `"right"` |

### `[buffer.channel.nicklist.color]` Section

Expand Down Expand Up @@ -102,48 +102,56 @@ max_lines = <integer>
enabled = true | false
smart = <integer>
username_format = "full" | "short"
hex = "<string>"
```

```toml
[buffer.server_messages.part]
enabled = true | false
smart = <integer>
username_format = "full" | "short"
hex = "<string>"
```

```toml
[buffer.server_messages.quit]
enabled = true | false
smart = <integer>
username_format = "full" | "short"
hex = "<string>"
```

```toml
[buffer.server_messages.topic]
enabled = true | false
hex = "<string>"
```

| Key | Description | Default |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
| `enabled` | Control if the server message should appear in buffers or not | `true` |
| `smart` | Only show server message if the user has sent a message in the given time interval (seconds) prior to the server message. | `not set` |
| `username_format` | Adjust how the username should look. Can be `"full"` (shows the longest username available (nickname, username and hostname) or `"short"` (only shows nickname). | `"full"` |
| `hex` | Overwrite the default color. Optional. | `not set` |

## `[buffer.internal_messages]` Section

```toml
[buffer.internal_messages.success]
enabled = true | false
smart = <integer>
hex = "<string>"
```

```toml
[buffer.internal_messages.error]
enabled = true | false
smart = <integer>
hex = "<string>"
```

| Key | Description | Default |
| --------- | -------------------------------------------------------------------------------- | --------- |
| `enabled` | Control if the internal message should appear in buffers or not | `true` |
| `smart` | Only show internal message if received within the given time duration (seconds). | `not set` |
| `hex` | Overwrite the default color. Optional. | `not set` |
26 changes: 16 additions & 10 deletions data/src/config/buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,26 @@ pub struct ServerMessages {
}

impl ServerMessages {
pub fn get(&self, server: &source::Server) -> Option<ServerMessage> {
pub fn get(&self, server: &source::Server) -> Option<&ServerMessage> {
match server.kind() {
source::server::Kind::ReplyTopic => Some(self.topic),
source::server::Kind::Part => Some(self.part),
source::server::Kind::Quit => Some(self.quit),
source::server::Kind::Join => Some(self.join),
source::server::Kind::ReplyTopic => Some(&self.topic),
source::server::Kind::Part => Some(&self.part),
source::server::Kind::Quit => Some(&self.quit),
source::server::Kind::Join => Some(&self.join),
}
}
}

#[derive(Debug, Copy, Clone, Deserialize)]
#[derive(Debug, Clone, Deserialize)]
pub struct ServerMessage {
#[serde(default = "default_bool_true")]
pub enabled: bool,
#[serde(default)]
pub smart: Option<i64>,
#[serde(default)]
pub username_format: UsernameFormat,
#[serde(default)]
pub hex: Option<String>,
}

impl Default for ServerMessage {
Expand All @@ -62,6 +64,7 @@ impl Default for ServerMessage {
enabled: true,
smart: Default::default(),
username_format: UsernameFormat::default(),
hex: None,
}
}
}
Expand All @@ -75,27 +78,30 @@ pub struct InternalMessages {
}

impl InternalMessages {
pub fn get(&self, server: &source::Status) -> Option<InternalMessage> {
pub fn get(&self, server: &source::Status) -> Option<&InternalMessage> {
match server {
source::Status::Success => Some(self.success),
source::Status::Error => Some(self.error),
source::Status::Success => Some(&self.success),
source::Status::Error => Some(&self.error),
}
}
}

#[derive(Debug, Copy, Clone, Deserialize)]
#[derive(Debug, Clone, Deserialize)]
pub struct InternalMessage {
#[serde(default = "default_bool_true")]
pub enabled: bool,
#[serde(default)]
pub smart: Option<i64>,
#[serde(default)]
pub hex: Option<String>,
}

impl Default for InternalMessage {
fn default() -> Self {
Self {
enabled: true,
smart: Default::default(),
hex: None,
}
}
}
Expand Down
25 changes: 19 additions & 6 deletions src/buffer/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@ pub fn view<'a>(
|theme| {
theme::selectable_text::nickname(
theme,
user.nick_color(theme.colors(), &config.buffer.nickname.color),
user.nick_color(
theme.colors(),
&config.buffer.nickname.color,
),
user.is_away(),
)
},
Expand Down Expand Up @@ -101,9 +104,14 @@ pub fn view<'a>(
.into(),
)
}
message::Source::Server(_) => {
let message =
selectable_text(&message.text).style(theme::selectable_text::info);
message::Source::Server(server) => {
let message = selectable_text(&message.text).style(move |theme| {
theme::selectable_text::server(
theme,
server.as_ref(),
&config.buffer.server_messages,
)
});

Some(container(row![].push_maybe(timestamp).push(message)).into())
}
Expand All @@ -114,8 +122,13 @@ pub fn view<'a>(
Some(container(row![].push_maybe(timestamp).push(message)).into())
}
message::Source::Internal(message::source::Internal::Status(status)) => {
let message = selectable_text(&message.text)
.style(|theme| theme::selectable_text::status(theme, *status));
let message = selectable_text(&message.text).style(move |theme| {
theme::selectable_text::status(
theme,
*status,
&config.buffer.internal_messages,
)
});

Some(container(row![].push_maybe(timestamp).push(message)).into())
}
Expand Down
27 changes: 20 additions & 7 deletions src/buffer/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ pub fn view<'a>(
scroll_view::Kind::Query(&state.server, &state.nick),
history,
config,
|message| {
move |message| {
let timestamp =
config
.buffer
Expand All @@ -51,7 +51,10 @@ pub fn view<'a>(
|theme| {
theme::selectable_text::nickname(
theme,
user.nick_color(theme.colors(), &config.buffer.nickname.color),
user.nick_color(
theme.colors(),
&config.buffer.nickname.color,
),
false,
)
},
Expand All @@ -77,9 +80,14 @@ pub fn view<'a>(
.into(),
)
}
message::Source::Server(_) => {
let message =
selectable_text(&message.text).style(theme::selectable_text::info);
message::Source::Server(server) => {
let message = selectable_text(&message.text).style(move |theme| {
theme::selectable_text::server(
theme,
server.as_ref(),
&config.buffer.server_messages,
)
});

Some(container(row![].push_maybe(timestamp).push(message)).into())
}
Expand All @@ -90,8 +98,13 @@ pub fn view<'a>(
Some(container(row![].push_maybe(timestamp).push(message)).into())
}
message::Source::Internal(message::source::Internal::Status(status)) => {
let message = selectable_text(&message.text)
.style(|theme| theme::selectable_text::status(theme, *status));
let message = selectable_text(&message.text).style(move |theme| {
theme::selectable_text::status(
theme,
*status,
&config.buffer.internal_messages,
)
});

Some(container(row![].push_maybe(timestamp).push(message)).into())
}
Expand Down
22 changes: 16 additions & 6 deletions src/buffer/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ pub fn view<'a>(
scroll_view::Kind::Server(&state.server),
history,
config,
|message| {
move |message| {
let timestamp =
config
.buffer
Expand All @@ -39,15 +39,25 @@ pub fn view<'a>(
});

match message.target.source() {
message::Source::Server(_) => {
let message =
selectable_text(&message.text).style(theme::selectable_text::info);
message::Source::Server(server) => {
let message = selectable_text(&message.text).style(move |theme| {
theme::selectable_text::server(
theme,
server.as_ref(),
&config.buffer.server_messages,
)
});

Some(container(row![].push_maybe(timestamp).push(message)).into())
}
message::Source::Internal(message::source::Internal::Status(status)) => {
let message = selectable_text(&message.text)
.style(|theme| theme::selectable_text::status(theme, *status));
let message = selectable_text(&message.text).style(move |theme| {
theme::selectable_text::status(
theme,
*status,
&config.buffer.internal_messages,
)
});

Some(container(row![].push_maybe(timestamp).push(message)).into())
}
Expand Down
40 changes: 36 additions & 4 deletions src/theme/selectable_text.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use data::{message, user::NickColor};
use data::{config, message, theme::hex_to_color, user::NickColor};

use crate::widget::selectable_text::{Catalog, Style, StyleFn};

Expand Down Expand Up @@ -46,6 +46,24 @@ pub fn accent(theme: &Theme) -> Style {
}
}

pub fn server(
theme: &Theme,
server: Option<&message::source::Server>,
config: &config::buffer::ServerMessages,
) -> Style {
let color = server.and_then(|server| match server.kind() {
message::source::server::Kind::Join => config.join.hex.as_deref().and_then(hex_to_color),
message::source::server::Kind::Part => config.part.hex.as_deref().and_then(hex_to_color),
message::source::server::Kind::Quit => config.quit.hex.as_deref().and_then(hex_to_color),
message::source::server::Kind::ReplyTopic => config.topic.hex.as_deref().and_then(hex_to_color),
}).or_else(|| text::info(theme).color);

Style {
color,
selection_color: theme.colors().accent.high_alpha,
}
}

pub fn nickname(theme: &Theme, nick_color: NickColor, transparent: bool) -> Style {
let color = text::nickname(theme, nick_color, transparent).color;

Expand All @@ -55,10 +73,24 @@ pub fn nickname(theme: &Theme, nick_color: NickColor, transparent: bool) -> Styl
}
}

pub fn status(theme: &Theme, status: message::source::Status) -> Style {
pub fn status(
theme: &Theme,
status: message::source::Status,
config: &config::buffer::InternalMessages,
) -> Style {
let color = match status {
message::source::Status::Success => text::success(theme).color,
message::source::Status::Error => text::error(theme).color,
message::source::Status::Success => config
.success
.hex
.as_deref()
.and_then(hex_to_color)
.or_else(|| text::success(theme).color),
message::source::Status::Error => config
.error
.hex
.as_deref()
.and_then(hex_to_color)
.or_else(|| text::error(theme).color),
};

Style {
Expand Down

0 comments on commit d50bef5

Please sign in to comment.