roby 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (236) hide show
  1. data/History.txt +7 -5
  2. data/Manifest.txt +91 -16
  3. data/README.txt +24 -24
  4. data/Rakefile +92 -64
  5. data/app/config/app.yml +42 -43
  6. data/app/config/init.rb +26 -0
  7. data/benchmark/alloc_misc.rb +123 -0
  8. data/benchmark/discovery_latency.rb +67 -0
  9. data/benchmark/garbage_collection.rb +48 -0
  10. data/benchmark/genom.rb +31 -0
  11. data/benchmark/transactions.rb +62 -0
  12. data/bin/roby +1 -1
  13. data/bin/roby-log +16 -6
  14. data/doc/guide/.gitignore +2 -0
  15. data/doc/guide/config.yaml +34 -0
  16. data/doc/guide/ext/init.rb +14 -0
  17. data/doc/guide/ext/previous_next.rb +40 -0
  18. data/doc/guide/ext/rdoc_links.rb +33 -0
  19. data/doc/guide/index.rdoc +16 -0
  20. data/doc/guide/overview.rdoc +62 -0
  21. data/doc/guide/plan_modifications.rdoc +67 -0
  22. data/doc/guide/src/abstraction/achieve_with.page +8 -0
  23. data/doc/guide/src/abstraction/forwarding.page +8 -0
  24. data/doc/guide/src/abstraction/hierarchy.page +19 -0
  25. data/doc/guide/src/abstraction/index.page +28 -0
  26. data/doc/guide/src/abstraction/task_models.page +13 -0
  27. data/doc/guide/src/basics.template +6 -0
  28. data/doc/guide/src/basics/app.page +139 -0
  29. data/doc/guide/src/basics/code_examples.page +33 -0
  30. data/doc/guide/src/basics/dry.page +69 -0
  31. data/doc/guide/src/basics/errors.page +443 -0
  32. data/doc/guide/src/basics/events.page +179 -0
  33. data/doc/guide/src/basics/hierarchy.page +275 -0
  34. data/doc/guide/src/basics/index.page +11 -0
  35. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  36. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  37. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  38. data/doc/guide/src/basics/log_replay/goForward_4.png +0 -0
  39. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  40. data/doc/guide/src/basics/log_replay/hierarchy_error_1.png +0 -0
  41. data/doc/guide/src/basics/log_replay/hierarchy_error_2.png +0 -0
  42. data/doc/guide/src/basics/log_replay/hierarchy_error_3.png +0 -0
  43. data/doc/guide/src/basics/log_replay/plan_repair_1.png +0 -0
  44. data/doc/guide/src/basics/log_replay/plan_repair_2.png +0 -0
  45. data/doc/guide/src/basics/log_replay/plan_repair_3.png +0 -0
  46. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  47. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  48. data/doc/guide/src/basics/log_replay/roby_log_relation_window.png +0 -0
  49. data/doc/guide/src/basics/log_replay/roby_replay_event_representation.png +0 -0
  50. data/doc/guide/src/basics/plan_objects.page +71 -0
  51. data/doc/guide/src/basics/relations_display.page +203 -0
  52. data/doc/guide/src/basics/roby_cycle_overview.png +0 -0
  53. data/doc/guide/src/basics/shell.page +102 -0
  54. data/doc/guide/src/basics/summary.page +32 -0
  55. data/doc/guide/src/basics/tasks.page +357 -0
  56. data/doc/guide/src/basics_shell_header.txt +16 -0
  57. data/doc/guide/src/cycle/cycle-overview.png +0 -0
  58. data/doc/guide/src/cycle/cycle-overview.svg +208 -0
  59. data/doc/guide/src/cycle/error_handling.page +168 -0
  60. data/doc/guide/src/cycle/error_instantaneous_repair.png +0 -0
  61. data/doc/guide/src/cycle/error_instantaneous_repair.svg +1224 -0
  62. data/doc/guide/src/cycle/garbage_collection.page +10 -0
  63. data/doc/guide/src/cycle/index.page +23 -0
  64. data/doc/guide/src/cycle/propagation.page +154 -0
  65. data/doc/guide/src/cycle/propagation_diamond.png +0 -0
  66. data/doc/guide/src/cycle/propagation_diamond.svg +1279 -0
  67. data/doc/guide/src/default.css +319 -0
  68. data/doc/guide/src/default.template +74 -0
  69. data/doc/guide/src/htmldoc.metainfo +20 -0
  70. data/doc/guide/src/htmldoc.virtual +18 -0
  71. data/doc/guide/src/images/bodybg.png +0 -0
  72. data/doc/guide/src/images/contbg.png +0 -0
  73. data/doc/guide/src/images/footerbg.png +0 -0
  74. data/doc/guide/src/images/gradient1.png +0 -0
  75. data/doc/guide/src/images/gradient2.png +0 -0
  76. data/doc/guide/src/index.page +7 -0
  77. data/doc/guide/src/introduction/index.page +29 -0
  78. data/doc/guide/src/introduction/install.page +133 -0
  79. data/doc/{papers.rdoc → guide/src/introduction/publications.page} +5 -2
  80. data/doc/{videos.rdoc → guide/src/introduction/videos.page} +4 -2
  81. data/doc/guide/src/plugins/fault_tolerance.page +44 -0
  82. data/doc/guide/src/plugins/index.page +11 -0
  83. data/doc/guide/src/plugins/subsystems.page +45 -0
  84. data/doc/guide/src/relations/dependency.page +89 -0
  85. data/doc/guide/src/relations/index.page +12 -0
  86. data/doc/misc/update_github +24 -0
  87. data/doc/tutorials/02-GoForward.rdoc +3 -3
  88. data/ext/graph/graph.cc +46 -0
  89. data/lib/roby.rb +57 -22
  90. data/lib/roby/app.rb +132 -112
  91. data/lib/roby/app/plugins/rake.rb +21 -0
  92. data/lib/roby/app/rake.rb +0 -7
  93. data/lib/roby/app/run.rb +1 -1
  94. data/lib/roby/app/scripts/distributed.rb +1 -2
  95. data/lib/roby/app/scripts/generate/bookmarks.rb +1 -1
  96. data/lib/roby/app/scripts/results.rb +2 -1
  97. data/lib/roby/app/scripts/run.rb +6 -2
  98. data/lib/roby/app/scripts/shell.rb +11 -11
  99. data/lib/roby/config.rb +1 -1
  100. data/lib/roby/decision_control.rb +62 -3
  101. data/lib/roby/distributed.rb +4 -0
  102. data/lib/roby/distributed/base.rb +8 -0
  103. data/lib/roby/distributed/communication.rb +12 -8
  104. data/lib/roby/distributed/connection_space.rb +61 -44
  105. data/lib/roby/distributed/distributed_object.rb +1 -1
  106. data/lib/roby/distributed/notifications.rb +22 -30
  107. data/lib/roby/distributed/peer.rb +13 -8
  108. data/lib/roby/distributed/proxy.rb +5 -5
  109. data/lib/roby/distributed/subscription.rb +4 -4
  110. data/lib/roby/distributed/transaction.rb +3 -3
  111. data/lib/roby/event.rb +176 -110
  112. data/lib/roby/exceptions.rb +12 -4
  113. data/lib/roby/execution_engine.rb +1604 -0
  114. data/lib/roby/external_process_task.rb +225 -0
  115. data/lib/roby/graph.rb +0 -6
  116. data/lib/roby/interface.rb +221 -137
  117. data/lib/roby/log/console.rb +5 -3
  118. data/lib/roby/log/data_stream.rb +94 -16
  119. data/lib/roby/log/dot.rb +8 -8
  120. data/lib/roby/log/event_stream.rb +13 -3
  121. data/lib/roby/log/file.rb +43 -18
  122. data/lib/roby/log/gui/basic_display_ui.rb +89 -0
  123. data/lib/roby/log/gui/chronicle_view_ui.rb +90 -0
  124. data/lib/roby/log/gui/data_displays.rb +4 -5
  125. data/lib/roby/log/gui/data_displays_ui.rb +146 -0
  126. data/lib/roby/log/gui/relations.rb +18 -18
  127. data/lib/roby/log/gui/relations_ui.rb +120 -0
  128. data/lib/roby/log/gui/relations_view_ui.rb +144 -0
  129. data/lib/roby/log/gui/replay.rb +41 -13
  130. data/lib/roby/log/gui/replay_controls.rb +3 -0
  131. data/lib/roby/log/gui/replay_controls.ui +133 -110
  132. data/lib/roby/log/gui/replay_controls_ui.rb +249 -0
  133. data/lib/roby/log/hooks.rb +19 -18
  134. data/lib/roby/log/logger.rb +7 -6
  135. data/lib/roby/log/notifications.rb +4 -4
  136. data/lib/roby/log/plan_rebuilder.rb +20 -22
  137. data/lib/roby/log/relations.rb +44 -16
  138. data/lib/roby/log/server.rb +1 -4
  139. data/lib/roby/log/timings.rb +88 -19
  140. data/lib/roby/plan-object.rb +135 -11
  141. data/lib/roby/plan.rb +408 -224
  142. data/lib/roby/planning/loops.rb +32 -25
  143. data/lib/roby/planning/model.rb +157 -51
  144. data/lib/roby/planning/task.rb +47 -20
  145. data/lib/roby/query.rb +128 -92
  146. data/lib/roby/relations.rb +254 -136
  147. data/lib/roby/relations/conflicts.rb +6 -9
  148. data/lib/roby/relations/dependency.rb +358 -0
  149. data/lib/roby/relations/ensured.rb +0 -1
  150. data/lib/roby/relations/error_handling.rb +0 -1
  151. data/lib/roby/relations/events.rb +0 -2
  152. data/lib/roby/relations/executed_by.rb +26 -11
  153. data/lib/roby/relations/planned_by.rb +14 -14
  154. data/lib/roby/robot.rb +46 -0
  155. data/lib/roby/schedulers/basic.rb +34 -0
  156. data/lib/roby/standalone.rb +4 -0
  157. data/lib/roby/standard_errors.rb +21 -15
  158. data/lib/roby/state/events.rb +5 -4
  159. data/lib/roby/support.rb +107 -6
  160. data/lib/roby/task-operations.rb +23 -19
  161. data/lib/roby/task.rb +522 -148
  162. data/lib/roby/task_index.rb +80 -0
  163. data/lib/roby/test/common.rb +283 -44
  164. data/lib/roby/test/distributed.rb +53 -37
  165. data/lib/roby/test/testcase.rb +9 -204
  166. data/lib/roby/test/tools.rb +3 -3
  167. data/lib/roby/transactions.rb +154 -111
  168. data/lib/roby/transactions/proxy.rb +40 -7
  169. data/manifest.xml +20 -0
  170. data/plugins/fault_injection/README.txt +0 -3
  171. data/plugins/fault_injection/Rakefile +2 -8
  172. data/plugins/fault_injection/app.rb +1 -1
  173. data/plugins/fault_injection/fault_injection.rb +3 -3
  174. data/plugins/fault_injection/test/test_fault_injection.rb +19 -25
  175. data/plugins/subsystems/README.txt +0 -3
  176. data/plugins/subsystems/Rakefile +2 -7
  177. data/plugins/subsystems/app.rb +27 -16
  178. data/plugins/subsystems/test/app/config/init.rb +3 -0
  179. data/plugins/subsystems/test/app/planners/main.rb +1 -1
  180. data/plugins/subsystems/test/app/tasks/services.rb +1 -1
  181. data/plugins/subsystems/test/test_subsystems.rb +23 -16
  182. data/test/distributed/test_communication.rb +32 -15
  183. data/test/distributed/test_connection.rb +28 -26
  184. data/test/distributed/test_execution.rb +59 -54
  185. data/test/distributed/test_mixed_plan.rb +34 -34
  186. data/test/distributed/test_plan_notifications.rb +26 -26
  187. data/test/distributed/test_protocol.rb +57 -48
  188. data/test/distributed/test_query.rb +11 -7
  189. data/test/distributed/test_remote_plan.rb +71 -71
  190. data/test/distributed/test_transaction.rb +50 -47
  191. data/test/mockups/external_process +28 -0
  192. data/test/planning/test_loops.rb +163 -119
  193. data/test/planning/test_model.rb +3 -3
  194. data/test/planning/test_task.rb +27 -7
  195. data/test/relations/test_conflicts.rb +3 -3
  196. data/test/relations/test_dependency.rb +324 -0
  197. data/test/relations/test_ensured.rb +2 -2
  198. data/test/relations/test_executed_by.rb +94 -19
  199. data/test/relations/test_planned_by.rb +11 -9
  200. data/test/suite_core.rb +6 -3
  201. data/test/suite_distributed.rb +1 -0
  202. data/test/suite_planning.rb +1 -0
  203. data/test/suite_relations.rb +2 -2
  204. data/test/tasks/test_external_process.rb +126 -0
  205. data/test/{test_thread_task.rb → tasks/test_thread_task.rb} +17 -20
  206. data/test/test_bgl.rb +21 -1
  207. data/test/test_event.rb +229 -155
  208. data/test/test_exceptions.rb +79 -80
  209. data/test/test_execution_engine.rb +987 -0
  210. data/test/test_gui.rb +1 -1
  211. data/test/test_interface.rb +11 -5
  212. data/test/test_log.rb +18 -7
  213. data/test/test_log_server.rb +1 -0
  214. data/test/test_plan.rb +229 -395
  215. data/test/test_query.rb +193 -35
  216. data/test/test_relations.rb +88 -8
  217. data/test/test_state.rb +55 -37
  218. data/test/test_support.rb +1 -1
  219. data/test/test_task.rb +371 -218
  220. data/test/test_testcase.rb +32 -16
  221. data/test/test_transactions.rb +211 -170
  222. data/test/test_transactions_proxy.rb +37 -19
  223. metadata +169 -71
  224. data/.gitignore +0 -29
  225. data/doc/styles/allison.css +0 -314
  226. data/doc/styles/allison.js +0 -316
  227. data/doc/styles/allison.rb +0 -276
  228. data/doc/styles/jamis.rb +0 -593
  229. data/lib/roby/control.rb +0 -746
  230. data/lib/roby/executives/simple.rb +0 -30
  231. data/lib/roby/propagation.rb +0 -562
  232. data/lib/roby/relations/hierarchy.rb +0 -239
  233. data/lib/roby/transactions/updates.rb +0 -139
  234. data/test/relations/test_hierarchy.rb +0 -158
  235. data/test/test_control.rb +0 -399
  236. data/test/test_propagation.rb +0 -210
