/ 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)