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,83 @@
1
+ <ui version="4.0" >
2
+ <class>BasicDisplayConfig</class>
3
+ <widget class="QWidget" name="BasicDisplayConfig" >
4
+ <property name="geometry" >
5
+ <rect>
6
+ <x>0</x>
7
+ <y>0</y>
8
+ <width>333</width>
9
+ <height>77</height>
10
+ </rect>
11
+ </property>
12
+ <property name="windowTitle" >
13
+ <string>Form</string>
14
+ </property>
15
+ <layout class="QGridLayout" >
16
+ <property name="margin" >
17
+ <number>9</number>
18
+ </property>
19
+ <property name="spacing" >
20
+ <number>6</number>
21
+ </property>
22
+ <item row="0" column="0" >
23
+ <layout class="QGridLayout" >
24
+ <property name="margin" >
25
+ <number>0</number>
26
+ </property>
27
+ <property name="spacing" >
28
+ <number>6</number>
29
+ </property>
30
+ <item row="1" column="0" >
31
+ <widget class="QLabel" name="label" >
32
+ <property name="sizePolicy" >
33
+ <sizepolicy>
34
+ <hsizetype>1</hsizetype>
35
+ <vsizetype>5</vsizetype>
36
+ <horstretch>0</horstretch>
37
+ <verstretch>0</verstretch>
38
+ </sizepolicy>
39
+ </property>
40
+ <property name="text" >
41
+ <string>Data stream</string>
42
+ </property>
43
+ </widget>
44
+ </item>
45
+ <item row="0" column="2" >
46
+ <widget class="QPushButton" name="close" >
47
+ <property name="text" >
48
+ <string>Close</string>
49
+ </property>
50
+ </widget>
51
+ </item>
52
+ <item row="0" column="0" colspan="2" >
53
+ <spacer>
54
+ <property name="orientation" >
55
+ <enum>Qt::Horizontal</enum>
56
+ </property>
57
+ <property name="sizeHint" >
58
+ <size>
59
+ <width>161</width>
60
+ <height>20</height>
61
+ </size>
62
+ </property>
63
+ </spacer>
64
+ </item>
65
+ <item row="1" column="1" colspan="2" >
66
+ <widget class="QComboBox" name="stream" >
67
+ <property name="sizePolicy" >
68
+ <sizepolicy>
69
+ <hsizetype>3</hsizetype>
70
+ <vsizetype>0</vsizetype>
71
+ <horstretch>0</horstretch>
72
+ <verstretch>0</verstretch>
73
+ </sizepolicy>
74
+ </property>
75
+ </widget>
76
+ </item>
77
+ </layout>
78
+ </item>
79
+ </layout>
80
+ </widget>
81
+ <resources/>
82
+ <connections/>
83
+ </ui>
@@ -0,0 +1,26 @@
1
+ require 'roby/log/gui/basic_display_ui'
2
+ require 'roby/log/chronicle'
3
+
4
+ module Ui
5
+ class ChronicleConfig < Ui::BasicDisplayConfig
6
+ attr_reader :streams_model
7
+
8
+ def setupUi(streams_model, widget)
9
+ super(widget)
10
+
11
+ display = Roby::Log::ChronicleDisplay.new
12
+ @streams_model = FilteredDataStreamListModel.new(stream, display, 'roby-events', streams_model.streams)
13
+ Qt::Object.connect(stream, SIGNAL("currentIndexChanged(int)"), @streams_model, SLOT("selectedStream()"))
14
+ @streams_model.source_model = streams_model
15
+ stream.model = @streams_model
16
+ display
17
+ end
18
+
19
+ def self.setup_optparse(opt, replay)
20
+ opt.on("--chronicle") do
21
+ replay.add_display('Chronicle')
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,40 @@
1
+ require 'roby/log/gui/chronicle_view_ui'
2
+
3
+ class Ui::ChronicleView
4
+ TIME_SCALE_STEP = 2.0
5
+ ZOOM_STEP = 0.25
6
+
7
+ attr_reader :display
8
+ def setupUi(display, widget)
9
+ @display = display
10
+ super(widget)
11
+
12
+ actionZoom.connect(SIGNAL(:triggered)) do
13
+ scale = graphics.matrix.m11
14
+ if scale + ZOOM_STEP > 1
15
+ scale = 1 - ZOOM_STEP
16
+ end
17
+ graphics.resetMatrix
18
+ graphics.scale scale + ZOOM_STEP, scale + ZOOM_STEP
19
+ end
20
+ actionUnZoom.connect(SIGNAL(:triggered)) do
21
+ scale = graphics.matrix.m11
22
+ graphics.resetMatrix
23
+ graphics.scale scale - ZOOM_STEP, scale - ZOOM_STEP
24
+ end
25
+ actionTimeScale.connect(SIGNAL(:triggered)) do
26
+ current_scale = display.time_scale
27
+ if current_scale * TIME_SCALE_STEP >= 1000
28
+ display.time_scale = 1000
29
+ actionTimeScale.enabled = false
30
+ else
31
+ display.time_scale = current_scale * TIME_SCALE_STEP
32
+ end
33
+ end
34
+ actionTimeUnscale.connect(SIGNAL(:triggered)) do
35
+ display.time_scale /= TIME_SCALE_STEP
36
+ actionTimeScale.enabled = true
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,70 @@
1
+ <ui version="4.0" >
2
+ <class>ChronicleView</class>
3
+ <widget class="QMainWindow" name="ChronicleView" >
4
+ <property name="geometry" >
5
+ <rect>
6
+ <x>0</x>
7
+ <y>0</y>
8
+ <width>800</width>
9
+ <height>600</height>
10
+ </rect>
11
+ </property>
12
+ <property name="windowTitle" >
13
+ <string>MainWindow</string>
14
+ </property>
15
+ <widget class="QWidget" name="centralwidget" >
16
+ <layout class="QVBoxLayout" >
17
+ <item>
18
+ <widget class="QGraphicsView" name="graphics" >
19
+ <property name="renderHints" >
20
+ <set>QPainter::Antialiasing|QPainter::TextAntialiasing</set>
21
+ </property>
22
+ </widget>
23
+ </item>
24
+ </layout>
25
+ </widget>
26
+ <widget class="QMenuBar" name="menubar" >
27
+ <property name="geometry" >
28
+ <rect>
29
+ <x>0</x>
30
+ <y>0</y>
31
+ <width>800</width>
32
+ <height>29</height>
33
+ </rect>
34
+ </property>
35
+ <widget class="QMenu" name="menuView" >
36
+ <property name="title" >
37
+ <string>View</string>
38
+ </property>
39
+ <addaction name="actionTimeScale" />
40
+ <addaction name="actionTimeUnscale" />
41
+ <addaction name="actionZoom" />
42
+ <addaction name="actionUnZoom" />
43
+ </widget>
44
+ <addaction name="menuView" />
45
+ </widget>
46
+ <widget class="QStatusBar" name="statusbar" />
47
+ <action name="actionTimeScale" >
48
+ <property name="text" >
49
+ <string>Timescale +</string>
50
+ </property>
51
+ </action>
52
+ <action name="actionTimeUnscale" >
53
+ <property name="text" >
54
+ <string>Timescale -</string>
55
+ </property>
56
+ </action>
57
+ <action name="actionZoom" >
58
+ <property name="text" >
59
+ <string>Zoom +</string>
60
+ </property>
61
+ </action>
62
+ <action name="actionUnZoom" >
63
+ <property name="text" >
64
+ <string> Zoom-</string>
65
+ </property>
66
+ </action>
67
+ </widget>
68
+ <resources/>
69
+ <connections/>
70
+ </ui>
@@ -0,0 +1,172 @@
1
+ require 'Qt4'
2
+ require 'roby/app'
3
+ require 'roby/log/gui/data_displays_ui'
4
+ require 'roby/log/gui/relations'
5
+ require 'roby/log/gui/notifications'
6
+ require 'roby/log/gui/chronicle'
7
+
8
+ class DataStreamListModel < Qt::AbstractListModel
9
+ attr_reader :streams
10
+ def initialize(streams)
11
+ @streams = streams
12
+ super()
13
+ end
14
+
15
+ def rowCount(parent)
16
+ if parent.valid? then 0
17
+ else streams.size
18
+ end
19
+ end
20
+
21
+ def flags(index)
22
+ Qt::ItemIsSelectable | Qt::ItemIsEnabled
23
+ end
24
+
25
+ def data(index, role)
26
+ return Qt::Variant.new unless role == Qt::DisplayRole && index.valid? && index.row < streams.size
27
+ s = streams[index.row]
28
+ return Qt::Variant.new(s.name + " [#{s.type}]")
29
+ end
30
+
31
+ def edit_at(index)
32
+ return unless index.valid? && index.row < streams.size
33
+ edit(streams[index.row])
34
+ emit dataChanged(index, index)
35
+ end
36
+
37
+ def insertRow(row, parent)
38
+ emit beginInsertRows(parent, row, row)
39
+ if stream = edit(nil)
40
+ @streams.insert row, stream
41
+ return true
42
+ end
43
+ ensure
44
+ emit endInsertRows()
45
+ end
46
+
47
+ def removeRow(row, parent)
48
+ emit beginRemoveRows(parent, row, row)
49
+ @streams.delete_at row
50
+ emit endRemoveRows()
51
+ true
52
+ end
53
+
54
+ def add_new(stream = nil)
55
+ if stream
56
+ emit beginInsertRows(Qt::ModelIndex.new, streams.size, streams.size)
57
+ streams << stream
58
+ emit endInsertRows()
59
+ else
60
+ insertRow(streams.size, Qt::ModelIndex.new)
61
+ end
62
+ end
63
+ end
64
+
65
+
66
+ class FilteredDataStreamListModel < Qt::SortFilterProxyModel
67
+ attr_reader :type, :streams
68
+ attr_reader :stream_combo
69
+ attr_reader :display
70
+ def initialize(stream_combo, display, type, streams)
71
+ super()
72
+ @display = display
73
+ @type = type
74
+ @streams = streams
75
+ @stream_combo = stream_combo
76
+ end
77
+ def filterAcceptsRow(stream_row, stream_parent)
78
+ if s = streams[stream_row]
79
+ s.type == type
80
+ else
81
+ false
82
+ end
83
+ end
84
+ def selectedStream()
85
+ index = stream_combo.current_index
86
+ index = self.index(index, 0, Qt::ModelIndex.new)
87
+ display.stream = streams[mapToSource(index).row]
88
+ end
89
+ slots 'selectedStream()'
90
+ end
91
+
92
+ class DisplayConfigHandler < Qt::Widget
93
+ attr_reader :display_configs
94
+ attr_reader :config_ui
95
+ attr_reader :display
96
+
97
+ def setup(data_displays, config_ui)
98
+ @display_configs = data_displays.display_configs
99
+ @display = data_displays.displays[config_ui]
100
+ @config_ui = config_ui
101
+
102
+ connect(config_ui.close, SIGNAL('clicked()'), self, SLOT('close()'))
103
+ end
104
+
105
+ def close
106
+ idx = display_configs.index_of(self)
107
+ if display.decoder
108
+ display.decoder.displays.delete(display)
109
+ end
110
+ display.main.close
111
+ display_configs.remove_item idx
112
+ end
113
+ slots 'close()'
114
+ end
115
+
116
+ class Ui_DataDisplays
117
+ DISPLAYS = {
118
+ 'Relations' => Ui::RelationsConfig,
119
+ 'Chronicle' => Ui::ChronicleConfig,
120
+ 'Notifications' => Ui::NotificationsConfig
121
+ }
122
+ attr_reader :displays
123
+
124
+ def initialize
125
+ super()
126
+
127
+ @displays = Hash.new
128
+ @display_number = 0
129
+ end
130
+
131
+ def allocate_display_number; @display_number += 1 end
132
+ def add_display(streams, kind = nil)
133
+ kind ||= display_types.current_text
134
+
135
+ begin
136
+ config_widget = DisplayConfigHandler.new
137
+ config_ui = DISPLAYS[kind].new
138
+ rescue Exception => e
139
+ Qt::MessageBox.critical nil, "Cannot create display", "cannot create display #{kind}: #{e.message}"
140
+ return
141
+ end
142
+
143
+ display = config_ui.setupUi(streams, config_widget)
144
+
145
+ name = "#{kind}##{allocate_display_number}"
146
+ idx = display_configs.add_item(config_widget, name)
147
+ display_configs.current_index = idx
148
+
149
+ displays[config_ui] = display
150
+ display.main.window_title = name
151
+ display.main.show
152
+ display.config_ui = config_ui
153
+
154
+ main_window = display.main
155
+ main_window.singleton_class.class_eval do
156
+ define_method(:closeEvent) do |event|
157
+ config_ui.close.clicked
158
+ end
159
+ end
160
+ config_widget.setup(self, config_ui)
161
+
162
+ display
163
+ end
164
+ end
165
+
166
+ if $0 == __FILE__
167
+ a = Qt::Application.new(ARGV)
168
+ w = Replay.new
169
+ w.show
170
+ a.exec
171
+ end
172
+
@@ -0,0 +1,155 @@
1
+ <ui version="4.0" >
2
+ <class>DataDisplays</class>
3
+ <widget class="QWidget" name="DataDisplays" >
4
+ <property name="geometry" >
5
+ <rect>
6
+ <x>0</x>
7
+ <y>0</y>
8
+ <width>548</width>
9
+ <height>508</height>
10
+ </rect>
11
+ </property>
12
+ <property name="windowTitle" >
13
+ <string>Form</string>
14
+ </property>
15
+ <layout class="QVBoxLayout" >
16
+ <property name="margin" >
17
+ <number>9</number>
18
+ </property>
19
+ <property name="spacing" >
20
+ <number>6</number>
21
+ </property>
22
+ <item>
23
+ <widget class="QGroupBox" name="groupBox" >
24
+ <property name="title" >
25
+ <string>Data sources</string>
26
+ </property>
27
+ <layout class="QVBoxLayout" >
28
+ <property name="margin" >
29
+ <number>9</number>
30
+ </property>
31
+ <property name="spacing" >
32
+ <number>6</number>
33
+ </property>
34
+ <item>
35
+ <widget class="QListView" name="streams" />
36
+ </item>
37
+ <item>
38
+ <layout class="QHBoxLayout" >
39
+ <property name="margin" >
40
+ <number>0</number>
41
+ </property>
42
+ <property name="spacing" >
43
+ <number>6</number>
44
+ </property>
45
+ <item>
46
+ <spacer>
47
+ <property name="orientation" >
48
+ <enum>Qt::Horizontal</enum>
49
+ </property>
50
+ <property name="sizeHint" >
51
+ <size>
52
+ <width>40</width>
53
+ <height>20</height>
54
+ </size>
55
+ </property>
56
+ </spacer>
57
+ </item>
58
+ <item>
59
+ <widget class="QPushButton" name="add_stream" >
60
+ <property name="text" >
61
+ <string>&amp;Add</string>
62
+ </property>
63
+ </widget>
64
+ </item>
65
+ <item>
66
+ <widget class="QPushButton" name="remove_stream" >
67
+ <property name="text" >
68
+ <string>Remove</string>
69
+ </property>
70
+ </widget>
71
+ </item>
72
+ </layout>
73
+ </item>
74
+ </layout>
75
+ </widget>
76
+ </item>
77
+ <item>
78
+ <widget class="QGroupBox" name="displaysGroup" >
79
+ <property name="title" >
80
+ <string>Displays</string>
81
+ </property>
82
+ <layout class="QVBoxLayout" >
83
+ <property name="margin" >
84
+ <number>9</number>
85
+ </property>
86
+ <property name="spacing" >
87
+ <number>6</number>
88
+ </property>
89
+ <item>
90
+ <layout class="QHBoxLayout" >
91
+ <property name="margin" >
92
+ <number>0</number>
93
+ </property>
94
+ <property name="spacing" >
95
+ <number>6</number>
96
+ </property>
97
+ <item>
98
+ <widget class="QComboBox" name="display_types" >
99
+ <property name="sizePolicy" >
100
+ <sizepolicy>
101
+ <hsizetype>5</hsizetype>
102
+ <vsizetype>0</vsizetype>
103
+ <horstretch>1</horstretch>
104
+ <verstretch>0</verstretch>
105
+ </sizepolicy>
106
+ </property>
107
+ <item>
108
+ <property name="text" >
109
+ <string>Relations</string>
110
+ </property>
111
+ </item>
112
+ <item>
113
+ <property name="text" >
114
+ <string>Chronicle</string>
115
+ </property>
116
+ </item>
117
+ <item>
118
+ <property name="text" >
119
+ <string>Notifications</string>
120
+ </property>
121
+ </item>
122
+ </widget>
123
+ </item>
124
+ <item>
125
+ <widget class="QPushButton" name="display_add" >
126
+ <property name="text" >
127
+ <string>&amp;Add</string>
128
+ </property>
129
+ </widget>
130
+ </item>
131
+ </layout>
132
+ </item>
133
+ <item>
134
+ <widget class="QToolBox" name="display_configs" >
135
+ <property name="sizePolicy" >
136
+ <sizepolicy>
137
+ <hsizetype>5</hsizetype>
138
+ <vsizetype>3</vsizetype>
139
+ <horstretch>0</horstretch>
140
+ <verstretch>0</verstretch>
141
+ </sizepolicy>
142
+ </property>
143
+ <property name="currentIndex" >
144
+ <number>-1</number>
145
+ </property>
146
+ </widget>
147
+ </item>
148
+ </layout>
149
+ </widget>
150
+ </item>
151
+ </layout>
152
+ </widget>
153
+ <resources/>
154
+ <connections/>
155
+ </ui>