From 22f1b4dc337353782474bf59580cab91b87f9ede Mon Sep 17 00:00:00 2001
From: Alex Pasmantier <47638216+alexpasmantier@users.noreply.github.com>
Date: Wed, 18 Dec 2024 22:30:10 +0100
Subject: [PATCH] feat(ui): decouple preview title position from input bar
position and make it configurable (#144)
fixes #143
## example
```toml
[ui]
input_bar_position = "top"
preview_title_position = "top"
```
---
.config/config.toml | 2 ++
crates/television-screen/src/layout.rs | 31 +++++++++++++++++++++-----
crates/television/config/ui.rs | 8 ++++++-
crates/television/television.rs | 1 +
4 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/.config/config.toml b/.config/config.toml
index fda7ac2..6b96508 100644
--- a/.config/config.toml
+++ b/.config/config.toml
@@ -40,6 +40,8 @@ ui_scale = 100
show_help_bar = true
# Where to place the input bar in the UI (top or bottom)
input_bar_position = "bottom"
+# Where to place the preview title in the UI (top or bottom)
+preview_title_position = "top"
# The theme to use for the UI
# A list of builtin themes can be found in the `themes` directory of the television
# repository. You may also create your own theme by creating a new file in a `themes`
diff --git a/crates/television-screen/src/layout.rs b/crates/television-screen/src/layout.rs
index 23b3440..718b67a 100644
--- a/crates/television-screen/src/layout.rs
+++ b/crates/television-screen/src/layout.rs
@@ -62,6 +62,24 @@ impl Display for InputPosition {
}
}
+#[derive(Debug, Clone, Copy, Deserialize, Default)]
+pub enum PreviewTitlePosition {
+ #[serde(rename = "top")]
+ #[default]
+ Top,
+ #[serde(rename = "bottom")]
+ Bottom,
+}
+
+impl Display for PreviewTitlePosition {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ PreviewTitlePosition::Top => write!(f, "top"),
+ PreviewTitlePosition::Bottom => write!(f, "bottom"),
+ }
+ }
+}
+
pub struct Layout {
pub help_bar: Option,
pub results: Rect,
@@ -97,6 +115,7 @@ impl Layout {
with_remote: bool,
with_help_bar: bool,
input_position: InputPosition,
+ preview_title_position: PreviewTitlePosition,
) -> Self {
let main_block = centered_rect(dimensions.x, dimensions.y, area);
// split the main block into two vertical chunks (help bar + rest)
@@ -172,16 +191,16 @@ impl Layout {
let right_chunks = layout::Layout::default()
.direction(Direction::Vertical)
- .constraints(match input_position {
- InputPosition::Top => {
+ .constraints(match preview_title_position {
+ PreviewTitlePosition::Bottom => {
preview_constraints.into_iter().rev().collect()
}
- InputPosition::Bottom => preview_constraints,
+ PreviewTitlePosition::Top => preview_constraints,
})
.split(vt_chunks[1]);
- let (preview_title, preview_window) = match input_position {
- InputPosition::Bottom => (right_chunks[0], right_chunks[1]),
- InputPosition::Top => (right_chunks[1], right_chunks[0]),
+ let (preview_title, preview_window) = match preview_title_position {
+ PreviewTitlePosition::Top => (right_chunks[0], right_chunks[1]),
+ PreviewTitlePosition::Bottom => (right_chunks[1], right_chunks[0]),
};
Self::new(
diff --git a/crates/television/config/ui.rs b/crates/television/config/ui.rs
index 8abf3d4..e879204 100644
--- a/crates/television/config/ui.rs
+++ b/crates/television/config/ui.rs
@@ -2,7 +2,7 @@ use config::ValueKind;
use serde::Deserialize;
use std::collections::HashMap;
-use television_screen::layout::InputPosition;
+use television_screen::layout::{InputPosition, PreviewTitlePosition};
use super::themes::DEFAULT_THEME;
@@ -15,6 +15,7 @@ pub struct UiConfig {
pub show_help_bar: bool,
#[serde(default)]
pub input_bar_position: InputPosition,
+ pub preview_title_position: PreviewTitlePosition,
pub theme: String,
}
@@ -25,6 +26,7 @@ impl Default for UiConfig {
ui_scale: DEFAULT_UI_SCALE,
show_help_bar: true,
input_bar_position: InputPosition::Bottom,
+ preview_title_position: PreviewTitlePosition::Top,
theme: String::from(DEFAULT_THEME),
}
}
@@ -49,6 +51,10 @@ impl From for ValueKind {
String::from("input_position"),
ValueKind::String(val.input_bar_position.to_string()).into(),
);
+ m.insert(
+ String::from("preview_title_position"),
+ ValueKind::String(val.preview_title_position.to_string()).into(),
+ );
m.insert(String::from("theme"), ValueKind::String(val.theme).into());
ValueKind::Table(m)
}
diff --git a/crates/television/television.rs b/crates/television/television.rs
index 33638e6..3113cad 100644
--- a/crates/television/television.rs
+++ b/crates/television/television.rs
@@ -406,6 +406,7 @@ impl Television {
!matches!(self.mode, Mode::Channel),
self.config.ui.show_help_bar,
self.config.ui.input_bar_position,
+ self.config.ui.preview_title_position,
);
// help bar (metadata, keymaps, logo)