AcquireSettingsWidget.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. """
  2. This Module Is the Acquiresettings subWindow.
  3. """
  4. from PyQt4 import QtGui, QtCore
  5. from collections import OrderedDict
  6. from ..base import kcgwidget as kcgw
  7. from ..base.backend import board
  8. from ..base.backend.CalibrationHandle import theCalibration
  9. from ..base.backend.board import available_boards
  10. from ..base import backendinterface as bif
  11. from ..base.groupedelements import Elements
  12. from .. import config
  13. from ..base.globals import glob as global_objects
  14. tr = kcgw.tr
  15. __widget_id__ = None
  16. class AcquireSettingsTab(kcgw.KCGWidgets):
  17. """
  18. A single tab in the acquire settings window
  19. """
  20. available_for_same_as = OrderedDict()
  21. def __init__(self, board_id, same_as_widgets, parent=None):
  22. super(AcquireSettingsTab, self).__init__()
  23. self.available_for_same_as[board_id] = True
  24. self.widgets = None # IMPORTANT: THIS WIDGET NEEDS A LIST OF ALL THE OTHER WIDGETS
  25. self.same_as_widgets = same_as_widgets
  26. self.parent = parent
  27. self.board_id = board_id
  28. self.layout = QtGui.QGridLayout()
  29. self.outerLayout = QtGui.QVBoxLayout()
  30. self.outerLayout.addLayout(self.layout)
  31. self.outerLayout.addStretch(1)
  32. self.setLayout(self.outerLayout)
  33. self.sameAsLabel = self.createLabel("Same as")
  34. self.sameAsCombo = QtGui.QComboBox()
  35. self.sameAsTick = self.createCheckbox("", connect=self.same_as)
  36. self.sameAs = QtGui.QHBoxLayout()
  37. self.sameAs.addWidget(self.sameAsCombo)
  38. self.sameAs.addWidget(self.sameAsTick)
  39. if available_boards.multi_board:
  40. self.layout.addWidget(self.sameAsLabel, 0, 0)
  41. self.layout.addLayout(self.sameAs, 0, 1)
  42. else:
  43. self.sameAsLabel.hide()
  44. # ---------[ Create Labels and corresponding Fields ]---------
  45. self.numOfTurnsLabel = self.createLabel(tr("Label", "Number of turns to observe"))
  46. self.numOfSkipTurnsLabel = self.createLabel(tr("Label", "Number of turns to skip"))
  47. self.numOfTurnsSpinbox = self.createSpinbox(1, 10000000, connect=self.on_number_of_turns_changed)
  48. self.numOfSkipTurnsSpinbox = self.createSpinbox(0, 100, connect=self.on_number_of_skipped_turns_changed)
  49. self.fileSizeLabel = self.createLabel(tr("Label", "Resulting file size"))
  50. self.fileSizeOutLabel = self.createLabel(tr("Label", "??"))
  51. self.totalDurationLabel = self.createLabel(tr("Label", "Total Duration"))
  52. self.totalDurationOutLabel = self.createLabel(tr("Label", "??"))
  53. self.totalSizeLabel = self.createLabel(tr("Label", "Total Size"))
  54. self.totalSizeOutLabel = self.createLabel(tr("Label", "??"))
  55. self.countLabel = self.createLabel(tr("Label", "Number of acquisitions"))
  56. self.countSpinbox = self.createSpinbox(1, 10000000, start_value=10, connect=self.on_count_changed)
  57. self.waitLabel = self.createLabel(tr("Label", "Wait(s)"))
  58. self.waitSpinbox = self.createSpinbox(0, 60, start_value=15, connect=self.on_wait_changed)
  59. self.simulatePilotBunch = self.createCheckbox(tr("Button", "Simulate Pilot Bunch"),
  60. connect=self.on_simulate_pilot_bunch_changed)
  61. self.buildSpectrogrammTickbox = self.createCheckbox(tr("Button", "Build Spectograms"),
  62. connect=self.on_build_spectrograms_changed)
  63. self.shiftFMC2Label = self.createLabel(tr("Label", "shift FMC2"))
  64. self.shiftFMC2Spinbox = self.createSpinbox(-20, 20, connect=self.on_shift_FMC2_changed)
  65. self.reloadCalibration = self.createButton('reload Calibration', connect=lambda : theCalibration.reload())
  66. # ----------[ Trigger part ]--------------------
  67. self.trigger_skip_label = self.createLabel(tr("Label", "Number of trigger signals to skip"))
  68. self.trigger_skip_signals = self.createSpinbox(0, 1000, 1, start_value=0,
  69. connect=self.on_trigger_skip_signals_changed)
  70. self.timeout_label = self.createLabel(tr("Label", "Timeout (s)"))
  71. self.timeout = self.createSpinbox(0, 10000000, start_value=12, connect=self.on_trigger_timeout_changed)
  72. self.method_label = self.createLabel(tr("Label", "Method"))
  73. self.method = kcgw.Switch("1", "2")
  74. self.method.clicked.connect(self.on_trigger_method_changed)
  75. self.trigger_skip_label.hide()
  76. self.trigger_skip_signals.hide()
  77. self.timeout_label.hide()
  78. self.timeout.hide()
  79. self.method_label.hide()
  80. self.method.hide()
  81. self.trigger_tick = self.createCheckbox(tr("Label", "Use External Trigger"), connect=self.use_external_trigger)
  82. # -------[ register observers ]------
  83. board.get_board_config(board_id).observe(self.numOfTurnsSpinbox,
  84. lambda x: self.set_value_silent(self.numOfTurnsSpinbox, x),
  85. 'turns_observe')
  86. board.get_board_config(board_id).observe(self.numOfSkipTurnsSpinbox,
  87. lambda x: self.set_value_silent(self.numOfSkipTurnsSpinbox, x),
  88. 'turns_skip')
  89. board.get_board_config(board_id).observe(self.countSpinbox,
  90. lambda x: self.set_value_silent(self.countSpinbox, x),
  91. 'acquisition_count')
  92. board.get_board_config(board_id).observe(self.waitSpinbox,
  93. lambda x: self.set_value_silent(self.waitSpinbox, x),
  94. 'turns_wait_time')
  95. board.get_board_config(board_id).observe(self.simulatePilotBunch,
  96. lambda x: self.tick_silent(self.simulatePilotBunch, x),
  97. 'pilot_bunch')
  98. board.get_board_config(board_id).observe(self.buildSpectrogrammTickbox,
  99. lambda x: self.tick_silent(self.buildSpectrogrammTickbox, x),
  100. 'build_spectrograms')
  101. board.get_board_config(board_id).observe(self.trigger_skip_signals,
  102. lambda x: self.set_value_silent(self.trigger_skip_signals, x),
  103. 'trigger_skip')
  104. board.get_board_config(board_id).observe(self.timeout,
  105. lambda x: self.set_value_silent(self.timeout, x), 'trigger_timeout')
  106. board.get_board_config(board_id).observe(self.trigger_tick, self.update_external_trigger, 'use_trigger')
  107. board.get_board_config(board_id).observe(self.fileSizeOutLabel, self.set_filesize, 'turns_observe')
  108. board.get_board_config(board_id).observe(self.fileSizeOutLabel, self.set_filesize, 'turns_skip')
  109. # -------[ register elements ]-------
  110. Elements.addItem(["acquire", "no_board", "acquire_"+str(board_id)],
  111. [
  112. self.numOfTurnsSpinbox,
  113. self.numOfSkipTurnsSpinbox,
  114. self.countSpinbox,
  115. self.waitSpinbox,
  116. self.buildSpectrogrammTickbox,
  117. self.simulatePilotBunch,
  118. self.trigger_skip_signals,
  119. self.timeout,
  120. self.method,
  121. self.trigger_tick
  122. ])
  123. # -------[ Add to grid ]-------------
  124. self.layout.addWidget(self.numOfTurnsLabel, 1, 0)
  125. self.layout.addWidget(self.numOfTurnsSpinbox, 1, 1)
  126. self.layout.addWidget(self.numOfSkipTurnsLabel, 2, 0)
  127. self.layout.addWidget(self.numOfSkipTurnsSpinbox, 2, 1)
  128. self.layout.addWidget(self.fileSizeLabel, 3,0)
  129. self.layout.addWidget(self.fileSizeOutLabel, 3,1)
  130. line = QtGui.QFrame()
  131. line.setFrameShape(QtGui.QFrame.HLine)
  132. self.layout.addWidget(line, 4, 0, 1, 2)
  133. self.layout.addWidget(self.countLabel, 5, 0)
  134. self.layout.addWidget(self.countSpinbox, 5, 1)
  135. self.layout.addWidget(self.waitLabel, 6, 0)
  136. self.layout.addWidget(self.waitSpinbox, 6, 1)
  137. self.layout.addWidget(self.simulatePilotBunch, 11, 0)
  138. self.layout.addWidget(self.buildSpectrogrammTickbox, 11, 1)
  139. self.layout.addWidget(self.trigger_tick, 9, 0)
  140. line = QtGui.QFrame()
  141. line.setFrameShape(QtGui.QFrame.HLine)
  142. self.layout.addWidget(line, 10, 0, 1, 2)
  143. self.layout.addWidget(self.shiftFMC2Label, 12, 0)
  144. self.layout.addWidget(self.shiftFMC2Spinbox, 12, 1)
  145. self.layout.addWidget(self.reloadCalibration, 13, 0)
  146. self.layout.addWidget(self.totalDurationLabel, 14, 0)
  147. self.layout.addWidget(self.totalDurationOutLabel, 14, 1)
  148. self.layout.addWidget(self.totalSizeLabel, 15, 0)
  149. self.layout.addWidget(self.totalSizeOutLabel, 15, 1)
  150. def build_same_as_list(self):
  151. """
  152. Build the list to show in the same-as drop down menu
  153. :return:
  154. """
  155. for wid_id, wid in self.widgets.items():
  156. wid.sameAsCombo.clear()
  157. for key, value in self.available_for_same_as.items():
  158. if value:
  159. if key is not wid_id:
  160. wid.sameAsCombo.addItem(available_boards.get_board_name_from_id(key))
  161. def same_as(self):
  162. """
  163. Toggle SameAs functionality
  164. :return: -
  165. """
  166. # This only does the ui
  167. bif._bif_enable_wait_cursor()
  168. QtGui.qApp.processEvents()
  169. c_t = available_boards.get_board_id_from_name(str(self.sameAsCombo.currentText()))
  170. if self.sameAsTick.isChecked():
  171. self.available_for_same_as[self.board_id] = False
  172. self.sameAsCombo.setEnabled(False)
  173. board.get_board_config(c_t).observe_all(
  174. board.get_board_config(self.board_id).update)
  175. self.widgets[c_t].sameAsTick.setEnabled(False)
  176. self.widgets[c_t].sameAsCombo.setEnabled(False)
  177. Elements.setEnabled('acquire_{}'.format(self.board_id), False)
  178. board.get_board_config(c_t).notify_all_observers()
  179. else:
  180. self.available_for_same_as[self.board_id] = True
  181. self.sameAsCombo.setEnabled(True)
  182. board.get_board_config(c_t).unobserve_all_observer(
  183. board.get_board_config(self.board_id).update)
  184. self.widgets[c_t].sameAsTick.setEnabled(True)
  185. self.widgets[c_t].sameAsCombo.setEnabled(True)
  186. Elements.setEnabled('acquire_{}'.format(self.board_id), True)
  187. # actual changes on board
  188. if c_t in self.same_as_widgets:
  189. self.same_as_widgets[c_t].append(self.board_id)
  190. else:
  191. self.same_as_widgets[c_t] = [self.board_id, ]
  192. self.build_same_as_list()
  193. bif._bif_disable_wait_cursor()
  194. def update_external_trigger(self, state):
  195. """
  196. Update the use external trigger tick
  197. :param state: the state to set the tick to
  198. """
  199. self.tick_silent(self.trigger_tick, state)
  200. self.use_external_trigger(state, update_config=False)
  201. def use_external_trigger(self, state, update_config=True):
  202. """
  203. Set use external trigger to state
  204. :param state: the state to set to
  205. :param update_config: true to update the board config
  206. """
  207. if state:
  208. if update_config:
  209. board.get_board_config(self.board_id).update('use_trigger', True)
  210. self.layout.removeWidget(self.waitLabel)
  211. self.layout.removeWidget(self.waitSpinbox)
  212. self.waitLabel.hide()
  213. self.waitSpinbox.hide()
  214. self.layout.addWidget(self.timeout_label, 6, 0)
  215. self.layout.addWidget(self.timeout, 6, 1)
  216. self.layout.addWidget(self.trigger_skip_label, 7, 0)
  217. self.layout.addWidget(self.trigger_skip_signals, 7, 1)
  218. self.layout.addWidget(self.method_label, 8, 0)
  219. self.layout.addWidget(self.method, 8, 1)
  220. self.timeout_label.show()
  221. self.timeout.show()
  222. self.trigger_skip_label.show()
  223. self.trigger_skip_signals.show()
  224. self.method_label.show()
  225. self.method.show()
  226. else:
  227. if update_config:
  228. board.get_board_config(self.board_id).update('use_trigger', False)
  229. self.layout.addWidget(self.waitLabel, 6, 0)
  230. self.layout.addWidget(self.waitSpinbox, 6, 1)
  231. self.waitLabel.show()
  232. self.waitSpinbox.show()
  233. self.layout.removeWidget(self.timeout_label)
  234. self.layout.removeWidget(self.timeout)
  235. self.layout.removeWidget(self.trigger_skip_label)
  236. self.layout.removeWidget(self.trigger_skip_signals)
  237. self.layout.removeWidget(self.method_label)
  238. self.layout.removeWidget(self.method)
  239. self.timeout_label.hide()
  240. self.timeout.hide()
  241. self.trigger_skip_label.hide()
  242. self.trigger_skip_signals.hide()
  243. self.method_label.hide()
  244. self.method.hide()
  245. QtCore.QCoreApplication.processEvents()
  246. try:
  247. self.parent.parent().adjustSize()
  248. except AttributeError: # when widget is opened with external trigger activated parent.parent() is None
  249. pass
  250. def set_value_silent(self, element, value):
  251. """
  252. Set a Value silent without notifying observers
  253. :param element: what element
  254. :param value: set to what value
  255. :return: -
  256. """
  257. element.blockSignals(True)
  258. element.setValue(value)
  259. element.blockSignals(False)
  260. def set_filesize(self, state):
  261. turns = bif.bk_get_config(self.board_id, 'turns_observe')
  262. turns_skip = bif.bk_get_config(self.board_id, 'turns_skip')
  263. bunches = bif.bk_get_config(self.board_id, 'bunches_per_turn')
  264. adc = bif.bk_get_config(self.board_id, 'adc_number')
  265. header = bif.bk_get_config(self.board_id, 'header')
  266. size = turns//(turns_skip+1)*bunches/2.0*adc
  267. if header: size += 8.0
  268. size *= 4.0
  269. size += 0x180
  270. pagesize = 4*1024
  271. overhead = (size%pagesize)
  272. if overhead > 0:
  273. overhead = pagesize-overhead
  274. size = (size//pagesize + 1)*pagesize
  275. size = size/(1024.0*1024.0)
  276. self.fileSizeOutLabel.setText("{:.3f} MB, {:} B overhead".format(size, int(overhead)))
  277. ac = 1.0*bif.bk_get_config(self.board_id, 'acquisition_count')
  278. wt = 1.0*bif.bk_get_config(self.board_id, 'turns_wait_time')
  279. sec = ac*wt
  280. h = ac*wt/(60.0*60.0)
  281. totalsize = size *ac/(1024.0)
  282. self.totalDurationOutLabel.setText("{:.2f} h".format(h))
  283. self.totalSizeOutLabel.setText("{:.2f} GB".format(totalsize))
  284. def tick_silent(self, element, state):
  285. """
  286. Tick a tickbox without notifying observers
  287. :param element: what tickbox
  288. :param state: (bool) to what state
  289. :return: -
  290. """
  291. element.blockSignals(True)
  292. element.setChecked(state)
  293. element.blockSignals(False)
  294. def set_values(self):
  295. """
  296. Set Initial Values when creating this Window.
  297. This will read the appropriate Values from the base.backend.board.BoardConfiguration instance used in the gui.
  298. :return: -
  299. """
  300. # bk_get_config has to be done for each widget seperately (get dientifier by widget.board_id)
  301. self.set_value_silent(self.numOfTurnsSpinbox, bif.bk_get_config(self.board_id, 'turns_observe'))
  302. self.set_value_silent(self.numOfSkipTurnsSpinbox, bif.bk_get_config(self.board_id, 'turns_skip'))
  303. self.set_value_silent(self.countSpinbox, bif.bk_get_config(self.board_id, 'acquisition_count'))
  304. self.set_value_silent(self.waitSpinbox, bif.bk_get_config(self.board_id, 'turns_wait_time'))
  305. self.tick_silent(self.buildSpectrogrammTickbox, bif.bk_get_config(self.board_id, 'build_spectrograms'))
  306. self.tick_silent(self.simulatePilotBunch, bif.bk_get_config(self.board_id, 'pilot_bunch'))
  307. self.update_external_trigger(bif.bk_get_config(self.board_id, 'use_trigger'))
  308. # -----------------[ Value Change Handlers ]---------------------------
  309. def on_number_of_turns_changed(self):
  310. """
  311. Handle the change of the number of turns
  312. """
  313. bif.bk_change_num_of_turns(self.board_id, self.numOfTurnsSpinbox.value())
  314. for b_id in self.same_as_widgets[self.board_id]:
  315. wid = self.widgets[b_id]
  316. bif.bk_change_num_of_turns(wid.board_id, wid.numOfTurnsSpinbox.value())
  317. def on_number_of_skipped_turns_changed(self):
  318. """
  319. Handle the change of the number of skipped turns
  320. """
  321. bif.bk_change_num_of_skipped_turns(self.board_id, self.numOfSkipTurnsSpinbox.value())
  322. for b_id in self.same_as_widgets[self.board_id]:
  323. wid = self.widgets[b_id]
  324. bif.bk_change_num_of_skipped_turns(wid.board_id, wid.numOfSkipTurnsSpinbox.value())
  325. def on_count_changed(self):
  326. """
  327. Handle the change of the count value
  328. """
  329. self.set_filesize(0)
  330. bif.bk_change_count(self.board_id, self.countSpinbox.value())
  331. for b_id in self.same_as_widgets[self.board_id]:
  332. wid = self.widgets[b_id]
  333. bif.bk_change_count(wid.board_id, wid.countSpinbox.value())
  334. def on_wait_changed(self):
  335. """
  336. Handle the change of the wait time
  337. """
  338. self.set_filesize(0)
  339. bif.bk_change_wait(self.board_id, self.waitSpinbox.value())
  340. for b_id in self.same_as_widgets[self.board_id]:
  341. wid = self.widgets[b_id]
  342. bif.bk_change_wait(wid.board_id, wid.waitSpinbox.value())
  343. def on_build_spectrograms_changed(self):
  344. """
  345. Handle the change of the build_spectrograms checkbox
  346. """
  347. bif.bk_change_build_spectrograms(self.board_id, self.buildSpectrogrammTickbox.checkState())
  348. for b_id in self.same_as_widgets[self.board_id]:
  349. wid = self.widgets[b_id]
  350. bif.bk_change_build_spectrograms(wid.board_id, wid.buildSpectrogrammTickbox.checkState())
  351. def on_simulate_pilot_bunch_changed(self):
  352. """
  353. Handle the change of the simulate_pilot_bunch checkbox
  354. """
  355. bif.bk_change_pilot_bunch(self.board_id, self.simulatePilotBunch.checkState())
  356. for b_id in self.same_as_widgets[self.board_id]:
  357. wid = self.widgets[b_id]
  358. bif.bk_change_pilot_bunch(wid.board_id, wid.simulatePilotBunch.checkState())
  359. def on_trigger_skip_signals_changed(self, value):
  360. """
  361. Handle change of trigger skip signal spinbox
  362. :param int value: the value to set trigger_skip to (the number of trigger signals to skip between acquisitions
  363. """
  364. bif.bk_update_config(self.board_id, 'trigger_skip', value)
  365. for b_id in self.same_as_widgets[self.board_id]:
  366. wid = self.widgets[b_id]
  367. bif.bk_update_config(wid.board_id, 'trigger_skip', value)
  368. def on_trigger_method_changed(self):
  369. """
  370. Handle change of trigger method.
  371. """
  372. bif.bk_update_config(self.board_id, 'trigger_method', 2 if self.method.state() else 1)
  373. for b_id in self.same_as_widgets[self.board_id]:
  374. wid = self.widgets[b_id]
  375. bif.bk_update_config(wid.board_id, 'trigger_method', 2 if self.method.satate() else 1)
  376. def on_trigger_timeout_changed(self, value):
  377. """
  378. Handle change of trigger timeout spinbox
  379. :param int value: the value to set the trigger_timout to
  380. """
  381. bif.bk_update_config(self.board_id, 'trigger_timeout', value)
  382. for b_id in self.same_as_widgets[self.board_id]:
  383. wid = self.widgets[b_id]
  384. bif.bk_update_config(wid.board_id, 'trigger_timeout', value)
  385. def on_shift_FMC2_changed(self, value):
  386. config.shiftFMC2 = value
  387. def closeEvent(self, event):
  388. """
  389. Event handler to handle the event of closing this window and gracefully delete resources and such
  390. :param event: the event to handle (gets passed to by PyQt)
  391. """
  392. board.get_board_config(self.board_id).unobserve(self.numOfTurnsSpinbox, 'turns_observe')
  393. board.get_board_config(self.board_id).unobserve(self.numOfSkipTurnsSpinbox, 'turns_skip')
  394. board.get_board_config(self.board_id).unobserve(self.countSpinbox, 'acquisition_count')
  395. board.get_board_config(self.board_id).unobserve(self.waitSpinbox, 'turns_wait_time')
  396. board.get_board_config(self.board_id).unobserve(self.simulatePilotBunch, 'pilot_bunch')
  397. board.get_board_config(self.board_id).unobserve(self.buildSpectrogrammTickbox, 'build_spectrograms')
  398. board.get_board_config(self.board_id).unobserve(self.trigger_skip_signals, 'trigger_skip')
  399. board.get_board_config(self.board_id).unobserve(self.timeout, 'trigger_timeout')
  400. board.get_board_config(self.board_id).unobserve(self.trigger_tick, 'use_trigger')
  401. board.get_board_config(self.board_id).unobserve(self.fileSizeOutLabel, 'turns_observe')
  402. board.get_board_config(self.board_id).unobserve(self.fileSizeOutLabel, 'turns_skip')
  403. Elements.removeItem(["acquire_{}".format(self.board_id), "no_board_{}".format(self.board_id)],
  404. [
  405. self.numOfTurnsSpinbox,
  406. self.numOfSkipTurnsSpinbox,
  407. self.countSpinbox,
  408. self.waitSpinbox,
  409. self.buildSpectrogrammTickbox,
  410. self.simulatePilotBunch,
  411. self.trigger_skip_signals,
  412. self.timeout,
  413. self.method,
  414. self.trigger_tick
  415. ]
  416. )
  417. # d8888 d8b .d8888b. 888 888 d8b
  418. # d88888 Y8P d88P Y88b 888 888 Y8P
  419. # d88P888 Y88b. 888 888
  420. # d88P 888 .d8888b .d88888 888 888 888 888d888 .d88b. "Y888b. .d88b. 888888 888888 888 88888b. .d88b. .d8888b
  421. # d88P 888 d88P" d88" 888 888 888 888 888P" d8P Y8b "Y88b. d8P Y8b 888 888 888 888 "88b d88P"88b 88K
  422. # d88P 888 888 888 888 888 888 888 888 88888888 "888 88888888 888 888 888 888 888 888 888 "Y8888b.
  423. # d8888888888 Y88b. Y88b 888 Y88b 888 888 888 Y8b. Y88b d88P Y8b. Y88b. Y88b. 888 888 888 Y88b 888 X88
  424. # d88P 888 "Y8888P "Y88888 "Y88888 888 888 "Y8888 "Y8888P" "Y8888 "Y888 "Y888 888 888 888 "Y88888 88888P'
  425. # 888 888
  426. # 888 Y8b d88P
  427. # 888 "Y88P"
  428. class AcquireSettingsWidget(kcgw.KCGWidgets):
  429. """
  430. This is the actual Acquire Settings Window.
  431. """
  432. def __init__(self, unique_id, parent=None):
  433. """
  434. Initialise the acquire settings window
  435. :param unique_id: the id for thiw widget
  436. :param parent: parent object
  437. :return: -
  438. """
  439. super(AcquireSettingsWidget, self).__init__()
  440. self.id = unique_id
  441. self.par = parent
  442. self.layout = QtGui.QHBoxLayout()
  443. self.setLayout(self.layout)
  444. self.setWindowTitle(tr("Heading", "Acquire Settings"))
  445. self.same_as_widgets = {i: [] for i in available_boards}
  446. self.widgets = OrderedDict({i: AcquireSettingsTab(i, self.same_as_widgets, self) for i in available_boards})
  447. if available_boards.multi_board:
  448. self.tabs = QtGui.QTabWidget()
  449. self.layout.addWidget(self.tabs)
  450. for wid in list(self.widgets.values()):
  451. self.tabs.addTab(wid, available_boards.get_board_name_from_id(wid.board_id))
  452. wid.sameAsCombo.addItems([available_boards.get_board_name_from_id(i) for i in available_boards if i != wid.board_id])
  453. wid.widgets = self.widgets
  454. else:
  455. self.single_widget = list(self.widgets.values())[0]
  456. self.layout.addWidget(self.single_widget)
  457. for wid in list(self.widgets.values()):
  458. wid.set_values()
  459. def show_tab(self, board_id):
  460. """
  461. Show the tab for the given board
  462. :param board_id: the id of the board to show
  463. """
  464. if not available_boards.multi_board:
  465. return
  466. self.tabs.setCurrentIndex(list(self.widgets.keys()).index(board_id))
  467. def closeEvent(self, event):
  468. global __widget_id__
  469. for wid in list(self.widgets.values()):
  470. wid.closeEvent(event)
  471. __widget_id__ = None
  472. del self.par.widgets[self.id]
  473. super(AcquireSettingsWidget, self).closeEvent(event)
  474. def addAcquireSettingsWidget(board_id=None):
  475. """
  476. Add this widget to the gui.
  477. This function will actually open the subwindow.
  478. :return: -
  479. """
  480. global __widget_id__
  481. if __widget_id__:
  482. global_objects.get_global('area').widgets[__widget_id__].setFocus()
  483. if board_id is not None:
  484. global_objects.get_global('area').widgets[__widget_id__].show_tab(board_id)
  485. else:
  486. nid = kcgw.idg.genid()
  487. __widget_id__ = nid
  488. w = AcquireSettingsWidget(nid, global_objects.get_global('area'))
  489. global_objects.get_global('area').newWidget(w, "Acquire", nid, widget_type=4, minSize=True) # TODO: proper type
  490. if board_id is not None:
  491. global_objects.get_global('area').widgets[__widget_id__].show_tab(board_id)
  492. kcgw.register_widget(QtGui.QIcon(config.icon_path(config.acquireSettingsIcon)),
  493. tr("Heading", "Acquire Settings"),
  494. addAcquireSettingsWidget, "Ctrl+A")