@@ -17,8 +17,12 @@ class OfflineStreamListModel < DataStreamListModel
17
17
  newfiles = Qt::FileDialog.get_open_file_names nil, "New data stream", dir
18
18
  return if newfiles.empty?
19
19
  if !newfiles.empty?
20
- if newstream = Roby.app.data_stream(newfiles)
21
- return newstream
20
+ newstreams = Roby.app.data_streams_of(newfiles)
21
+ if !newstreams.empty?
22
+ newstreams.each do |s|
23
+ s.open
24
+ end
25
+ return newstreams
22
26
  else
23
27
  Qt::MessageBox.warning nil, "Add data stream", "Cannot determine data stream type for #{newfiles.join(", ")}"
24
28
  return
@@ -50,6 +54,8 @@ class Replay < Qt::MainWindow
50
54
  attr_accessor :initial_time
51
55
  # A set of procs which are to be called to set up the display
52
56
  attr_accessor :initial_setup
57
+ # Set to true if we are playing some data right now
58
+ attr_predicate :running?, true
53
59
 
54
60
  def initialize
55
61
  super()
@@ -124,12 +130,14 @@ class Replay < Qt::MainWindow
124
130
  if !time || time == Time.at(0)
125
131
  min, max = displayed_streams.inject([nil, nil]) do |(min, max), stream|
