/ generate_widget_header.py
generate_widget_header.py
1 #!/usr/bin/env python3 2 import sys 3 import os 4 from ete3 import Tree, TreeStyle, AttrFace, faces, NodeStyle 5 import argparse 6 7 parser = argparse.ArgumentParser(description='Create a image showing all widgets') 8 parser.add_argument('sourcedir', metavar='sourcedir', help='the path where to find efls source') 9 10 G = parser.parse_args() 11 sys.path.insert(0, os.path.join(G.sourcedir, 'src', 'scripts', 'pyolian')) 12 13 import eolian 14 15 SCAN_FOLDER = os.path.join(G.sourcedir, 'src', 'lib') 16 17 eolian_db = eolian.Eolian_State() 18 19 if not eolian_db.directory_add(SCAN_FOLDER): 20 raise(RuntimeError('Eolian, failed to scan source directory')) 21 22 # Parse all known eo files 23 if not eolian_db.all_eot_files_parse(): 24 raise(RuntimeError('Eolian, failed to parse all EOT files')) 25 26 if not eolian_db.all_eo_files_parse(): 27 raise(RuntimeError('Eolian, failed to parse all EO files')) 28 29 widget = eolian_db.class_by_name_get("Efl.Ui.Widget") 30 assert(widget) 31 32 def is_widget(obj, rd = 0): 33 if obj == widget: 34 return rd 35 elif obj.parent != None: 36 return is_widget(obj.parent, rd + 1) 37 return -1 38 39 list_of_widgets = [] 40 41 for kl in eolian_db.classes: 42 widget_depth = is_widget(kl) 43 if widget_depth != -1: 44 insert = { 45 'depth' : widget_depth, 46 'name' : kl.name, 47 'eolian_obj' : kl, 48 'beta' : kl.is_beta, 49 } 50 list_of_widgets.append(insert) 51 52 def layout(node): 53 # Add node name to laef nodes 54 N = AttrFace("name", fsize=9, fgcolor="black") 55 faces.add_face_to_node(N, node, 0) 56 57 58 class Widget_Tree(): 59 def __init__(self, name, parent, is_beta): 60 self.name = name 61 self.children = [] 62 if parent != None: 63 self.parent = parent 64 parent.children.append(self) 65 self.tree_node = parent.tree_node.add_child(None, self.name, 1) 66 else: 67 self.tree_node = Tree(name = self.name).add_child(None, 'Efl.Ui.Widget', 1) 68 nstyle = NodeStyle() 69 if is_beta: 70 nstyle["fgcolor"] = "red" 71 else: 72 nstyle["fgcolor"] = "blue" 73 self.tree_node.set_style(nstyle) 74 75 def dump(self, prev): 76 print(prev + self.name) 77 self.children.sort(key = lambda x:x.name) 78 for c in self.children: 79 c.dump(prev + " ") 80 81 sorted_widgets = sorted(list_of_widgets, key=lambda x: x['depth']) 82 widget_tree = {} 83 84 for widget in sorted_widgets: 85 if widget['depth'] == 0: 86 widget_tree[widget['name']] = Widget_Tree(widget['name'], None, widget['beta']) 87 else: 88 widget_tree[widget['name']] = Widget_Tree(widget['name'], widget_tree[widget['eolian_obj'].parent.name], widget['beta']) 89 90 ts = TreeStyle() 91 ts.layout_fn = layout 92 ts.show_leaf_name = False 93 ts.show_scale = False 94 95 print("Created widget-overview.svg in $CWD") 96 97 widget_tree['Efl.Ui.Widget'].tree_node.render("widget-overview.svg", units="mm", tree_style=ts)