Mercurial > MadButterfly
annotate pyink/unlink_clone.py @ 1396:a5672125e515
Copy the transformation matrix when we clone it. It looks like the MB do not copy the matrix automatically.
Support isuse attribute to decide how to generate the tweened matrix.
author | wycc |
---|---|
date | Sat, 02 Apr 2011 05:39:26 +0800 |
parents | 0b5ee9c90af7 |
children |
rev | line source |
---|---|
1299
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
1 import dom_event |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
2 from data_monitor import data_monitor |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
3 |
1300
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
4 ## \brief Tracking relation-ship btween copy nodes and source nodes. |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
5 # |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
6 # To trace the relation-ship between source node and copy node, we add |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
7 # 'ns0:duplicate-src' attribute to copy nodes. But after unlink a |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
8 # clone node, inkscape does not copy attributes of 'svg:use' node to |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
9 # new nodes inserted after unlinking. So, we can not just putting |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
10 # 'ns0:duplicate-src' on 'svg:use' and hoping it is still working for |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
11 # us after unlinking. |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
12 # |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
13 # The solution is to duplicate value of 'id' attribute to 'saved_id' |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
14 # attribute for every node. Whenever Inkscape copying nodes for a |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
15 # copy & paste or an unlinking, the value of 'saved_id' attribute |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
16 # would be copied to copy nodes from source nodes. We copy the value |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
17 # of 'saved_id' attribute to 'ns0:duplicate-src', for copy node, to |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
18 # preserve the relation-ship of copy node and source node. After copy |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
19 # 'saved_id' to 'ns0:duplicate-src', 'saved_id' is re-assigned to the |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
20 # value of ID of copy node. A copy node is the new node of a copying. |
2a35a1cb6cdf
Add comment for unlink_clone.py
Thinker K.F. Li <thinker@codemud.net>
parents:
1299
diff
changeset
|
21 # |
1299
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
22 class unlink_clone_checker(object): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
23 __metaclass__ = data_monitor |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
24 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
25 _no_change_attrs = ('ns0:duplicate-src', 'saved_id') |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
26 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
27 def __init__(self, domview_ui): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
28 self._domviewui = domview_ui |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
29 self._locker = domview_ui |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
30 self._doc = None |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
31 self._root = None |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
32 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
33 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
34 def _start_check(self): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
35 doc = self._doc |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
36 dom_event.addEventListener(doc, 'DOMNodeInserted', |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
37 self.do_insert_node, None) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
38 dom_event.addEventListener(doc, 'DOMAttrModified', |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
39 self.do_attr_modified, None) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
40 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
41 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
42 def handle_doc_root(self, doc, root): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
43 self._doc = doc |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
44 self._root = root |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
45 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
46 self._start_check() |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
47 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
48 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
49 def _handle_unlinked_or_copied_nodes(self, node, child): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
50 try: |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
51 saved_id = child.getAttribute('saved_id') |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
52 except: # Skip it for losting saved_id |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
53 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
54 else: |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
55 child.setAttribute('ns0:duplicate-src', saved_id) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
56 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
57 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
58 try: |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
59 child_id = child.getAttribute('id') |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
60 except: # still have no ID. |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
61 pass # Assign saved_id later with attr |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
62 # modified event. |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
63 else: |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
64 child.setAttribute('saved_id', child_id) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
65 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
66 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
67 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
68 def _handle_new_nodes(self, node, child): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
69 if child.name() == 'svg:use': |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
70 return |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
71 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
72 try: |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
73 child_id = child.getAttribute('id') |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
74 except KeyError: |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
75 return |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
76 child.setAttribute('saved_id', child_id) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
77 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
78 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
79 ## \brief Check inserted node recurisvely. |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
80 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
81 # Travel the tree in post-order. |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
82 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
83 def _handle_insert_node_recursive(self, node, child): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
84 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
85 # Traveling forest of children. |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
86 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
87 for cchild in child.childList(): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
88 self._handle_insert_node_recursive(child, cchild) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
89 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
90 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
91 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
92 # Visit the node |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
93 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
94 try: |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
95 child_id = child.getAttribute('saved_id') |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
96 except KeyError: # have no saved_id |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
97 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
98 else: |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
99 self._handle_unlinked_or_copied_nodes(node, child) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
100 return |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
101 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
102 # have no saved_id |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
103 self._handle_new_nodes(node, child) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
104 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
105 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
106 def do_insert_node(self, node, child): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
107 self._handle_insert_node_recursive(node, child) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
108 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
109 |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
110 def do_attr_modified(self, node, name, old_value, new_value): |
1336
0b5ee9c90af7
Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents:
1300
diff
changeset
|
111 if name == 'id' and node.name() != 'svg:use' and new_value: |
1299
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
112 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
113 # The ID of a node may not be assigned when it being |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
114 # inserted, and be assigned later. So, we checking |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
115 # attribute modification event to assign value of |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
116 # saved_id. |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
117 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
118 node.setAttribute('saved_id', new_value) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
119 elif old_value and (name in self._no_change_attrs): |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
120 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
121 # Restore to old value for attributes that is not allowed |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
122 # to be changed by the user. |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
123 # |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
124 node.setAttribute(name, old_value) |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
125 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
126 pass |
6949e2b6cae2
Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff
changeset
|
127 pass |