126
132
  stream_min, stream_max = stream.range
127
- if !min || stream_min < min
128
- min = stream_min
129
- end
130
- if !max || stream_max > max
131
- max = stream_max
132
- end
133
+ if stream_min && stream_max
134
+ if !min || stream_min < min
135
+ min = stream_min
136
+ end
137
+ if !max || stream_max > max
138
+ max = stream_max
139
+ end
140
+ end
133
141
  [min, max]
134
142
  end
135
143
 
@@ -180,6 +188,7 @@ class Replay < Qt::MainWindow
180
188
  end
181
189
 
182
190
  def stop
191
+ self.running = false
183
192
  if play_timer
184
193
  ui_controls.play.checked = false
185
194
  play_timer.stop
@@ -197,8 +206,14 @@ class Replay < Qt::MainWindow
197
206
  play_until(time + time_slice * play_speed)
198
207
  end
199
208
  slots 'play_step_timer()'
209
+
210
+ def play_next_nonempty
211
+ self.running = true
212
+ while running? && !play_step
213
+ end
214
+ end
200
215
 
201
- def play_until(max_time, integrate = true)
216
+ def play_until(max_time, integrate = false)
202
217
  start_at = Time.now
203
218
  displayed_streams.inject(timeline = []) do |timeline, s|
204
219
  if s.next_time
@@ -212,15 +227,24 @@ class Replay < Qt::MainWindow
212
227
  return
213
228
  end
214
229
 
230
+ needs_display = Set.new
215
231
  updated_streams = Set.new
216
232
 
217
233
  timeline.sort_by { |t, _| t }
218
234
  while !timeline.empty? && (timeline[0][0] - max_time) < 0.001
219
235
  @time, stream = timeline.first
220
236
 
221
- stream.advance
222
- stream.clear_integrated unless integrate
223
- updated_streams << stream
237
+ unless integrate
238
+ if stream.clear_integrated
239
+ needs_display << stream
240
+ end
241
+ end
242
+
243
+ if stream.advance
244
+ needs_display << stream
245
+ updated_streams << stream
246
+ end
247
+
224
248
  if next_time = stream.next_time
225
249
  timeline[0] = [next_time, stream]
226
250
  else
@@ -231,7 +255,7 @@ class Replay < Qt::MainWindow
231
255
 
232
256
  replayed = Time.now
233
257
 
234
- updated_streams.each do |stream|
258
+ needs_display.each do |stream|
235
259
  stream.display
236
260
  end
237
261
 
@@ -250,6 +274,7 @@ class Replay < Qt::MainWindow
250
274
  end
251
275
  end
252
276
  update_time_display
277
+ !updated_streams.empty?
253
278
 
254
279
  rescue Exception => e
255
280
  message = "<html>#{Qt.escape(e.message)}<ul><li>#{e.backtrace.join("</li><li>")}</li></ul></html>"
@@ -277,6 +302,9 @@ class Replay < Qt::MainWindow
277
302
  replay = self.new
278
303
 
279
304
  parser = OptionParser.new do |opt|
305
+ opt.on('--require=FILE', '-r FILE', String, 'load this file at startup') do |file|
306
+ require file
307
+ end
280
308
  Ui_DataDisplays::DISPLAYS.each_value do |config_ui|
281
309
  config_ui.setup_optparse(opt, replay)
282
310
  end
@@ -161,6 +161,9 @@ class Ui::ReplayControls
161
161
  play_step.connect(SIGNAL("clicked()")) do
162
162
  replay.play_step
163
163
  end
164
+ play_next_nonempty.connect(SIGNAL("clicked()")) do
165
+ replay.play_next_nonempty
166
+ end
164
167
  end
165
168
 
166
169
  def handleGoto
@@ -1,52 +1,53 @@
1
- <ui version="4.0" >
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ui version="4.0">
2
3
  <class>ReplayControls</class>
3
- <widget class="QWidget" name="ReplayControls" >
4
- <property name="geometry" >
4
+ <widget class="QWidget" name="ReplayControls">
5
+ <property name="geometry">
5
6
  <rect>
6
7
  <x>0</x>
7
8
  <y>0</y>
8
- <width>432</width>
9
- <height>168</height>
9
+ <width>442</width>
10
+ <height>167</height>
10
11
  </rect>
11
12
  </property>
12
- <property name="windowTitle" >
13
+ <property name="windowTitle">
13
14
  <string>Form</string>
14
15
  </property>
15
- <layout class="QVBoxLayout" >
16
+ <layout class="QVBoxLayout">
16
17
  <item>
