tui: Change content handling for labels
Signed-off-by: Erik Kundt <erik@zirkular.io>
This commit is contained in:
parent
708e202dcc
commit
ceb1f8e700
|
|
@ -4,9 +4,6 @@ pub mod state;
|
||||||
pub mod theme;
|
pub mod theme;
|
||||||
pub mod widget;
|
pub mod widget;
|
||||||
|
|
||||||
use tuirealm::props::Attribute;
|
|
||||||
use tuirealm::{MockComponent, StateValue};
|
|
||||||
|
|
||||||
use components::container::{GlobalListener, LabeledContainer, Tabs};
|
use components::container::{GlobalListener, LabeledContainer, Tabs};
|
||||||
use components::context::{Shortcut, Shortcuts};
|
use components::context::{Shortcut, Shortcuts};
|
||||||
use components::label::Label;
|
use components::label::Label;
|
||||||
|
|
@ -14,6 +11,9 @@ use components::list::{Property, PropertyList};
|
||||||
use components::workspace::Workspaces;
|
use components::workspace::Workspaces;
|
||||||
use widget::Widget;
|
use widget::Widget;
|
||||||
|
|
||||||
|
use tuirealm::props::{AttrValue, Attribute};
|
||||||
|
use tuirealm::MockComponent;
|
||||||
|
|
||||||
pub fn global_listener() -> Widget<GlobalListener> {
|
pub fn global_listener() -> Widget<GlobalListener> {
|
||||||
Widget::new(GlobalListener::default())
|
Widget::new(GlobalListener::default())
|
||||||
}
|
}
|
||||||
|
|
@ -21,9 +21,11 @@ pub fn global_listener() -> Widget<GlobalListener> {
|
||||||
pub fn label(content: &str) -> Widget<Label> {
|
pub fn label(content: &str) -> Widget<Label> {
|
||||||
// TODO: Remove when size constraints are implemented
|
// TODO: Remove when size constraints are implemented
|
||||||
let width = content.chars().count() as u16;
|
let width = content.chars().count() as u16;
|
||||||
let label = Label::new(StateValue::String(content.to_owned()));
|
|
||||||
|
|
||||||
Widget::new(label).height(1).width(width)
|
Widget::new(Label::default())
|
||||||
|
.content(AttrValue::String(content.to_string()))
|
||||||
|
.height(1)
|
||||||
|
.width(width)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn labeled_container(
|
pub fn labeled_container(
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,9 @@ impl WidgetComponent for Header {
|
||||||
let display = properties
|
let display = properties
|
||||||
.get_or(Attribute::Display, AttrValue::Flag(true))
|
.get_or(Attribute::Display, AttrValue::Flag(true))
|
||||||
.unwrap_flag();
|
.unwrap_flag();
|
||||||
let spacer = Widget::new(Label::new(StateValue::String(String::default()))).to_boxed();
|
let spacer = Widget::new(Label::default())
|
||||||
|
.content(AttrValue::String(String::default()))
|
||||||
|
.to_boxed();
|
||||||
|
|
||||||
if display {
|
if display {
|
||||||
let labels: Vec<Box<dyn MockComponent>> = vec![self.content.clone().to_boxed(), spacer];
|
let labels: Vec<Box<dyn MockComponent>> = vec![self.content.clone().to_boxed(), spacer];
|
||||||
|
|
|
||||||
|
|
@ -2,27 +2,22 @@ use tuirealm::command::{Cmd, CmdResult};
|
||||||
use tuirealm::props::{AttrValue, Attribute, Color, Props, Style};
|
use tuirealm::props::{AttrValue, Attribute, Color, Props, Style};
|
||||||
use tuirealm::tui::layout::Rect;
|
use tuirealm::tui::layout::Rect;
|
||||||
use tuirealm::tui::text::Span;
|
use tuirealm::tui::text::Span;
|
||||||
use tuirealm::{Frame, MockComponent, State, StateValue};
|
use tuirealm::{Frame, MockComponent, State};
|
||||||
|
|
||||||
use crate::ui::widget::{Widget, WidgetComponent};
|
use crate::ui::widget::{Widget, WidgetComponent};
|
||||||
|
|
||||||
/// A label that can be styled using a foreground color and text modifiers.
|
/// A label that can be styled using a foreground color and text modifiers.
|
||||||
/// Its height is fixed, its width depends on the length of the text it displays.
|
/// Its height is fixed, its width depends on the length of the text it displays.
|
||||||
#[derive(Clone)]
|
#[derive(Clone, Default)]
|
||||||
pub struct Label {
|
pub struct Label;
|
||||||
content: StateValue,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Label {
|
|
||||||
pub fn new(content: StateValue) -> Self {
|
|
||||||
Self { content }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl WidgetComponent for Label {
|
impl WidgetComponent for Label {
|
||||||
fn view(&mut self, properties: &Props, frame: &mut Frame, area: Rect) {
|
fn view(&mut self, properties: &Props, frame: &mut Frame, area: Rect) {
|
||||||
use tui_realm_stdlib::Label;
|
use tui_realm_stdlib::Label;
|
||||||
|
|
||||||
|
let content = properties
|
||||||
|
.get_or(Attribute::Content, AttrValue::String(String::default()))
|
||||||
|
.unwrap_string();
|
||||||
let display = properties
|
let display = properties
|
||||||
.get_or(Attribute::Display, AttrValue::Flag(true))
|
.get_or(Attribute::Display, AttrValue::Flag(true))
|
||||||
.unwrap_flag();
|
.unwrap_flag();
|
||||||
|
|
@ -39,11 +34,11 @@ impl WidgetComponent for Label {
|
||||||
.foreground(foreground)
|
.foreground(foreground)
|
||||||
.background(background)
|
.background(background)
|
||||||
.modifiers(modifiers.unwrap_text_modifiers())
|
.modifiers(modifiers.unwrap_text_modifiers())
|
||||||
.text(self.content.clone().unwrap_string()),
|
.text(content),
|
||||||
None => Label::default()
|
None => Label::default()
|
||||||
.foreground(foreground)
|
.foreground(foreground)
|
||||||
.background(background)
|
.background(background)
|
||||||
.text(self.content.clone().unwrap_string()),
|
.text(content),
|
||||||
};
|
};
|
||||||
|
|
||||||
label.view(frame, area);
|
label.view(frame, area);
|
||||||
|
|
@ -51,7 +46,7 @@ impl WidgetComponent for Label {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn state(&self) -> State {
|
fn state(&self) -> State {
|
||||||
State::One(self.content.clone())
|
State::None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn perform(&mut self, _cmd: Cmd) -> CmdResult {
|
fn perform(&mut self, _cmd: Cmd) -> CmdResult {
|
||||||
|
|
@ -61,6 +56,11 @@ impl WidgetComponent for Label {
|
||||||
|
|
||||||
impl From<&Widget<Label>> for Span<'_> {
|
impl From<&Widget<Label>> for Span<'_> {
|
||||||
fn from(label: &Widget<Label>) -> Self {
|
fn from(label: &Widget<Label>) -> Self {
|
||||||
Span::styled(label.content.clone().unwrap_string(), Style::default())
|
let content = label
|
||||||
|
.query(Attribute::Content)
|
||||||
|
.unwrap_or(AttrValue::String(String::default()))
|
||||||
|
.unwrap_string();
|
||||||
|
|
||||||
|
Span::styled(content, Style::default())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,11 @@ impl<T: WidgetComponent> Widget<T> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn content(mut self, content: AttrValue) -> Self {
|
||||||
|
self.attr(Attribute::Content, content);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn to_boxed(self) -> Box<Self> {
|
pub fn to_boxed(self) -> Box<Self> {
|
||||||
Box::new(self)
|
Box::new(self)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue