annotate pyink/domview.py @ 1525:701a568f6949

Fix typeo
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 22 Aug 2011 19:20:20 +0800
parents 8bc2e824f155
children d42951ebfc6f
rev   line source
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1 import random
1253
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1247
diff changeset
2 import dom_event
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
3 from tween import TweenObject
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
4 from trait import trait, require, composite
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
5
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
6
1318
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
7 ## \brief Compare two nodes with ID.
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
8 #
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
9 # \return True if node1 ID equivalent to ndoe2 ID.
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
10 #
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
11 def _id_eq(node1, node2):
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
12 try:
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
13 node1_id = node1.getAttribute('id')
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
14 except:
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
15 return False
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
16
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
17 try:
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
18 node2_id = node2.getAttribute('id')
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
19 except:
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
20 return False
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
21 return node1_id == node2_id
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
22
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
23
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
24 class Layer:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
25 def __init__(self, node):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
26 self.scenes = []
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
27 self.group = node
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
28 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
29 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
30
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
31
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
32 class Timeline(object):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
33 def __init__(self, scenes_node):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
34 self.scenes_node = scenes_node
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
35 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
36
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
37 def name(self):
1407
f19121bd6a6c Check if the name is defined for old SVG file.
wycc
parents: 1356
diff changeset
38 try:
f19121bd6a6c Check if the name is defined for old SVG file.
wycc
parents: 1356
diff changeset
39 name = self.scenes_node.getAttribute('name')
f19121bd6a6c Check if the name is defined for old SVG file.
wycc
parents: 1356
diff changeset
40 except:
f19121bd6a6c Check if the name is defined for old SVG file.
wycc
parents: 1356
diff changeset
41 name='default'
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
42 return name
1331
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
43
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
44 def rename(self, new_name):
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
45 scenes_node = self.scenes_node
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
46 scenes_node.setAttribute('name', new_name)
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
47 pass
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
48 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
49
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
50
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
51 class Transition(object):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
52 node = None
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
53 condition = None
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
54 target = None
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
55 action = None
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
56 path = None
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
57
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
58 def __init__(self, node=None):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
59 self.node = node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
60 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
61
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
62 def set_condition(self, cond):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
63 node = self.node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
64
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
65 node.setAttribute('condition', cond)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
66 self.condition = cond
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
67 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
68
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
69 def set_action(self, action):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
70 self.action = action
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
71 node = self.node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
72 node.setAttribute('action', action)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
73 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
74
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
75 def set_path(self, path):
1470
2a9b9c281f80 Fix wiring error
Thinker K.F. Li <thinker@codemud.net>
parents: 1469
diff changeset
76 self.path = path
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
77 node = self.node
1470
2a9b9c281f80 Fix wiring error
Thinker K.F. Li <thinker@codemud.net>
parents: 1469
diff changeset
78 path_txt = ' '.join([str(c) for c in path])
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
79 node.setAttribute('path', path_txt)
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
80 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
81
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
82 def reparse(self):
1520
8bc2e824f155 Fix various bug of code for parsing finite state machines.
Thinker K.F. Li <thinker@codemud.net>
parents: 1511
diff changeset
83 node = self.node
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
84 condition = node.getAttribute('condition')
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
85 target = node.getAttribute('target')
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
86 try:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
87 action = node.getAttribute('action')
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
88 except:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
89 action = None
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
90 pass
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
91 try:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
92 path = node.getAttribute('path').strip().split()
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
93 path = [float(c) for c in path]
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
94 except:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
95 path = None
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
96 pass
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
97
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
98 self.condition = condition
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
99 self.target = target
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
100 self.action = action
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
101 self.path = path
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
102 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
103
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
104 def update_node(self):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
105 node = self.node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
106 node.setAttribute('condition', self.condition)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
107 node.setAttribute('target', self.target)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
108 if self.action:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
109 node.setAttribute('action', self.action)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
110 pass
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
111 if self.path:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
112 node.setAttribute('path', self.path)
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
113 pass
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
114 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
115
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
116 ## \brief Create a node according status of the object.
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
117 #
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
118 # A new node is created for the object, and attributes of the node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
119 # is initialized with information from the object.
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
120 #
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
121 def create_node(self, doc):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
122 node = doc.createElement('ns0:transition')
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
123 self.node = node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
124 self.update_node()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
125
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
126 return node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
127
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
128 @staticmethod
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
129 def parse_transition(node):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
130 trn = Transition(node)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
131 trn.reparse()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
132 return trn
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
133 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
134
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
135
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
136 ## \brief A state in a FSM
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
137 #
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
138 # Every component can have a FSM to describe its behavior. Every
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
139 # state has an entry action and transitions to other states. Every
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
140 # transition can have a transition action.
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
141 #
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
142 # The FSM of a component is defined as a child of ns0:component node.
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
143 # \verbatim
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
144 # <ns0:component>
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
145 # <ns0:states start_state="UP">
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
146 # <ns0:state name="UP" entry_action="entry action">
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
147 # <ns0:transition target="DOWN"
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
148 # condition="button_down" action="..."/>
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
149 # </ns0:state>
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
150 # </ns0:states>
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
151 # </ns0:/component>
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
152 # \endverbatim
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
153 #
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
154 class State(object):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
155 name = None
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
156 entry_action = None
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
157 transitions = None
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
158 r = None
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
159 x = 0
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
160 y = 0
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
161
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
162 def __init__(self, node=None):
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
163 self.node = node
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
164 self.transitions = {}
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
165 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
166
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
167 def rename(self, name):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
168 self.name = name
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
169 self.node.setAttribute('name', name)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
170 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
171
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
172 def set_entry_action(self, action):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
173 self.entry_action = action
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
174 self.node.setAttribute('entry_action', action)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
175 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
176
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
177 def set_r(self, r):
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
178 self.r = r
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
179 self.node.setAttribute('r', str(r))
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
180 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
181
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
182 def set_xy(self, x, y):
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
183 self.x = x
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
184 self.y = y
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
185 self.node.setAttribute('x', str(x))
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
186 self.node.setAttribute('y', str(y))
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
187 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
188
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
189 def reparse(self):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
190 node = self.node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
191
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
192 name = node.getAttribute('name')
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
193 try:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
194 entry_action = node.getAttribute('entry_action')
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
195 except:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
196 entry_action = None
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
197 pass
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
198 try:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
199 r = float(node.getAttribute('r'))
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
200 except:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
201 r = None
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
202 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
203 try:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
204 x = float(node.getAttribute('x'))
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
205 except:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
206 x = 0
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
207 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
208 try:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
209 y = float(node.getAttribute('y'))
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
210 except:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
211 y = 0
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
212 pass
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
213
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
214 all_transitions = [Transition.parse_transition(child)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
215 for child in node.childList()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
216 if child.name() == 'ns0:transition']
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
217 transitions = dict([(trn.condition, trn)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
218 for trn in all_transitions])
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
219
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
220 self.name = name
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
221 self.transitions = transitions
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
222 self.entry_action = entry_action
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
223 self.r = r
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
224 self.x = x
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
225 self.y = y
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
226 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
227
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
228 def update_node(self):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
229 node = self.node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
230
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
231 node.setAttribute('name', self.name)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
232 if self.entry_action:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
233 node.setAttribute('entry_action', self.entry_action)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
234 pass
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
235 if self.r:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
236 node.setAttribute('r', self.r)
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
237 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
238 if self.x:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
239 node.setAttribute('x', self.x)
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
240 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
241 if self.y:
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
242 node.setAttribute('y', self.y)
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
243 pass
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
244
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
245 transitions = self.transitions
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
246 for trn in transitions:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
247 trn.update_node()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
248 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
249 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
250
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
251 def create_node(self, doc):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
252 node = doc.createElement('ns0:state')
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
253 self.node = node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
254
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
255 self.update_node()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
256
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
257 return node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
258
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
259 @staticmethod
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
260 def parse_state(node):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
261 state = State(node)
1520
8bc2e824f155 Fix various bug of code for parsing finite state machines.
Thinker K.F. Li <thinker@codemud.net>
parents: 1511
diff changeset
262 state.reparse()
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
263
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
264 return state
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
265
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
266 def change_transition_cond(self, old_cond, new_cond):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
267 transitions = self.transitions
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
268 trn = transitions[old_cond]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
269 del transitions[old_cond]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
270 transitions[new_cond] = trn
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
271
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
272 trn.set_condition(new_cond)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
273 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
274
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
275 def add_transition(self, cond, target):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
276 transitions = self.transitions
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
277 assert cond not in transitions
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
278
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
279 node = self.node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
280
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
281 trn = Transition()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
282 trn.condition = cond
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
283 trn.target = target
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
284 trn_node = trn.create_node(node.document())
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
285
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
286 node.appendChild(trn_node)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
287 transitions[cond] = trn
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
288 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
289
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
290 def rm_transition(self, cond):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
291 transitions = self.transitions
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
292 if cond not in transitions:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
293 raise ValueError, \
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
294 'There is no transition defined for this condition (%s)' % \
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
295 (cond)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
296
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
297 trn = transitions[cond]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
298 trn_node = trn.node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
299 node = self.node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
300
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
301 node.removeChild(trn_node)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
302 del transitions[cond]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
303 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
304
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
305 def all_transitions(self):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
306 return self.transitions.keys()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
307
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
308 def get_transition(self, cond):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
309 transitions = self.transitions
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
310 transition = transitions[cond]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
311 return transition
1501
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
312
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
313 def chg_transition_cond(self, cond, new_cond):
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
314 transitions = self.transitions
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
315
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
316 trn = transitions[cond]
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
317 trn.set_condition(new_cond)
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
318
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
319 del transitions[cond]
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
320 transitions[new_cond] = trn
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
321 pass
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
322 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
323
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
324
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
325 class Component(object):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
326 #
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
327 # \param comp_node is None for main component.
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
328 #
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
329 def __init__(self, comp_mgr, comp_node):
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
330 self._comp_mgr = comp_mgr
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
331 self.node = comp_node
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
332 self.layers = []
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
333 self.timelines = []
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
334 self.fsm_states = {}
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
335 self.fsm_states_node = None
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
336 self.fsm_start_state = None
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
337
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
338 if comp_node:
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
339 self._initialize_comp()
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
340 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
341 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
342
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
343 def _initialize_comp(self):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
344 comp_node = self.node
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
345 for child in comp_node.childList():
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
346 if child.name() == 'ns0:scenes':
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
347 break
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
348 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
349 else: # no any ns0:scenes
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
350 doc = self._comp_mgr._doc
1310
85d04ba11146 Support adding new components
Thinker K.F. Li <thinker@codemud.net>
parents: 1308
diff changeset
351 scenes_node = doc.createElement('ns0:scenes')
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
352 scenes_node.setAttribute('name', 'default')
1310
85d04ba11146 Support adding new components
Thinker K.F. Li <thinker@codemud.net>
parents: 1308
diff changeset
353
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
354 node_id = self._comp_mgr.new_id()
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
355 scenes_node.setAttribute('id', node_id)
1310
85d04ba11146 Support adding new components
Thinker K.F. Li <thinker@codemud.net>
parents: 1308
diff changeset
356
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
357 comp_node.appendChild(scenes_node)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
358 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
359 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
360
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
361 def _get_comp_node(self):
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
362 return self.node or self._comp_mgr._metadata_node
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
363
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
364 def name(self):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
365 if self.node:
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
366 name = self.node.getAttribute('name')
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
367 else:
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
368 name = 'main'
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
369 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
370 return name
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
371
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
372 def all_timeline_names(self):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
373 names = [tl.name() for tl in self.timelines]
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
374 return names
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
375
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
376 def parse_timelines(self):
1336
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
377 self.timelines[:] = []
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
378
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
379 if self.node: # main component has None value for self.node
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
380 assert self.node.name() == 'ns0:component'
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
381 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
382
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
383 comp_node = self._get_comp_node()
1310
85d04ba11146 Support adding new components
Thinker K.F. Li <thinker@codemud.net>
parents: 1308
diff changeset
384 for child in comp_node.childList():
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
385 if child.name() == 'ns0:scenes':
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
386 tl = Timeline(child)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
387 self.timelines.append(tl)
1336
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
388 print ' ' + tl.name()
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
389 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
390 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
391 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
392
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
393 ## \brief Parse FSM from a ns0:states node.
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
394 #
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
395 def parse_states(self):
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
396 comp_node = self._get_comp_node()
1520
8bc2e824f155 Fix various bug of code for parsing finite state machines.
Thinker K.F. Li <thinker@codemud.net>
parents: 1511
diff changeset
397 assert (not comp_node) or comp_node.name() in ('ns0:component',
8bc2e824f155 Fix various bug of code for parsing finite state machines.
Thinker K.F. Li <thinker@codemud.net>
parents: 1511
diff changeset
398 'svg:metadata')
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
399
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
400 states_nodes = [node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
401 for node in comp_node.childList()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
402 if node.name() == 'ns0:states']
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
403 if not states_nodes:
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
404 self.fsm_states = {}
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
405 return
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
406 states_node = states_nodes[0]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
407
1465
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
408 try:
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
409 self.fsm_start_state = states_node.getAttribute('start_state')
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
410 except:
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
411 pass
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
412
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
413 state_nodes = [child
1520
8bc2e824f155 Fix various bug of code for parsing finite state machines.
Thinker K.F. Li <thinker@codemud.net>
parents: 1511
diff changeset
414 for child in states_node.childList()
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
415 if child.name() == 'ns0:state']
1520
8bc2e824f155 Fix various bug of code for parsing finite state machines.
Thinker K.F. Li <thinker@codemud.net>
parents: 1511
diff changeset
416 states = [State.parse_state(state_node) for state_node in state_nodes]
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
417 self.fsm_states = dict([(state.name, state) for state in states])
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
418
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
419 self.fsm_states_node = states_node
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
420 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
421
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
422 def get_timeline(self, name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
423 for tl in self.timelines:
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
424 if tl.name() == name:
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
425 return tl
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
426 pass
1525
701a568f6949 Fix typeo
Thinker K.F. Li <thinker@codemud.net>
parents: 1520
diff changeset
427 raise ValueError, 'invalid timeline name - %s' % (name)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
428
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
429 def has_timeline(self, name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
430 for tl in self.timelines:
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
431 if tl.name() == name:
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
432 return True
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
433 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
434 return False
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
435
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
436 def add_timeline(self, name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
437 if self.has_timeline(name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
438 raise ValueError, \
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
439 'try add a timeline with duplicated name - %s' % (name)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
440
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
441 doc = self._comp_mgr._doc
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
442 comp_node = self._get_comp_node()
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
443
1310
85d04ba11146 Support adding new components
Thinker K.F. Li <thinker@codemud.net>
parents: 1308
diff changeset
444 scenes_node = doc.createElement('ns0:scenes')
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
445 scenes_node.setAttribute('name', name)
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
446 node_id = self._comp_mgr.new_id()
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
447 scenes_node.setAttribute('id', node_id)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
448
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
449 comp_node.appendChild(scenes_node)
1317
e2ad9eb7f7a4 Show timelines correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 1316
diff changeset
450
e2ad9eb7f7a4 Show timelines correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 1316
diff changeset
451 tl = Timeline(scenes_node)
e2ad9eb7f7a4 Show timelines correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 1316
diff changeset
452 self.timelines.append(tl)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
453 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
454
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
455 ## \brief Add a timeline for an existed scenes node.
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
456 #
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
457 def add_timeline_scenes(self, scenes_node):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
458 tl = Timeline(scenes_node)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
459 name = tl.name()
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
460 if self.has_timeline(name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
461 raise ValueError, \
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
462 'name of scenes node of a timeline is duplicated'
1317
e2ad9eb7f7a4 Show timelines correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 1316
diff changeset
463
e2ad9eb7f7a4 Show timelines correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 1316
diff changeset
464 self.timeline.append(tl)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
465 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
466
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
467 def rm_timeline(self, name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
468 for i, tl in enumerate(self.timelines):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
469 if tl.name() == name:
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
470 comp_node = self._get_comp_node()
1317
e2ad9eb7f7a4 Show timelines correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 1316
diff changeset
471 comp_node.removeChild(tl.scenes_node)
e2ad9eb7f7a4 Show timelines correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 1316
diff changeset
472
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
473 del self.timelines[i]
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
474 return
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
475 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
476 raise ValueError, 'try to remove a non-existed timeline - %s' % (name)
1331
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
477
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
478 def rename_timeline(self, timeline_name, new_name):
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
479 for i, tl in enumerate(self.timelines):
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
480 if tl.name() == timeline_name:
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
481 tl.rename(new_name)
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
482 return
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
483 pass
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
484 raise ValueError, 'try to remove a non-existed timeline - %s' % (name)
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
485
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
486 def rename(self, new_name):
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
487 self.node.setAttribute('name', new_name)
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
488 pass
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
489
1465
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
490 def _create_states_node(self):
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
491 node = self._get_comp_node()
1465
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
492 doc = self._comp_mgr._doc
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
493
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
494 states_node = doc.createElement('ns0:states')
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
495 node.appendChild(states_node)
1465
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
496 self.fsm_states_node = states_node
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
497 pass
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
498
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
499 def get_start_state_name(self):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
500 return self.fsm_start_state
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
501
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
502 def set_start_state(self, state_name):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
503 assert state_name in self.fsm_states
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
504 self.fsm_start_state = state_name
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
505 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
506
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
507 def all_state_names(self):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
508 return self.fsm_states.keys()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
509
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
510 def get_state(self, name):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
511 return self.fsm_states[name]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
512
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
513 def add_state(self, name):
1465
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
514 if not self.fsm_states_node:
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
515 self._create_states_node()
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
516 pass
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
517
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
518 doc = self._comp_mgr._doc
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
519
1468
c586981ecf1a Avoid duplication in state names
Thinker K.F. Li <thinker@codemud.net>
parents: 1467
diff changeset
520 if name in self.fsm_states:
c586981ecf1a Avoid duplication in state names
Thinker K.F. Li <thinker@codemud.net>
parents: 1467
diff changeset
521 raise KeyError, \
c586981ecf1a Avoid duplication in state names
Thinker K.F. Li <thinker@codemud.net>
parents: 1467
diff changeset
522 'Add a state with a name (%s) been used' % (name)
c586981ecf1a Avoid duplication in state names
Thinker K.F. Li <thinker@codemud.net>
parents: 1467
diff changeset
523
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
524 state = State()
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
525 state.name = name
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
526 self.fsm_states[name] = state
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
527
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
528 state_node = state.create_node(doc)
1465
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
529 states_node = self.fsm_states_node
1467
6927debad4ee Fix issue and a simple testcase for FSM
Thinker K.F. Li <thinker@codemud.net>
parents: 1465
diff changeset
530 states_node.appendChild(state_node)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
531 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
532
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
533 def rename_state(self, state_name, new_name):
1506
f185a9d23a30 _FSM_popup handles edit state
Thinker K.F. Li <thinker@codemud.net>
parents: 1501
diff changeset
534 if new_name in self.fsm_states:
f185a9d23a30 _FSM_popup handles edit state
Thinker K.F. Li <thinker@codemud.net>
parents: 1501
diff changeset
535 raise ValueError, 'New state name %s is duplicated' % (new_name)
f185a9d23a30 _FSM_popup handles edit state
Thinker K.F. Li <thinker@codemud.net>
parents: 1501
diff changeset
536
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
537 state = self.fsm_states[state_name]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
538 del self.fsm_states[state_name]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
539 self.fsm_states[new_name] = state
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
540
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
541 state.rename(new_name)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
542 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
543
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
544 def rm_state(self, name):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
545 fsm_states = self.fsm_states
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
546 state = fsm_states[name]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
547 del self.fsm_states[name]
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
548
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
549 state_node = state.node
1465
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
550 states_node = self.fsm_states_node
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
551 states_node.removeChild(state_node)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
552 pass
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
553 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
554
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
555
1336
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
556 ## \brief A mix-in for class component_manager for UI updating.
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
557 #
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
558 # This class collects all methods for supporting UI updating.
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
559 #
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
560 class component_manager_ui_update(object):
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
561 ## \brief Update the list of components.
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
562 #
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
563 def reparse_components(self):
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
564 saved_cur_comp = self._cur_comp
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
565 self._components[:] = [self._main_comp]
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
566 self._comp_names.clear()
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
567 self._parse_components()
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
568
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
569 for comp in self._components:
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
570 if comp.name() == saved_cur_comp.name():
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
571 self._cur_comp = comp
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
572 break
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
573 pass
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
574 else:
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
575 self._cur_comp = self._main_comp
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
576 pass
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
577 pass
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
578
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
579 ## \brief Update the list of timelines of current component.
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
580 #
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
581 def reparse_timelines(self):
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
582 comp = self._cur_comp
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
583 saved_cur_timeline = self._cur_timeline
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
584 comp.parse_timelines()
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
585
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
586 for timeline in comp.timelines:
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
587 if timeline.name() == saved_cur_timeline.name():
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
588 self._cur_timeline = timeline
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
589 break
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
590 pass
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
591 else:
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
592 self._cur_timeline = comp.timelines[0]
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
593 pass
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
594 pass
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
595 pass
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
596
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
597
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
598 ## \brief A trait for class domview for managing components.
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
599 #
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
600 # This class is responsible for manage components and timelines. It
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
601 # is also responsible for switching component and timeline. Switching
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
602 # to a component is actually switching to a timeline in another
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
603 # component. When switch to a timeline, it actuall change
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
604 # domview._scense_node, parent of all scene nodes of a component, and
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
605 # domview._layers_parent, parent of all layer group of a component.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
606 # domview relys on these two variables to operate on right component
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
607 # and timeline. (It should be changed to get more hint with
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
608 # meaningful names.)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
609 #
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
610 # FIXME: The root node is always the 'main' component. It is a
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
611 # special case with slightly different in structure. It should be
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
612 # removed and normalized to normal components.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
613 #
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
614 @trait
1336
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
615 class component_manager(component_manager_ui_update):
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
616 _scenes_node = require
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
617 _metadata_node = require
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
618 _doc = require
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
619 _root = require
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
620 _layers = require
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
621 _layers_parent = require
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
622 _cur_comp = require
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
623 new_id = require
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
624 get_node = require
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
625 reset = require
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
626
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
627 def __init__(self):
1342
972d749b9656 Move component_manager to a separated object.
Thinker K.F. Li <thinker@codemud.net>
parents: 1340
diff changeset
628 super(component_manager, self).__init__()
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
629 self._components_node = None
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
630 self._components = []
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
631 self._comp_names = set()
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
632 self._main_comp = None
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
633 self._cur_timeline = None
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
634 self._components_group = None
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
635 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
636
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
637 def _set_main_component(self):
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
638 comp = Component(self, None)
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
639 comp.layers = self._layers
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
640 scenes_node = self._scenes_node
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
641 timeline = Timeline(scenes_node)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
642 comp.timelines = [timeline]
1520
8bc2e824f155 Fix various bug of code for parsing finite state machines.
Thinker K.F. Li <thinker@codemud.net>
parents: 1511
diff changeset
643 comp.parse_states()
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
644
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
645 self._components.append(comp)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
646 self._comp_names.add('main')
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
647
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
648 self._main_comp = comp
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
649 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
650
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
651 def _parse_components(self):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
652 comp_names = self._comp_names
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
653 components_node = self._components_node
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
654 for child in components_node.childList():
1428
43369f3314d8 Fix the issue of loading components from SVG.
Thinker K.F. Li <thinker@codemud.net>
parents: 1427
diff changeset
655 child_node_name = child.name()
43369f3314d8 Fix the issue of loading components from SVG.
Thinker K.F. Li <thinker@codemud.net>
parents: 1427
diff changeset
656 if child_node_name != 'ns0:component':
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
657 continue
1428
43369f3314d8 Fix the issue of loading components from SVG.
Thinker K.F. Li <thinker@codemud.net>
parents: 1427
diff changeset
658
43369f3314d8 Fix the issue of loading components from SVG.
Thinker K.F. Li <thinker@codemud.net>
parents: 1427
diff changeset
659 child_name = child.getAttribute('name')
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
660 if child_name in comp_names:
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
661 raise ValueError, 'duplicate component name %s' % (child_name)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
662
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
663 comp = Component(self, child)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
664 comp.parse_timelines()
1465
a3ce8d22d163 Parse states while parsing a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1463
diff changeset
665 comp.parse_states()
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
666
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
667 self._components.append(comp)
1428
43369f3314d8 Fix the issue of loading components from SVG.
Thinker K.F. Li <thinker@codemud.net>
parents: 1427
diff changeset
668
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
669 comp_names.add(child_name)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
670 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
671 pass
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
672
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
673 ## \brief To initialize subtree of metadata.
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
674 #
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
675 # This method is called by domview._init_metadata().
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
676 #
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
677 def _component_manager_init_metadata(self):
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
678 metadata_node = self._metadata_node
1321
6a014a4ec79e Fix missed variable name after refactory
Thinker K.F. Li <thinker@codemud.net>
parents: 1318
diff changeset
679
6a014a4ec79e Fix missed variable name after refactory
Thinker K.F. Li <thinker@codemud.net>
parents: 1318
diff changeset
680 # Make sure ns0:components in metadata
6a014a4ec79e Fix missed variable name after refactory
Thinker K.F. Li <thinker@codemud.net>
parents: 1318
diff changeset
681 for n in metadata_node.childList():
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
682 if n.name() == 'ns0:components':
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
683 self._components_node = n
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
684 break
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
685 pass
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
686 else:
1342
972d749b9656 Move component_manager to a separated object.
Thinker K.F. Li <thinker@codemud.net>
parents: 1340
diff changeset
687 components_node = \
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
688 self._doc.createElement("ns0:components")
1321
6a014a4ec79e Fix missed variable name after refactory
Thinker K.F. Li <thinker@codemud.net>
parents: 1318
diff changeset
689 metadata_node.appendChild(components_node)
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
690 self._components_node = components_node
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
691 pass
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
692
1321
6a014a4ec79e Fix missed variable name after refactory
Thinker K.F. Li <thinker@codemud.net>
parents: 1318
diff changeset
693 # Make sure the group for containing components.
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
694 for n in self._root.childList():
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
695 if n.name() != 'svg:g':
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
696 continue
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
697 try:
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
698 nlabel = n.getAttribute('inkscape:label')
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
699 except:
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
700 continue
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
701 if nlabel == 'components':
1427
5b69baa49a8b Abandon head #6fa411fd9549
Thinker K.F. Li <thinker@codemud.net>
parents: 1419
diff changeset
702 self._components_group = n
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
703 break
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
704 pass
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
705 else: # no components group
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
706 components_group = self._doc.createElement('svg:g')
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
707 components_group.setAttribute('inkscape:label', 'components')
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
708 gid = self.new_id()
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
709 components_group.setAttribute('id', gid)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
710
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
711 self._root.appendChild(components_group)
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
712 self._components_group = components_group
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
713 pass
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
714 pass
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
715
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
716 def _start_component_manager(self):
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
717 self._component_manager_init_metadata()
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
718 self._set_main_component()
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
719 self._parse_components()
1316
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
720
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
721 self._cur_comp = self._main_comp
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
722 tl = self._main_comp.get_timeline('default')
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
723 self._cur_timeline = tl
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
724 self._scenes_node = tl.scenes_node
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
725 pass
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
726
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
727 ## \brief Create component group
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
728 #
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
729 # A component group is a group with a layers group as child.
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
730 # The layers group is where layer groups is in.
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
731 #
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
732 def _create_component_group(self):
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
733 doc = self._doc
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
734 group = doc.createElement('svg:g')
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
735 gid = self.new_id()
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
736 group.setAttribute('id', gid)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
737
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
738 self._components_group.appendChild(group)
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
739
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
740 # Create layers group
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
741 layers_group = doc.createElement('svg:g')
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
742 gid = self.new_id()
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
743 layers_group.setAttribute('id', gid)
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
744 layers_group.setAttribute('inkscape:label', 'layers')
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
745 group.appendChild(layers_group)
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
746
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
747 return group
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
748
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
749 ## \brief Create a ns0:component node for a given name.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
750 #
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
751 # \param comp_name is the name of the created component.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
752 # \param comp_group_id is the component group.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
753 # \return a ns0:component node.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
754 #
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
755 def _create_component_node(self, comp_name, comp_group_id):
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
756 comp_node = self._doc.createElement('ns0:component')
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
757 comp_id = self.new_id()
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
758 comp_node.setAttribute('id', comp_id)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
759 comp_node.setAttribute('name', comp_name)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
760 comp_node.setAttribute('ref', comp_group_id)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
761 self._components_node.appendChild(comp_node)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
762 return comp_node
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
763
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
764 ## \brief Get Component object associated with the given name.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
765 #
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
766 def _get_component(self, comp_name):
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
767 if comp_name in self._comp_names:
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
768 for comp in self._components:
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
769 if comp.name() == comp_name:
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
770 return comp
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
771 pass
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
772 pass
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
773 raise ValueError, 'can not find component node - %s' % (comp_name)
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
774
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
775 ## \brief Create a layer group for give layer of a component.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
776 #
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
777 def _create_comp_layer_group(self, layers_group, layer_name):
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
778 doc = self._doc
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
779 gid = self.new_id()
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
780
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
781 layer_group = doc.createElement('svg:g')
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
782 layer_group.setAttribute('id', gid)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
783 layer_group.setAttribute('inkscape:label', layer_name)
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
784 layer_group.setAttribute('inkscape:groupmode', 'layer')
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
785 layers_group.appendChild(layer_group)
1326
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
786
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
787 return layer_group
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
788
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
789 ## \brief Return group of specified layer in a component.
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
790 #
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
791 # This is here for getting layer group without switch current
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
792 # component.
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
793 #
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
794 def _get_group_of_component_layer(self, comp_name, layer_idx):
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
795 comp = self._get_component(comp_name)
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
796 layer = comp.layers[layer_idx]
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
797 return layer.group
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
798
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
799 def _get_layers_group_of_component(self, comp_name):
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
800 if comp_name == 'main':
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
801 return self._root
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
802
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
803 comp_group = self.get_component_group(comp_name)
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
804 layers_group = comp_group.firstChild()
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
805 assert layers_group.getAttribute('inkscape:label') == 'layers'
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
806
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
807 return layers_group
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
808
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
809 def all_comp_names(self):
1317
e2ad9eb7f7a4 Show timelines correctly
Thinker K.F. Li <thinker@codemud.net>
parents: 1316
diff changeset
810 return [comp.name() for comp in self._components]
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
811
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
812 def has_component(self, name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
813 return name in self._comp_names
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
814
1326
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
815 def hide_component(self, comp_name):
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
816 if comp_name == 'main':
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
817 comp = self._get_component(comp_name)
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
818 for layer in comp.layers:
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
819 group = layer.group
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
820 group.setAttribute('style', 'display: none')
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
821 pass
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
822 return
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
823
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
824 comp_group = self.get_component_group(comp_name)
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
825 comp_group.setAttribute('style', 'display: none')
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
826 pass
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
827
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
828 def show_component(self, comp_name):
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
829 if comp_name == 'main':
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
830 comp = self._get_component(comp_name)
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
831 for layer in comp.layers:
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
832 group = layer.group
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
833 group.setAttribute('style', '')
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
834 pass
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
835 return
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
836
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
837 comp_group = self.get_component_group(comp_name)
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
838 comp_group.setAttribute('style', '')
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
839 pass
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
840
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
841 def switch_component(self, comp_name):
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
842 old_comp = self._cur_comp
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
843
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
844 comp = self._get_component(comp_name)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
845 self._cur_comp = comp
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
846 self._layers = comp.layers
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
847 comp_name = self._cur_comp.name()
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
848 # for domview
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
849 self._layers_parent = \
1342
972d749b9656 Move component_manager to a separated object.
Thinker K.F. Li <thinker@codemud.net>
parents: 1340
diff changeset
850 self._get_layers_group_of_component(comp_name)
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
851
1430
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
852 self.make_sure_timeline()
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
853
1419
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
854 try:
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
855 comp_grp = self.get_component_group(old_comp.name())
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
856 old_comp_existed = True
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
857 except ValueError:
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
858 old_comp_existed = False
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
859 pass
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
860
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
861 if old_comp_existed:
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
862 self.hide_component(old_comp.name())
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
863 pass
3519f43da037 Check old component before hiding it for a component switching.
Thinker K.F. Li <thinker@codemud.net>
parents: 1418
diff changeset
864
1326
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
865 self.show_component(comp.name())
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
866 pass
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
867
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
868 def add_component(self, comp_name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
869 if self.has_component(comp_name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
870 raise ValueError, \
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
871 'try add a component with existed name %s' % (comp_name)
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
872
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
873 comp_group = self._create_component_group()
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
874 comp_group_id = comp_group.getAttribute('id')
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
875 comp_node = self._create_component_node(comp_name, comp_group_id)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
876
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
877 comp = Component(self, comp_node)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
878 comp.parse_timelines()
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
879
1327
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
880 self._components.append(comp)
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
881 self._comp_names.add(comp_name)
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
882
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
883 # Create Layer1 (at least one layer for a component)
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
884 layers_group = self._get_layers_group_of_component(comp_name)
ab281ec3eeec Add a layers group for components
Thinker K.F. Li <thinker@codemud.net>
parents: 1326
diff changeset
885 layer_group = self._create_comp_layer_group(layers_group, 'Layer1')
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
886 layer = Layer(layer_group)
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
887 comp.layers.append(layer)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
888
1326
0a2034f490e5 Show/hide components by showing/hiding component group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1323
diff changeset
889 self.hide_component(comp_name)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
890 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
891
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
892 def add_component_node(self, comp_node):
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
893 comp = Component(self, comp_node)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
894 comp_name = comp.name()
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
895 if self.has_component(comp_name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
896 raise ValueError, \
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
897 'the name of a ns0:component is duplicated'
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
898
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
899 self._components.append(comp)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
900 self._comp_names.add(comp_name)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
901 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
902
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
903 def rm_component(self, comp_name):
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
904 comp = self._get_component(comp_name)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
905 comp_name = comp.name()
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
906 comp_node = comp.node
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
907 comp_group = self.get_component_group(comp_name)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
908
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
909 self._components.remove(comp)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
910 self._comp_names.remove(comp_name)
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
911 self._components_node.removeChild(comp_node)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
912 self._components_group.removeChild(comp_group)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
913 pass
1331
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
914
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
915 def rename_component(self, comp_name, new_name):
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
916 comp = self._get_component(comp_name)
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
917 comp.rename(new_name)
1459
8eecaca2a125 Fix bug when renaming component
Thinker K.F. Li <thinker@codemud.net>
parents: 1432
diff changeset
918 self._comp_names.remove(comp_name)
8eecaca2a125 Fix bug when renaming component
Thinker K.F. Li <thinker@codemud.net>
parents: 1432
diff changeset
919 self._comp_names.add(new_name)
1331
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
920 pass
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
921
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
922 def get_component_group(self, comp_name):
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
923 comp = self._get_component(comp_name)
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
924
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
925 comp_name = comp.name()
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
926 if comp_name == 'main':
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
927 return self._root
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
928
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
929 comp_node = comp.node
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
930 gid = comp_node.getAttribute('ref')
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
931 comp_group = self.get_node(gid)
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
932 return comp_group
1316
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
933
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
934 def get_current_component(self):
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
935 return self._cur_comp.name()
1344
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
936
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
937 ## \brief Hide scene groups of current timeline.
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
938 #
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
939 # This method all scene groups of current timeline invisible.
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
940 #
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
941 def _hide_current_timeline(self):
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
942 tl = self._cur_timeline
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
943 scenes_node = tl.scenes_node
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
944 for child in scenes_node.childList():
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
945 if child.name() != 'ns0:scene':
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
946 continue
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
947 gid = child.getAttribute('ref')
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
948 group = self.get_node(gid)
1344
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
949 group.setAttribute('style', 'display: none')
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
950 pass
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
951 pass
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
952
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
953 def switch_timeline(self, timeline_name):
1344
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
954 if self._cur_timeline:
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
955 self._hide_current_timeline()
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
956 pass
8f1f8ef5c9ea Hide scene groups of old timeline when switching to a new timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1343
diff changeset
957
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
958 tl = self._cur_comp.get_timeline(timeline_name)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
959 self._cur_timeline = tl
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
960 self._scenes_node = tl.scenes_node # of class domview
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
961
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
962 # Make domview to rescan layers and scenes.
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
963 self.reset() # from domview
1430
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
964
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
965 cur_comp_name = self.get_current_component()
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
966 cur_comp_node = self.get_component_group(cur_comp_name)
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
967 cur_comp_node.setAttribute("cur_timeline", timeline_name)
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
968 pass
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
969
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
970 def make_sure_timeline(self):
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
971 cur_comp_name = self.get_current_component()
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
972 cur_comp_node = self.get_component_group(cur_comp_name)
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
973 try:
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
974 timeline_name = cur_comp_node.getAttribute("cur_timeline")
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
975 except KeyError:
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
976 timeline_name = self.all_timeline_names()[0]
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
977 pass
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
978 self._cur_timeline = None
bf405cb2d7cb Switch to latest timeline when switching back to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1429
diff changeset
979 self.switch_timeline(timeline_name)
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
980 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
981
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
982 def add_timeline(self, timeline_name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
983 self._cur_comp.add_timeline(timeline_name)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
984 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
985
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
986 def rm_timeline(self, timeline_name):
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
987 self._cur_comp.rm_timeline(timeline_name)
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
988 pass
1306
8c0a4684c1f7 Expose methods from component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1302
diff changeset
989
1331
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
990 def rename_timeline_of_component(self, timeline_name, new_name, comp_name):
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
991 comp = self._get_component(comp_name)
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
992 comp.rename_timeline(timeline_name, new_name)
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
993 pass
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
994
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
995 def rename_timeline(self, timeline_name, new_name):
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
996 comp_name = self._cur_comp.name()
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
997 self.rename_timeline_of_component(timeline_name, new_name, comp_name)
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
998 pass
5da64f67d00d Rename components and timelines with context menu
Thinker K.F. Li <thinker@codemud.net>
parents: 1328
diff changeset
999
1306
8c0a4684c1f7 Expose methods from component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1302
diff changeset
1000 def all_timeline_names(self):
8c0a4684c1f7 Expose methods from component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1302
diff changeset
1001 r = self._cur_comp.all_timeline_names()
8c0a4684c1f7 Expose methods from component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1302
diff changeset
1002 return r
8c0a4684c1f7 Expose methods from component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1302
diff changeset
1003
8c0a4684c1f7 Expose methods from component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1302
diff changeset
1004 def has_timeline(self, name):
8c0a4684c1f7 Expose methods from component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1302
diff changeset
1005 r = self._cur_comp.has_timeline(name)
8c0a4684c1f7 Expose methods from component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1302
diff changeset
1006 return r
1316
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
1007
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
1008 def get_current_timeline(self):
9ab8d50dcf7e Refactory code of refreshing UI
Thinker K.F. Li <thinker@codemud.net>
parents: 1315
diff changeset
1009 return self._cur_timeline.name()
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1010
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1011 ## \brief Add a new component from a group node.
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1012 #
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1013 # The group node is reparented to the group of first layer of
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1014 # specified component.
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1015 #
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1016 def mv_group_to_component(self, group, comp_name):
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1017 group_parent = group.parent()
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1018 if group_parent:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1019 group_parent.removeChild(group)
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1020 pass
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1021
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1022 layer_group = self._get_group_of_component_layer(comp_name, 0)
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1023 layer_group.appendChild(group)
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1024 pass
1328
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1025
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1026 ## \brief Create a link to a component.
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1027 #
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1028 # \param parent_group is where the link will be pliaced in.
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1029 # \return link node.
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1030 #
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1031 def link_to_component(self, comp_name, parent_group):
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1032 layers_group = self._get_layers_group_of_component(comp_name)
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1033
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
1034 use_node = self._doc.createElement('svg:use')
1328
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1035 layers_group_id = layers_group.getAttribute('id')
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1036 use_node.setAttribute('xlink:href', '#' + layers_group_id)
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
1037 use_node_id = self.new_id()
1328
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1038 use_node.setAttribute('id', use_node_id)
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1039 use_node.setAttribute('use_component', 'true')
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1040
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1041 parent_group.appendChild(use_node)
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1042
407f321f0d7c Add a svg:use after transform a group to a component
Thinker K.F. Li <thinker@codemud.net>
parents: 1327
diff changeset
1043 return use_node
1431
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1044
1432
8e8c9ab3818f Add documentation
Thinker K.F. Li <thinker@codemud.net>
parents: 1431
diff changeset
1045 ## \brief Remember current frame and layer on the scenes node.
8e8c9ab3818f Add documentation
Thinker K.F. Li <thinker@codemud.net>
parents: 1431
diff changeset
1046 #
1431
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1047 def remember_current_frame(self, layer_idx, frame_idx):
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1048 if not isinstance(layer_idx, int):
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1049 raise TypeError, 'layer index should be a integer'
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1050 if not isinstance(frame_idx, int):
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1051 raise TypeError, 'frame index should be a integer'
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1052
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1053 timeline_name = self.get_current_timeline()
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1054 timeline = self._cur_comp.get_timeline(timeline_name)
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1055 timeline_scenes = timeline.scenes_node
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1056 timeline_scenes.setAttribute('cur_layer', str(layer_idx))
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1057 timeline_scenes.setAttribute('cur_frame', str(frame_idx))
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1058 pass
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1059
1432
8e8c9ab3818f Add documentation
Thinker K.F. Li <thinker@codemud.net>
parents: 1431
diff changeset
1060 ## \brief Get current frame and layer from the scenes node.
8e8c9ab3818f Add documentation
Thinker K.F. Li <thinker@codemud.net>
parents: 1431
diff changeset
1061 #
1431
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1062 def get_current_frame(self):
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1063 timeline_name = self.get_current_timeline()
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1064 timeline = self._cur_comp.get_timeline(timeline_name)
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1065 timeline_scenes = timeline.scenes_node
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1066 try:
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1067 cur_layer = timeline_scenes.getAttribute('cur_layer')
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1068 except KeyError:
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1069 cur_layer_idx = 0
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1070 else:
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1071 cur_layer_idx = int(cur_layer)
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1072 pass
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1073 try:
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1074 cur_frame = timeline_scenes.getAttribute('cur_frame')
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1075 except KeyError:
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1076 cur_frame_idx = 0
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1077 else:
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1078 cur_frame_idx = int(cur_frame)
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1079 pass
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1080
60f2c9a24cdb Keep the same active layer and frame when switching back a timeline.
Thinker K.F. Li <thinker@codemud.net>
parents: 1430
diff changeset
1081 return cur_layer_idx, cur_frame_idx
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1082 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1083
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1084
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1085 ## \brief A trait for management FSM associated with current component.
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1086 #
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1087 @trait
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1088 class FSM_manager(object):
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1089 _get_component = require
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1090
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1091 def __init__(self):
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1092 super(FSM_manager, self).__init__()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1093 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1094
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1095 def all_state_names(self, comp_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1096 comp = self._get_component(comp_name)
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1097 return comp.all_state_names()
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1098
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1099 def get_start_state_name(self, comp_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1100 comp = self._get_component(comp_name)
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1101 return comp.get_start_state_name()
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1102
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1103 ## \brief To return state object for the given name.
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1104 #
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1105 # This method should only be used by component_manager internally.
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1106 #
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1107 def _get_state(self, comp_name, state_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1108 comp = self._get_component(comp_name)
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1109 return comp.get_state(state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1110
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1111 def rm_state(self, comp_name, state_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1112 comp = self._get_component(comp_name)
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1113 comp.rm_state(state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1114 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1115
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1116 def add_state(self, comp_name, state_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1117 comp = self._get_component(comp_name)
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1118 comp.add_state(state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1119 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1120
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1121 def rename_state(self, comp_name, state_name, new_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1122 comp = self._get_component(comp_name)
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1123 comp.rename_state(state_name, new_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1124 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1125
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1126 def set_start_state(self, comp_name, state_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1127 comp = self._get_component(comp_name)
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1128 comp.set_start_state(state_name)
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1129 pass
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1130
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1131 def set_state_entry_action(self, comp_name, state_name, entry_action):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1132 state = self._get_state(comp_name, state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1133 state.set_entry_action(entry_action)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1134 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1135
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1136 def set_state_r(self, comp_name, state_name, r):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1137 state = self._get_state(comp_name, state_name)
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1138 state.set_r(r)
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1139 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1140
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1141 def set_state_xy(self, comp_name, state_name, x, y):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1142 state = self._get_state(comp_name, state_name)
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1143 state.set_xy(x, y)
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1144 pass
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1145
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1146 def get_state_entry_action(self, comp_name, state_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1147 state = self._get_state(comp_name, state_name)
1506
f185a9d23a30 _FSM_popup handles edit state
Thinker K.F. Li <thinker@codemud.net>
parents: 1501
diff changeset
1148 action = state.entry_action
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1149 return action
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1150
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1151 def get_state_r(self, comp_name, state_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1152 state = self._get_state(comp_name, state_name)
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1153 r = state.r
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1154 return r
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1155
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1156 def get_state_xy(self, comp_name, state_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1157 state = self._get_state(comp_name, state_name)
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1158 xy = state.x, state.y
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1159 return xy
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1160
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1161 def all_transitions(self, comp_name, state_name):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1162 state = self._get_state(comp_name, state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1163 trn_names = state.all_transitions()
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1164 return trn_names
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1165
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1166 def add_transition(self, comp_name, state_name, cond, target):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1167 state = self._get_state(comp_name, state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1168 state.add_transition(cond, target)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1169 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1170
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1171 def rm_transition(self, comp_name, state_name, cond):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1172 state = self._get_state(comp_name, state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1173 state.rm_transition(cond)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1174 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1175
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1176 def change_transition_cond(self, comp_name, state_name,
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1177 old_cond, new_cond):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1178 state = self._get_state(comp_name, state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1179 state.change_transition_cond(old_cond, new_cond)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1180 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1181
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1182 def get_transition(self, comp_name, state_name, cond):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1183 state = self._get_state(comp_name, state_name)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1184 trn = state.get_transition(cond)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1185
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1186 cond = trn.condition
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1187 target = trn.target
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1188 action = trn.action
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1189 path = trn.path
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1190
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1191 return cond, target, action, path
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1192
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1193 def set_transition_action(self, comp_name, state_name, cond, action):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1194 state = self._get_state(comp_name, state_name)
1470
2a9b9c281f80 Fix wiring error
Thinker K.F. Li <thinker@codemud.net>
parents: 1469
diff changeset
1195 trn = state.get_transition(cond)
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1196 trn.set_action(action)
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1197 pass
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1198
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1199 def set_transition_path(self, comp_name, state_name, cond, path):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1200 state = self._get_state(comp_name, state_name)
1470
2a9b9c281f80 Fix wiring error
Thinker K.F. Li <thinker@codemud.net>
parents: 1469
diff changeset
1201 trn = state.get_transition(cond)
1469
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1202 trn.set_path(path)
c1e70540541c Drawing functions for states and transitions
Thinker K.F. Li <thinker@codemud.net>
parents: 1468
diff changeset
1203 pass
1501
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
1204
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1205 def chg_transition_cond(self, comp_name, state_name, cond, new_cond):
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1206 state = self._get_state(comp_name, state_name)
1501
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
1207 state.chg_transition_cond(cond, new_cond)
4a57650bb926 Apply changes returned from transition editor
Thinker K.F. Li <thinker@codemud.net>
parents: 1470
diff changeset
1208 pass
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1209 pass
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1210
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1211
1350
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1212 ## \brief Parser for scenes nodes.
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1213 #
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1214 # This class parses scenes nodes and collect ID of all nodes.
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1215 #
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1216 @trait
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1217 class scenes_parser(object):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1218 _root = require
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1219 _scenes_node = require
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1220 _id2node = require
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1221 _group2scene = require
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1222 current = require
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1223 _maxframe = require
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1224
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1225 def _find_maxframe(self, scenes_node):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1226 maxframe = 0
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1227 for child in scenes_node.childList():
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1228 if child.name() != 'ns0:scene':
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1229 continue
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1230
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1231 try:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1232 start = child.getAttribute('start')
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1233 maxframe = max(int(start), maxframe)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1234 except:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1235 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1236 try:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1237 end = child.getAttribute('end')
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1238 maxframe = max(int(end), maxframe)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1239 except:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1240 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1241 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1242 return maxframe
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1243
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1244 ## \brief Collect ID of nodes in the document.
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1245 #
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1246 # It is used to implement a fast mapping from an ID to the respective node.
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1247 #
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1248 def _collect_node_ids(self):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1249 self._id2node = {}
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1250 root = self._root
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1251 for n in root.childList():
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1252 self._collect_node_ids_recursive(n)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1253 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1254 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1255
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1256 def _collect_node_ids_recursive(self, node):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1257 try:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1258 node_id = node.getAttribute('id')
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1259 except:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1260 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1261 else:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1262 self._id2node[node_id] = node
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1263 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1264
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1265 for n in node.childList():
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1266 self._collect_node_ids_recursive(n)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1267 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1268 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1269
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1270 def parse_one_scene(self, scene_node):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1271 assert scene_node.name() == 'ns0:scene'
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1272
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1273 start = int(scene_node.getAttribute("start"))
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1274 try:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1275 end = int(scene_node.getAttribute("end"))
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1276 except:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1277 end = start
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1278 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1279
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1280 try:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1281 scene_type = scene_node.getAttribute('type')
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1282 if scene_type == None:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1283 scene_type = 'normal'
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1284 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1285 except:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1286 scene_type = 'normal'
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1287 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1288
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1289 return start, end, scene_type
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1290
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1291 def _parse_one_scenes(self, scenes_node):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1292 try:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1293 cur = int(n.getAttribute("current"))
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1294 except:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1295 cur = 0
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1296 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1297 self.current = cur
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1298
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1299 for scene_node in scenes_node.childList():
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1300 if scene_node.name() != 'ns0:scene':
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1301 continue
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1302
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1303 try:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1304 start, end, scene_type = self.parse_one_scene(scene_node)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1305 group_id = scene_node.getAttribute("ref")
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1306 except: # the scene node is incompleted.
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1307 continue
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1308
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1309 self._group2scene[group_id] = scene_node
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1310 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1311 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1312
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1313 ## \brief Parse all scenes node in svg:metadata subtree.
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1314 #
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1315 def _collect_all_scenes(self):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1316 scenes_node = self._scenes_node
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1317 self._parse_one_scenes(scenes_node)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1318 self._maxframe = self._find_maxframe(scenes_node)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1319 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1320 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1321
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1322 ## \brief Return the node with given ID.
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1323 #
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1324 def get_node(self, node_id):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1325 value = self._id2node[node_id]
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1326 if isinstance(value, list):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1327 return value[-1]
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1328 return value
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1329
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1330 ## \brief Return a scene node corresponding to a scene group of given ID.
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1331 #
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1332 def get_scene(self, group_id):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1333 return self._group2scene[group_id]
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1334
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1335 def new_id(self):
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1336 while True:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1337 candidate = 's%d' % int(random.random()*100000)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1338 if candidate not in self._id2node:
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1339 return candidate
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1340 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1341 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1342 pass
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1343
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1344 ## \brief Monitor changes of DOM-tree.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1345 #
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1346 # This class monitors DOM-tree to maintain _maxframe and maps for node ID to
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1347 # node and scene group ID to scene node.
1350
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1348 @composite
1244
b241f9768833 Remove MBScene_ from the prefix of class names.
Thinker K.F. Li <thinker@codemud.net>
parents: 1243
diff changeset
1349 class domview_monitor(object):
1350
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1350 use_traits = (scenes_parser,)
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1351
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1352 method_map_traits = {
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1353 scenes_parser._find_maxframe: '_find_maxframe',
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1354 scenes_parser._collect_all_scenes: '_collect_all_scenes',
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1355 scenes_parser._collect_node_ids: '_collect_node_ids'}
17fa5d78200b Refactory domview_monitor to move code to scenes_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1348
diff changeset
1356
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1357 def __init__(self, *args, **kws):
1244
b241f9768833 Remove MBScene_ from the prefix of class names.
Thinker K.F. Li <thinker@codemud.net>
parents: 1243
diff changeset
1358 super(domview_monitor, self).__init__()
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1359
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1360 self._maxframe = 0
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1361 self._id2node = {} # map ID to the node in the DOM tree.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1362 self._group2scene = {} # map ID of a group to associated scene node.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1363 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1364
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1365 def _start_monitor(self):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1366 self._collect_node_ids()
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1367 self._collect_all_scenes()
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1368
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1369 doc = self._doc
1253
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1247
diff changeset
1370 dom_event.addEventListener(doc, 'DOMNodeInserted',
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1247
diff changeset
1371 self._on_insert_node, None)
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1247
diff changeset
1372 dom_event.addEventListener(doc, 'DOMNodeRemoved',
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1247
diff changeset
1373 self._on_remove_node, None)
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1247
diff changeset
1374 dom_event.addEventListener(doc, 'DOMAttrModified',
07e0cb1e051d Add class consistency_checker for domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1247
diff changeset
1375 self._on_attr_modified, None)
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1376 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1377
1340
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1378 ## \brief Add a node to id2node mapping.
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1379 #
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1380 # domview_monitor._id2node is a multiple mapping to map a key to
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1381 # multiple node. The reason that it is not a single mapping is
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1382 # Inkscape would insert a node with the ID from the node been
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1383 # copied, and change its ID to a unique one later. So, we must
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1384 # provide the capability to handle two or more nodes with the same
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1385 # ID.
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1386 def _map_id2node(self, node, node_id):
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1387 if node_id in self._id2node:
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1388 old_value = self._id2node[node_id]
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1389 if isinstance(old_value, list):
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1390 old_value.append(node)
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1391 else:
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1392 self._id2node[node_id] = [old_value, node]
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1393 pass
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1394 else:
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1395 self._id2node[node_id] = node
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1396 pass
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1397 pass
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1398
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1399 def _unmap_id2node(self, node, node_id):
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1400 if node_id not in self._id2node:
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1401 raise ValueError, 'invalide node ID (%s)' % (node_id)
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1402
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1403 value = self._id2node[node_id]
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1404 if isinstance(value, list):
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1405 value.remove(node)
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1406 if not value:
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1407 del self._id2node[node_id]
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1408 pass
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1409 pass
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1410 else:
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1411 del self._id2node[node_id]
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1412 pass
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1413 pass
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1414
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1415 ## \brief Rescan the tree.
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1416 #
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
1417 def _monitor_reparse(self):
1301
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1418 self._maxframe = 0
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1419 self._id2node = {}
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1420 self._group2scene = {}
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1421
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1422 self._collect_node_ids()
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1423 self._collect_all_scenes()
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1424 pass
18af917cf855 Add component_manager as a mix-in of domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1299
diff changeset
1425
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1426 def _on_insert_node(self, node, child):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1427 for cchild in child.childList():
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1428 self._on_insert_node(child, cchild)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1429 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1430
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1431 try:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1432 child_id = child.getAttribute('id')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1433 except:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1434 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1435 else:
1340
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1436 self._map_id2node(child, child_id)
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1437 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1438
1318
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1439 if child.name() == 'ns0:scene' and _id_eq(node, self._scenes_node):
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1440 try:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1441 ref = child.getAttribute('ref')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1442 except:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1443 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1444 else:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1445 if ref not in self._group2scene:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1446 self._group2scene[ref] = child
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1447 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1448 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1449
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1450 try:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1451 start = child.getAttribute('start')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1452 self._maxframe = max(int(start), self._maxframe)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1453 except:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1454 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1455 try:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1456 start = child.getAttribute('end')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1457 self._maxframe = max(int(start), self._maxframe)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1458 except:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1459 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1460 pass
1265
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
1461 pass
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1462
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1463 def _on_remove_node(self, node, child):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1464 for cchild in child.childList():
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1465 self._on_remove_node(child, cchild)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1466 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1467
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1468 try:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1469 child_id = child.getAttribute('id')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1470 except:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1471 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1472 else:
1340
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1473 self._unmap_id2node(child, child_id)
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1474 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1475
1318
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1476 if child.name() == 'ns0:scene' and _id_eq(node, self._scenes_node):
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1477 try:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1478 ref = child.getAttribute('ref')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1479 except:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1480 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1481 else:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1482 del self._group2scene[ref]
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1483 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1484
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1485 try:
1318
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1486 if int(child.getAttribute('start')) == self._maxframe or \
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1487 int(child.getAttribute('end')) == self._maxframe:
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1488 self._maxframe = self._find_maxframe(node)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1489 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1490 except:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1491 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1492 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1493 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1494
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1495 def _on_attr_modified(self, node, name, old_value, new_value):
1318
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1496 if old_value == new_value:
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1497 return
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1498
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1499 if name == 'id':
1340
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1500 if old_value and old_value in self._id2node:
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1501 self._unmap_id2node(node, old_value)
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1502 pass
1336
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
1503 if new_value:
1340
10d5f06f7566 Fix issue of shouting error when removing a node.
Thinker K.F. Li <thinker@codemud.net>
parents: 1336
diff changeset
1504 self._map_id2node(node, new_value)
1336
0b5ee9c90af7 Update components and timelines list for async changes on DOM
Thinker K.F. Li <thinker@codemud.net>
parents: 1331
diff changeset
1505 pass
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1506 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1507 elif name == 'ref' and node.name() == 'ns0:scene':
1318
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1508 parent_node = node.parent()
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1509 scenes_node = self._scenes_node
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1510 if not _id_eq(parent_node, scenes_node):
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1511 return # not in current timeline
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1512
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1513 if old_value:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1514 node = self._group2scene[old_value] # use old node. Binding
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1515 # may generate a new
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1516 # wrapper.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1517 del self._group2scene[old_value]
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1518 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1519 if new_value:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1520 self._group2scene[new_value] = node
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1521 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1522 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1523 elif (name in ('start', 'end')) and node.name() == 'ns0:scene':
1318
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1524 parent_node = node.parent()
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1525 scenes_node = self._scenes_node
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1526 if not _id_eq(parent_node, scenes_node):
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1527 return # not in current timeline
b1776f441e8a Fix issue of parsing scene nodes
Thinker K.F. Li <thinker@codemud.net>
parents: 1317
diff changeset
1528
1276
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1529 try:
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1530 new_value = int(new_value)
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1531 old_value = int(old_value)
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1532 except TypeError:
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1533 self._maxframe = self._find_maxframe(scenes_node)
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1534 else:
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1535 if old_value == self._maxframe and old_value > new_value:
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1536 # _maxframe may be reduced.
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1537 self._maxframe = self._find_maxframe(scenes_node)
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1538 else:
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1539 self._maxframe = max(int(new_value), self._maxframe)
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1540 pass
0442ae9c2ac2 Fix bug of max frame of domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1275
diff changeset
1541 pass
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1542 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1543 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1544 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1545
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1546
1246
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1547 ## \brief Iterator to travel a sub-tree of DOM.
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1548 #
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1549 def _DOM_iterator(node):
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1550 nodes = [node]
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1551 while nodes:
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1552 node = nodes.pop(0)
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1553 child = node.firstChild()
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1554 while child:
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1555 nodes.append(child)
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1556 child = child.next()
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1557 pass
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1558 yield node
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1559 pass
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1560 pass
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1561
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
1562
1352
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1563 @trait
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1564 class layers_parser(object):
1356
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1565 _doc = require
1352
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1566 _layers = require
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1567 _layers_parent = require
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1568 get_scene = require
1356
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1569 get_node = require
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1570 new_id = require
1352
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1571
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1572 def parse_all_layers(self):
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1573 layers = self._layers
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1574 layers_parent = self._layers_parent
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1575
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1576 for child in layers_parent.childList():
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1577 if child.name() != 'svg:g':
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1578 continue
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1579
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1580 try:
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1581 label = child.getAttribute('inkscape:label')
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1582 except:
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1583 pass
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1584 else: # has no label
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1585 if label == 'components':
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1586 continue
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1587 pass
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1588
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1589 layer_group = child
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1590 layer = Layer(layer_group)
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1591 layer.idx = len(layers)
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1592 layers.append(layer)
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1593 self.parse_layer(layer.idx)
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1594 pass
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1595 pass
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1596
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1597 def parse_layer(self, layer_idx):
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1598 layer = self._layers[layer_idx]
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1599 layer_group = layer.group
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1600
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1601 for child in layer_group.childList():
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1602 if child.name() != 'svg:g':
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1603 continue
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1604 try:
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1605 child_id = child.getAttribute('id')
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1606 scene_node = self.get_scene(child_id)
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1607 except:
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1608 continue
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1609
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1610 layer.scenes.append(scene_node)
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1611 pass
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1612 pass
1354
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1613
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1614 def get_layer_num(self):
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1615 return len(self._layers)
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1616
1356
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1617 ## \brief Add/insert a layer at given position.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1618 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1619 # \param layer_idx is the position in the layer list.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1620 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1621 def insert_layer(self, layer_idx, layer_group):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1622 layers = self._layers
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1623
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1624 layer = Layer(layer_group)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1625 if layer_idx >= len(layers):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1626 layers.append(layer)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1627 else:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1628 layers.insert(layer_idx, layer)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1629 for idx in range(layer_idx, len(layers)):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1630 layers[idx].idx = idx
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1631 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1632 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1633 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1634
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1635 ## \brief Manage a existed layer group
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1636 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1637 # This method scan layer groups of all managed layers, and find a
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1638 # proper place to insert it.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1639 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1640 # \return -1 for error, or layer index.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1641 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1642 def manage_layer_group(self, layer_group_id):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1643 layer_group = self.get_node(layer_group_id)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1644 new_layer = Layer(layer_group)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1645
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1646 if not self._layers:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1647 new_layer.idx = 0
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1648 self._layers.append(new_layer)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1649 return 0
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1650
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1651 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1652 # Scan who is after the given group
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1653 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1654 next_group = layer_group.next()
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1655 while next_group:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1656 next_group_id = next_group.getAttribute('id')
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1657
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1658 for vlayer in self._layers:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1659 vlayer_group_id = vlayer.group.getAttribute('id')
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1660 if vlayer_group_id == next_group_id:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1661 # This layer group is after given one.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1662 self._layers.insert(vlayer.idx, new_layer)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1663
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1664 for idx in range(vlayer.idx, len(self._layers)):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1665 self._layers[idx].idx = idx
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1666 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1667 return new_layer.idx
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1668 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1669
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1670 next_group = next_group.next()
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1671 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1672
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1673 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1674 # Is the given group after last layer group?
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1675 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1676 tail_group = self._layers[-1].group.next()
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1677 while tail_group:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1678 tail_group_id = tail_group.getAttribute('id')
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1679
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1680 if tail_group_id == layer_group_id:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1681 # it is after last layer group.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1682 new_layer.idx = len(self._layers)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1683 self._layers.append(new_layer)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1684 return new_layer.idx
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1685
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1686 tail_group = tail_group.next()
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1687 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1688
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1689 return -1 # error, can not determinze the position
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1690
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1691 ## \brief Remove layer and associated scene nodes and scene groups.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1692 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1693 def rm_layer(self, layer_idx):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1694 layers = self._layers
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1695
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1696 layer = self._layers[layer_idx]
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1697 for scene_node in layer.scenes:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1698 scene_group_id = scene_node.getAttribute('ref')
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1699 try:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1700 scene_group_node = self.get_node(scene_group_id)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1701 if scene_group_node.parent(): # keep from crashing
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1702 scene_group_node.parent().removeChild(scene_group_node)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1703 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1704 except:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1705 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1706
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1707 if scene_node.parent(): # keep from crashing
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1708 scene_node.parent().removeChild(scene_node)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1709 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1710 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1711
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1712 del layers[layer_idx]
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1713
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1714 for idx in range(layer_idx, len(layers)):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1715 layers[idx].idx = idx
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1716 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1717 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1718
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1719 def get_layer_group(self, layer_idx):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1720 layer = self._layers[layer_idx]
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1721 return layer.group
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1722
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1723 def get_all_scene_node_of_layer(self, layer_idx):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1724 layer = self._layers[layer_idx]
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1725 return layer.scenes
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1726
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1727 def get_layer_data(self, layer_idx):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1728 layer = self._layers[layer_idx]
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1729 try:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1730 data = layer.data
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1731 except:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1732 return None
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1733 return data
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1734
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1735 def set_layer_data(self, layer_idx, data):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1736 layer = self._layers[layer_idx]
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1737 layer.data = data
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1738 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1739
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1740 def create_layer_dup_group(self, layer_idx):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1741 layer = self._layers[layer_idx]
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1742
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1743 dup_group = self._doc.createElement('svg:g')
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1744 gid = self.new_id()
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1745 dup_group.setAttribute('id', gid)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1746 dup_group.setAttribute('inkscape:label', 'dup')
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1747 dup_group.setAttribute('sodipodi:insensitive', '1')
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1748 dup_group.setAttribute('style', '')
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1749
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1750 layer.group.appendChild(dup_group)
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1751
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1752 return dup_group
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1753
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1754 ## \brief Return associated layer index of given layer group.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1755 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1756 # \return -1 for error.
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1757 #
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1758 def find_layer_of_group(self, group_id):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1759 for layer_idx, layer in enumerate(self._layers):
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1760 if layer.group.getAttribute('id') == group_id:
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1761 return layer_idx
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1762 pass
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1763 return -1
ac61d86987af Move more code to layers_parser
Thinker K.F. Li <thinker@codemud.net>
parents: 1354
diff changeset
1764
1354
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1765 def reset_layers(self):
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1766 self._layers[:] = []
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1767 self.parse_all_layers()
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1768 pass
1352
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1769 pass
9164a0782ba7 Refactory layer_parser out from domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1350
diff changeset
1770
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1771 ## \brief This layer provide a data view to the DOM-tree.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1772 #
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1773 # This class maintains layers information, and provides functions to create,
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1774 # change and destroy scene node and scene group. A scene node is a 'ns0:scene'
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1775 # in 'ns0:scenes' tag. A scene group is respective 'svg:g' for a scene.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1776 #
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
1777 @composite
1342
972d749b9656 Move component_manager to a separated object.
Thinker K.F. Li <thinker@codemud.net>
parents: 1340
diff changeset
1778 class domview(domview_monitor):
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1779 use_traits = (component_manager, layers_parser, FSM_manager)
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
1780
1348
22a79dcbaec6 Change structure of provide_traits and method_map_traits
Thinker K.F. Li <thinker@codemud.net>
parents: 1345
diff changeset
1781 method_map_traits = {component_manager._start_component_manager:
1511
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1782 '_start_component_manager',
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1783 component_manager._get_component:
4c349b214877 FSM_window use _compview to decorate domview.
Thinker K.F. Li <thinker@codemud.net>
parents: 1506
diff changeset
1784 '_get_component'}
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
1785
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1786 # Declare variables, here, for keeping tracking
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1787 _doc = None
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1788 _root = None
1463
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1789 # Required by component_manager and FSM_manager
5ff744b981fb FSM manager and data types
Thinker K.F. Li <thinker@codemud.net>
parents: 1459
diff changeset
1790 _cur_comp = None
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1791
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1792 def __init__(self, *args, **kws):
1244
b241f9768833 Remove MBScene_ from the prefix of class names.
Thinker K.F. Li <thinker@codemud.net>
parents: 1243
diff changeset
1793 super(domview, self).__init__()
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
1794 self._metadata_node = None
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
1795 #
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
1796 # Following two variables would be changed by class
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
1797 # component_manager to switch components and timelines.
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
1798 #
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
1799 self._scenes_node = None
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
1800 self._layers_parent = None
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
1801 self._layers = []
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1802 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1803
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1804 ## \brief Create a scenes node if not existed.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1805 #
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1806 def _init_metadata(self):
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
1807 self._layers_parent = self._root
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
1808
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1809 for node in self._root.childList():
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1810 if node.name() == 'svg:metadata':
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1811 break
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1812 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1813 else:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1814 raise RuntimeError, \
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1815 'can not find <svg:metadata> node in the document'
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
1816
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
1817 self._metadata_node = node
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1818
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1819 for n in node.childList():
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1820 if n.name() == 'ns0:scenes':
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1821 self._scenes_node = n
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1822 break
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1823 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1824 else:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1825 ns = "http://madbutterfly.sourceforge.net/DTD/madbutterfly.dtd"
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1826 self._root.setAttribute("xmlns:ns0", ns)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1827 scenes_node = self._doc.createElement("ns0:scenes")
1322
7f25abbc1b61 Assign a name and ID for scenes node of main component
Thinker K.F. Li <thinker@codemud.net>
parents: 1321
diff changeset
1828 scenes_node_id = 'main_default_scenes'
7f25abbc1b61 Assign a name and ID for scenes node of main component
Thinker K.F. Li <thinker@codemud.net>
parents: 1321
diff changeset
1829 scenes_node.setAttribute('id', scenes_node_id)
7f25abbc1b61 Assign a name and ID for scenes node of main component
Thinker K.F. Li <thinker@codemud.net>
parents: 1321
diff changeset
1830 scenes_node.setAttribute('name', 'default')
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1831 node.appendChild(scenes_node)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1832 self._scenes_node = scenes_node
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1833 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1834 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1835
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1836 def handle_doc_root(self, doc, root):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1837 self._doc = doc
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1838 self._root = root
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1839
1315
fcff6978f9bf User can switch components.
Thinker K.F. Li <thinker@codemud.net>
parents: 1310
diff changeset
1840 self._init_metadata()
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
1841 self._start_monitor() # from domview_monitor
1345
e0400a2b7c35 Use trait instead of mixin for component_manager
Thinker K.F. Li <thinker@codemud.net>
parents: 1344
diff changeset
1842 self._start_component_manager()
1354
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1843 self.reset_layers()
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1844 pass
1265
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
1845
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
1846 def reset(self):
1302
c53331c55a23 Refactory domview to more clear responsibilities
Thinker K.F. Li <thinker@codemud.net>
parents: 1301
diff changeset
1847 self._monitor_reparse() # from domview_monitor
1354
f92be354ad24 Refactory code to layer_parser.reset_layers()
Thinker K.F. Li <thinker@codemud.net>
parents: 1352
diff changeset
1848 self.reset_layers()
1265
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
1849 pass
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1850
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1851 def dumpattr(self, n):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1852 s = ""
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1853 for a,v in n.attrib.items():
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1854 s = s + ("%s=%s" % (a,v))
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1855 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1856 return s
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1857
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1858 def dump(self, node, l=0):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1859 print " " * l*2,"<", node.tag, self.dumpattr(node),">"
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1860 for n in node:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1861 self.dump(n, l+1)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1862 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1863 print " " * l * 2,"/>"
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1864 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1865
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1866 ## \brief Create and add a ns0:scene node under ns0:scenes subtree.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1867 #
1247
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1868 def add_scene_node(self, layer_idx, start, end,
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1869 frame_type=TweenObject.TWEEN_TYPE_NORMAL,
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1870 ref=None):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1871 type_names = ('normal', 'scale')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1872 scenes_node = self._scenes_node
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1873 doc = self._doc
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1874
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1875 scene_node = doc.createElement('ns0:scene')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1876 self.chg_scene_node(scene_node, start=start)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1877 if start != end:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1878 self.chg_scene_node(scene_node, end=end)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1879 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1880 type_name = type_names[frame_type]
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1881 self.chg_scene_node(scene_node, tween_type=type_name)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1882 if ref:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1883 self.chg_scene_node(scene_node, ref=ref)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1884 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1885
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1886 scenes_node.appendChild(scene_node)
1247
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1887
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1888 self._layers[layer_idx].scenes.append(scene_node)
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1889
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1890 return scene_node
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1891
1262
2f861eea1214 Make domview_ui manages scenes and layers found by checker
Thinker K.F. Li <thinker@codemud.net>
parents: 1260
diff changeset
1892 ## \brief Manage a existed scene node at given layer.
2f861eea1214 Make domview_ui manages scenes and layers found by checker
Thinker K.F. Li <thinker@codemud.net>
parents: 1260
diff changeset
1893 #
2f861eea1214 Make domview_ui manages scenes and layers found by checker
Thinker K.F. Li <thinker@codemud.net>
parents: 1260
diff changeset
1894 def manage_scene_node(self, layer_idx, scene_node):
2f861eea1214 Make domview_ui manages scenes and layers found by checker
Thinker K.F. Li <thinker@codemud.net>
parents: 1260
diff changeset
1895 self._layers[layer_idx].scenes.append(scene_node)
2f861eea1214 Make domview_ui manages scenes and layers found by checker
Thinker K.F. Li <thinker@codemud.net>
parents: 1260
diff changeset
1896 pass
2f861eea1214 Make domview_ui manages scenes and layers found by checker
Thinker K.F. Li <thinker@codemud.net>
parents: 1260
diff changeset
1897
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1898 ## \brief Change attributes of a scene node.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1899 #
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1900 # This is here to monitor changes of scene node.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1901 def chg_scene_node(self, scene_node, start=None, end=None,
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1902 tween_type=None, ref=None):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1903 if start is not None:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1904 scene_node.setAttribute('start', str(start))
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1905 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1906 if end is not None:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1907 scene_node.setAttribute('end', str(end))
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1908 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1909 if tween_type is not None:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1910 scene_node.setAttribute('type', tween_type)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1911 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1912 if ref is not None:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1913 scene_node.setAttribute('ref', ref)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1914 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1915 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1916
1256
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1917 ## \brief Remove scene node from DOM-tree.
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1918 #
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1919 def rm_scene_node(self, scene_node):
1256
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1920 if not scene_node.parent():
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1921 return # without this, may crash the Inkscape.
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1922
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1923 self._scenes_node.removeChild(scene_node)
1247
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1924 for layer in self._layers:
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1925 try:
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1926 layer.scenes.remove(scene_node)
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1927 except ValueError: # not in the list
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1928 pass
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1929 else:
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1930 break
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
1931 pass
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1932 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1933
1256
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1934 ## \brief Remove scene node and asssociated scene group from DOM.
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1935 #
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1936 # It will remove as many as possible. Does not complain about
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1937 # error in the procedure of removing.
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1938 #
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1939 def rm_scene_node_n_group(self, scene_node):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1940 scene_group_id = scene_node.getAttribute('ref')
1256
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1941 try:
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1942 scene_group_node = self.get_node(scene_group_id)
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1943 if scene_group_node.parent(): # Check it, or crash the
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1944 # Inkscape.
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1945 scene_group_node.parent().removeChild(scene_group_node)
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1946 pass
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1947 except:
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1948 pass
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1949
1256
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1950 try:
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1951 self.rm_scene_node(scene_node)
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1952 except:
8755415b5e99 More check for remvoing scene and scene group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1253
diff changeset
1953 pass
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1954 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1955
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1956 ## \brief Create and add a svg:g for a scene under a group for a layer.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1957 #
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1958 def add_scene_group(self, layer_idx):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1959 layer = self._layers[layer_idx]
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1960 doc = self._doc
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1961
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1962 scene_group = doc.createElement('svg:g')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1963 gid = self.new_id()
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1964 scene_group.setAttribute("id", gid)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1965 scene_group.setAttribute("inkscape:groupmode", "layer")
1299
6949e2b6cae2 Add unlink clone checker.
Thinker K.F. Li <thinker@codemud.net>
parents: 1298
diff changeset
1966 scene_group.setAttribute('scene_group', 'true')
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1967
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1968 layer.group.appendChild(scene_group)
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1969
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1970 return scene_group
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1971
1259
df474448364e Add find_layer_from_group() for domview_ui
Thinker K.F. Li <thinker@codemud.net>
parents: 1256
diff changeset
1972 ## \brief Find layer index and scene info for a given scene node.
df474448364e Add find_layer_from_group() for domview_ui
Thinker K.F. Li <thinker@codemud.net>
parents: 1256
diff changeset
1973 #
df474448364e Add find_layer_from_group() for domview_ui
Thinker K.F. Li <thinker@codemud.net>
parents: 1256
diff changeset
1974 # \return (-1, None) for error.
df474448364e Add find_layer_from_group() for domview_ui
Thinker K.F. Li <thinker@codemud.net>
parents: 1256
diff changeset
1975 #
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1976 def find_layer_n_scene_of_node(self, node_id):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1977 for layer_idx, layer in enumerate(self._layers):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1978 for scene_node in layer.scenes:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1979 scene_group_id = scene_node.getAttribute('ref')
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1980 if scene_group_id == node_id:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1981 return layer_idx, scene_node
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1982 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1983 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1984 return -1, None
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1985
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1986 def insert_frames(self, layer_idx, frame_idx, num):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1987 layer = self._layers[layer_idx]
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1988 for scene_node in layer.scenes:
1274
a4d3838264dd Make public APIs being public for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1270
diff changeset
1989 start, end, tween_type = self.parse_one_scene(scene_node)
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1990 if start >= frame_idx:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1991 self.chg_scene_node(scene_node, start=(start + num))
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1992 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1993 if end >= frame_idx:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1994 self.chg_scene_node(scene_node, end=(end + num))
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1995 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1996 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1997 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
1998
1265
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
1999 ## \brief add the current position to the undo buffer
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
2000 #
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
2001 def mark_undo(self, msg):
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
2002 self._doc.done("none", msg)
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
2003 pass
ca301f6abef7 Support undo for insert key frame/rm keyframe. We will refresh all layers and scenes since it is not feasible to collect these changes and update the layers and scenes. We may scan two level only in the future to improve the performance.
wycc
parents: 1262
diff changeset
2004
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2005 ## \brief Remove frames
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2006 #
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2007 # - Scenes covered by removing range were removed.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2008 # - Scenes after removing range were shifted left.
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2009 #
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2010 def rm_frames(self, layer_idx, frame_idx, num):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2011 layer = self._layers[layer_idx]
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2012
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2013 last_rm = frame_idx + num - 1 # last removed frame
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2014 for scene_node in layer.scenes:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2015 start, end, tween_type = \
1274
a4d3838264dd Make public APIs being public for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1270
diff changeset
2016 self.parse_one_scene(scene_node)
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2017
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2018 if end < frame_idx:
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2019 continue
1286
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2020
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2021 if start > last_rm: # this scene is at right side
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2022 self.chg_scene_node(scene_node,
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2023 start=(start - num),
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2024 end=(end - num))
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2025 else: # this scene is covered by removing range
1286
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2026 self.rm_scene_node_n_group(scene_node)
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2027 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2028 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2029 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2030
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2031 def get_max_frame(self):
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2032 return self._maxframe
1246
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2033
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2034 ## \brief Copy children of a group.
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2035 #
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2036 # Duplicate children of a group, and append them to another group.
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2037 #
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2038 def copy_group_children(self, src_group, dst_group):
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2039 # Search for the duplicated group
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2040 doc = self._doc
1286
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2041
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2042 dup_group = src_group.duplicate(doc)
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2043
1247
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2044 old_nodes = _DOM_iterator(src_group)
1286
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2045 new_nodes = _DOM_iterator(dup_group)
1247
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2046 new_gids = set()
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2047 for old_node in old_nodes:
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2048 old_node_id = old_node.getAttribute('id')
1286
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2049 new_node = new_nodes.next()
1247
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2050 new_node.setAttribute('ns0:duplicate-src', old_node_id)
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2051
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2052 #
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2053 # Change ID here, or inkscape would insert the node with
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2054 # the same ID, and change it later to avoid duplication.
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2055 # But, our event handler would be called before changing
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2056 # ID. It would confuse our code. We change ID of nodes
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2057 # before inserting them into the DOM-tree.
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2058 #
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2059 gid = self.new_id()
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2060 while gid in new_gids:
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2061 gid = self.new_id()
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2062 pass
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2063 new_gids.add(gid)
45e9566ea5c0 Fix bugs of inserting/removing frames.
Thinker K.F. Li <thinker@codemud.net>
parents: 1246
diff changeset
2064 new_node.setAttribute('id', gid)
1246
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2065 pass
1286
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2066
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2067 for child in dup_group.childList():
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2068 dup_group.removeChild(child) # prevent from crash
1298
2a5da457474d Fix typo
Thinker K.F. Li <thinker@codemud.net>
parents: 1295
diff changeset
2069 dst_group.appendChild(child)
1286
922d1caf6632 Revert to changeset #0442ae9c2ac2 for domview.py.
Thinker K.F. Li <thinker@codemud.net>
parents: 1285
diff changeset
2070 pass
1246
42c4874c8d1e Move _duplicate_group to domview_ui.
Thinker K.F. Li <thinker@codemud.net>
parents: 1244
diff changeset
2071 pass
1291
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2072
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2073 ## \brief Clone children of a source group to a destinate group.
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2074 #
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2075 # It create a 'svg:use' node for every child of the source group,
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2076 # and append nodes to the desitnate group.
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2077 #
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2078 def clone_group_children(self, src_group, dst_group):
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2079 doc = self._doc
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2080
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2081 for src_child in src_group.childList():
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2082 src_child_id = src_child.getAttribute('id')
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2083 dst_child_id = self.new_id()
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2084
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2085 dst_child = doc.createElement('svg:use')
1294
Thinker K.F. Li <thinker@codemud.net>
parents: 1291 1290
diff changeset
2086 dst_child.setAttribute('id', dst_child_id)
1291
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2087 dst_child.setAttribute('xlink:href', '#' + src_child_id)
1294
Thinker K.F. Li <thinker@codemud.net>
parents: 1291 1290
diff changeset
2088 dst_child.setAttribute('ns0:duplicate-src', src_child_id)
1295
71118bff7d61 CHange the wrong append to appendCHild
wycc
parents: 1294
diff changeset
2089 dst_group.appendChild(dst_child)
1291
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2090 pass
a3e04b3f2a8c Add clone function for domview
Thinker K.F. Li <thinker@codemud.net>
parents: 1286
diff changeset
2091 pass
1323
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2092
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2093 ## \brief To test a graphic node.
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2094 #
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2095 # A graphic node is a SVG node that is not layer group, scene
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2096 # group, ... etc. It is only a normal node in a layer group or a
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2097 # scene group.
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2098 def is_graph_node(self, node):
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2099 try:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2100 mode = node.getAttribute('inkscape:groupmode')
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2101 except:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2102 pass
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2103 else:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2104 if mode == 'layer':
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2105 return False
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2106 pass
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2107
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2108 try:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2109 label = node.geteAttribute('inkscape:label')
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2110 except:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2111 pass
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2112 else:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2113 return False
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2114
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2115 try:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2116 scene_group = node.geteAttribute('scene_group')
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2117 except:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2118 pass
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2119 else:
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2120 if scene_group == 'true':
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2121 return False
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2122 pass
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2123
ffbbd3aa218d Make a component from a group.
Thinker K.F. Li <thinker@codemud.net>
parents: 1322
diff changeset
2124 return True
1243
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2125 pass
d5f70928e9f1 Move MBScene_domview_ui and MBScene_domview to separated modules.
Thinker K.F. Li <thinker@codemud.net>
parents:
diff changeset
2126