Skip to content

Commit e58f77b

Browse files
committed
Connect up animation of force derived layouts.
1 parent 494bf6f commit e58f77b

6 files changed

Lines changed: 59 additions & 18 deletions

File tree

src/mapclient/core/managers/workflowmanager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ def layout_workflow(self, layout_algorithm):
216216
raise WorkflowError(f"Unknown layout algorithm: {layout_algorithm}")
217217

218218
self._iteration_count = 0
219-
animate = False
219+
animate = True
220220
if animate:
221221
self._layout_timer.start(16)
222222
else:

src/mapclient/core/workflow/workflowdependencygraph.py

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333

3434
def _node_is_destination(graph, node):
3535
"""
36-
Determine whether or not the given node features
36+
Determine whether the given node features
3737
in a destination of another node. Return True if
38-
the node is a destination, False otherwise..
38+
the node is a destination, False otherwise.
3939
"""
4040
for graph_node in graph:
4141
if node in graph[graph_node]:
@@ -86,7 +86,7 @@ def _determine_topological_order(graph, starting_set):
8686

8787
def _reverse_dict_with_lists(in_dict):
8888
reverseDictOut = {}
89-
for k, v in list(in_dict.items()):
89+
for k, v in in_dict.items():
9090
for rk in v:
9191
reverseDictOut[rk] = reverseDictOut.get(rk, [])
9292
reverseDictOut[rk].append(k)
@@ -98,7 +98,6 @@ class WorkflowDependencyGraph(object):
9898

9999
def __init__(self, scene):
100100
self._scene = scene
101-
self._dependency_graph = {}
102101
self._reverse_dependency_graph = {}
103102
self._topological_order = []
104103
self._current = -1
@@ -122,12 +121,16 @@ def _find_all_connected_nodes(self):
122121

123122
def _calculate_dependency_graph(self):
124123
graph = {}
125-
for item in list(self._scene.items()):
124+
graph_ports = []
125+
for item in self._scene.items():
126126
if item.Type == Connection.Type:
127127
graph[item.source()] = graph.get(item.source(), [])
128128
graph[item.source()].append(item.destination())
129-
130-
return graph
129+
graph_ports.append(
130+
{'from': item.source(), 'from_port': item.sourceIndex(),
131+
'to': item.destination(), 'to_port': item.destinationIndex()}
132+
)
133+
return graph, graph_ports
131134

132135
def _solo_node(self):
133136
scene_items = list(self._scene.items())
@@ -153,31 +156,36 @@ def set_finished_callback(self, callback):
153156
def execute_status_message(self):
154157
return self._execute_status_message
155158

156-
def can_execute(self):
157-
self._dependency_graph = self._calculate_dependency_graph()
158-
self._reverse_dependency_graph = _reverse_dict_with_lists(self._dependency_graph)
159+
def graph(self):
160+
dependency_graph, graph_ports = self._calculate_dependency_graph()
161+
return dependency_graph, graph_ports, _reverse_dict_with_lists(dependency_graph)
162+
163+
def _determine_graph(self):
164+
dependency_graph, _ = self._calculate_dependency_graph()
165+
self._reverse_dependency_graph = _reverse_dict_with_lists(dependency_graph)
159166
# Find all connected nodes in the graph
160167
nodes = self._find_all_connected_nodes()
161168
# Find starting point set, uses helper graph
162-
starting_set = _find_starting_set(self._dependency_graph, nodes)
169+
starting_set = _find_starting_set(dependency_graph, nodes)
163170

164-
self._topological_order = _determine_topological_order(self._dependency_graph, starting_set)
171+
self._topological_order = _determine_topological_order(dependency_graph, starting_set)
165172

166-
items_count = len(self._scene.items())
167173
solo_node = self._solo_node()
168174
if solo_node:
169-
self._dependency_graph = {solo_node: []}
170175
self._topological_order = [solo_node]
171176

177+
def can_execute(self):
178+
self._determine_graph()
172179
configured = [metastep.getStep().isConfigured() for metastep in self._topological_order]
173180

