Skip to content

Commit 43a64e3

Browse files
transparent colors
1 parent 37772e9 commit 43a64e3

15 files changed

+416
-363
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ license = "MIT"
9292
name = "boxmux"
9393
readme = "README.md"
9494
repository = "https://github.com/jowharshamshiri/boxmux"
95-
version = "0.225.268382"
95+
version = "0.226.272308"
9696

9797
[package.metadata.deb]
9898
assets = [["target/release/boxmux", "usr/bin/", "755"], ["README.md", "usr/share/doc/boxmux/README", "644"], ["examples/*", "usr/share/doc/boxmux/examples/", "644"]]

src/components/box_renderer.rs

Lines changed: 49 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use crate::components::{
33
ChartComponent, ChartConfig, ChartType
44
};
55
use crate::draw_utils::{
6-
get_fg_color, get_bg_color, fill_muxbox, draw_horizontal_line, draw_vertical_line,
6+
get_fg_color_transparent, get_bg_color_transparent,
7+
should_draw_color, fill_muxbox, draw_horizontal_line, draw_vertical_line,
78
print_with_color_and_background_at, content_size, draw_horizontal_line_with_tabs
89
};
910
use crate::model::common::{Cell, ContentStreamTrait, ChoicesStreamTrait, StreamType};
@@ -89,38 +90,38 @@ impl<'a> BoxRenderer<'a> {
8990

9091
// Calculate all colors and properties (same logic as draw_muxbox)
9192
let muxbox_parent = app_graph.get_parent(&layout.id, &self.muxbox.id);
92-
let bg_color = self.muxbox.calc_bg_color(app_context, app_graph).to_string();
93+
let bg_color = self.muxbox.calc_bg_color(app_context, app_graph);
9394
let parent_bg_color = if muxbox_parent.is_none() {
94-
layout.bg_color.clone().unwrap_or("black".to_string())
95+
layout.bg_color.clone().map(|s| s.to_string())
9596
} else {
96-
muxbox_parent.unwrap().calc_bg_color(app_context, app_graph).to_string()
97+
muxbox_parent.unwrap().calc_bg_color(app_context, app_graph).map(|s| s.to_string())
9798
};
98-
let fg_color = self.muxbox.calc_fg_color(app_context, app_graph).to_string();
99-
let title_bg_color = self.muxbox.calc_title_bg_color(app_context, app_graph).to_string();
100-
let title_fg_color = self.muxbox.calc_title_fg_color(app_context, app_graph).to_string();
99+
let fg_color = self.muxbox.calc_fg_color(app_context, app_graph);
100+
let title_bg_color = self.muxbox.calc_title_bg_color(app_context, app_graph);
101+
let title_fg_color = self.muxbox.calc_title_fg_color(app_context, app_graph);
101102
let border = self.muxbox.calc_border(app_context, app_graph);
102103

103104
// F0135: PTY Error States - Use different colors based on PTY status
104105
let border_color = if self.muxbox.execution_mode.is_pty() {
105106
if let Some(pty_manager) = &app_context.pty_manager {
106107
if pty_manager.is_pty_dead(&self.muxbox.id) {
107-
"red".to_string()
108+
Some("red".to_string())
108109
} else if pty_manager.is_pty_in_error_state(&self.muxbox.id) {
109-
"yellow".to_string()
110+
Some("yellow".to_string())
110111
} else {
111-
"bright_cyan".to_string()
112+
Some("bright_cyan".to_string())
112113
}
113114
} else {
114-
"bright_cyan".to_string()
115+
Some("bright_cyan".to_string())
115116
}
116117
} else {
117-
self.muxbox.calc_border_color(app_context, app_graph).to_string()
118+
self.muxbox.calc_border_color(app_context, app_graph).map(|s| s.to_string())
118119
};
119120

120121
let fill_char = self.muxbox.calc_fill_char(app_context, app_graph);
121122

122123
// Draw fill (same logic as draw_muxbox)
123-
fill_muxbox(bounds, border, &bg_color, fill_char, buffer);
124+
fill_muxbox(bounds, border, &bg_color, &None, fill_char, buffer);
124125

125126
// Calculate overflow behavior (same logic as draw_muxbox)
126127
let mut overflow_behavior = self.muxbox.calc_overflow_behavior(app_context, app_graph);
@@ -169,20 +170,20 @@ impl<'a> BoxRenderer<'a> {
169170
fn render_box_contents(
170171
&self,
171172
bounds: &Bounds,
172-
border_color: &str,
173-
bg_color: &str,
174-
parent_bg_color: &str,
173+
border_color: &Option<String>,
174+
bg_color: &Option<String>,
175+
parent_bg_color: &Option<String>,
175176
streams: &indexmap::IndexMap<String, crate::model::common::Stream>,
176177
active_tab_index: usize,
177178
tab_scroll_offset: usize,
178-
title_fg_color: &str,
179-
title_bg_color: &str,
179+
title_fg_color: &Option<String>,
180+
title_bg_color: &Option<String>,
180181
title_position: &str,
181-
menu_fg_color: &str,
182-
menu_bg_color: &str,
183-
selected_menu_fg_color: &str,
184-
selected_menu_bg_color: &str,
185-
fg_color: &str,
182+
menu_fg_color: &Option<String>,
183+
menu_bg_color: &Option<String>,
184+
selected_menu_fg_color: &Option<String>,
185+
selected_menu_bg_color: &Option<String>,
186+
fg_color: &Option<String>,
186187
overflow_behavior: &str,
187188
border: Option<&bool>,
188189
horizontal_scroll: f64,
@@ -245,7 +246,7 @@ impl<'a> BoxRenderer<'a> {
245246
None
246247
};
247248

248-
let draw_border = border.unwrap_or(&true);
249+
// Border visibility now determined by transparent color support
249250
let mut _overflowing = false;
250251
let mut scrollbars_drawn = false;
251252

@@ -265,19 +266,18 @@ impl<'a> BoxRenderer<'a> {
265266
title_fg_color,
266267
title_bg_color,
267268
title_position,
268-
*draw_border,
269269
tab_labels,
270270
tab_close_buttons,
271271
active_tab_index,
272272
tab_scroll_offset,
273273
buffer,
274274
);
275-
} else if *draw_border {
275+
} else if crate::draw_utils::should_draw_color(border_color) || crate::draw_utils::should_draw_color(bg_color) {
276276
draw_horizontal_line(
277277
bounds.top(),
278278
bounds.left(),
279279
bounds.right(),
280-
border_color,
280+
&border_color,
281281
bg_color,
282282
buffer,
283283
);
@@ -307,7 +307,6 @@ impl<'a> BoxRenderer<'a> {
307307
selected_menu_fg_color,
308308
selected_menu_bg_color,
309309
border_color,
310-
*draw_border,
311310
buffer,
312311
);
313312

@@ -332,7 +331,6 @@ impl<'a> BoxRenderer<'a> {
332331
overflow_behavior,
333332
horizontal_scroll,
334333
vertical_scroll,
335-
*draw_border,
336334
buffer,
337335
);
338336
}
@@ -383,22 +381,21 @@ impl<'a> BoxRenderer<'a> {
383381
}
384382
}
385383

386-
self.render_borders(&bounds, border_color, bg_color, *draw_border, scrollbars_drawn, locked, content, buffer);
384+
self.render_borders(&bounds, &border_color, &bg_color, scrollbars_drawn, locked, content, buffer);
387385
}
388386

