@@ -414,6 +414,7 @@ class Theme:
414414
415415 ##########
416416 ## DATA node
417+ ##
417418
418419 #: Reduce margins, since sideffects take a lost of space
419420 #: (default margin: x=0.11, y=0.055O)
@@ -427,12 +428,6 @@ class Theme:
427428 3 : {"shape" : "hexagon" }, # Inp/Out
428429 }
429430 kw_data_mapped = {"label" : make_template ("<{{ nx_item | eee }}>" )}
430-
431- kw_data_pruned = {
432- "fontcolor" : Ref ("pruned_color" ),
433- "color" : Ref ("pruned_color" ),
434- "tooltip" : "(pruned)" ,
435- }
436431 kw_data_sideffect = {
437432 "color" : "blue" ,
438433 "fontcolor" : "blue" ,
@@ -451,6 +446,14 @@ class Theme:
451446 "style" : ["dashed" ],
452447 "tooltip" : "(to evict)" ,
453448 }
449+ ##
450+ ## data STATE
451+ ##
452+ kw_data_pruned = {
453+ "fontcolor" : Ref ("pruned_color" ),
454+ "color" : Ref ("pruned_color" ),
455+ "tooltip" : "(pruned)" ,
456+ }
454457 kw_data_in_solution = {"style" : ["filled" ], "fillcolor" : Ref ("fill_color" )}
455458 kw_data_evicted = {"penwidth" : "3" , "tooltip" : "(evicted)" }
456459 kw_data_overwritten = {"style" : ["filled" ], "fillcolor" : Ref ("overwrite_color" )}
@@ -462,6 +465,7 @@ class Theme:
462465
463466 ##########
464467 ## OPERATION node
468+ ##
465469
466470 #: Keys to ignore from operation styles & node-attrs,
467471 #: because they are handled internally by HTML-Label, and/or
@@ -472,23 +476,47 @@ class Theme:
472476 kw_op = {}
473477 #: props only for HTML-Table label
474478 kw_op_label = {}
475- kw_op_pruned = {"color" : Ref ("pruned_color" ), "fontcolor" : Ref ("pruned_color" )}
476479 kw_op_executed = {"fillcolor" : Ref ("fill_color" )}
477480 kw_op_endured = {
478481 "penwidth" : Ref ("resched_thickness" ),
479482 "style" : ["dashed" ],
480- "tooltip" : "(rescheduled)" ,
483+ "tooltip" : "(endured)" ,
484+ "badges" : ["E" ],
481485 }
482486 kw_op_rescheduled = {
483487 "penwidth" : Ref ("resched_thickness" ),
484488 "style" : ["dashed" ],
485489 "tooltip" : "(rescheduled)" ,
490+ "badges" : ["R" ],
486491 }
492+ kw_op_parallel = {"badges" : ["P" ]}
493+ kw_op_marshalled = {"badges" : ["M" ]}
494+ kw_op_returns_dict = {"badges" : ["D" ]}
495+ ##
496+ ## op STATE
497+ ##
498+ kw_op_pruned = {"color" : Ref ("pruned_color" ), "fontcolor" : Ref ("pruned_color" )}
487499 kw_op_failed = {
488500 "fillcolor" : Ref ("failed_color" ),
489501 "tooltip" : make_template ("{{ solution.executed[nx_item] if solution | ex }}" ),
490502 }
491503 kw_op_canceled = {"fillcolor" : Ref ("canceled_color" ), "tooltip" : "(canceled)" }
504+ #: Operation styles may specify one or more "letters"
505+ #: in a `badges` list item, as long as the "letter" is contained in the dictionary
506+ #: below.
507+ op_badge_styles = {
508+ "badge_styles" : {
509+ "E" : {"tooltip" : "endured(!)" , "bgcolor" : "#04277d" , "color" : "white" },
510+ "R" : {"tooltip" : "rescheduled(?)" , "bgcolor" : "#fc89ac" , "color" : "white" },
511+ "P" : {"tooltip" : "parallel(|)" , "bgcolor" : "#b1ce9a" , "color" : "white" },
512+ "M" : {"tooltip" : "marshalled($)" , "bgcolor" : "#4e3165" , "color" : "white" },
513+ "D" : {
514+ "tooltip" : "returns_dict({})" ,
515+ "bgcolor" : "#cc5500" ,
516+ "color" : "white" ,
517+ },
518+ }
519+ }
492520 #: Try to mimic a regular `Graphviz`_ node attributes
493521 #: (see examples in ``test.test_plot.test_op_template_full()`` for params).
494522 #: TODO: fix jinja2 template is un-picklable!
@@ -512,10 +540,24 @@ class Theme:
512540 {{- '<B>OP:</B> <I>%s</I>' % op_name |ee if op_name -}}
513541 {%- if fontcolor -%}</FONT>{%- endif -%}
514542 </TD>
543+ <TD BORDER="1" SIDES="b">
544+ {%- if badges -%}
545+ <TABLE BORDER="0" CELLBORDER="0" CELLSPACING="1" CELLPADDING="2">
546+ <TR>
547+ {%- for badge in badges -%}
548+ <TD STYLE="rounded" HEIGHT="22" VALIGN="BOTTOM" BGCOLOR="{{ badge_styles[badge].bgcolor }}" TITLE="{{ badge_styles[badge].tooltip | e }}" TARGET="_self"
549+ ><FONT FACE="monospace" COLOR="{{ badge_styles[badge].color }}"><B>
550+ {{- badge -}}
551+ </B></FONT></TD>
552+ {%- endfor -%}
553+ </TR>
554+ </TABLE>
555+ {%- endif -%}
556+ </TD>
515557 </TR>
516558 {%- if fn_name -%}
517559 <TR>
518- <TD ALIGN="left"
560+ <TD COLSPAN="2" ALIGN="left"
519561 {{- {
520562 'TOOLTIP': fn_tooltip | truncate | eee,
521563 'HREF': fn_url | hrefer | ee,
@@ -538,6 +580,7 @@ class Theme:
538580
539581 ##########
540582 ## EDGE
583+ ##
541584
542585 kw_edge = {}
543586 kw_edge_optional = {"style" : ["dashed" ]}
@@ -560,6 +603,7 @@ class Theme:
560603
561604 ##########
562605 ## Other
606+ ##
563607
564608 include_steps = False
565609 kw_step = {
@@ -1035,6 +1079,12 @@ def _make_node(self, plot_args: PlotArgs) -> pydot.Node:
10351079 label_styles .add ("kw_op_rescheduled" )
10361080 if nx_node .endured :
10371081 label_styles .add ("kw_op_endured" )
1082+ if nx_node .parallel :
1083+ label_styles .add ("kw_op_parallel" )
1084+ if nx_node .marshalled :
1085+ label_styles .add ("kw_op_marshalled" )
1086+ if nx_node .returns_dict :
1087+ label_styles .add ("kw_op_returns_dict" )
10381088
10391089 ## Op-state
10401090 #
@@ -1060,6 +1110,8 @@ def _make_node(self, plot_args: PlotArgs) -> pydot.Node:
10601110 },
10611111 )
10621112
1113+ label_styles .add ("op_badge_styles" )
1114+
10631115 label_styles .add ("user-overrides" , _pub_props (node_attrs ))
10641116
10651117 kw = label_styles .merge ()
0 commit comments