mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
wip12 (0e)
This commit is contained in:
parent
83e64a3a10
commit
f5128829d6
12 changed files with 55 additions and 53 deletions
|
|
@ -33,15 +33,15 @@ winit = { version = "0.30.4", features = [ "x11" ] }
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "tek_arranger"
|
name = "tek_arranger"
|
||||||
path = "src/cli_arranger.rs"
|
path = "src/cli/cli_arranger.rs"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "tek_sequencer"
|
name = "tek_sequencer"
|
||||||
path = "src/cli_sequencer.rs"
|
path = "src/cli/cli_sequencer.rs"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "tek_transport"
|
name = "tek_transport"
|
||||||
path = "src/cli_transport.rs"
|
path = "src/cli/cli_transport.rs"
|
||||||
|
|
||||||
#[[bin]]
|
#[[bin]]
|
||||||
#name = "tek_mixer"
|
#name = "tek_mixer"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
mod phrase; pub(crate) use phrase::*;
|
mod phrase; pub(crate) use phrase::*;
|
||||||
mod jack; pub(crate) use jack::*;
|
mod jack; pub(crate) use self::jack::*;
|
||||||
mod clip; pub(crate) use clip::*;
|
mod clip; pub(crate) use clip::*;
|
||||||
mod color; pub(crate) use color::*;
|
mod color; pub(crate) use color::*;
|
||||||
mod clock; pub(crate) use clock::*;
|
mod clock; pub(crate) use clock::*;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::*;
|
include!("../lib.rs");
|
||||||
|
|
||||||
pub fn main () -> Usually<()> {
|
pub fn main () -> Usually<()> {
|
||||||
ArrangerCli::parse().run()
|
ArrangerCli::parse().run()
|
||||||
|
|
@ -22,7 +22,7 @@ impl ArrangerCli {
|
||||||
/// Run the arranger TUI from CLI arguments.
|
/// Run the arranger TUI from CLI arguments.
|
||||||
fn run (&self) -> Usually<()> {
|
fn run (&self) -> Usually<()> {
|
||||||
Tui::run(JackClient::new("tek_arranger")?.activate_with(|jack|{
|
Tui::run(JackClient::new("tek_arranger")?.activate_with(|jack|{
|
||||||
let mut app = tek_tui::ArrangerTui::try_from(jack)?;
|
let mut app = ArrangerTui::try_from(jack)?;
|
||||||
if let Some(name) = self.name.as_ref() {
|
if let Some(name) = self.name.as_ref() {
|
||||||
*app.name.write().unwrap() = name.clone();
|
*app.name.write().unwrap() = name.clone();
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::*;
|
include!("../lib.rs");
|
||||||
|
|
||||||
pub fn main () -> Usually<()> {
|
pub fn main () -> Usually<()> {
|
||||||
SequencerCli::parse().run()
|
SequencerCli::parse().run()
|
||||||
|
|
@ -20,7 +20,7 @@ pub struct SequencerCli {
|
||||||
impl SequencerCli {
|
impl SequencerCli {
|
||||||
fn run (&self) -> Usually<()> {
|
fn run (&self) -> Usually<()> {
|
||||||
Tui::run(JackClient::new("tek_sequencer")?.activate_with(|jack|{
|
Tui::run(JackClient::new("tek_sequencer")?.activate_with(|jack|{
|
||||||
let mut app = tek_tui::SequencerTui::try_from(jack)?;
|
let mut app = SequencerTui::try_from(jack)?;
|
||||||
// TODO: create from arguments
|
// TODO: create from arguments
|
||||||
let midi_in = app.jack.read().unwrap().register_port("in", MidiIn::default())?;
|
let midi_in = app.jack.read().unwrap().register_port("in", MidiIn::default())?;
|
||||||
app.player.midi_ins.push(midi_in);
|
app.player.midi_ins.push(midi_in);
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
use crate::*;
|
include!("../lib.rs");
|
||||||
|
|
||||||
/// Application entrypoint.
|
/// Application entrypoint.
|
||||||
pub fn main () -> Usually<()> {
|
pub fn main () -> Usually<()> {
|
||||||
Tui::run(JackClient::new("tek_transport")?.activate_with(|jack|{
|
Tui::run(JackClient::new("tek_transport")?.activate_with(|jack|{
|
||||||
tek_tui::TransportTui::try_from(jack)
|
TransportTui::try_from(jack)
|
||||||
})?)?;
|
})?)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
@ -39,7 +39,7 @@ pub(crate) use palette::{
|
||||||
okhsl::*
|
okhsl::*
|
||||||
};
|
};
|
||||||
|
|
||||||
pub(crate) use clap;
|
pub(crate) use clap::{self, Parser};
|
||||||
|
|
||||||
pub(crate) use crossterm::{ExecutableCommand};
|
pub(crate) use crossterm::{ExecutableCommand};
|
||||||
pub(crate) use crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen, enable_raw_mode, disable_raw_mode};
|
pub(crate) use crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen, enable_raw_mode, disable_raw_mode};
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ impl Tui {
|
||||||
let engine = Self {
|
let engine = Self {
|
||||||
exited: Arc::new(AtomicBool::new(false)),
|
exited: Arc::new(AtomicBool::new(false)),
|
||||||
buffer: Buffer::empty(area),
|
buffer: Buffer::empty(area),
|
||||||
area: area.xywh(),
|
area: [area.x, area.y, area.width, area.height],
|
||||||
backend,
|
backend,
|
||||||
};
|
};
|
||||||
let engine = Arc::new(RwLock::new(engine));
|
let engine = Arc::new(RwLock::new(engine));
|
||||||
|
|
@ -167,7 +167,10 @@ impl Tui {
|
||||||
buffer.resize(size);
|
buffer.resize(size);
|
||||||
buffer.reset();
|
buffer.reset();
|
||||||
}
|
}
|
||||||
let mut output = TuiOutput { buffer, area: size.xywh() };
|
let mut output = TuiOutput {
|
||||||
|
buffer,
|
||||||
|
area: [size.x, size.y, size.width, size.height]
|
||||||
|
};
|
||||||
state.render(&mut output).expect("render failed");
|
state.render(&mut output).expect("render failed");
|
||||||
buffer = engine.write().unwrap().flip(output.buffer, size);
|
buffer = engine.write().unwrap().flip(output.buffer, size);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
pub struct TuiInput {
|
pub struct TuiInput {
|
||||||
exited: Arc<AtomicBool>,
|
pub(crate) exited: Arc<AtomicBool>,
|
||||||
event: TuiEvent,
|
pub(crate) event: TuiEvent,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
|
||||||
|
|
@ -25,50 +25,49 @@ impl<'a, T: HasPhraseList> From<&'a T> for PhraseListView<'a> {
|
||||||
// TODO: Display phrases always in order of appearance
|
// TODO: Display phrases always in order of appearance
|
||||||
render!(|self: PhraseListView<'a>|{
|
render!(|self: PhraseListView<'a>|{
|
||||||
let Self { title, focused, entered, phrases, index, mode } = self;
|
let Self { title, focused, entered, phrases, index, mode } = self;
|
||||||
let content = col!(|add|match mode {
|
|
||||||
Some(PhrasesMode::Import(_, ref 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();
|
|
||||||
let mut length = PhraseLength::new(length, None);
|
|
||||||
if let Some(PhrasesMode::Length(phrase, new_length, focus)) = mode {
|
|
||||||
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 mut row2 = format!(" {name}");
|
|
||||||
if let Some(PhrasesMode::Rename(phrase, _)) = mode {
|
|
||||||
if *focused && i == *phrase {
|
|
||||||
row2 = format!("{row2}▄");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let row2 = Tui::bold(true, row2);
|
|
||||||
add(&Tui::bg(color.base.rgb, Tui::fill_x(Tui::to_south(row1, row2))))?;
|
|
||||||
if *entered && i == *index {
|
|
||||||
add(&CORNERS)?;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}))?;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
});
|
|
||||||
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 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!([
|
||||||
Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color))
|
Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color))
|
||||||
.wrap(Tui::bg(Color::Rgb(28, 35, 25), Tui::fill_xy(content))),
|
.wrap(Tui::bg(Color::Rgb(28, 35, 25), Tui::fill_xy(col!(move|add|match mode {
|
||||||
|
Some(PhrasesMode::Import(_, ref 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();
|
||||||
|
let mut length = PhraseLength::new(length, None);
|
||||||
|
if let Some(PhrasesMode::Length(phrase, new_length, focus)) = mode {
|
||||||
|
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 mut row2 = format!(" {name}");
|
||||||
|
if let Some(PhrasesMode::Rename(phrase, _)) = mode {
|
||||||
|
if *focused && i == *phrase {
|
||||||
|
row2 = format!("{row2}▄");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let row2 = Tui::bold(true, row2);
|
||||||
|
add(&Tui::bg(color.base.rgb, Tui::fill_x(Tui::to_south(row1, row2))))?;
|
||||||
|
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_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())))),
|
Tui::fill_xy(Tui::at_ne(Tui::pull_x(1, Tui::fg(title_color, upper_right.to_string())))),
|
||||||
])
|
])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue