cosmos 3.4.2 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (261) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +69 -11
  3. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +23 -0
  4. data/autohotkey/tools/TestRunnerAHK5 +17 -0
  5. data/autohotkey/tools/TestRunnerAHK6 +17 -0
  6. data/autohotkey/tools/cmd_extractor.ahk +6 -0
  7. data/autohotkey/tools/data_viewer.ahk +6 -0
  8. data/autohotkey/tools/limits_monitor.ahk +67 -14
  9. data/autohotkey/tools/replay.ahk +6 -0
  10. data/autohotkey/tools/test_runner5.ahk +8 -0
  11. data/autohotkey/tools/test_runner6.ahk +5 -0
  12. data/autohotkey/tools/tlm_extractor.ahk +25 -1
  13. data/autohotkey/tools/tlm_grapher.ahk +6 -0
  14. data/cosmos.gemspec +19 -19
  15. data/data/crc.txt +46 -46
  16. data/data/critical.wav +0 -0
  17. data/data/information.wav +0 -0
  18. data/data/input.wav +0 -0
  19. data/data/message.wav +0 -0
  20. data/data/question.wav +0 -0
  21. data/data/warning.wav +0 -0
  22. data/demo/Gemfile +5 -1
  23. data/demo/Launcher +5 -4
  24. data/demo/Launcher.bat +6 -56
  25. data/demo/config/data/crc.txt +73 -55
  26. data/demo/config/system/system.txt +1 -0
  27. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +2 -0
  28. data/demo/procedures/example_test.rb +17 -16
  29. data/demo/tools/CmdExtractor +6 -5
  30. data/demo/tools/CmdExtractor.bat +6 -56
  31. data/demo/tools/CmdSender +6 -5
  32. data/demo/tools/CmdSender.bat +6 -56
  33. data/demo/tools/CmdTlmServer +6 -5
  34. data/demo/tools/CmdTlmServer.bat +6 -56
  35. data/demo/tools/DataViewer +6 -5
  36. data/demo/tools/DataViewer.bat +6 -56
  37. data/demo/tools/ExampleTarget +6 -5
  38. data/demo/tools/ExampleTarget.bat +6 -56
  39. data/demo/tools/HandbookCreator +6 -5
  40. data/demo/tools/HandbookCreator.bat +6 -58
  41. data/demo/tools/Launcher +6 -5
  42. data/demo/tools/Launcher.bat +6 -56
  43. data/demo/tools/LimitsMonitor +6 -5
  44. data/demo/tools/LimitsMonitor.bat +6 -56
  45. data/demo/tools/OpenGLBuilder +6 -5
  46. data/demo/tools/OpenGLBuilder.bat +6 -56
  47. data/demo/tools/PacketViewer +6 -5
  48. data/demo/tools/PacketViewer.bat +6 -56
  49. data/demo/tools/Replay +6 -5
  50. data/demo/tools/Replay.bat +6 -56
  51. data/demo/tools/ScpiTarget +6 -5
  52. data/demo/tools/ScpiTarget.bat +6 -56
  53. data/demo/tools/ScriptRunner +6 -5
  54. data/demo/tools/ScriptRunner.bat +6 -56
  55. data/demo/tools/TableManager +6 -5
  56. data/demo/tools/TableManager.bat +6 -56
  57. data/demo/tools/TestRunner +6 -5
  58. data/demo/tools/TestRunner.bat +6 -56
  59. data/demo/tools/TlmExtractor +6 -5
  60. data/demo/tools/TlmExtractor.bat +6 -56
  61. data/demo/tools/TlmGrapher +6 -5
  62. data/demo/tools/TlmGrapher.bat +6 -56
  63. data/demo/tools/TlmViewer +6 -5
  64. data/demo/tools/TlmViewer.bat +6 -56
  65. data/demo/tools/ToolLaunch.bat +63 -0
  66. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +6 -5
  67. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  68. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +6 -5
  69. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -0
  70. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +6 -5
  71. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -0
  72. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +6 -5
  73. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  74. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +6 -5
  75. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -0
  76. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +6 -5
  77. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -0
  78. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +6 -5
  79. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -0
  80. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +6 -5
  81. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -0
  82. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +6 -5
  83. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  84. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +6 -5
  85. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -0
  86. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +6 -5
  87. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  88. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +6 -5
  89. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -0
  90. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +6 -5
  91. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  92. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +6 -5
  93. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  94. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +6 -5
  95. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -0
  96. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +6 -5
  97. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  98. data/demo/tools/tool_launch.rb +38 -0
  99. data/install/Gemfile +5 -1
  100. data/install/Launcher +5 -3
  101. data/install/Launcher.bat +6 -56
  102. data/install/config/data/crc.txt +67 -49
  103. data/install/config/tools/launcher/launcher.txt +1 -0
  104. data/install/tools/CmdExtractor +6 -5
  105. data/install/tools/CmdExtractor.bat +6 -56
  106. data/install/tools/CmdSender +6 -5
  107. data/install/tools/CmdSender.bat +6 -56
  108. data/install/tools/CmdTlmServer +6 -5
  109. data/install/tools/CmdTlmServer.bat +6 -56
  110. data/install/tools/DataViewer +6 -5
  111. data/install/tools/DataViewer.bat +6 -56
  112. data/install/tools/HandbookCreator +6 -5
  113. data/install/tools/HandbookCreator.bat +6 -58
  114. data/install/tools/Launcher +6 -5
  115. data/install/tools/Launcher.bat +6 -56
  116. data/install/tools/LimitsMonitor +6 -5
  117. data/install/tools/LimitsMonitor.bat +6 -56
  118. data/install/tools/OpenGLBuilder +6 -5
  119. data/install/tools/OpenGLBuilder.bat +6 -56
  120. data/install/tools/PacketViewer +6 -5
  121. data/install/tools/PacketViewer.bat +6 -56
  122. data/install/tools/Replay +6 -5
  123. data/install/tools/Replay.bat +6 -56
  124. data/install/tools/ScriptRunner +6 -5
  125. data/install/tools/ScriptRunner.bat +6 -56
  126. data/install/tools/TableManager +6 -5
  127. data/install/tools/TableManager.bat +6 -56
  128. data/install/tools/TestRunner +6 -5
  129. data/install/tools/TestRunner.bat +6 -56
  130. data/install/tools/TlmExtractor +6 -5
  131. data/install/tools/TlmExtractor.bat +6 -56
  132. data/install/tools/TlmGrapher +6 -5
  133. data/install/tools/TlmGrapher.bat +6 -56
  134. data/install/tools/TlmViewer +6 -5
  135. data/install/tools/TlmViewer.bat +6 -56
  136. data/install/tools/ToolLaunch.bat +63 -0
  137. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +6 -5
  138. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  139. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +6 -5
  140. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -0
  141. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +6 -5
  142. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -0
  143. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +6 -5
  144. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  145. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +6 -5
  146. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -0
  147. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +6 -5
  148. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -0
  149. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +6 -5
  150. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -0
  151. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +6 -5
  152. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -0
  153. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +6 -5
  154. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  155. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +6 -5
  156. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -0
  157. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +6 -5
  158. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  159. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +6 -5
  160. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -0
  161. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +6 -5
  162. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  163. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +6 -5
  164. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  165. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +6 -5
  166. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -0
  167. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +6 -5
  168. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  169. data/install/tools/tool_launch.rb +38 -0
  170. data/lib/cosmos/core_ext/string.rb +3 -2
  171. data/lib/cosmos/gui/dialogs/about_dialog.rb +3 -7
  172. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +200 -136
  173. data/lib/cosmos/gui/opengl/gl_viewer.rb +8 -8
  174. data/lib/cosmos/gui/qt.rb +56 -27
  175. data/lib/cosmos/gui/qt_tool.rb +3 -1
  176. data/lib/cosmos/gui/text/ruby_editor.rb +130 -110
  177. data/lib/cosmos/gui/utilities/script_module_gui.rb +150 -4
  178. data/lib/cosmos/io/json_drb.rb +1 -1
  179. data/lib/cosmos/io/win32_serial_driver.rb +2 -4
  180. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +1 -0
  181. data/lib/cosmos/packet_logs/packet_log_reader.rb +13 -4
  182. data/lib/cosmos/packets/limits.rb +6 -3
  183. data/lib/cosmos/packets/telemetry.rb +34 -3
  184. data/lib/cosmos/processors/new_packet_log_processor.rb +1 -1
  185. data/lib/cosmos/script/commands.rb +20 -2
  186. data/lib/cosmos/script/extract.rb +11 -3
  187. data/lib/cosmos/script/limits.rb +6 -0
  188. data/lib/cosmos/script/scripting.rb +17 -9
  189. data/lib/cosmos/system/system.rb +73 -17
  190. data/lib/cosmos/system/target.rb +10 -5
  191. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +1 -0
  192. data/lib/cosmos/tools/cmd_tlm_server/api.rb +95 -0
  193. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +8 -4
  194. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +55 -0
  195. data/lib/cosmos/tools/data_viewer/data_viewer.rb +5 -12
  196. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +14 -48
  197. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -5
  198. data/lib/cosmos/tools/launcher/launcher.rb +4 -0
  199. data/lib/cosmos/tools/launcher/launcher_config.rb +50 -0
  200. data/lib/cosmos/tools/launcher/launcher_tool.rb +21 -9
  201. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +607 -566
  202. data/lib/cosmos/tools/replay/replay.rb +51 -45
  203. data/lib/cosmos/tools/script_runner/script_runner.rb +13 -5
  204. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +8 -109
  205. data/lib/cosmos/tools/test_runner/test.rb +65 -6
  206. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -4
  207. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +5 -0
  208. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +3 -0
  209. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +3 -2
  210. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +9 -6
  211. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +1 -5
  212. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +1 -5
  213. data/lib/cosmos/top_level.rb +86 -3
  214. data/lib/cosmos/version.rb +5 -5
  215. data/lib/cosmos/win32/win32_main.rb +7 -1
  216. data/spec/packet_logs/packet_log_reader_spec.rb +67 -7
  217. data/spec/packets/limits_spec.rb +19 -1
  218. data/spec/packets/telemetry_spec.rb +44 -1
  219. data/spec/script/commands_spec.rb +14 -0
  220. data/spec/script/scripting_spec.rb +5 -1
  221. data/spec/script/telemetry_spec.rb +38 -3
  222. data/spec/system/system_spec.rb +24 -4
  223. data/spec/tools/cmd_tlm_server/api_spec.rb +30 -0
  224. data/test/benchmarks/gsub_benchmark.rb +42 -4
  225. data/test/benchmarks/is_a_benchmark.rb +34 -0
  226. data/test/performance/config/data/crc.txt +161 -171
  227. data/test/performance/config/system/system_packets.txt +10 -10
  228. data/test/performance/config/system/system_threads.txt +30 -30
  229. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +7 -2
  230. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -0
  231. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -0
  232. data/test/performance/config/targets/{EXAMPLE → PACKET}/cmd_tlm_server.txt +2 -2
  233. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -0
  234. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -0
  235. data/test/performance/config/targets/PACKET/screens/status.txt +25 -0
  236. data/test/performance/config/targets/PACKET/target.txt +28 -0
  237. data/test/performance/config/targets/{EXAMPLE/cmd_tlm/example_cmds.txt → THREAD/cmd_tlm/thread_cmds.txt} +1 -1
  238. data/test/performance/config/targets/{EXAMPLE/cmd_tlm/example_tlm.txt → THREAD/cmd_tlm/thread_tlm.txt} +1 -1
  239. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -0
  240. data/test/performance/config/targets/{EXAMPLE/lib/example_interface.rb → THREAD/lib/thread_interface.rb} +1 -1
  241. data/test/performance/config/targets/THREAD/screens/status.txt +25 -0
  242. data/test/performance/config/targets/{EXAMPLE → THREAD}/target.txt +0 -0
  243. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +24 -30
  244. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +31 -31
  245. data/test/performance/config/tools/launcher/launcher_packets.txt +16 -11
  246. data/test/performance/config/tools/launcher/launcher_threads.txt +41 -35
  247. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -0
  248. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +10 -38
  249. data/test/performance/lib/packet_target.rb +126 -0
  250. data/test/performance/lib/{example_target.rb → thread_target.rb} +9 -9
  251. data/test/performance/tools/CmdTlmServerMemProf +1 -1
  252. data/test/performance/tools/{ExampleTarget → PacketTarget} +2 -2
  253. data/test/performance/tools/{ExampleTarget.bat → PacketTarget.bat} +0 -0
  254. data/test/performance/tools/ThreadTarget +14 -0
  255. data/test/performance/tools/ThreadTarget.bat +59 -0
  256. data/test/performance/tools/TlmGrapherMemProf +1 -1
  257. data/test/performance/tools/TlmViewerMemProf +19 -0
  258. data/{autohotkey/tools/Replay.bat → test/performance/tools/TlmViewerMemProf.bat} +1 -1
  259. metadata +107 -55
  260. data/test/performance/lib/example_background_task.rb +0 -57
  261. data/test/performance/lib/scpi_target.rb +0 -74
@@ -532,15 +532,15 @@ module Cosmos
532
532
  w[0]*@transform[0][2] + w[1]*@transform[1][2] + w[2]*@transform[2][2] + @transform[3][2]
533
533
  end
534
534
 
535
+ def calc_prime(v)
536
+ return [v[0]*@itransform[0][0] + v[1]*@itransform[1][0] + v[2]*@itransform[2][0] + @itransform[3][0],
537
+ v[0]*@itransform[0][1] + v[1]*@itransform[1][1] + v[2]*@itransform[2][1] + @itransform[3][1],
538
+ v[0]*@itransform[0][2] + v[1]*@itransform[1][2] + v[2]*@itransform[2][2] + @itransform[3][2]]
539
+ end
540
+
535
541
  def worldVector(fx, fy, tx, ty)
536
- wfm = screenToTarget(fx, fy)
537
- wto = screenToTarget(tx, ty)
538
- wfm_prime = [wfm[0]*@itransform[0][0] + wfm[1]*@itransform[1][0] + wfm[2]*@itransform[2][0] + @itransform[3][0],
539
- wfm[0]*@itransform[0][1] + wfm[1]*@itransform[1][1] + wfm[2]*@itransform[2][1] + @itransform[3][1],
540
- wfm[0]*@itransform[0][2] + wfm[1]*@itransform[1][2] + wfm[2]*@itransform[2][2] + @itransform[3][2]]
541
- wto_prime = [wto[0]*@itransform[0][0] + wto[1]*@itransform[1][0] + wto[2]*@itransform[2][0] + @itransform[3][0],
542
- wto[0]*@itransform[0][1] + wto[1]*@itransform[1][1] + wto[2]*@itransform[2][1] + @itransform[3][1],
543
- wto[0]*@itransform[0][2] + wto[1]*@itransform[1][2] + wto[2]*@itransform[2][2] + @itransform[3][2]]
542
+ wfm_prime = calc_prime(screenToTarget(fx, fy))
543
+ wto_prime = calc_prime(screenToTarget(tx, ty))
544
544
  return [wto_prime[0] - wfm_prime[0], wto_prime[1] - wfm_prime[1], wto_prime[2] - wfm_prime[2]]
545
545
  end
546
546
 
@@ -175,6 +175,24 @@ module Cosmos
175
175
  font
176
176
  end
177
177
 
178
+ # Get the default small font for the platform (Windows, Mac, Linux)
179
+ def self.get_default_small_font
180
+ if Kernel.is_windows?
181
+ Cosmos.getFont("courier", 9)
182
+ else
183
+ Cosmos.getFont("courier", 12)
184
+ end
185
+ end
186
+
187
+ # Get the default font for the platform (Windows, Mac, Linux)
188
+ def self.get_default_font
189
+ if Kernel.is_windows?
190
+ Cosmos.getFont("Courier", 10)
191
+ else
192
+ Cosmos.getFont("Courier", 14)
193
+ end
194
+ end
195
+
178
196
  def self.getFontMetrics(font)
179
197
  font_metrics = FONT_METRICS[font]
180
198
  unless font_metrics
@@ -217,28 +235,23 @@ module Cosmos
217
235
 
218
236
  # Load the applications icon
219
237
  def self.get_icon(name, fail_blank = true)
220
- icon = nil
221
- filename = File.join(::Cosmos::USERPATH, 'config', 'data', name)
222
- begin
223
- raise unless File.exist? filename
224
- icon = Qt::Icon.new(filename)
225
- raise if icon.isNull
226
- rescue
227
- begin
228
- filename = File.join(::Cosmos::PATH, 'data', name)
229
- raise unless File.exist? filename
230
- icon = Qt::Icon.new(filename)
231
- raise if icon.isNull
232
- rescue
233
- # Return a blank icon if we couldn't find an icon in either the user path or cosmos path
234
- if fail_blank
235
- icon = Qt::Icon.new
238
+ icon = Qt::Icon.new(Cosmos.data_path(name))
239
+ icon = nil if icon.isNull && !fail_blank
240
+ return icon
241
+ end
242
+
243
+ # Try to change to a configuration in a packet log reader
244
+ def self.check_log_configuration(packet_log_reader, log_filename)
245
+ config_change_success, change_error = packet_log_reader.open(log_filename)
246
+ unless config_change_success
247
+ Qt.execute_in_main_thread(true) do
248
+ if change_error
249
+ Qt::MessageBox.warning(Qt::Application.instance.activeWindow, 'Warning', "When opening: #{log_filename}\n\nAn error occurred when changing to saved configuration:\n#{packet_log_reader.configuration_name}\n\n#{change_error.formatted}\n\nUsing default configuration")
236
250
  else
237
- icon = nil
251
+ Qt::MessageBox.warning(Qt::Application.instance.activeWindow, 'Warning', "When opening: #{log_filename}\n\nThe following saved configuration was not found:\n#{packet_log_reader.configuration_name}\n\nUsing default configuration")
238
252
  end
239
253
  end
240
254
  end
241
- return icon
242
255
  end
243
256
  end
244
257
 
@@ -268,6 +281,16 @@ class Qt::CoreApplication
268
281
  end
269
282
  #### END TEMPORARY UNTIL INCLUDED IN QTBINDINGS ####
270
283
 
284
+ class Qt::Icon
285
+ def initialize(param = nil)
286
+ if param
287
+ super(param)
288
+ else
289
+ super()
290
+ end
291
+ end
292
+ end
293
+
271
294
  class Qt::Dialog
272
295
  def initialize(parent = Qt::Application.activeWindow,
273
296
  flags = (Qt::WindowTitleHint | Qt::WindowSystemMenuHint))
@@ -437,7 +460,15 @@ class Qt::LineEdit
437
460
  end
438
461
 
439
462
  class Qt::PlainTextEdit
463
+ BLANK = ''.freeze
464
+ BREAK = '<br/>'.freeze
465
+ AMP = '&amp;'.freeze
466
+ NBSP = '&nbsp;'.freeze
467
+ GT = '&gt;'.freeze
468
+ LT = '&lt;'.freeze
440
469
  @@color_cache = {}