17
- <widget class="QGroupBox" name="grp_play" >
18
- <property name="title" >
18
+ <widget class="QGroupBox" name="grp_play">
19
+ <property name="title">
19
20
  <string>Play</string>
20
21
  </property>
21
- <layout class="QVBoxLayout" >
22
+ <layout class="QVBoxLayout" name="verticalLayout">
22
23
  <item>
23
- <layout class="QHBoxLayout" >
24
+ <layout class="QHBoxLayout" name="horizontalLayout">
24
25
  <item>
25
- <widget class="QProgressBar" name="progress" >
26
- <property name="value" >
26
+ <widget class="QProgressBar" name="progress">
27
+ <property name="value">
27
28
  <number>0</number>
28
29
  </property>
29
- <property name="orientation" >
30
+ <property name="orientation">
30
31
  <enum>Qt::Horizontal</enum>
31
32
  </property>
32
33
  </widget>
33
34
  </item>
34
35
  <item>
35
- <widget class="QPushButton" name="goto" >
36
- <property name="text" >
36
+ <widget class="QPushButton" name="goto">
37
+ <property name="text">
37
38
  <string>&amp;Goto</string>
38
39
  </property>
39
40
  </widget>
40
41
  </item>
41
42
  <item>
42
- <widget class="QLCDNumber" name="time_lcd" >
43
- <property name="numDigits" >
43
+ <widget class="QLCDNumber" name="time_lcd">
44
+ <property name="numDigits">
44
45
  <number>6</number>
45
46
  </property>
46
- <property name="segmentStyle" >
47
+ <property name="segmentStyle">
47
48
  <enum>QLCDNumber::Flat</enum>
48
49
  </property>
49
- <property name="value" stdset="0" >
50
+ <property name="value" stdset="0">
50
51
  <double>0.000000000000000</double>
51
52
  </property>
52
53
  </widget>
@@ -54,202 +55,224 @@
54
55
  </layout>
55
56
  </item>
56
57
  <item>
57
- <layout class="QHBoxLayout" >
58
+ <layout class="QHBoxLayout">
58
59
  <item>
59
- <widget class="QLabel" name="textLabel1" >
60
- <property name="text" >
60
+ <widget class="QLabel" name="textLabel1">
61
+ <property name="text">
61
62
  <string>Speed</string>
62
63
  </property>
63
- <property name="wordWrap" >
64
+ <property name="wordWrap">
64
65
  <bool>false</bool>
65
66
  </property>
66
67
  </widget>
67
68
  </item>
68
69
  <item>
69
- <widget class="QLineEdit" name="speed" >
70
- <property name="sizePolicy" >
71
- <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
70
+ <widget class="QLineEdit" name="speed">
71
+ <property name="sizePolicy">
72
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
72
73
  <horstretch>1</horstretch>
73
74
  <verstretch>0</verstretch>
74
75
  </sizepolicy>
75
76
  </property>
76
- <property name="maximumSize" >
77
+ <property name="maximumSize">
77
78
  <size>
78
79
  <width>80</width>
79
80
  <height>32767</height>
80
81
  </size>
81
82
  </property>
82
- <property name="toolTip" >
83
- <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
83
+ <property name="toolTip">
84
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
84
85
  p, li { white-space: pre-wrap; }
85
- &lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
86
- &lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">Current playing speed&lt;/span>&lt;/p>
87
- &lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">&lt;span style=" font-weight:400;">it is the factor between the time in the log file and the time of replay. For instance, 2 means that we replay twice as fast as in reality.&lt;/span>&lt;/p>
88
- &lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>&lt;/body>&lt;/html></string>
86
+ &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;
87
+ &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Current playing speed&lt;/span&gt;&lt;/p&gt;
88
+ &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;&quot;&gt;&lt;span style=&quot; font-weight:400;&quot;&gt;it is the factor between the time in the log file and the time of replay. For instance, 2 means that we replay twice as fast as in reality.&lt;/span&gt;&lt;/p&gt;
89
+ &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
89
90
  </property>
90
- <property name="text" >
91
+ <property name="text">
91
92
  <string>1</string>
92
93
  </property>
93
- <property name="alignment" >
94
+ <property name="alignment">
94
95
  <set>Qt::AlignRight</set>
95
96
  </property>
