roby 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>