mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
naked mode
This commit is contained in:
parent
74a07d0e75
commit
0bd8df1e57
6 changed files with 101 additions and 93 deletions
|
|
@ -3,6 +3,7 @@ use crate::*;
|
||||||
mod engine_focus; pub(crate) use engine_focus::*;
|
mod engine_focus; pub(crate) use engine_focus::*;
|
||||||
mod engine_input; pub(crate) use engine_input::*;
|
mod engine_input; pub(crate) use engine_input::*;
|
||||||
mod engine_style; pub(crate) use engine_style::*;
|
mod engine_style; pub(crate) use engine_style::*;
|
||||||
|
mod engine_theme; pub(crate) use engine_theme::*;
|
||||||
mod engine_output; pub(crate) use engine_output::*;
|
mod engine_output; pub(crate) use engine_output::*;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -116,35 +116,33 @@ render!(|self: TransportField<'a>|{
|
||||||
});
|
});
|
||||||
|
|
||||||
render!(|self: TransportView|{
|
render!(|self: TransportView|{
|
||||||
let bg = TuiTheme::border_bg();
|
let border_style = Style::default()
|
||||||
let border_style = Style::default().bg(bg).fg(TuiTheme::border_fg(false));
|
.bg(TuiTheme::bg())
|
||||||
|
.fg(TuiTheme::border_fg(true));
|
||||||
lay!(move|add|{
|
lay!(move|add|{
|
||||||
if self.focused {
|
if self.focused {
|
||||||
add(&Tui::fill_x(Lozenge(border_style)))?;
|
add(&Tui::fill_x(Lozenge(border_style)))?;
|
||||||
}
|
}
|
||||||
add(&Tui::outset_x(1, row!([
|
add(&Tui::outset_x(2, row!([
|
||||||
|
col!(|add|{
|
||||||
|
if self.started {
|
||||||
|
add(&col!([Tui::fg(Color::Rgb(0, 255, 0), "▶ PLAYING "), ""]))
|
||||||
|
} else {
|
||||||
|
add(&col!(["", Tui::fg(Color::Rgb(255, 128, 0), "⏹ STOPPED ")]))
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
" ",
|
||||||
row!([
|
row!([
|
||||||
TransportField("SR ", self.sr.as_str()),
|
TransportField("Beat", "00X+0/0B+00/00P"),
|
||||||
" ",
|
" ",
|
||||||
TransportField("BPM ", self.bpm.as_str()),
|
TransportField("BPM ", self.bpm.as_str()),
|
||||||
" ",
|
" ",
|
||||||
TransportField("PPQ ", self.ppq.as_str()),
|
TransportField("Second", self.current_second.as_str()),
|
||||||
|
" ",
|
||||||
|
TransportField("SR ", self.sr.as_str()),
|
||||||
|
" ",
|
||||||
|
TransportField("Sample", self.current_sample.as_str()),
|
||||||
]),
|
]),
|
||||||
lay!(|add|{
|
|
||||||
if self.started {
|
|
||||||
add(&row!([
|
|
||||||
col!(["", Tui::fg(Color::Rgb(0, 255, 0), "▶ PLAYING ")]),
|
|
||||||
" ",
|
|
||||||
TransportField("Beat", "00X+0/0B+00/00P"),
|
|
||||||
" ",
|
|
||||||
TransportField("Second", self.current_second.as_str()),
|
|
||||||
" ",
|
|
||||||
TransportField("Sample", self.current_sample.as_str()),
|
|
||||||
]))
|
|
||||||
} else {
|
|
||||||
add(&col!([Tui::fg(Color::Rgb(255, 128, 0), "⏹ STOPPED "), ""]))
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
])))
|
])))
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -83,35 +83,6 @@ impl<S: BorderStyle> Render<Tui> for Border<S> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TuiTheme;
|
|
||||||
|
|
||||||
impl TuiTheme {
|
|
||||||
pub fn border_bg () -> Color {
|
|
||||||
Color::Rgb(40, 50, 30)
|
|
||||||
}
|
|
||||||
pub fn border_fg (focused: bool) -> Color {
|
|
||||||
if focused { Color::Rgb(100, 110, 40) } else { Color::Rgb(70, 80, 50) }
|
|
||||||
}
|
|
||||||
pub fn title_fg (focused: bool) -> Color {
|
|
||||||
if focused { Color::Rgb(150, 160, 90) } else { Color::Rgb(120, 130, 100) }
|
|
||||||
}
|
|
||||||
pub fn separator_fg (_: bool) -> Color {
|
|
||||||
Color::Rgb(0, 0, 0)
|
|
||||||
}
|
|
||||||
pub const fn hotkey_fg () -> Color {
|
|
||||||
Color::Rgb(255, 255, 0)
|
|
||||||
}
|
|
||||||
pub fn mode_bg () -> Color {
|
|
||||||
Color::Rgb(150, 160, 90)
|
|
||||||
}
|
|
||||||
pub fn mode_fg () -> Color {
|
|
||||||
Color::Rgb(255, 255, 255)
|
|
||||||
}
|
|
||||||
pub fn status_bar_bg () -> Color {
|
|
||||||
Color::Rgb(28, 35, 25)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Styled<T: Render<Tui>>(pub Option<Style>, pub T);
|
pub struct Styled<T: Render<Tui>>(pub Option<Style>, pub T);
|
||||||
|
|
||||||
impl Render<Tui> for Styled<&str> {
|
impl Render<Tui> for Styled<&str> {
|
||||||
|
|
|
||||||
33
crates/tek/src/tui/engine_theme.rs
Normal file
33
crates/tek/src/tui/engine_theme.rs
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
|
pub struct TuiTheme;
|
||||||
|
|
||||||
|
impl TuiTheme {
|
||||||
|
pub fn bg () -> Color {
|
||||||
|
Color::Rgb(28, 35, 25)
|
||||||
|
}
|
||||||
|
pub fn border_bg () -> Color {
|
||||||
|
Color::Rgb(40, 50, 30)
|
||||||
|
}
|
||||||
|
pub fn border_fg (focused: bool) -> Color {
|
||||||
|
if focused { Color::Rgb(100, 110, 40) } else { Color::Rgb(70, 80, 50) }
|
||||||
|
}
|
||||||
|
pub fn title_fg (focused: bool) -> Color {
|
||||||
|
if focused { Color::Rgb(150, 160, 90) } else { Color::Rgb(120, 130, 100) }
|
||||||
|
}
|
||||||
|
pub fn separator_fg (_: bool) -> Color {
|
||||||
|
Color::Rgb(0, 0, 0)
|
||||||
|
}
|
||||||
|
pub const fn hotkey_fg () -> Color {
|
||||||
|
Color::Rgb(255, 255, 0)
|
||||||
|
}
|
||||||
|
pub fn mode_bg () -> Color {
|
||||||
|
Color::Rgb(150, 160, 90)
|
||||||
|
}
|
||||||
|
pub fn mode_fg () -> Color {
|
||||||
|
Color::Rgb(255, 255, 255)
|
||||||
|
}
|
||||||
|
pub fn status_bar_bg () -> Color {
|
||||||
|
Color::Rgb(28, 35, 25)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -126,48 +126,50 @@ render!(|self: PhraseListView<'a>|{
|
||||||
let title_color = if *focused {Color::Rgb(150, 160, 90)} else {Color::Rgb(120, 130, 100)};
|
let title_color = if *focused {Color::Rgb(150, 160, 90)} else {Color::Rgb(120, 130, 100)};
|
||||||
let upper_left = format!("[{}] {title}", if *entered {"■"} else {" "});
|
let upper_left = format!("[{}] {title}", if *entered {"■"} else {" "});
|
||||||
let upper_right = format!("({})", phrases.len());
|
let upper_right = format!("({})", phrases.len());
|
||||||
lay!([
|
lay!(move|add|{
|
||||||
Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color))
|
if *focused {
|
||||||
.wrap(Tui::bg(Color::Rgb(28, 35, 25), Tui::fill_xy(col!(move|add|match mode {
|
add(&Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color)))?;
|
||||||
Some(PhrasesMode::Import(_, ref browser)) => {
|
}
|
||||||
add(browser)
|
add(&Tui::inset_xy(1, 1, Tui::fill_xy(col!(move|add|match mode {
|
||||||
},
|
Some(PhrasesMode::Import(_, ref browser)) => {
|
||||||
Some(PhrasesMode::Export(_, ref browser)) => {
|
add(browser)
|
||||||
add(browser)
|
},
|
||||||
},
|
Some(PhrasesMode::Export(_, ref browser)) => {
|
||||||
_ => {
|
add(browser)
|
||||||
for (i, phrase) in phrases.iter().enumerate() {
|
},
|
||||||
add(&lay!(|add|{
|
_ => {
|
||||||
let Phrase { ref name, color, length, .. } = *phrase.read().unwrap();
|
for (i, phrase) in phrases.iter().enumerate() {
|
||||||
let mut length = PhraseLength::new(length, None);
|
add(&lay!(|add|{
|
||||||
if let Some(PhrasesMode::Length(phrase, new_length, focus)) = mode {
|
let Phrase { ref name, color, length, .. } = *phrase.read().unwrap();
|
||||||
if *focused && i == *phrase {
|
let mut length = PhraseLength::new(length, None);
|
||||||
length.pulses = *new_length;
|
if let Some(PhrasesMode::Length(phrase, new_length, focus)) = mode {
|
||||||
length.focus = Some(*focus);
|
if *focused && i == *phrase {
|
||||||
}
|
length.pulses = *new_length;
|
||||||
|
length.focus = Some(*focus);
|
||||||
}
|
}
|
||||||
let length = Tui::fill_x(Tui::at_e(length));
|
}
|
||||||
let row1 = Tui::fill_x(lay!([Tui::fill_x(Tui::at_w(format!(" {i}"))), length]));
|
let length = Tui::fill_x(Tui::at_e(length));
|
||||||
let mut row2 = format!(" {name}");
|
let row1 = Tui::fill_x(lay!([Tui::fill_x(Tui::at_w(format!(" {i}"))), length]));
|
||||||
if let Some(PhrasesMode::Rename(phrase, _)) = mode {
|
let mut row2 = format!(" {name}");
|
||||||
if *focused && i == *phrase {
|
if let Some(PhrasesMode::Rename(phrase, _)) = mode {
|
||||||
row2 = format!("{row2}▄");
|
if *focused && i == *phrase {
|
||||||
}
|
row2 = format!("{row2}▄");
|
||||||
};
|
|
||||||
let row2 = Tui::bold(true, row2);
|
|
||||||
add(&Tui::bg(color.base.rgb, Tui::fill_x(col!([row1, row2]))))?;
|
|
||||||
if *entered && i == *index {
|
|
||||||
add(&CORNERS)?;
|
|
||||||
}
|
}
|
||||||
Ok(())
|
};
|
||||||
}))?;
|
let row2 = Tui::bold(true, row2);
|
||||||
}
|
add(&Tui::bg(color.base.rgb, Tui::fill_x(col!([row1, row2]))))?;
|
||||||
Ok(())
|
if *entered && i == *index {
|
||||||
|
add(&CORNERS)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}))?;
|
||||||
}
|
}
|
||||||
})))),
|
Ok(())
|
||||||
Tui::fill_xy(Tui::at_nw(Tui::push_x(1, Tui::fg(title_color, upper_left.to_string())))),
|
}
|
||||||
Tui::fill_xy(Tui::at_ne(Tui::pull_x(1, Tui::fg(title_color, upper_right.to_string())))),
|
}))))?;
|
||||||
])
|
add(&Tui::fill_xy(Tui::at_nw(Tui::push_x(1, Tui::fg(title_color, upper_left.to_string())))))?;
|
||||||
|
add(&Tui::fill_xy(Tui::at_ne(Tui::pull_x(1, Tui::fg(title_color, upper_right.to_string())))))
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Debug)]
|
#[derive(Clone, PartialEq, Debug)]
|
||||||
|
|
|
||||||
|
|
@ -40,8 +40,11 @@ render!(|self: PhraseSelector<'a>|{
|
||||||
let border_color = if *focused {Color::Rgb(100, 110, 40)} else {Color::Rgb(70, 80, 50)};
|
let border_color = if *focused {Color::Rgb(100, 110, 40)} else {Color::Rgb(70, 80, 50)};
|
||||||
let border = Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color));
|
let border = Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color));
|
||||||
let title_color = if *focused {Color::Rgb(150, 160, 90)} else {Color::Rgb(120, 130, 100)};
|
let title_color = if *focused {Color::Rgb(150, 160, 90)} else {Color::Rgb(120, 130, 100)};
|
||||||
Tui::fixed_y(4, lay!([
|
Tui::fixed_y(3, lay!(move|add|{
|
||||||
border.wrap(Tui::bg(Color::Rgb(28, 35, 25), Tui::fill_xy(Layers::new(move|add|{
|
if *focused {
|
||||||
|
add(&Tui::fill_x(border))?;
|
||||||
|
}
|
||||||
|
add(&Tui::fill_xy(Layers::new(move|add|{
|
||||||
if let Some((instant, Some(phrase))) = phrase {
|
if let Some((instant, Some(phrase))) = phrase {
|
||||||
let Phrase { ref name, color, length, .. } = *phrase.read().unwrap();
|
let Phrase { ref name, color, length, .. } = *phrase.read().unwrap();
|
||||||
let length = PhraseLength::new(length, None);
|
let length = PhraseLength::new(length, None);
|
||||||
|
|
@ -52,7 +55,7 @@ render!(|self: PhraseSelector<'a>|{
|
||||||
add(&Tui::bg(color.base.rgb, Tui::fill_x(col!([row1, row2]))))?;
|
add(&Tui::bg(color.base.rgb, Tui::fill_x(col!([row1, row2]))))?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
})))),
|
})))?;
|
||||||
Tui::fill_xy(Tui::at_nw(Tui::push_x(1, Tui::fg(title_color, *title)))),
|
add(&Tui::fill_xy(Tui::at_nw(Tui::push_x(1, Tui::fg(title_color, *title)))))
|
||||||
]))
|
}))
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue