annotate pyink/consistency.py @ 1257:027cd060d9ba

Remove the key frame if associated scene node or scene group being removed.
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 11 Jan 2011 15:03:01 +0800
parents 07e0cb1e051d
children 6177f5d0ef01
rev   line source
1253
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1 import dom_event
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2 from data_monitor import data_monitor
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
3
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
4 ## \brief Check consistency of a DOM-tree associated with a domview_ui.
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
5 #
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
6 # This is a co-worker of \ref domview_ui to check DOM-tree and make
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
7 # sure consistency of scenes, scene groups in the DOM-tree. It also
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
8 # updates layer list of \ref domview_ui to reflect last changes of the
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
9 # DOM-tree.
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
10 #
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
11 # Since it is a consistency checker, it must well understanding
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
12 # structure that expected by domview_ui. So, this class is highly
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
13 # closed to the internal of \ref domview_ui. It is separated from
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
14 # domview_ui for collecting related logic and functions in a place to
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
15 # set up a clear boundary from the functions provided by \ref
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
16 # domview_ui.
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
17 #
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
18 # This class is expected to access private variables of \ref
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
19 # domview_ui. But, use public interface of domview_ui if possible.
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
20 #
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
21 # This class is also monitored by \ref data_monitor to monitor the
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
22 # accessing to domview_ui.
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
23 #
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
24 class consistency_checker(object):
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
25 __metaclass__ = data_monitor
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
26
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
27 def __init__(self, domview_ui):
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
28 self._domview = domview_ui
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
29 self._doc = None
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
30 self._root = None
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
31 pass
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
32
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
33 def _start_check(self):
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
34 doc = self._doc
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
35 dom_event.addEventListener(doc, 'DOMNodeInserted',
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
36 self.do_insert_node, None)
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
37 dom_event.addEventListener(doc, 'DOMNodeRemoved',
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
38 self.do_remove_node, None)
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
39 dom_event.addEventListener(doc, 'DOMAttrModified',
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
40 self.do_attr_modified, None)
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
41 pass
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
42
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
43 ## \brief Handle a new document.
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
44 #
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
45 # This method is called by domview_ui.handle_doc_root().
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
46 #
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
47 def handle_doc_root(self, doc, root):
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
48 self._doc = doc
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
49 self._root = root
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
50
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
51 self._start_check()
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
52 pass
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
53
1257
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
54 def _remove_node_recursive(self, node, child):
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
55 for cchild in child.childList():
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
56 self._remove_node_recursive(child, cchild)
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
57 pass
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
58
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
59 child_name = child.name()
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
60 if child_name not in ('ns0:scene', 'svg:g'):
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
61 return
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
62
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
63 #
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
64 # Remove the key frame assocated with a removed scene node or
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
65 # scene group if we can find the key frame.
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
66 #
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
67 if child_name == 'ns0:scene':
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
68 try:
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
69 group_id = child.getAttribute('ref')
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
70 except:
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
71 return
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
72 elif child_name == 'svg:g':
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
73 try:
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
74 group_id = child.getAttribute('id')
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
75 except:
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
76 return
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
77 pass
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
78
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
79 try:
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
80 layer_idx, (start, end, tween_type) = \
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
81 self._domview.find_key_from_group(group_id)
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
82 except ValueError:
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
83 pass
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
84 else: # We have found the key frame.
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
85 self._domview.unmark_key(layer_idx, start)
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
86 pass
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
87 pass
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
88
1253
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
89 def do_insert_node(self, node, child):
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
90 pass
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
91
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
92 def do_remove_node(self, node, child):
1257
027cd060d9ba Remove the key frame if associated scene node or scene group being removed.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
93 self._remove_node_recursive(node, child)
1253
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
94 pass
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
95
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
96 def do_attr_modified(self, node, name, old_value, new_value):
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
97 pass
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
98 pass