feat(view): global status line option

Add option to render single glboal status line instead of rendering
status line per view.

Fixes: https://github.com/helix-editor/helix/issues/2254
pull/4417/head
Matouš Dzivjak 2 years ago
parent f323ffabcc
commit ea31a5b14c

@ -19,7 +19,7 @@ use helix_core::{
use helix_view::{
apply_transaction,
document::{Mode, SCRATCH_BUFFER_NAME},
editor::{CompleteAction, CursorShapeConfig},
editor::{CompleteAction, CursorShapeConfig, StatusLineRenderConfig},
graphics::{Color, CursorKind, Modifier, Rect, Style},
input::{KeyEvent, MouseButton, MouseEvent, MouseEventKind},
keyboard::{KeyCode, KeyModifiers},
@ -80,7 +80,10 @@ impl EditorView {
is_focused: bool,
) {
let inner = view.inner_area(doc);
let area = view.area;
let area = match editor.config().statusline.render {
StatusLineRenderConfig::Single => view.area.clip_bottom(1),
StatusLineRenderConfig::PerView => view.area,
};
let theme = &editor.theme;
let config = editor.config();
@ -164,13 +167,14 @@ impl EditorView {
for y in area.top()..area.bottom() {
surface[(x, y)]
.set_symbol(tui::symbols::line::VERTICAL)
//.set_symbol(" ")
.set_style(border_style);
}
}
Self::render_diagnostics(doc, view, inner, surface, theme);
match editor.config().statusline.render {
StatusLineRenderConfig::PerView => {
let statusline_area = view
.area
.clip_top(view.area.height.saturating_sub(1))
@ -181,6 +185,20 @@ impl EditorView {
statusline::render(&mut context, statusline_area, surface);
}
StatusLineRenderConfig::Single => {
// -1 for command line
if viewport.bottom() - 1 != view.area.bottom() {
let y = area.bottom();
let border_style = theme.get("ui.window");
for x in area.left()..area.right() {
surface[(x, y)]
.set_symbol(tui::symbols::line::HORIZONTAL)
.set_style(border_style);
}
}
}
};
}
pub fn render_rulers(
editor: &Editor,
@ -1470,6 +1488,23 @@ impl Component for EditorView {
self.render_view(cx.editor, doc, view, area, surface, is_focused);
}
if config.statusline.render == StatusLineRenderConfig::Single {
if let Some((view, is_focused)) =
cx.editor.tree.views().find(|&(_, is_focused)| is_focused)
{
let doc = cx.editor.document(view.doc).unwrap();
let mut context = statusline::RenderContext::new(
cx.editor,
doc,
view,
is_focused,
&self.spinners,
);
let statusline_area = area.clip_top(area.height.saturating_sub(2)).clip_bottom(1); // -1 from bottom to remove commandline
statusline::render(&mut context, statusline_area, surface);
}
}
if config.auto_info {
if let Some(mut info) = cx.editor.autoinfo.take() {
info.render(area, surface, cx);

@ -271,6 +271,7 @@ pub struct StatusLineConfig {
pub right: Vec<StatusLineElement>,
pub separator: String,
pub mode: ModeConfig,
pub render: StatusLineRenderConfig,
}
impl Default for StatusLineConfig {
@ -283,6 +284,7 @@ impl Default for StatusLineConfig {
right: vec![E::Diagnostics, E::Selections, E::Position, E::FileEncoding],
separator: String::from("│"),
mode: ModeConfig::default(),
render: StatusLineRenderConfig::PerView,
}
}
}
@ -305,6 +307,13 @@ impl Default for ModeConfig {
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum StatusLineRenderConfig {
Single,
PerView,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum StatusLineElement {

Loading…
Cancel
Save