Skip to content

Commit 92a1ea5

Browse files
committed
feat(console): make field colors more like #25
Signed-off-by: Eliza Weisman <[email protected]>
1 parent ac7d9f5 commit 92a1ea5

File tree

4 files changed

+63
-17
lines changed

4 files changed

+63
-17
lines changed

console/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ async fn main() -> color_eyre::Result<()> {
7272
_ => {}
7373
}
7474
},
75-
task_update = conn.next_update() => tasks.update_tasks(task_update),
75+
task_update = conn.next_update() => tasks.update_tasks(&view.styles, task_update),
7676
details_update = details_rx.recv() => {
7777
if let Some(details_update) = details_update {
7878
tasks.update_task_details(details_update);

console/src/tasks.rs

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ use std::{
1111
sync::Arc,
1212
time::{Duration, SystemTime},
1313
};
14-
use tui::text::Span;
14+
use tui::{
15+
style::{Color, Modifier},
16+
text::Span,
17+
};
1518

1619
#[derive(Default, Debug)]
1720
pub(crate) struct State {
@@ -122,7 +125,7 @@ impl State {
122125
self.new_tasks.drain(..)
123126
}
124127

125-
pub(crate) fn update_tasks(&mut self, update: proto::tasks::TaskUpdate) {
128+
pub(crate) fn update_tasks(&mut self, styles: &view::Styles, update: proto::tasks::TaskUpdate) {
126129
if let Some(now) = update.now {
127130
self.last_updated_at = Some(now.try_into().unwrap());
128131
}
@@ -160,21 +163,13 @@ impl State {
160163
return None;
161164
}
162165
};
163-
let fields = task
166+
let mut fields = task
164167
.fields
165168
.drain(..)
166169
.filter_map(|pb| Field::from_proto(pb, meta))
167170
.collect::<Vec<_>>();
168171

169-
let formatted_fields = fields.iter().fold(Vec::default(), |mut acc, f| {
170-
acc.push(vec![
171-
view::bold(f.name.to_string()),
172-
Span::from("="),
173-
Span::from(format!("{} ", f.value)),
174-
]);
175-
acc
176-
});
177-
172+
let formatted_fields = Field::make_formatted(styles, &mut fields);
178173
let id = task.id?.id;
179174
let stats = stats_update.remove(&id)?.into();
180175
let mut task = Task {
@@ -459,6 +454,9 @@ impl TryFrom<usize> for SortBy {
459454
// === impl Field ===
460455

461456
impl Field {
457+
const SPAWN_LOCATION: &'static str = "spawn.location";
458+
const NAME: &'static str = "name";
459+
462460
/// Converts a wire-format `Field` into an internal `Field` representation,
463461
/// using the provided `Metadata` for the task span that the field came
464462
/// from.
@@ -521,12 +519,59 @@ impl Field {
521519
// if the value is an empty string, just skip it.
522520
.ensure_nonempty()?;
523521

524-
if &*name == "spawn.location" {
522+
if &*name == Field::SPAWN_LOCATION {
525523
value = value.truncate_registry_path();
526524
}
527525

528526
Some(Self { name, value })
529527
}
528+
529+
fn make_formatted(styles: &view::Styles, fields: &mut Vec<Field>) -> Vec<Vec<Span<'static>>> {
530+
use std::cmp::Ordering;
531+
532+
let key_style = styles.fg(Color::LightBlue).add_modifier(Modifier::BOLD);
533+
let delim_style = styles.fg(Color::LightBlue).add_modifier(Modifier::DIM);
534+
let val_style = styles.fg(Color::Yellow);
535+
536+
fields.sort_unstable_by(|left, right| {
537+
if &*left.name == Field::NAME {
538+
return Ordering::Less;
539+
}
540+
541+
if &*right.name == Field::NAME {
542+
return Ordering::Greater;
543+
}
544+
545+
if &*left.name == Field::SPAWN_LOCATION {
546+
return Ordering::Greater;
547+
}
548+
549+
if &*right.name == Field::SPAWN_LOCATION {
550+
return Ordering::Less;
551+
}
552+
553+
left.name.cmp(&right.name)
554+
});
555+
556+
let mut formatted = Vec::with_capacity(fields.len());
557+
let mut fields = fields.iter();
558+
if let Some(field) = fields.next() {
559+
formatted.push(vec![
560+
Span::styled(field.name.to_string(), key_style),
561+
Span::styled("=", delim_style),
562+
Span::styled(field.value.to_string(), val_style),
563+
]);
564+
for field in fields {
565+
formatted.push(vec![
566+
Span::styled(", ", delim_style),
567+
Span::styled(field.name.to_string(), key_style),
568+
Span::styled("=", delim_style),
569+
Span::styled(field.value.to_string(), val_style),
570+
])
571+
}
572+
}
573+
formatted
574+
}
530575
}
531576

532577
// === impl FieldValue ===
@@ -586,6 +631,7 @@ impl TaskState {
586631
const COMPLETED_UTF8: &str = "\u{23F9}";
587632
match self {
588633
Self::Running => styles.if_utf8(RUNNING_UTF8, ">"),
634+
589635
Self::Idle => styles.if_utf8(IDLE_UTF8, ":"),
590636
Self::Completed => styles.if_utf8(COMPLETED_UTF8, "!"),
591637
}

console/src/view/task.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ impl TaskView {
108108
let attrs = Spans::from(vec![
109109
bold("ID: "),
110110
Span::raw(format!("{} ", task.id())),
111-
bold(task.state().render(styles)),
111+
Span::raw(task.state().render(styles)),
112112
]);
113113
let target = Spans::from(vec![bold("Target: "), Span::raw(task.target())]);
114114
let total = Spans::from(vec![bold("Total Time: "), dur(styles, task.total(now))]);

console/src/view/tasks.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ impl List {
108108
self.sorted_tasks.iter().filter_map(move |task| {
109109
let task = task.upgrade()?;
110110
let task = task.borrow();
111-
111+
let is_terminated = task.completed_for() > 0;
112112
let mut row = Row::new(vec![
113113
Cell::from(id_width.update_str(task.id().to_string())),
114114
Cell::from(task.state().render(styles)),
@@ -125,7 +125,7 @@ impl List {
125125
.collect::<Vec<_>>(),
126126
)),
127127
]);
128-
if task.completed_for() > 0 {
128+
if is_terminated {
129129
row = row.style(styles.terminated());
130130
}
131131
Some(row)

0 commit comments

Comments
 (0)