470
+ @@mapping = {'&'=>AMP,"\n"=>BLANK,"\s"=>NBSP,'>'=>GT,'<'=>LT}
471
+ @@regex = Regexp.union(@@mapping.keys)
441
472
 
442
473
  def add_formatted_text(text, color = nil)
443
474
  if text =~ /[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F-\xFF]/
@@ -446,16 +477,16 @@ class Qt::PlainTextEdit
446
477
  text << "\n"
447
478
  end
448
479
  if text =~ /<G>/ or color == Cosmos::GREEN
449
- text.gsub!(/<G>/, '')
480
+ text.gsub!(/<G>/, BLANK)
450
481
  addText(text, Cosmos::GREEN)
451
482
  elsif text =~ /<Y>/ or color == Cosmos::YELLOW
452
- text.gsub!(/<Y>/, '')
483
+ text.gsub!(/<Y>/, BLANK)
453
484
  addText(text, Cosmos::YELLOW)
454
485
  elsif text =~ /<R>/ or color == Cosmos::RED
455
- text.gsub!(/<R>/, '')
486
+ text.gsub!(/<R>/, BLANK)
456
487
  addText(text, Cosmos::RED)
457
488
  elsif text =~ /<B>/ or color == Cosmos::BLUE
458
- text.gsub!(/<B>/, '')
489
+ text.gsub!(/<B>/, BLANK)
459
490
  addText(text, Cosmos::BLUE)
460
491
  else
461
492
  addText(text) # default is Cosmos::BLACK
@@ -464,7 +495,7 @@ class Qt::PlainTextEdit
464
495
 
465
496
  def addText(text, color = Cosmos::BLACK)
466
497
  @current_text ||= ''
467
- @current_text << escape_text(text.chomp, color) << '<br/>'.freeze
498
+ @current_text << escape_text(text.chomp, color) << BREAK
468
499
  end
469
500
 
470
501
  def flush
@@ -522,14 +553,12 @@ class Qt::PlainTextEdit
522
553
  end
523
554
 
524
555
  private
525
-
526
556
  def escape_text(text, color)
557
+ @@color_cache[color] ||= "#%02X%02X%02X" % [color.red, color.green, color.blue]
527
558
  # You might think gsub! would use less memory but benchmarking proves gsub
528
559
  # with a regular express argument is the fastest and uses the least memory.
529
560
  # However, this is still an expensive operation due to how many times it is called.
530
- text = text.gsub(/&/,'&amp;'.freeze).gsub(/\n/,'<br/>'.freeze).gsub(/\s/, '&nbsp;'.freeze).gsub(/>/,'&gt;'.freeze).gsub(/</,'&lt;'.freeze)
531
- @@color_cache[color] ||= "#%02X%02X%02X" % [color.red, color.green, color.blue]
532
- "<font color=\"#{@@color_cache[color]}\">#{text}</font>"
561
+ "<font color=\"#{@@color_cache[color]}\">#{text.gsub(@@regex,@@mapping)}</font>"
533
562
  end
534
563
  end
535
564
 
@@ -365,12 +365,14 @@ module Cosmos
365
365
  def self.restore_io(stdout = true, stderr = true)
366
366
  $stdout = STDOUT if stdout
367
367
  $stderr = STDERR if stderr
368
+ @@redirect_io_thread_sleeper.cancel
369
+ Qt::CoreApplication.processEvents()
368
370
  Cosmos.kill_thread(self, @@redirect_io_thread)
369
371
  @@redirect_io_thread = nil
370
372
  end
371
373
 
372
374
  def self.graceful_kill
373
- @@redirect_io_thread_sleeper.cancel
375
+ # Just to remove warning
374
376
  end
375
377
 
376
378
  end # class QtTool
@@ -16,15 +16,19 @@ require 'cosmos/gui/text/completion_text_edit'
16
16
  module Cosmos
17
17
 
18
18
  class RubyEditor < CompletionTextEdit
19
+ # private slot used to connect to the blockCountChanged signal
19
20
  slots 'line_count_changed()'
21
+ # private slot used to connect to the updateRequest signal
20
22
  slots 'update_line_number_area(const QRect &, int)'
23
+
21
24
  signals 'breakpoint_set(int)'
22
25
  signals 'breakpoint_cleared(int)'
23
26
  signals 'breakpoints_cleared()'
24
27
 
25
28
  attr_accessor :enable_breakpoints
26
29
 
27
- # This works but slows down the GUI significantly when pasting a large (10k line) block of code into the editor
30
+ # This works but slows down the GUI significantly when
31
+ # pasting a large (10k line) block of code into the editor
28
32
  class RubySyntax < Qt::SyntaxHighlighter
29
33
  # Ruby keywords - http://www.ruby-doc.org/docs/keywords/1.9/
30
34
  # Also include some common methods that are typically called by
@@ -85,6 +89,8 @@ module Cosmos
85
89
  ['\bclass\b\s*(\w+)', 1, STYLES['class']],
86
90
  # Ruby symbol
87
91
  [':\b\w+', 0, STYLES['symbol']],
92
+ # Ruby namespace operator
93
+ ['\b\w+(::\b\w+)+', 0, STYLES['class']],
88
94
  # Ruby global
89
95
  ['\\$\b\w+', 0, STYLES['string']],
90
96
  # A single # or a # not followed by { to the end
@@ -141,12 +147,8 @@ module Cosmos
141
147
  self
142
148
  end
143
149
 
144
- def sizeHint()
145
- return Qt::Size(@codeEditor.lineNumberAreaWidth(), 0)
146
- end
147
-
148
150
  def paintEvent(event)
149
- @codeEditor.lineNumberAreaPaintEvent(event)
151
+ @codeEditor.line_number_area_paint_event(event)
150
152
  end
151
153
  end
152
154
 
@@ -154,13 +156,9 @@ module Cosmos
154
156
 
155
157
  def initialize(parent)
156
158
  super(parent)
157
- if Kernel.is_windows?
158
- setFont(Cosmos.getFont("Courier", 10))
159
- @fontMetrics = Cosmos.getFontMetrics(Cosmos.getFont("Courier", 10))
160
- else
161
- setFont(Cosmos.getFont("Courier", 14))
162
- @fontMetrics = Cosmos.getFontMetrics(Cosmos.getFont("Courier", 14))
163
- end
159
+ font = Cosmos.get_default_font
160
+ setFont(font)
161
+ @fontMetrics = Cosmos.getFontMetrics(font)
164
162
 
165
163
  # This is needed so text searching highlights correctly
166
164
  setStyleSheet("selection-background-color: lightblue; selection-color: black;")
@@ -168,7 +166,8 @@ module Cosmos
168
166
  @breakpoints = []
169
167
  @enable_breakpoints = false
170
168
 
171
- # RubySyntax works but slows down the GUI significantly when pasting a large (10k line) block of code into the editor
169
+ # RubySyntax works but slows down the GUI significantly when
170
+ # pasting a large (10k line) block of code into the editor
172
171
  @syntax = RubySyntax.new(document())
173
172
  @lineNumberArea = LineNumberArea.new(self)
174
173
 
@@ -186,46 +185,16 @@ module Cosmos
186
185
 
187
186
  def context_menu(point)
188
187
  menu = createStandardContextMenu()
189
- if @enable_breakpoints
190
- menu.addSeparator()
191
-
192
- add_breakpoint = Qt::Action.new(tr("Add Breakpoint"), self)
193
- add_breakpoint.statusTip = tr("Add a breakpoint at this line")
194
- add_breakpoint.connect(SIGNAL('triggered()')) { breakpoint_click(point) }
195
- menu.addAction(add_breakpoint)
196
-
197
- clear_breakpoint = Qt::Action.new(tr("Clear Breakpoint"), self)
198
- clear_breakpoint.statusTip = tr("Clear an existing breakpoint at this line")
199
- clear_breakpoint.connect(SIGNAL('triggered()')) { breakpoint_click(point, false) }
200
- menu.addAction(clear_breakpoint)
201
-
202
- clear_all_breakpoints = Qt::Action.new(tr("Clear All Breakpoints"), self)
203
- clear_all_breakpoints.statusTip = tr("Clear all existing breakpoints")
204
- clear_all_breakpoints.connect(SIGNAL('triggered()')) do
205
- clear_breakpoints()
206
- emit breakpoints_cleared
207
- end
208
- menu.addAction(clear_all_breakpoints)
209
- end
210
- return menu
211
- end
188
+ return menu unless @enable_breakpoints
212
189
 
213
- def breakpoint_click(point, add_breakpoint = true)
214
- line = point.y / @fontMetrics.height() + 1 + firstVisibleBlock().blockNumber()
215
- if add_breakpoint
216
- if line <= document.blockCount()
217
- breakpoint(line)
218
- emit breakpoint_set(line)
219
- end
220
- else
221
- if line <= document.blockCount()
222
- clear_breakpoint(line)
223
- emit breakpoint_cleared(line)
224
- end
225
- end
190
+ menu.addSeparator()
191
+ menu.addAction(create_add_breakpoint_action(point))
192
+ menu.addAction(create_clear_breakpoint_action(point))
193
+ menu.addAction(create_clear_all_breakpoints_action())
194
+ menu
226
195
  end
227
196
 
228
- def breakpoint(line)
197
+ def add_breakpoint(line)
229
198
  @breakpoints << line
230
199
  @lineNumberArea.repaint
231
200
  end
@@ -242,19 +211,18 @@ module Cosmos
242
211
 
243
212
  def comment_or_uncomment_lines
244
213
  cursor = textCursor
245
- # Figure out if the cursor has a selection
246
- no_selection = true
247
- no_selection = false if cursor.hasSelection
214
+ no_selection = cursor.hasSelection ? false : true
248
215
 
249
216
  # Start the edit block so this can be all undone with a single undo step
250
217
  cursor.beginEditBlock
251
218
  selection_end = cursor.selectionEnd
252
219
  # Initially place the cursor at the beginning of the selection
253
- # If nothing is selected this will just put the cursor at the beginning of the current line
220
+ # If nothing is selected this will just put the cursor at the beginning
221
+ # of the current line
254
222
  cursor.setPosition(textCursor.selectionStart)
255
223
  cursor.movePosition(Qt::TextCursor::StartOfLine)
256
224
  result = true
257
- while (cursor.position < selection_end and result == true) or (no_selection)
225
+ while (cursor.position < selection_end && result == true) || (no_selection)
258
226
  # Check for a special comment
259
227
  if cursor.block.text =~ /^\S*#~/
260
228
  cursor.deleteChar
@@ -269,63 +237,27 @@ module Cosmos
269
237
  # Move the cursor to the beginning of the next line
270
238
  cursor.movePosition(Qt::TextCursor::StartOfLine)
271
239
  result = cursor.movePosition(Qt::TextCursor::Down)
272
- # If nothing was selected then we're working with a single line and we can break
240
+ # If nothing was selected then its a single line so break
273
241
  break if no_selection
274
242
  end
275
243
  cursor.endEditBlock
276
244
  end
277
245
 
278
- def lineNumberAreaWidth
279
- digits = 1
280
- my_document = document()
281
- max = [1, my_document.blockCount()].max
282
-
283
- # Figure the line number power of ten to determine how much space we need
284
- while (max >= 10)
285
- max /= 10
286
- digits += 1
287
- end
288
- # We'll always display space for 5 digits so the line number area
289
- # isn't constantly expanding and contracting
290
- digits = 5 if digits < 5
291
- digits += 1 # always allow room for a breakpoint symbol
292
- # Get the font width of the character 57 ('9')
293
- # times the number of digits to display
294
- return (3 + @fontMetrics.width(CHAR_57) * digits)
295
- end
296
-
297
- def line_count_changed
298
- setViewportMargins(lineNumberAreaWidth(), 0, 0, 0)
299
- update
300
- end
301
-
302
- def update_line_number_area(rect, dy)
303
- if (dy)
304
- @lineNumberArea.scroll(0, dy)
305
- else
306
- @lineNumberArea.update(0, rect.y(), @lineNumberArea.width(), rect.height())
307
- end
308
- my_viewport = viewport()
309
- viewport_rect = my_viewport.rect()
310
- line_count_changed() if (rect.contains(viewport_rect))
311
- viewport_rect.dispose
312
- end
313
-
314
246
  def resizeEvent(e)
315
247
  super(e)
316
248
  cr = self.contentsRect()
317
249
  rect = Qt::Rect.new(cr.left(),
318
250
  cr.top(),
319
- lineNumberAreaWidth(),
251
+ line_number_area_width(),
320
252
  cr.height())
321
253
  @lineNumberArea.setGeometry(rect)
322
254
  cr.dispose
323
255
  rect.dispose
324
256
  end
325
257
 
326
- def lineNumberAreaPaintEvent(event)
258
+ def line_number_area_paint_event(event)
327
259
  painter = Qt::Painter.new(@lineNumberArea)
328
- # On initialization sometimes we get some weird bad conditions so check for them
260
+ # Check for weird bad initialization conditions
329
261
  if painter.isActive and not painter.paintEngine.nil?
330
262
  event_rect = event.rect()
331
263
  painter.fillRect(event_rect, Qt::lightGray)
@@ -333,20 +265,7 @@ module Cosmos
333
265
  block = firstVisibleBlock()
334
266
  blockNumber = block.blockNumber()
335
267
 