96
97
  </widget>
97
98
  </item>
98
99
  <item>
99
- <widget class="QPushButton" name="slower" >
100
- <property name="toolTip" >
101
- <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
100
+ <widget class="QPushButton" name="slower">
101
+ <property name="toolTip">
102
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
102
103
  p, li { white-space: pre-wrap; }
103
- &lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
104
- &lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Decrease speed&lt;/p>&lt;/body>&lt;/html></string>
104
+ &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;
105
+ &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Decrease speed&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
105
106
  </property>
106
- <property name="text" >
107
- <string>&lt;&lt;</string>
107
+ <property name="text">
108
+ <string>Slower</string>
108
109
  </property>
109
110
  </widget>
110
111
  </item>
111
112
  <item>
112
- <widget class="QPushButton" name="play" >
113
- <property name="sizePolicy" >
114
- <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
113
+ <widget class="QPushButton" name="play">
114
+ <property name="sizePolicy">
115
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
115
116
  <horstretch>2</horstretch>
116
117
  <verstretch>0</verstretch>
117
118
  </sizepolicy>
118
119
  </property>
119
- <property name="toolTip" >
120
- <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
120
+ <property name="toolTip">
121
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
121
122
  p, li { white-space: pre-wrap; }
122
- &lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
123
- &lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Play&lt;/p>&lt;/body>&lt;/html></string>
123
+ &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;
124
+ &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Play&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
124
125
  </property>
125
- <property name="text" >
126
- <string>></string>
126
+ <property name="text">
127
+ <string>Play</string>
127
128
  </property>
128
- <property name="checkable" >
129
+ <property name="checkable">
129
130
  <bool>true</bool>
130
131
  </property>
131
132
  </widget>
132
133
  </item>
133
134
  <item>
134
- <widget class="QPushButton" name="faster" >
135
- <property name="toolTip" >
136
- <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
135
+ <widget class="QPushButton" name="faster">
136
+ <property name="toolTip">
137
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
137
138
  p, li { white-space: pre-wrap; }
138
- &lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
139
- &lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Increase speed&lt;/p>&lt;/body>&lt;/html></string>
139
+ &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;
140
+ &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Increase speed&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
140
141
  </property>
141
- <property name="text" >
142
- <string>>></string>
142
+ <property name="text">
143
+ <string>Faster</string>
143
144
  </property>
144
145
  </widget>
145
146
  </item>
146
147
  </layout>
147
148
  </item>
148
149
  <item>
149
- <layout class="QHBoxLayout" >
150
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
150
151
  <item>
151
- <widget class="QToolButton" name="bookmarks" >
152
- <property name="text" >
152
+ <widget class="QToolButton" name="bookmarks">
153
+ <property name="text">
153
154
  <string>Bookmarks</string>
154
155
  </property>
155
- <property name="popupMode" >
156
+ <property name="popupMode">
156
157
  <enum>QToolButton::InstantPopup</enum>
157
158
  </property>
158
- <property name="toolButtonStyle" >
159
+ <property name="toolButtonStyle">
159
160
  <enum>Qt::ToolButtonTextBesideIcon</enum>
160
161
  </property>
161
- <property name="arrowType" >
162
+ <property name="arrowType">
162
163
  <enum>Qt::DownArrow</enum>
163
164
  </property>
164
165
  </widget>
165
166
  </item>
166
167
  <item>
167
168
  <spacer>
168
- <property name="orientation" >
169
+ <property name="orientation">
169
170
  <enum>Qt::Horizontal</enum>
170
171
  </property>
171
- <property name="sizeHint" >
172
+ <property name="sizeHint" stdset="0">
172
173
  <size>
173
- <width>40</width>
174
+ <width>101</width>
174
175
  <height>20</height>
175
176
  </size>
176
177
  </property>
177
178
  </spacer>
178
179
  </item>
179
180
  <item>
180
- <widget class="QPushButton" name="seek_start" >
181
- <property name="toolTip" >
182
- <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
181
+ <layout class="QGridLayout" name="gridLayout">
182
+ <item row="0" column="0">
183
+ <widget class="QPushButton" name="seek_start">
184
+ <property name="toolTip">
185
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
183
186
  p, li { white-space: pre-wrap; }
