In the dot representation of the techtree, highlight root elements with a slightly different shade so they are easy to pick out. This tells people at a glance what topics they can immediately start working on :)
This commit is contained in:
parent
9519414929
commit
22c489f983
|
@ -15,8 +15,20 @@ pub struct Element {
|
||||||
pub status: ElementStatus,
|
pub status: ElementStatus,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
||||||
|
pub enum ElementRole {
|
||||||
|
Root,
|
||||||
|
Ultimate,
|
||||||
|
Intermediate,
|
||||||
|
Disjoint,
|
||||||
|
}
|
||||||
|
|
||||||
impl Element {
|
impl Element {
|
||||||
fn to_dot_node_attributes(&self, role: Option<SubtreeElementRole>) -> String {
|
fn to_dot_node_attributes(
|
||||||
|
&self,
|
||||||
|
role: Option<ElementRole>,
|
||||||
|
subtree_role: Option<SubtreeElementRole>,
|
||||||
|
) -> String {
|
||||||
let Element {
|
let Element {
|
||||||
issue_number,
|
issue_number,
|
||||||
description,
|
description,
|
||||||
|
@ -31,10 +43,18 @@ impl Element {
|
||||||
));
|
));
|
||||||
attributes.push(r#"shape = "record""#.to_owned());
|
attributes.push(r#"shape = "record""#.to_owned());
|
||||||
|
|
||||||
let (color, background) = match (role, status) {
|
let (color, background) = match (subtree_role, status) {
|
||||||
(Some(SubtreeElementRole::ElementOfInterest), _) => ("black", "white"),
|
(Some(SubtreeElementRole::ElementOfInterest), _) => ("black", "white"),
|
||||||
(Some(SubtreeElementRole::Dependant), _) => ("gray", "gray"),
|
(Some(SubtreeElementRole::Dependant), _) => ("gray", "gray"),
|
||||||
(_, ElementStatus::Missing) => ("#800", "#fcc"),
|
(_, ElementStatus::Missing) => (
|
||||||
|
"#800",
|
||||||
|
// Highlight root elements
|
||||||
|
if role == Some(ElementRole::Root) {
|
||||||
|
"#ffddc1"
|
||||||
|
} else {
|
||||||
|
"#fcc"
|
||||||
|
},
|
||||||
|
),
|
||||||
(_, ElementStatus::Assigned) => ("#a50", "#ffa"),
|
(_, ElementStatus::Assigned) => ("#a50", "#ffa"),
|
||||||
(_, ElementStatus::Completed) => ("#080", "#afa"),
|
(_, ElementStatus::Completed) => ("#080", "#afa"),
|
||||||
};
|
};
|
||||||
|
@ -170,7 +190,30 @@ impl Tree {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_element_role(&self, element: ElementIndex) -> ElementRole {
|
||||||
|
let has_dependencies = self
|
||||||
|
.graph
|
||||||
|
.neighbors_directed(element, petgraph::Direction::Outgoing)
|
||||||
|
.next()
|
||||||
|
.is_some();
|
||||||
|
let has_dependants = self
|
||||||
|
.graph
|
||||||
|
.neighbors_directed(element, petgraph::Direction::Incoming)
|
||||||
|
.next()
|
||||||
|
.is_some();
|
||||||
|
|
||||||
|
match (has_dependencies, has_dependants) {
|
||||||
|
(false, true) => ElementRole::Root,
|
||||||
|
(true, false) => ElementRole::Ultimate,
|
||||||
|
(true, true) => ElementRole::Intermediate,
|
||||||
|
(false, false) => ElementRole::Disjoint,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn to_dot(&self) -> String {
|
pub fn to_dot(&self) -> String {
|
||||||
|
let to_node_attributes = |_g, (id, element): (ElementIndex, &Element)| {
|
||||||
|
element.to_dot_node_attributes(Some(self.get_element_role(id)), None)
|
||||||
|
};
|
||||||
let dot = petgraph::dot::Dot::with_attr_getters(
|
let dot = petgraph::dot::Dot::with_attr_getters(
|
||||||
&self.graph,
|
&self.graph,
|
||||||
&[
|
&[
|
||||||
|
@ -180,7 +223,7 @@ impl Tree {
|
||||||
petgraph::dot::Config::GraphContentOnly,
|
petgraph::dot::Config::GraphContentOnly,
|
||||||
],
|
],
|
||||||
&|_g, _edge_id| "".to_string(),
|
&|_g, _edge_id| "".to_string(),
|
||||||
&|_g, (_, element)| element.to_dot_node_attributes(None),
|
&to_node_attributes,
|
||||||
);
|
);
|
||||||
|
|
||||||
let ultimate_elements: Vec<_> = self
|
let ultimate_elements: Vec<_> = self
|
||||||
|
@ -318,7 +361,11 @@ impl<'a> Subtree<'a> {
|
||||||
petgraph::dot::Config::RankDir(petgraph::dot::RankDir::BT),
|
petgraph::dot::Config::RankDir(petgraph::dot::RankDir::BT),
|
||||||
],
|
],
|
||||||
&|_g, _edge_id| "".to_string(),
|
&|_g, _edge_id| "".to_string(),
|
||||||
&|_g, (_, element)| element.element.to_dot_node_attributes(Some(element.role)),
|
&|_g, (_, element)| {
|
||||||
|
element
|
||||||
|
.element
|
||||||
|
.to_dot_node_attributes(None, Some(element.role))
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
format!("{:?}", dot)
|
format!("{:?}", dot)
|
||||||
|
|
Loading…
Reference in a new issue