336
- offset = contentOffset()
337
- rect = blockBoundingGeometry(block)
338
- rect2 = rect.translated(offset)
339
- top = rect2.top()
340
- rect3 = blockBoundingRect(block)
341
- bottom = top + rect3.height()
342
- offset.dispose
343
- offset = nil
344
- rect.dispose
345
- rect = nil
346
- rect2.dispose
347
- rect2 = nil
348
- rect3.dispose
349
- rect3 = nil
268
+ top, bottom = block_top_and_bottom(block)
350
269
 
351
270
  width = @lineNumberArea.width()
352
271
  height = @fontMetrics.height()
@@ -390,6 +309,107 @@ module Cosmos
390
309
  painter.dispose
391
310
  painter = nil
392
311
  end
312
+
313
+ private
314
+
315
+ def line_count_changed
316
+ setViewportMargins(line_number_area_width(), 0, 0, 0)
317
+ update
318
+ end
319
+
320
+ def update_line_number_area(rect, dy)
321
+ if (dy)
322
+ @lineNumberArea.scroll(0, dy)
323
+ else
324
+ @lineNumberArea.update(0, rect.y(), @lineNumberArea.width(), rect.height())
325
+ end
326
+ my_viewport = viewport()
327
+ viewport_rect = my_viewport.rect()
328
+ line_count_changed() if (rect.contains(viewport_rect))
329
+ viewport_rect.dispose
330
+ end
331
+
332
+ def line_number_area_width
333
+ digits = 1
334
+ my_document = document()
335
+ max = [1, my_document.blockCount()].max
336
+
337
+ # Figure the line number power of ten to determine how much space we need
338
+ while (max >= 10)
339
+ max /= 10
340
+ digits += 1
341
+ end
342
+ # We'll always display space for 5 digits so the line number area
343
+ # isn't constantly expanding and contracting
344
+ digits = 5 if digits < 5
345
+ digits += 1 # always allow room for a breakpoint symbol
346
+ # Get the font width of the character 57 ('9')
347
+ # times the number of digits to display
348
+ return (3 + @fontMetrics.width(CHAR_57) * digits)
349
+ end
350
+
351
+ def line_at_point(point)
352
+ line = point.y / @fontMetrics.height() + 1 +
353
+ firstVisibleBlock().blockNumber()
354
+ yield line if line <= document.blockCount()
355
+ end
356
+
357
+ def create_add_breakpoint_action(point)
358
+ add_breakpoint = Qt::Action.new(tr("Add Breakpoint"), self)
359
+ add_breakpoint.statusTip = tr("Add a breakpoint at this line")
360
+ add_breakpoint.connect(SIGNAL('triggered()')) do
361
+ line_at_point(point) do |line|
362
+ add_breakpoint(line)
363
+ emit breakpoint_set(line)
364
+ end
365
+ end
366
+ add_breakpoint
367
+ end
368
+
369
+ def create_clear_breakpoint_action(point)
370
+ clear_breakpoint = Qt::Action.new(tr("Clear Breakpoint"), self)
371
+ clear_breakpoint.statusTip = tr("Clear an existing breakpoint at this line")
372
+ clear_breakpoint.connect(SIGNAL('triggered()')) do
373
+ line_at_point(point) do |line|
374
+ clear_breakpoint(line)
375
+ emit breakpoint_cleared(line)
376
+ end
377
+ end
378
+ clear_breakpoint
379
+ end
380
+
381
+ def create_clear_all_breakpoints_action
382
+ clear_all_breakpoints = Qt::Action.new(tr("Clear All Breakpoints"), self)
383
+ clear_all_breakpoints.statusTip = tr("Clear all existing breakpoints")
384
+ clear_all_breakpoints.connect(SIGNAL('triggered()')) do
385
+ clear_breakpoints
386
+ emit breakpoints_cleared
387
+ end
388
+ clear_all_breakpoints
389
+ end
390
+
391
+ # Get the top and bottom coordinates of the block in viewport coordinates
392
+ def block_top_and_bottom(block)
393
+ # bounding rect of the text block in content coordinates
394
+ rect = blockBoundingGeometry(block)
395
+ offset = contentOffset() # content origin in viewport coordinates
396
+ # translate the rect to get visual coordinates on the viewport
397
+ rect2 = rect.translated(offset)
398
+ top = rect2.top()
399
+ # bounding rect in block coordinates
400
+ rect3 = blockBoundingRect(block)
401
+ bottom = top + rect3.height()
402
+ # Now call the destructors and set to nil to allow garbage collection
403
+ offset.dispose
404
+ offset = nil
405
+ rect.dispose
406
+ rect = nil
407
+ rect2.dispose
408
+ rect2 = nil
409
+ rect3.dispose
410
+ rect3 = nil
411
+ return top, bottom
412
+ end
393
413
  end
394
414
 
395
415
  end # module Cosmos