roby 0.7

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 (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>