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