roby 0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (240) hide show
  1. data/.gitignore +29 -0
  2. data/History.txt +4 -0
  3. data/License-fr.txt +519 -0
  4. data/License.txt +515 -0
  5. data/Manifest.txt +245 -0
  6. data/NOTES +4 -0
  7. data/README.txt +163 -0
  8. data/Rakefile +161 -0
  9. data/TODO.txt +146 -0
  10. data/app/README.txt +24 -0
  11. data/app/Rakefile +8 -0
  12. data/app/config/ROBOT.rb +5 -0
  13. data/app/config/app.yml +91 -0
  14. data/app/config/init.rb +7 -0
  15. data/app/config/roby.yml +3 -0
  16. data/app/controllers/.gitattributes +0 -0
  17. data/app/controllers/ROBOT.rb +2 -0
  18. data/app/data/.gitattributes +0 -0
  19. data/app/planners/ROBOT/main.rb +6 -0
  20. data/app/planners/main.rb +5 -0
  21. data/app/scripts/distributed +3 -0
  22. data/app/scripts/generate/bookmarks +3 -0
  23. data/app/scripts/replay +3 -0
  24. data/app/scripts/results +3 -0
  25. data/app/scripts/run +3 -0
  26. data/app/scripts/server +3 -0
  27. data/app/scripts/shell +3 -0
  28. data/app/scripts/test +3 -0
  29. data/app/tasks/.gitattributes +0 -0
  30. data/app/tasks/ROBOT/.gitattributes +0 -0
  31. data/bin/roby +210 -0
  32. data/bin/roby-log +168 -0
  33. data/bin/roby-shell +25 -0
  34. data/doc/images/event_generalization.png +0 -0
  35. data/doc/images/exception_propagation_1.png +0 -0
  36. data/doc/images/exception_propagation_2.png +0 -0
  37. data/doc/images/exception_propagation_3.png +0 -0
  38. data/doc/images/exception_propagation_4.png +0 -0
  39. data/doc/images/exception_propagation_5.png +0 -0
  40. data/doc/images/replay_handler_error.png +0 -0
  41. data/doc/images/replay_handler_error_0.png +0 -0
  42. data/doc/images/replay_handler_error_1.png +0 -0
  43. data/doc/images/roby_cycle_overview.png +0 -0
  44. data/doc/images/roby_replay_02.png +0 -0
  45. data/doc/images/roby_replay_03.png +0 -0
  46. data/doc/images/roby_replay_04.png +0 -0
  47. data/doc/images/roby_replay_event_representation.png +0 -0
  48. data/doc/images/roby_replay_first_state.png +0 -0
  49. data/doc/images/roby_replay_relations.png +0 -0
  50. data/doc/images/roby_replay_startup.png +0 -0
  51. data/doc/images/task_event_generalization.png +0 -0
  52. data/doc/papers.rdoc +11 -0
  53. data/doc/styles/allison.css +314 -0
  54. data/doc/styles/allison.js +316 -0
  55. data/doc/styles/allison.rb +276 -0
  56. data/doc/styles/jamis.rb +593 -0
  57. data/doc/tutorials/01-GettingStarted.rdoc +86 -0
  58. data/doc/tutorials/02-GoForward.rdoc +220 -0
  59. data/doc/tutorials/03-PlannedPath.rdoc +268 -0
  60. data/doc/tutorials/04-EventPropagation.rdoc +236 -0
  61. data/doc/tutorials/05-ErrorHandling.rdoc +319 -0
  62. data/doc/tutorials/06-Overview.rdoc +40 -0
  63. data/doc/videos.rdoc +69 -0
  64. data/ext/droby/dump.cc +175 -0
  65. data/ext/droby/extconf.rb +3 -0
  66. data/ext/graph/algorithm.cc +746 -0
  67. data/ext/graph/extconf.rb +7 -0
  68. data/ext/graph/graph.cc +529 -0
  69. data/ext/graph/graph.hh +183 -0
  70. data/ext/graph/iterator_sequence.hh +102 -0
  71. data/ext/graph/undirected_dfs.hh +226 -0
  72. data/ext/graph/undirected_graph.hh +421 -0
  73. data/lib/roby.rb +41 -0
  74. data/lib/roby/app.rb +870 -0
  75. data/lib/roby/app/rake.rb +56 -0
  76. data/lib/roby/app/run.rb +14 -0
  77. data/lib/roby/app/scripts/distributed.rb +13 -0
  78. data/lib/roby/app/scripts/generate/bookmarks.rb +162 -0
  79. data/lib/roby/app/scripts/replay.rb +31 -0
  80. data/lib/roby/app/scripts/results.rb +15 -0
  81. data/lib/roby/app/scripts/run.rb +26 -0
  82. data/lib/roby/app/scripts/server.rb +18 -0
  83. data/lib/roby/app/scripts/shell.rb +88 -0
  84. data/lib/roby/app/scripts/test.rb +40 -0
  85. data/lib/roby/basic_object.rb +151 -0
  86. data/lib/roby/config.rb +5 -0
  87. data/lib/roby/control.rb +747 -0
  88. data/lib/roby/decision_control.rb +17 -0
  89. data/lib/roby/distributed.rb +32 -0
  90. data/lib/roby/distributed/base.rb +440 -0
  91. data/lib/roby/distributed/communication.rb +871 -0
  92. data/lib/roby/distributed/connection_space.rb +592 -0
  93. data/lib/roby/distributed/distributed_object.rb +206 -0
  94. data/lib/roby/distributed/drb.rb +62 -0
  95. data/lib/roby/distributed/notifications.rb +539 -0
  96. data/lib/roby/distributed/peer.rb +550 -0
  97. data/lib/roby/distributed/protocol.rb +529 -0
  98. data/lib/roby/distributed/proxy.rb +343 -0
  99. data/lib/roby/distributed/subscription.rb +311 -0
  100. data/lib/roby/distributed/transaction.rb +498 -0
  101. data/lib/roby/event.rb +897 -0
  102. data/lib/roby/exceptions.rb +234 -0
  103. data/lib/roby/executives/simple.rb +30 -0
  104. data/lib/roby/graph.rb +166 -0
  105. data/lib/roby/interface.rb +390 -0
  106. data/lib/roby/log.rb +3 -0
  107. data/lib/roby/log/chronicle.rb +303 -0
  108. data/lib/roby/log/console.rb +72 -0
  109. data/lib/roby/log/data_stream.rb +197 -0
  110. data/lib/roby/log/dot.rb +279 -0
  111. data/lib/roby/log/event_stream.rb +151 -0
  112. data/lib/roby/log/file.rb +340 -0
  113. data/lib/roby/log/gui/basic_display.ui +83 -0
  114. data/lib/roby/log/gui/chronicle.rb +26 -0
  115. data/lib/roby/log/gui/chronicle_view.rb +40 -0
  116. data/lib/roby/log/gui/chronicle_view.ui +70 -0
  117. data/lib/roby/log/gui/data_displays.rb +172 -0
  118. data/lib/roby/log/gui/data_displays.ui +155 -0
  119. data/lib/roby/log/gui/notifications.rb +26 -0
  120. data/lib/roby/log/gui/relations.rb +248 -0
  121. data/lib/roby/log/gui/relations.ui +123 -0
  122. data/lib/roby/log/gui/relations_view.rb +185 -0
  123. data/lib/roby/log/gui/relations_view.ui +149 -0
  124. data/lib/roby/log/gui/replay.rb +327 -0
  125. data/lib/roby/log/gui/replay_controls.rb +200 -0
  126. data/lib/roby/log/gui/replay_controls.ui +259 -0
  127. data/lib/roby/log/gui/runtime.rb +130 -0
  128. data/lib/roby/log/hooks.rb +185 -0
  129. data/lib/roby/log/logger.rb +202 -0
  130. data/lib/roby/log/notifications.rb +244 -0
  131. data/lib/roby/log/plan_rebuilder.rb +470 -0
  132. data/lib/roby/log/relations.rb +1056 -0
  133. data/lib/roby/log/server.rb +550 -0
  134. data/lib/roby/log/sqlite.rb +47 -0
  135. data/lib/roby/log/timings.rb +164 -0
  136. data/lib/roby/plan-object.rb +247 -0
  137. data/lib/roby/plan.rb +762 -0
  138. data/lib/roby/planning.rb +13 -0
  139. data/lib/roby/planning/loops.rb +302 -0
  140. data/lib/roby/planning/model.rb +906 -0
  141. data/lib/roby/planning/task.rb +151 -0
  142. data/lib/roby/propagation.rb +562 -0
  143. data/lib/roby/query.rb +619 -0
  144. data/lib/roby/relations.rb +583 -0
  145. data/lib/roby/relations/conflicts.rb +70 -0
  146. data/lib/roby/relations/ensured.rb +20 -0
  147. data/lib/roby/relations/error_handling.rb +23 -0
  148. data/lib/roby/relations/events.rb +9 -0
  149. data/lib/roby/relations/executed_by.rb +193 -0
  150. data/lib/roby/relations/hierarchy.rb +239 -0
  151. data/lib/roby/relations/influence.rb +10 -0
  152. data/lib/roby/relations/planned_by.rb +63 -0
  153. data/lib/roby/robot.rb +7 -0
  154. data/lib/roby/standard_errors.rb +218 -0
  155. data/lib/roby/state.rb +5 -0
  156. data/lib/roby/state/events.rb +221 -0
  157. data/lib/roby/state/information.rb +55 -0
  158. data/lib/roby/state/pos.rb +110 -0
  159. data/lib/roby/state/shapes.rb +32 -0
  160. data/lib/roby/state/state.rb +353 -0
  161. data/lib/roby/support.rb +92 -0
  162. data/lib/roby/task-operations.rb +182 -0
  163. data/lib/roby/task.rb +1618 -0
  164. data/lib/roby/test/common.rb +399 -0
  165. data/lib/roby/test/distributed.rb +214 -0
  166. data/lib/roby/test/tasks/empty_task.rb +9 -0
  167. data/lib/roby/test/tasks/goto.rb +36 -0
  168. data/lib/roby/test/tasks/simple_task.rb +23 -0
  169. data/lib/roby/test/testcase.rb +519 -0
  170. data/lib/roby/test/tools.rb +160 -0
  171. data/lib/roby/thread_task.rb +87 -0
  172. data/lib/roby/transactions.rb +462 -0
  173. data/lib/roby/transactions/proxy.rb +292 -0
  174. data/lib/roby/transactions/updates.rb +139 -0
  175. data/plugins/fault_injection/History.txt +4 -0
  176. data/plugins/fault_injection/README.txt +37 -0
  177. data/plugins/fault_injection/Rakefile +18 -0
  178. data/plugins/fault_injection/TODO.txt +0 -0
  179. data/plugins/fault_injection/app.rb +52 -0
  180. data/plugins/fault_injection/fault_injection.rb +89 -0
  181. data/plugins/fault_injection/test/test_fault_injection.rb +84 -0
  182. data/plugins/subsystems/README.txt +40 -0
  183. data/plugins/subsystems/Rakefile +18 -0
  184. data/plugins/subsystems/app.rb +171 -0
  185. data/plugins/subsystems/test/app/README +24 -0
  186. data/plugins/subsystems/test/app/Rakefile +8 -0
  187. data/plugins/subsystems/test/app/config/app.yml +71 -0
  188. data/plugins/subsystems/test/app/config/init.rb +9 -0
  189. data/plugins/subsystems/test/app/config/roby.yml +3 -0
  190. data/plugins/subsystems/test/app/planners/main.rb +20 -0
  191. data/plugins/subsystems/test/app/scripts/distributed +3 -0
  192. data/plugins/subsystems/test/app/scripts/replay +3 -0
  193. data/plugins/subsystems/test/app/scripts/results +3 -0
  194. data/plugins/subsystems/test/app/scripts/run +3 -0
  195. data/plugins/subsystems/test/app/scripts/server +3 -0
  196. data/plugins/subsystems/test/app/scripts/shell +3 -0
  197. data/plugins/subsystems/test/app/scripts/test +3 -0
  198. data/plugins/subsystems/test/app/tasks/services.rb +15 -0
  199. data/plugins/subsystems/test/test_subsystems.rb +71 -0
  200. data/test/distributed/test_communication.rb +178 -0
  201. data/test/distributed/test_connection.rb +282 -0
  202. data/test/distributed/test_execution.rb +373 -0
  203. data/test/distributed/test_mixed_plan.rb +341 -0
  204. data/test/distributed/test_plan_notifications.rb +238 -0
  205. data/test/distributed/test_protocol.rb +516 -0
  206. data/test/distributed/test_query.rb +102 -0
  207. data/test/distributed/test_remote_plan.rb +491 -0
  208. data/test/distributed/test_transaction.rb +463 -0
  209. data/test/mockups/tasks.rb +27 -0
  210. data/test/planning/test_loops.rb +380 -0
  211. data/test/planning/test_model.rb +427 -0
  212. data/test/planning/test_task.rb +106 -0
  213. data/test/relations/test_conflicts.rb +42 -0
  214. data/test/relations/test_ensured.rb +38 -0
  215. data/test/relations/test_executed_by.rb +149 -0
  216. data/test/relations/test_hierarchy.rb +158 -0
  217. data/test/relations/test_planned_by.rb +54 -0
  218. data/test/suite_core.rb +24 -0
  219. data/test/suite_distributed.rb +9 -0
  220. data/test/suite_planning.rb +3 -0
  221. data/test/suite_relations.rb +8 -0
  222. data/test/test_bgl.rb +508 -0
  223. data/test/test_control.rb +399 -0
  224. data/test/test_event.rb +894 -0
  225. data/test/test_exceptions.rb +592 -0
  226. data/test/test_interface.rb +37 -0
  227. data/test/test_log.rb +114 -0
  228. data/test/test_log_server.rb +132 -0
  229. data/test/test_plan.rb +584 -0
  230. data/test/test_propagation.rb +210 -0
  231. data/test/test_query.rb +266 -0
  232. data/test/test_relations.rb +180 -0
  233. data/test/test_state.rb +414 -0
  234. data/test/test_support.rb +16 -0
  235. data/test/test_task.rb +938 -0
  236. data/test/test_testcase.rb +122 -0
  237. data/test/test_thread_task.rb +73 -0
  238. data/test/test_transactions.rb +569 -0
  239. data/test/test_transactions_proxy.rb +198 -0
  240. metadata +570 -0