184
- &lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
185
- &lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to start&lt;/p>&lt;/body>&lt;/html></string>
186
- </property>
187
- <property name="text" >
188
- <string>|&lt;&lt;</string>
189
- </property>
190
- <property name="shortcut" >
191
- <string/>
192
- </property>
193
- </widget>
194
- </item>
195
- <item>
196
- <widget class="QPushButton" name="play_step" >
197
- <property name="toolTip" >
198
- <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
187
+ &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;
188
+ &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Go to start&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
189
+ </property>
190
+ <property name="text">
191
+ <string>Go To Beginning</string>
192
+ </property>
193
+ <property name="shortcut">
194
+ <string/>
195
+ </property>
196
+ </widget>
197
+ </item>
198
+ <item row="0" column="1">
199
+ <widget class="QPushButton" name="play_step">
200
+ <property name="toolTip">
201
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
199
202
  p, li { white-space: pre-wrap; }
200
- &lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
201
- &lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go forward one step&lt;/p>&lt;/body>&lt;/html></string>
202
- </property>
203
- <property name="text" >
204
- <string>>|</string>
205
- </property>
206
- </widget>
203
+ &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;
204
+ &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Go forward one step&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
205
+ </property>
206
+ <property name="text">
207
+ <string>Step</string>
208
+ </property>
209
+ </widget>
210
+ </item>
211
+ <item row="1" column="0" colspan="2">
212
+ <widget class="QPushButton" name="play_next_nonempty">
213
+ <property name="toolTip">
214
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
215
+ p, li { white-space: pre-wrap; }
216
+ &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;
217
+ &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Go to start&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
218
+ </property>
219
+ <property name="text">
220
+ <string>Play next non-empty cycle</string>
221
+ </property>
222
+ <property name="shortcut">
223
+ <string/>
224
+ </property>
225
+ </widget>
226
+ </item>
227
+ </layout>
207
228
  </item>
208
229
  </layout>
209
230
  </item>
210
231
  </layout>
232
+ <zorder>play_next_nonempty</zorder>
233
+ <zorder>faster</zorder>
211
234
  </widget>
212
235
  </item>
213
236
  </layout>
214
- <action name="actionBookmarksAdd" >
215
- <property name="text" >
237
+ <action name="actionBookmarksAdd">
238
+ <property name="text">
216
239
  <string>Add...</string>
217
240
  </property>
218
241
  </action>
219
- <action name="actionGoto" >
220
- <property name="text" >
242
+ <action name="actionGoto">
243
+ <property name="text">
221
244
  <string>goto</string>
222
245
  </property>
223
- <property name="shortcut" >
246
+ <property name="shortcut">
224
247
  <string>Shift+G, G</string>
225
248
  </property>
226
- <property name="shortcutContext" >
249
+ <property name="shortcutContext">
227
250
  <enum>Qt::ApplicationShortcut</enum>
228
251
  </property>
229
252
  </action>
230
- <action name="actionBookmarksSave" >
231
- <property name="enabled" >
253
+ <action name="actionBookmarksSave">
254
+ <property name="enabled">
232
255
  <bool>false</bool>
233
256
  </property>
234
- <property name="text" >
257
+ <property name="text">
235
258
  <string>Save</string>
236
259
  </property>
237
260
  </action>
238
- <action name="actionBookmarksSaveAs" >
239
- <property name="enabled" >
261
+ <action name="actionBookmarksSaveAs">
262
+ <property name="enabled">
240
263
  <bool>true</bool>
241
264
  </property>
242
- <property name="text" >
265
+ <property name="text">
243
266
  <string>Save As</string>
244
267
  </property>
245
268
  </action>
246
- <action name="actionBookmarksLoad" >
247
- <property name="text" >
269
+ <action name="actionBookmarksLoad">
270
+ <property name="text">
248
271
  <string>Load</string>
249
272
  </property>
250
273
  </action>
251
- <action name="actionBookmarksSetMark" >
252
- <property name="text" >
274
+ <action name="actionBookmarksSetMark">
275
+ <property name="text">
253
276
  <string>Set mark</string>
254
277
  </property>
255
278
  </action>