diff --git a/CHANGELOG.md b/CHANGELOG.md index bc08971f..6d23dacd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,14 @@ # Unreleased +Added: + +- Configuration option `new_buffer.input_visibility` to control input field visibility: always shown or following the focused buffer. + Fixed: - Changes done in the config file are now properly applied to the old buffers + # 2023.2 (2023-07-07) Added: diff --git a/config.yaml b/config.yaml index b80fc7e2..0a460d29 100644 --- a/config.yaml +++ b/config.yaml @@ -71,6 +71,11 @@ new_buffer: left: "[" right: "]" + # Input visibility behaviour + # - Always: Show input at all times [default] + # - Focused: Only show input when the buffer is focused + input_visibility: Always + # Channel buffer settings channel: # User list settings diff --git a/data/src/buffer.rs b/data/src/buffer.rs index bede7eba..a192c1cc 100644 --- a/data/src/buffer.rs +++ b/data/src/buffer.rs @@ -51,6 +51,13 @@ impl From for Settings { } } +#[derive(Debug, Clone, Copy, Default, Deserialize)] +pub enum InputVisibility { + Focused, + #[default] + Always, +} + #[derive(Debug, Clone, Deserialize)] pub struct Timestamp { pub format: String, diff --git a/data/src/config/buffer.rs b/data/src/config/buffer.rs index 27eaae8e..da7e1576 100644 --- a/data/src/config/buffer.rs +++ b/data/src/config/buffer.rs @@ -2,7 +2,7 @@ use chrono::{DateTime, Local, Utc}; use serde::Deserialize; use super::Channel; -use crate::buffer::{Color, Nickname, Timestamp}; +use crate::buffer::{Color, InputVisibility, Nickname, Timestamp}; #[derive(Debug, Clone, Deserialize)] pub struct Buffer { @@ -11,6 +11,8 @@ pub struct Buffer { #[serde(default)] pub nickname: Nickname, #[serde(default)] + pub input_visibility: InputVisibility, + #[serde(default)] pub channel: Channel, } @@ -25,6 +27,7 @@ impl Default for Buffer { color: Color::Unique, brackets: Default::default(), }, + input_visibility: InputVisibility::default(), channel: Channel::default(), } } diff --git a/src/buffer/channel.rs b/src/buffer/channel.rs index 9fd2d591..f550eb2b 100644 --- a/src/buffer/channel.rs +++ b/src/buffer/channel.rs @@ -97,11 +97,20 @@ pub fn view<'a>( .width(Length::FillPortion(2)) .height(Length::Fill); - let spacing = is_focused.then_some(vertical_space(4)); let users = clients.get_channel_users(&state.server, &state.channel); let nick_list = nick_list::view(users).map(Message::UserContext); - let text_input = (is_focused && status.connected()).then(|| { - input_view::view(&state.input_view, buffer, users, input_history).map(Message::InputView) + + let show_text_input = match config.buffer.input_visibility { + data::buffer::InputVisibility::Focused => is_focused && status.connected(), + data::buffer::InputVisibility::Always => status.connected(), + }; + + let text_input = show_text_input.then(|| { + column![ + vertical_space(4), + input_view::view(&state.input_view, buffer, users, input_history) + .map(Message::InputView) + ] }); let content = match (settings.users.visible, config.buffer.channel.users.position) { @@ -115,7 +124,6 @@ pub fn view<'a>( }; let scrollable = column![container(content).height(Length::Fill)] - .push_maybe(spacing) .push_maybe(text_input) .height(Length::Fill); diff --git a/src/buffer/query.rs b/src/buffer/query.rs index 819682d3..cd30c4e6 100644 --- a/src/buffer/query.rs +++ b/src/buffer/query.rs @@ -83,13 +83,20 @@ pub fn view<'a>( .map(Message::ScrollView), ) .height(Length::Fill); - let spacing = is_focused.then_some(vertical_space(4)); - let text_input = (is_focused && status.connected()).then(|| { - input_view::view(&state.input_view, buffer, &[], input_history).map(Message::InputView) + + let show_text_input = match config.buffer.input_visibility { + data::buffer::InputVisibility::Focused => is_focused && status.connected(), + data::buffer::InputVisibility::Always => status.connected(), + }; + + let text_input = show_text_input.then(|| { + column![ + vertical_space(4), + input_view::view(&state.input_view, buffer, &[], input_history).map(Message::InputView) + ] }); let scrollable = column![messages] - .push_maybe(spacing) .push_maybe(text_input) .height(Length::Fill); diff --git a/src/buffer/server.rs b/src/buffer/server.rs index 380fd971..e34f7067 100644 --- a/src/buffer/server.rs +++ b/src/buffer/server.rs @@ -52,13 +52,20 @@ pub fn view<'a>( .map(Message::ScrollView), ) .height(Length::Fill); - let spacing = is_focused.then_some(vertical_space(4)); - let text_input = (is_focused && status.connected()).then(|| { - input_view::view(&state.input_view, buffer, &[], input_history).map(Message::InputView) + + let show_text_input = match config.buffer.input_visibility { + data::buffer::InputVisibility::Focused => is_focused && status.connected(), + data::buffer::InputVisibility::Always => status.connected(), + }; + + let text_input = show_text_input.then(|| { + column![ + vertical_space(4), + input_view::view(&state.input_view, buffer, &[], input_history).map(Message::InputView) + ] }); let scrollable = column![messages] - .push_maybe(spacing) .push_maybe(text_input) .height(Length::Fill);