@@ -0,0 +1,200 @@
1
+ require 'roby/log/gui/replay_controls_ui'
2
+
3
+ class Ui::ReplayControls
4
+ attr_reader :replay
5
+
6
+ attr_reader :bookmarks_menu
7
+ attr_reader :bookmarks_actions
8
+ attr_reader :bookmarks_file
9
+ attr_reader :bookmarks_start_mark
10
+
11
+ KEY_GOTO = Qt::KeySequence.new('g')
12
+
13
+ def load_bookmarks(file = nil)
14
+ file ||= Qt::FileDialog.get_open_file_name replay, "Load bookmarks"
15
+ unless !file || file.empty?
16
+ replay.bookmarks.clear
17
+
18
+ list = File.open(file) { |io| YAML.load(io) }
19
+ list.each do |name, times|
20
+ replay.bookmarks[name] = times.map { |t| Time.from_hms(t) if t }
21
+ end
22
+ update_bookmarks_menu
23
+
24
+ @bookmarks_file = file
25
+ actionBookmarksSave.enabled = true
26
+ end
27
+ end
28
+
29
+ def save_bookmarks_as
30
+ file = Qt::FileDialog.get_save_file_name replay, "Save bookmarks"
31
+ unless !file || file.empty?
32
+ @bookmarks_file = file
33
+ actionBookmarksSave.enabled = true
34
+ save_bookmarks
35
+ end
36
+ end
37
+
38
+ def save_bookmarks
39
+ data = replay.bookmarks.inject(Hash.new) do |data, (name, times)|
40
+ data[name] = times.map { |t| t.to_hms if t }
41
+ data
42
+ end
43
+ File.open(bookmarks_file, 'w') do |io|
44
+ YAML.dump(data, io)
45
+ end
46
+ end
47
+
48
+
49
+ def update_bookmarks_menu
50
+ bookmarks_actions.each do |action|
51
+ bookmarks_menu.remove_action action
52
+ end
53
+ bookmarks_actions.clear
54
+
55
+ bookmarks = replay.bookmarks.sort_by { |name, time| time }
56
+ bookmarks.unshift(["Mark", [bookmarks_start_mark, nil]]) if bookmarks_start_mark
57
+
58
+ bookmarks.each do |name, range|
59
+ start_time, end_time = if replay.first_sample
60
+ # Handle sub-millisecond rounding effects
61
+ range.map do |t|
62
+ if t
63
+ ((t - replay.first_sample) * 1000).round / 1000.0
64
+ end
65
+ end
66
+ else
67
+ range.map { |t| t.to_hms if t }
68
+ end
69
+
70
+ display = if start_time && end_time
71
+ "#{start_time} - #{end_time}"
72
+ else
73
+ (start_time || end_time).to_s
74
+ end
75
+
76
+ action = Qt::Action.new "#{name} (#{display})", bookmarks_menu
77
+ action.connect(SIGNAL(:triggered)) do
78
+ range.each { |t| replay.seek(t) if t }
79
+ end
80
+ bookmarks_actions << action
81
+ bookmarks_menu.add_action action
82
+ end
83
+ end
84
+
85
+ def setupUi(replay, widget)
86
+ @replay = replay
87
+ super(widget)
88
+
89
+ @bookmarks_actions = []
90
+ bookmarks.menu = @bookmarks_menu = Qt::Menu.new
91
+ bookmarks_menu.add_action actionBookmarksSave
92
+ bookmarks_menu.add_action actionBookmarksSaveAs
93
+ bookmarks_menu.add_action actionBookmarksLoad
94
+ bookmarks_menu.add_separator
95
+ bookmarks_menu.add_action actionBookmarksSetMark
96
+ bookmarks_menu.add_action actionBookmarksAdd
97
+ bookmarks_menu.add_separator
98
+ actionBookmarksLoad.connect(SIGNAL(:triggered)) { load_bookmarks }
99
+ actionBookmarksSaveAs.connect(SIGNAL(:triggered)) { save_bookmarks_as }
100
+ actionBookmarksSave.connect(SIGNAL(:triggered)) { save_bookmarks }
101
+ actionBookmarksSetMark.connect(SIGNAL(:triggered)) do
102
+ @bookmarks_start_mark = replay.time
103
+ update_bookmarks_menu
104
+ end
105
+ actionBookmarksAdd.connect(SIGNAL(:triggered)) do
106
+ new_name = Qt::InputDialog.get_text widget, "New bookmark", "Name: "
107
+ unless new_name && new_name.empty?
108
+ replay.bookmarks[new_name] = [bookmarks_start_mark, replay.time]
109
+ update_bookmarks_menu
110
+ end
111
+ end
112
+ update_bookmarks_menu
113
+
114
+ goto.connect(SIGNAL(:clicked)) do
115
+ handleGoto
116
+ end
117
+ shortcut = Qt::Shortcut.new(KEY_GOTO, widget)
118
+ shortcut.context = Qt::ApplicationShortcut
119
+ shortcut.connect(SIGNAL(:activated)) do
120
+ handleGoto
121
+ end
122
+
123
+ seek_start.connect(SIGNAL(:clicked)) do
124
+ replay.seek(nil)
125
+ end
126
+ faster.connect(SIGNAL('clicked()')) do
127
+ speed = replay.play_speed
128
+ factor = speed < 1 ? 10 : 1
129
+ speed = Float(Integer(factor * speed) + 1.0) / factor
130
+ slower.enabled = (speed > 0.1)
131
+ replay.play_speed = speed
132
+ end
133
+ slower.connect(SIGNAL('clicked()')) do
134
+ speed = replay.play_speed
135
+ factor = speed <= 1 ? 10 : 1
136
+ speed = Float(Integer(factor * speed) - 1.0) / factor
137
+ slower.enabled = (speed > 0.1)
138
+ replay.play_speed = speed
139
+ end
140
+ speed.connect(SIGNAL('editingFinished()')) do
141
+ begin
142
+ new_speed = Float(speed.text)
143
+ if new_speed <= 0
144
+ raise ArgumentError, "negative values are not allowed for speed"
145
+ end
146
+ replay.play_speed = new_speed
147
+ rescue ArgumentError
148
+ Qt::MessageBox.warning nil, "Invalid speed", "Invalid value for speed \"#{ui_controls.speed.text}\": #{$!.message}"
149
+ self.play_speed = play_speed
150
+ end
151
+ end
152
+
153
+ play.connect(SIGNAL("clicked()")) do
154
+ if play.checked?
155
+ replay.play
156
+ else
157
+ replay.stop
158
+ end
159
+ seek_start.enabled = play_step.enabled = !play.checked?
160
+ end
161
+ play_step.connect(SIGNAL("clicked()")) do
162
+ replay.play_step
163
+ end
164
+ end
165
+
166
+ def handleGoto
167
+ user_time = begin
168
+ user_time = Qt::InputDialog.get_text nil, 'Going to ...',
169
+ "<html><b>Go to time</b><ul><li>use \'+\' for a relative jump forward</li><li>'-' for a relative jump backwards</li></ul></html>",
170
+ Qt::LineEdit::Normal, (user_time || @last_goto || "")
171
+ return unless user_time && !user_time.empty?
172
+
173
+ @last_goto = user_time
174
+ if user_time =~ /^\s*([\+\-@])(.*)/
175
+ op = $1
176
+ user_time = $2
177
+ end
178
+ user_time = Time.from_hms(user_time)
179
+
180
+ rescue ArgumentError
181
+ Qt::MessageBox.warning nil, "Invalid user_time", "Invalid user_time: #{$!.message}", "OK"
182
+ retry
183
+ end
184
+
185
+ unless replay.first_sample
186
+ replay.seek(nil)
187
+ end
188
+
189
+ user_time = if !op
190
+ replay.first_sample + (user_time - Time.at(0))
191
+ elsif op != "@"
192
+ replay.time.send(op, user_time - Time.at(0))
193
+ else
194
+ user_time
195
+ end
196
+
197
+ replay.seek(user_time)
198
+ end
199
+ end
200
+
@@ -0,0 +1,259 @@
1
+ <ui version="4.0" >
2
+ <class>ReplayControls</class>
3
+ <widget class="QWidget" name="ReplayControls" >
4
+ <property name="geometry" >
5
+ <rect>
6
+ <x>0</x>
7
+ <y>0</y>
8
+ <width>432</width>
9
+ <height>168</height>
10
+ </rect>
11
+ </property>
12
+ <property name="windowTitle" >
13
+ <string>Form</string>
14
+ </property>
15
+ <layout class="QVBoxLayout" >
16
+ <item>
17
+ <widget class="QGroupBox" name="grp_play" >
18
+ <property name="title" >
19
+ <string>Play</string>
20
+ </property>
21
+ <layout class="QVBoxLayout" >
22
+ <item>
23
+ <layout class="QHBoxLayout" >
24
+ <item>
25
+ <widget class="QProgressBar" name="progress" >
26
+ <property name="value" >
27
+ <number>0</number>
28
+ </property>
29
+ <property name="orientation" >
30
+ <enum>Qt::Horizontal</enum>
31
+ </property>
32
+ </widget>
33
+ </item>
34
+ <item>
35
+ <widget class="QPushButton" name="goto" >
36
+ <property name="text" >
37
+ <string>&amp;Goto</string>
38
+ </property>
39
+ </widget>
40
+ </item>
41
+ <item>
42
+ <widget class="QLCDNumber" name="time_lcd" >
43
+ <property name="numDigits" >
44
+ <number>6</number>
45
+ </property>
46
+ <property name="segmentStyle" >
47
+ <enum>QLCDNumber::Flat</enum>
48
+ </property>
49
+ <property name="value" stdset="0" >
50
+ <double>0.000000000000000</double>
51
+ </property>
52
+ </widget>
53
+ </item>
54
+ </layout>
55
+ </item>
56
+ <item>
57
+ <layout class="QHBoxLayout" >
58
+ <item>
59
+ <widget class="QLabel" name="textLabel1" >
60
+ <property name="text" >
61
+ <string>Speed</string>
62
+ </property>
63
+ <property name="wordWrap" >
64
+ <bool>false</bool>
65
+ </property>
66
+ </widget>
67
+ </item>
68
+ <item>
69
+ <widget class="QLineEdit" name="speed" >
70
+ <property name="sizePolicy" >
71
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
72
+ <horstretch>1</horstretch>
73
+ <verstretch>0</verstretch>
74
+ </sizepolicy>
75
+ </property>
76
+ <property name="maximumSize" >
77
+ <size>
78
+ <width>80</width>
79
+ <height>32767</height>
80
+ </size>
81
+ </property>
82
+ <property name="toolTip" >
83
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
84
+ 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>
89
+ </property>
90
+ <property name="text" >
91
+ <string>1</string>
92
+ </property>
93
+ <property name="alignment" >
94
+ <set>Qt::AlignRight</set>
95
+ </property>
96
+ </widget>
97
+ </item>
98
+ <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">
102
+ 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>
105
+ </property>
106
+ <property name="text" >
107
+ <string>&lt;&lt;</string>
108
+ </property>
109
+ </widget>
110
+ </item>
111
+ <item>
112
+ <widget class="QPushButton" name="play" >
113
+ <property name="sizePolicy" >
114
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" >
115
+ <horstretch>2</horstretch>
116
+ <verstretch>0</verstretch>
117
+ </sizepolicy>
118
+ </property>
119
+ <property name="toolTip" >
120
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
121
+ 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>
124
+ </property>
125
+ <property name="text" >
126
+ <string>></string>
127
+ </property>
128
+ <property name="checkable" >
129
+ <bool>true</bool>
130
+ </property>
131
+ </widget>
132
+ </item>
133
+ <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">
137
+ 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>
140
+ </property>
141
+ <property name="text" >
142
+ <string>>></string>
143
+ </property>
144
+ </widget>
145
+ </item>
146
+ </layout>
147
+ </item>
148
+ <item>
149
+ <layout class="QHBoxLayout" >
150
+ <item>
151
+ <widget class="QToolButton" name="bookmarks" >
152
+ <property name="text" >
153
+ <string>Bookmarks</string>
154
+ </property>
155
+ <property name="popupMode" >
156
+ <enum>QToolButton::InstantPopup</enum>
157
+ </property>
158
+ <property name="toolButtonStyle" >
159
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
160
+ </property>
161
+ <property name="arrowType" >
162
+ <enum>Qt::DownArrow</enum>
163
+ </property>
164
+ </widget>
165
+ </item>
166
+ <item>
167
+ <spacer>
168
+ <property name="orientation" >
169
+ <enum>Qt::Horizontal</enum>
170
+ </property>
171
+ <property name="sizeHint" >
172
+ <size>
173
+ <width>40</width>
174
+ <height>20</height>
175
+ </size>
176
+ </property>
177
+ </spacer>
178
+ </item>
179
+ <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">
183
+ 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">
199
+ 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>
207
+ </item>
208
+ </layout>
209
+ </item>
210
+ </layout>
211
+ </widget>
212
+ </item>
213
+ </layout>
214
+ <action name="actionBookmarksAdd" >
215
+ <property name="text" >
216
+ <string>Add...</string>
217
+ </property>
218
+ </action>
219
+ <action name="actionGoto" >
220
+ <property name="text" >
221
+ <string>goto</string>
222
+ </property>
223
+ <property name="shortcut" >
224
+ <string>Shift+G, G</string>
225
+ </property>
226
+ <property name="shortcutContext" >
227
+ <enum>Qt::ApplicationShortcut</enum>
228
+ </property>
229
+ </action>
230
+ <action name="actionBookmarksSave" >
231
+ <property name="enabled" >
232
+ <bool>false</bool>
233
+ </property>
234
+ <property name="text" >
235
+ <string>Save</string>
236
+ </property>
237
+ </action>
238
+ <action name="actionBookmarksSaveAs" >
239
+ <property name="enabled" >
240
+ <bool>true</bool>
241
+ </property>
242
+ <property name="text" >
243
+ <string>Save As</string>
244
+ </property>
245
+ </action>
246
+ <action name="actionBookmarksLoad" >
247
+ <property name="text" >
248
+ <string>Load</string>
249
+ </property>
250
+ </action>
251
+ <action name="actionBookmarksSetMark" >
252
+ <property name="text" >
253
+ <string>Set mark</string>
254
+ </property>
255
+ </action>
256
+ </widget>
257
+ <resources/>
258
+ <connections/>
259
+ </ui>