feat: unify window chrome and managed workspace tabs
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
use super::*;
|
||||
|
||||
pub(super) fn build(
|
||||
p: &mut Painter,
|
||||
state: &mut DeveloperToolsState,
|
||||
doc: &RenderDocument,
|
||||
viewport: Rect,
|
||||
) {
|
||||
let x = viewport.x;
|
||||
let w = viewport.width;
|
||||
let width = viewport.x + viewport.width;
|
||||
let bottom = viewport.height - 22.0;
|
||||
|
||||
p.fill(Rect::new(x, 32.0, w, 30.0), BAR);
|
||||
p.button(
|
||||
Rect::new(x + 3.0, 32.0, 139.0, 29.0),
|
||||
"Current snapshot",
|
||||
Action::Snapshot,
|
||||
!state.cloud,
|
||||
);
|
||||
p.button(
|
||||
Rect::new(x + 145.0, 32.0, 107.0, 29.0),
|
||||
"Cloud files",
|
||||
Action::Cloud,
|
||||
state.cloud,
|
||||
);
|
||||
if state.cloud {
|
||||
p.button(
|
||||
Rect::new(width - 92.0, 32.0, 88.0, 29.0),
|
||||
"Refresh",
|
||||
Action::CloudRefresh,
|
||||
false,
|
||||
);
|
||||
let tree = state.tree_width.clamp(120.0, (w - 180.0).max(120.0));
|
||||
let code_x = x + tree + 2.0;
|
||||
p.label(x + 10.0, 69.0, "CLOUD FILES", MUTED, false);
|
||||
let file_lines = state
|
||||
.cloud_sources
|
||||
.files
|
||||
.iter()
|
||||
.map(|file| {
|
||||
let mut l = Line::new(&file.path, TEXT);
|
||||
l.action = Some(Action::CloudOpen(file.id.clone()));
|
||||
l
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
p.lines(
|
||||
Rect::new(x + 1.0, 92.0, tree - 1.0, bottom - 92.0),
|
||||
Region::Tree,
|
||||
&file_lines,
|
||||
state,
|
||||
false,
|
||||
);
|
||||
p.split(Rect::new(x + tree, 63.0, 1.0, bottom - 63.0), Split::Tree);
|
||||
let mut source_lines = Vec::new();
|
||||
if let Some(source) = &state.cloud_sources.opened {
|
||||
p.label(code_x + 10.0, 69.0, &source.path, MUTED, false);
|
||||
for (i, line) in source.code.split('\n').enumerate() {
|
||||
source_lines.push(Line::new(format!("{:>5} {}", i + 1, line), TEXT));
|
||||
}
|
||||
} else {
|
||||
multiline(
|
||||
&mut source_lines,
|
||||
"No cloud file open\n\nNo provider connected.\nCloud files will open here as full source.\nCurrent snapshot contains your last successful script.",
|
||||
MUTED,
|
||||
);
|
||||
}
|
||||
if !state.cloud_sources.error.is_empty() {
|
||||
source_lines.push(Line::new(&state.cloud_sources.error, ERROR));
|
||||
}
|
||||
p.lines(
|
||||
Rect::new(code_x, 92.0, width - code_x, bottom - 92.0),
|
||||
Region::Source,
|
||||
&source_lines,
|
||||
state,
|
||||
false,
|
||||
);
|
||||
} else {
|
||||
let tree = state.tree_width.clamp(120.0, (w - 180.0).max(120.0));
|
||||
let code_x = x + tree + 2.0;
|
||||
p.label(x + 10.0, 69.0, "ASTER AST", MUTED, false);
|
||||
p.label(
|
||||
code_x + 10.0,
|
||||
69.0,
|
||||
&format!(
|
||||
"{} · {} lines · read only",
|
||||
if doc
|
||||
.root
|
||||
.as_ref()
|
||||
.is_some_and(|root| root.kind == "repl-session")
|
||||
{
|
||||
"Console transcript"
|
||||
} else {
|
||||
"app.main.endor"
|
||||
},
|
||||
doc.source.split('\n').count()
|
||||
),
|
||||
MUTED,
|
||||
false,
|
||||
);
|
||||
let mut tree_lines = Vec::new();
|
||||
if let Some(root) = &doc.root {
|
||||
let mut flat = Vec::new();
|
||||
flatten(root, 0, &mut flat);
|
||||
for (depth, n) in flat {
|
||||
let mut l = Line::new(format!("{}{} {}", " ".repeat(depth), n.kind, n.name), TEXT);
|
||||
l.selected = state.selected_node_id.as_deref() == Some(&n.id);
|
||||
l.action = Some(Action::Node(n.id.clone(), n.start_line));
|
||||
tree_lines.push(l);
|
||||
}
|
||||
} else {
|
||||
tree_lines.push(Line::new("No submitted source", MUTED));
|
||||
}
|
||||
p.lines(
|
||||
Rect::new(x + 1.0, 92.0, tree - 1.0, bottom - 92.0),
|
||||
Region::Tree,
|
||||
&tree_lines,
|
||||
state,
|
||||
false,
|
||||
);
|
||||
p.split(Rect::new(x + tree, 63.0, 1.0, bottom - 63.0), Split::Tree);
|
||||
let selected = state
|
||||
.selected_node_id
|
||||
.as_deref()
|
||||
.and_then(|id| doc.node(id));
|
||||
let code_lines = doc
|
||||
.source
|
||||
.replace("\r\n", "\n")
|
||||
.split('\n')
|
||||
.enumerate()
|
||||
.map(|(i, s)| {
|
||||
let mut l = Line::new(format!("{:>5} {}", i + 1, s.replace('\t', " ")), TEXT);
|
||||
l.selected = selected.is_some_and(|n| i + 1 >= n.start_line && i < n.end_line);
|
||||
l
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
p.lines(
|
||||
Rect::new(code_x, 92.0, width - code_x, bottom - 92.0),
|
||||
Region::Source,
|
||||
&code_lines,
|
||||
state,
|
||||
false,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user