181+
items_count = len(self._scene.items())
174182
if not all(configured):
175183
self._execute_status_message = "Not all steps are configured."
176184
return 1
177185
elif items_count == 0:
178186
self._execute_status_message = "No steps in workflow."
179187
return 2
180-
elif items_count > 1 and len(self._topological_order) == 0 and len(self._dependency_graph.keys()) == 0:
188+
elif items_count > 1 and len(self._topological_order) == 0 and len(self._reverse_dependency_graph.keys()) == 0:
181189
self._execute_status_message = "Multiple steps but no connections to create workflow."
182190
return 3
183191
elif self._current != -1:
@@ -223,8 +231,8 @@ def execute(self):
223231
# But don't use this as it is not what is documented.
224232
# source_step = connection.source()._step
225233
# destination_step = current_node._step
226-
# source_ports = [port for port in source_step._ports if port.has_provides()]
227-
# destination_ports = [port for port in destination_step._ports if port.has_uses()]
234+
# source_ports = [port for port in source_step._ports if port.hasProvides()]
235+
# destination_ports = [port for port in destination_step._ports if port.hasUses()]
228236
# source_data_index = source_ports.index(source_step._ports[connection.sourceIndex()])
229237
# destination_data_index = destination_ports.index(destination_step._ports[connection.destinationIndex()])
230238

src/mapclient/core/workflow/workflowitems.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ def setPos(self, pos):
5353
def getStep(self):
5454
return self._step
5555

56+
def set_graphics_pos(self, pos):
57+
raise NotImplementedError("Implemented only when a graphics item is created.")
58+
59+
def update_position(self, pos):
60+
self.setPos(pos)
61+
self.set_graphics_pos(pos)
62+
5663
def getName(self):
5764
return self._step.getName()
5865

src/mapclient/core/workflow/workflowscene.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,21 @@ def changeIdentifier(self, meta_step):
213213
self._manager.changeIdentifier(meta_step.getIdentifier(), meta_step.getStepIdentifier())
214214
meta_step.syncIdentifier()
215215

216+
def step_positions(self):
217+
positions = []
218+
for item in self._items:
219+
if item.Type == MetaStep.Type:
220+
positions.append(item.getPos())
221+
222+
return positions
223+
224+
def set_step_positions(self, positions):
225+
for item in self._items:
226+
if item.Type == MetaStep.Type:
227+
step_identifier = item.getIdentifier()
228+
if step_identifier in positions:
229+
item.update_position(positions[step_identifier])
230+
216231
def saveState(self, ws):
217232
connectionMap = {}
218233
stepList = []
@@ -382,6 +397,9 @@ def load_state(self, ws, scene_rect):
382397
def setMainWindow(self, main_window):
383398
self._main_window = main_window
384399

400+
def graph(self):
401+
return self._dependency_graph.graph()
402+
385403
def canExecute(self):
386404
return self._dependency_graph.can_execute()
387405

src/mapclient/view/mainwindow.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,9 @@ def abort_execution(self):
317317
def set_workflow_direction(self, direction):
318318
self.model().workflowManager().set_workflow_direction(direction)
319319

320+
def layout_workflow(self, layout_algorithm):
321+
self.model().workflowManager().layout_workflow(layout_algorithm)
322+
320323
@set_wait_cursor
321324
def set_current_widget(self, widget):
322325
if self._ui.stackedWidget.indexOf(widget) <= 0:

src/mapclient/view/workflow/workflowgraphicsitems.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,8 @@ def __init__(self, metastep):
258258

259259
self._margin = 2.0
260260
self._metastep = metastep
261+
self._metastep.set_graphics_pos = self.set_graphics_pos
262+
261263
icon = self._metastep.getStep().getIcon()
262264
if not icon:
263265
icon = QtGui.QImage(':/workflow/images/default_step_icon.png')
@@ -395,6 +397,9 @@ def setPos(self, pos, modify_parameterised=True):
395397
self._parameterised_pos = convert_to_parameterised_position(scene.sceneRect(), pos, self.offset())
396398
self._metastep.setPos(pos)
397399

400+
def set_graphics_pos(self, pos):
401+
self.setPos(pos)
402+
398403
def set_parameterised_pos(self, parameterised_pos):
399404
self._parameterised_pos = parameterised_pos
400405

0 commit comments

Comments
 (0)