mirror of
https://github.com/zaphar/sheetsui.git
synced 2025-07-22 13:00:22 -04:00
commit
48aad97f5b
92
Cargo.lock
generated
92
Cargo.lock
generated
@ -511,41 +511,6 @@ dependencies = [
|
|||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "darling"
|
|
||||||
version = "0.20.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
|
|
||||||
dependencies = [
|
|
||||||
"darling_core",
|
|
||||||
"darling_macro",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "darling_core"
|
|
||||||
version = "0.20.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
|
|
||||||
dependencies = [
|
|
||||||
"fnv",
|
|
||||||
"ident_case",
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"strsim",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "darling_macro"
|
|
||||||
version = "0.20.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
|
|
||||||
dependencies = [
|
|
||||||
"darling_core",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deranged"
|
name = "deranged"
|
||||||
version = "0.3.11"
|
version = "0.3.11"
|
||||||
@ -555,29 +520,6 @@ dependencies = [
|
|||||||
"powerfmt",
|
"powerfmt",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "derive-getters"
|
|
||||||
version = "0.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "74ef43543e701c01ad77d3a5922755c6a1d71b22d942cb8042be4994b380caff"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "derive_setters"
|
|
||||||
version = "0.1.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4e8ef033054e131169b8f0f9a7af8f5533a9436fadf3c500ed547f730f07090d"
|
|
||||||
dependencies = [
|
|
||||||
"darling",
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "diff"
|
name = "diff"
|
||||||
version = "0.1.13"
|
version = "0.1.13"
|
||||||
@ -595,15 +537,6 @@ dependencies = [
|
|||||||
"subtle",
|
"subtle",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "document-features"
|
|
||||||
version = "0.2.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
|
|
||||||
dependencies = [
|
|
||||||
"litrs",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.13.0"
|
version = "1.13.0"
|
||||||
@ -846,12 +779,6 @@ dependencies = [
|
|||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ident_case"
|
|
||||||
version = "1.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.6.0"
|
version = "2.6.0"
|
||||||
@ -986,12 +913,6 @@ version = "0.4.14"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
|
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "litrs"
|
|
||||||
version = "0.4.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lock_api"
|
name = "lock_api"
|
||||||
version = "0.4.12"
|
version = "0.4.12"
|
||||||
@ -1594,7 +1515,6 @@ dependencies = [
|
|||||||
"slice-utils",
|
"slice-utils",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tui-markdown",
|
"tui-markdown",
|
||||||
"tui-popup",
|
|
||||||
"tui-prompts",
|
"tui-prompts",
|
||||||
"tui-textarea",
|
"tui-textarea",
|
||||||
]
|
]
|
||||||
@ -1855,18 +1775,6 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tui-popup"
|
|
||||||
version = "0.6.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d9ee3d08800c83ba0a2efaec44d225bcc3f885f30e2b520a17e2cd962b7da6ab"
|
|
||||||
dependencies = [
|
|
||||||
"derive-getters",
|
|
||||||
"derive_setters",
|
|
||||||
"document-features",
|
|
||||||
"ratatui",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tui-prompts"
|
name = "tui-prompts"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
@ -18,7 +18,6 @@ thiserror = "1.0.65"
|
|||||||
tui-textarea = "0.7.0"
|
tui-textarea = "0.7.0"
|
||||||
tui-prompts = "0.5.0"
|
tui-prompts = "0.5.0"
|
||||||
slice-utils = { git = "https://dev.zaphar.net/zaphar/slice-cursor-rs.git" }
|
slice-utils = { git = "https://dev.zaphar.net/zaphar/slice-cursor-rs.git" }
|
||||||
tui-popup = "0.6.0"
|
|
||||||
serde_json = "1.0.133"
|
serde_json = "1.0.133"
|
||||||
colorsys = "0.6.7"
|
colorsys = "0.6.7"
|
||||||
tui-markdown = { version = "0.3.1", features = [] }
|
tui-markdown = { version = "0.3.1", features = [] }
|
||||||
|
@ -77,6 +77,7 @@ pub struct AppState<'ws> {
|
|||||||
pub numeric_prefix: Vec<char>,
|
pub numeric_prefix: Vec<char>,
|
||||||
pub char_queue: Vec<char>,
|
pub char_queue: Vec<char>,
|
||||||
pub range_select: RangeSelection,
|
pub range_select: RangeSelection,
|
||||||
|
pub dialog_scroll: u16,
|
||||||
dirty: bool,
|
dirty: bool,
|
||||||
popup: Text<'ws>,
|
popup: Text<'ws>,
|
||||||
clipboard: Option<ClipboardContents>,
|
clipboard: Option<ClipboardContents>,
|
||||||
@ -91,6 +92,7 @@ impl<'ws> Default for AppState<'ws> {
|
|||||||
numeric_prefix: Default::default(),
|
numeric_prefix: Default::default(),
|
||||||
char_queue: Default::default(),
|
char_queue: Default::default(),
|
||||||
range_select: Default::default(),
|
range_select: Default::default(),
|
||||||
|
dialog_scroll: 0,
|
||||||
dirty: Default::default(),
|
dirty: Default::default(),
|
||||||
popup: Default::default(),
|
popup: Default::default(),
|
||||||
clipboard: Default::default(),
|
clipboard: Default::default(),
|
||||||
@ -332,6 +334,12 @@ impl<'ws> Workspace<'ws> {
|
|||||||
KeyCode::Char('h') if key.modifiers == KeyModifiers::ALT => {
|
KeyCode::Char('h') if key.modifiers == KeyModifiers::ALT => {
|
||||||
self.exit_dialog_mode()?
|
self.exit_dialog_mode()?
|
||||||
}
|
}
|
||||||
|
KeyCode::Char('j') | KeyCode::Down => {
|
||||||
|
self.state.dialog_scroll = self.state.dialog_scroll.saturating_add(1);
|
||||||
|
}
|
||||||
|
KeyCode::Char('k') | KeyCode::Up => {
|
||||||
|
self.state.dialog_scroll = self.state.dialog_scroll.saturating_sub(1);
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
// NOOP
|
// NOOP
|
||||||
}
|
}
|
||||||
|
56
src/ui/render/dialog.rs
Normal file
56
src/ui/render/dialog.rs
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
use ratatui::{
|
||||||
|
self,
|
||||||
|
layout::{Constraint, Layout, Rect},
|
||||||
|
style::{Color, Style, Stylize},
|
||||||
|
text::Text,
|
||||||
|
widgets::{Block, Paragraph, Widget, Wrap},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct Dialog<'w> {
|
||||||
|
content: Text<'w>,
|
||||||
|
title: &'w str,
|
||||||
|
scroll: (u16, u16),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'w> Dialog<'w> {
|
||||||
|
pub fn new(content: Text<'w>, title: &'w str) -> Self {
|
||||||
|
Self {
|
||||||
|
content,
|
||||||
|
title,
|
||||||
|
scroll: (0, 0),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn scroll(mut self, line: u16) -> Self {
|
||||||
|
self.scroll.0 = line;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'w> Widget for Dialog<'w> {
|
||||||
|
fn render(self, area: Rect, buf: &mut ratatui::prelude::Buffer)
|
||||||
|
where
|
||||||
|
Self: Sized,
|
||||||
|
{
|
||||||
|
// First find the center of the area.
|
||||||
|
let content_width = self.content.width();
|
||||||
|
let sidebar_width = (area.width - (content_width as u16) + 2) / 2;
|
||||||
|
let [_, dialog_area, _] = Layout::horizontal(vec![
|
||||||
|
Constraint::Length(sidebar_width),
|
||||||
|
Constraint::Fill(1),
|
||||||
|
Constraint::Length(sidebar_width),
|
||||||
|
])
|
||||||
|
.areas(area);
|
||||||
|
|
||||||
|
let dialog_block = Block::bordered()
|
||||||
|
.title_top(self.title)
|
||||||
|
.title_bottom("j,k or up,down to scroll")
|
||||||
|
.style(Style::default().on_black());
|
||||||
|
let dialog = Paragraph::new(self.content.clone())
|
||||||
|
.wrap(Wrap::default())
|
||||||
|
.scroll(self.scroll.clone())
|
||||||
|
.block(dialog_block)
|
||||||
|
.style(Style::default());
|
||||||
|
dialog.render(dialog_area, buf);
|
||||||
|
}
|
||||||
|
}
|
@ -5,12 +5,12 @@ use ratatui::{
|
|||||||
widgets::{Block, Paragraph, Tabs, Widget},
|
widgets::{Block, Paragraph, Tabs, Widget},
|
||||||
Frame,
|
Frame,
|
||||||
};
|
};
|
||||||
use tui_popup::Popup;
|
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
pub mod viewport;
|
pub mod viewport;
|
||||||
pub use viewport::Viewport;
|
pub use viewport::Viewport;
|
||||||
|
pub mod dialog;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test;
|
mod test;
|
||||||
@ -98,38 +98,40 @@ impl<'widget, 'ws: 'widget> Widget for &'widget mut Workspace<'ws> {
|
|||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
{
|
{
|
||||||
let outer_block = Block::bordered()
|
|
||||||
.title(Line::from(
|
|
||||||
self.name
|
|
||||||
.file_name()
|
|
||||||
.map(|p| p.to_string_lossy().to_string())
|
|
||||||
.unwrap_or_else(|| String::from("Unknown")),
|
|
||||||
))
|
|
||||||
.title_bottom(match self.state.modality() {
|
|
||||||
Modality::Navigate => "navigate",
|
|
||||||
Modality::CellEdit => "edit",
|
|
||||||
Modality::Command => "command",
|
|
||||||
Modality::Dialog => "",
|
|
||||||
Modality::RangeSelect => "range-copy",
|
|
||||||
})
|
|
||||||
.title_bottom(
|
|
||||||
Line::from(format!(
|
|
||||||
"{},{}",
|
|
||||||
self.book.location.row, self.book.location.col
|
|
||||||
))
|
|
||||||
.right_aligned(),
|
|
||||||
);
|
|
||||||
|
|
||||||
for (rect, f) in self.get_render_parts(area.clone()) {
|
|
||||||
f(rect, buf, self);
|
|
||||||
}
|
|
||||||
|
|
||||||
outer_block.render(area, buf);
|
|
||||||
|
|
||||||
if self.state.modality() == &Modality::Dialog {
|
if self.state.modality() == &Modality::Dialog {
|
||||||
|
// Use a popup here.
|
||||||
let lines = Text::from_iter(self.state.popup.iter().cloned());
|
let lines = Text::from_iter(self.state.popup.iter().cloned());
|
||||||
let popup = Popup::new(lines);
|
let popup = dialog::Dialog::new(lines, "Help").scroll(self.state.dialog_scroll);
|
||||||
|
//let popup = Paragraph::new(lines);
|
||||||
popup.render(area, buf);
|
popup.render(area, buf);
|
||||||
|
} else {
|
||||||
|
let outer_block = Block::bordered()
|
||||||
|
.title(Line::from(
|
||||||
|
self.name
|
||||||
|
.file_name()
|
||||||
|
.map(|p| p.to_string_lossy().to_string())
|
||||||
|
.unwrap_or_else(|| String::from("Unknown")),
|
||||||
|
))
|
||||||
|
.title_bottom(match self.state.modality() {
|
||||||
|
Modality::Navigate => "navigate",
|
||||||
|
Modality::CellEdit => "edit",
|
||||||
|
Modality::Command => "command",
|
||||||
|
Modality::Dialog => "",
|
||||||
|
Modality::RangeSelect => "range-copy",
|
||||||
|
})
|
||||||
|
.title_bottom(
|
||||||
|
Line::from(format!(
|
||||||
|
"{},{}",
|
||||||
|
self.book.location.row, self.book.location.col
|
||||||
|
))
|
||||||
|
.right_aligned(),
|
||||||
|
);
|
||||||
|
|
||||||
|
for (rect, f) in self.get_render_parts(area.clone()) {
|
||||||
|
f(rect, buf, self);
|
||||||
|
}
|
||||||
|
|
||||||
|
outer_block.render(area, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user