389387
/// Render content with scrolling and overflow handling
390388
fn render_content(
391389
&self,
392390
bounds: &Bounds,
393391
content: &str,
394-
fg_color: &str,
395-
bg_color: &str,
396-
border_color: &str,
397-
parent_bg_color: &str,
392+
fg_color: &Option<String>,
393+
bg_color: &Option<String>,
394+
border_color: &Option<String>,
395+
parent_bg_color: &Option<String>,
398396
overflow_behavior: &str,
399397
horizontal_scroll: f64,
400398
vertical_scroll: f64,
401-
draw_border: bool,
402399
buffer: &mut ScreenBuffer,
403400
) -> bool {
404401
let (content_width, content_height) = content_size(content);
@@ -428,7 +425,6 @@ impl<'a> BoxRenderer<'a> {
428425
fg_color,
429426
bg_color,
430427
border_color,
431-
draw_border,
432428
buffer,
433429
);
434430
true
@@ -470,10 +466,9 @@ impl<'a> BoxRenderer<'a> {
470466
viewable_height: usize,
471467
horizontal_scroll: f64,
472468
vertical_scroll: f64,
473-
fg_color: &str,
474-
bg_color: &str,
475-
border_color: &str,
476-
draw_border: bool,
469+
fg_color: &Option<String>,
470+
bg_color: &Option<String>,
471+
border_color: &Option<String>,
477472
buffer: &mut ScreenBuffer,
478473
) {
479474
let viewable_height = bounds.height().saturating_sub(1);
@@ -513,7 +508,7 @@ impl<'a> BoxRenderer<'a> {
513508
);
514509
}
515510

516-
if draw_border {
511+
if crate::draw_utils::should_draw_color(border_color) || crate::draw_utils::should_draw_color(bg_color) {
517512
draw_horizontal_line(
518513
bounds.bottom(),
519514
bounds.left(),
@@ -563,10 +558,10 @@ impl<'a> BoxRenderer<'a> {
563558
bounds: &Bounds,
564559
content: &str,
565560
vertical_scroll: f64,
566-
fg_color: &str,
567-
bg_color: &str,
568-
border_color: &str,
569-
parent_bg_color: &str,
561+
fg_color: &Option<String>,
562+
bg_color: &Option<String>,
563+
border_color: &Option<String>,
564+
parent_bg_color: &Option<String>,
570565
buffer: &mut ScreenBuffer,
571566
) -> bool {
572567
let overflow_config = OverflowConfig::wrap();
@@ -596,8 +591,8 @@ impl<'a> BoxRenderer<'a> {
596591
max_content_width: usize,
597592
viewable_width: usize,
598593
viewable_height: usize,
599-
fg_color: &str,
600-
bg_color: &str,
594+
fg_color: &Option<String>,
595+
bg_color: &Option<String>,
601596
buffer: &mut ScreenBuffer,
602597
) {
603598
let total_lines = content_lines.len();
@@ -621,24 +616,24 @@ impl<'a> BoxRenderer<'a> {
621616
}
622617
}
623618

624-
/// Render borders with proper corner handling
619+
/// Render borders with proper corner handling - supports transparent colors
625620
fn render_borders(
626621
&self,
627622
bounds: &Bounds,
628-
border_color: &str,
629-
bg_color: &str,
630-
draw_border: bool,
623+
border_color: &Option<String>,
624+
bg_color: &Option<String>,
631625
scrollbars_drawn: bool,
632626
locked: bool,
633627
content: Option<&str>,
634628
buffer: &mut ScreenBuffer,
635629
) {
636-
if !draw_border {
630+
// Skip border drawing if border color is transparent
631+
if !should_draw_color(border_color) {
637632
return;
638633
}
639634

640-
let border_color_code = get_fg_color(border_color);
641-
let bg_color_code = get_bg_color(bg_color);
635+
let border_color_code = get_fg_color_transparent(border_color);
636+
let bg_color_code = get_bg_color_transparent(bg_color);
642637

643638
// Check if we need horizontal scrollbar
644639
let has_horizontal_scrollbar = content.is_some() && {

src/components/chart_component.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,11 @@ impl ChartComponent {
223223
};
224224

225225
print_with_color_and_background_at(
226-
bounds.left(),
227226
y_pos,
227+
bounds.left(),
228+
&Some(fg_color.to_string()),
229+
&Some(bg_color.to_string()),
228230
&display_line,
229-
fg_color,
230-
bg_color,
231231
buffer,
232232
);
233233
}

0 commit comments

Comments
 (0)