pyobs-gui 2.0.0.dev3__py3-none-any.whl → 2.0.0.dev4__py3-none-any.whl

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.
pyobs_gui/camerawidget.py CHANGED
@@ -17,7 +17,6 @@ from pyobs.interfaces import (
17
17
  IBinning,
18
18
  BinningState,
19
19
  IWindow,
20
- WindowState,
21
20
  IFilters,
22
21
  ICooling,
23
22
  ITemperatures,
@@ -58,13 +57,6 @@ class CameraWidget(BaseWidget, Ui_CameraWidget):
58
57
  self.exposure_time_left = 0.0
59
58
  self.exposure_progress = 0.0
60
59
 
61
- self.spinWindowLeft.init_modified(self.labelWindowLeft).committed.connect(self._window_changed)
62
- self.spinWindowTop.init_modified(self.labelWindowTop).committed.connect(self._window_changed)
63
- self.spinWindowWidth.init_modified(self.labelWindowWidth).committed.connect(self._window_changed)
64
- self.spinWindowHeight.init_modified(self.labelWindowHeight).committed.connect(self._window_changed)
65
- self.spinGain.init_modified(self.labelGain).committed.connect(self._gain_changed)
66
- self.spinGainOffset.init_modified(self.labelGain).committed.connect(self._gain_changed)
67
-
68
60
  async def open(
69
61
  self,
70
62
  modules: list[str] | None = None,
@@ -80,7 +72,7 @@ class CameraWidget(BaseWidget, Ui_CameraWidget):
80
72
  image_types = sorted([it.name for it in ImageType])
81
73
  self.comboImageType.addItems(image_types)
82
74
 
83
- # before first update, disable mys
75
+ # before first update, disable myself
84
76
  self.setEnabled(False)
85
77
 
86
78
  # hide groups, if necessary
@@ -118,10 +110,25 @@ class CameraWidget(BaseWidget, Ui_CameraWidget):
118
110
 
119
111
  async def _init(self) -> None:
120
112
  # window
113
+ window_caps = await self.comm.get_capabilities(self.module, IWindow)
114
+ if window_caps is not None:
115
+ self.spinWindowLeft.setMaximum(int(window_caps.full_frame_width))
116
+ self.spinWindowTop.setMaximum(int(window_caps.full_frame_height))
117
+ self.spinWindowWidth.setMaximum(int(window_caps.full_frame_width))
118
+ self.spinWindowHeight.setMaximum(int(window_caps.full_frame_height))
121
119
  async with self.comm.safe_proxy(self.module, IWindow) as proxy:
122
120
  if proxy is not None:
123
- await self.comm.subscribe_state(self.module, IWindow, self._update_window)
124
- await self.set_full_frame()
121
+ state = await proxy.wait_for_state(IWindow)
122
+ if state is not None:
123
+ self.spinWindowLeft.setValue(state.x)
124
+ self.spinWindowTop.setValue(state.y)
125
+ self.spinWindowWidth.setValue(state.width)
126
+ self.spinWindowHeight.setValue(state.height)
127
+ elif window_caps is not None:
128
+ self.spinWindowLeft.setValue(window_caps.full_frame_x)
129
+ self.spinWindowTop.setValue(window_caps.full_frame_y)
130
+ self.spinWindowWidth.setValue(window_caps.full_frame_width)
131
+ self.spinWindowHeight.setValue(window_caps.full_frame_height)
125
132
 
126
133
  # binning
127
134
  binning_caps = await self.comm.get_capabilities(self.module, IBinning)
@@ -129,11 +136,21 @@ class CameraWidget(BaseWidget, Ui_CameraWidget):
129
136
  binnings = [f"{b.x}x{b.y}" for b in binning_caps.binnings]
130
137
  self.comboBinning.clear()
131
138
  self.comboBinning.addItems(binnings)
132
- await self.comm.subscribe_state(self.module, IBinning, self._update_binning)
139
+ async with self.comm.safe_proxy(self.module, IBinning) as proxy:
140
+ if proxy is not None:
141
+ state = await proxy.wait_for_state(IBinning)
142
+ if state is not None:
143
+ self.comboBinning.setCurrentText(f"{state.x}x{state.y}")
144
+ await self.comm.subscribe_state(self.module, IBinning, self._update_binning)
133
145
 
134
- # gain — initial values delivered by subscription callback
135
- if await self.comm.has_proxy(self.module, IGain):
136
- await self.comm.subscribe_state(self.module, IGain, self._update_gain)
146
+ # gain
147
+ async with self.comm.safe_proxy(self.module, IGain) as proxy:
148
+ if proxy is not None:
149
+ state = await proxy.wait_for_state(IGain)
150
+ if state is not None:
151
+ self.spinGain.setValue(state.gain)
152
+ self.spinGainOffset.setValue(state.offset)
153
+ await self.comm.subscribe_state(self.module, IGain, self._update_gain)
137
154
 
138
155
  # image format
139
156
  image_format_caps = await self.comm.get_capabilities(self.module, IImageFormat)
@@ -141,38 +158,52 @@ class CameraWidget(BaseWidget, Ui_CameraWidget):
141
158
  image_formats = [ImageFormat(f) for f in image_format_caps.image_formats]
142
159
  self.comboImageFormat.clear()
143
160
  self.comboImageFormat.addItems([f.name for f in image_formats])
144
- await self.comm.subscribe_state(self.module, IImageFormat, self._update_image_format)
161
+ async with self.comm.safe_proxy(self.module, IImageFormat) as proxy:
162
+ if proxy is not None:
163
+ state = await proxy.wait_for_state(IImageFormat)
164
+ if state is not None:
165
+ self.comboImageFormat.setCurrentText(state.image_format.name)
166
+ await self.comm.subscribe_state(self.module, IImageFormat, self._update_image_format)
145
167
 
168
+ # image type
146
169
  async with self.comm.safe_proxy(self.module, IImageType) as proxy:
147
170
  if proxy is not None:
148
- await self.comm.subscribe_state(self.module, IImageType, self._update_image_type)
171
+ state = await proxy.wait_for_state(IImageType)
172
+ if state is not None:
173
+ self.comboImageType.setCurrentText(state.image_type.name)
174
+ await self.comm.subscribe_state(self.module, IImageType, self._update_image_type)
149
175
 
176
+ # exposure (status, progress, time left)
150
177
  async with self.comm.safe_proxy(self.module, IExposure) as proxy:
151
178
  if proxy is not None:
152
- await self.comm.subscribe_state(self.module, IExposure, self._update_exposure)
153
-
179
+ state = await proxy.wait_for_state(IExposure)
180
+ if state is not None:
181
+ self.exposure_status = state.status
182
+ self.exposure_progress = state.progress
183
+ self.exposure_time_left = state.exposure_time_left
184
+ await self.comm.subscribe_state(self.module, IExposure, self._update_exposure)
185
+
186
+ # exposure time
154
187
  async with self.comm.safe_proxy(self.module, IExposureTime) as proxy:
155
188
  if proxy is not None:
156
- await self.comm.subscribe_state(self.module, IExposureTime, self._update_exposure_time)
189
+ state = await proxy.wait_for_state(IExposureTime)
190
+ if state is not None:
191
+ self.spinExpTime.setValue(state.exposure_time)
192
+ await self.comm.subscribe_state(self.module, IExposureTime, self._update_exposure_time)
157
193
 
194
+ # data sequence
158
195
  if await self.comm.has_proxy(self.module, IDataSequence):
159
196
  await self.comm.subscribe_state(self.module, IDataSequence, self._update_sequence)
160
197
 
161
198
  # update GUI
162
199
  self.signal_update_gui.emit()
163
200
 
164
- def _update_window(self, state: WindowState):
165
- self.labelWindowLeft.setText(str(state.x))
166
- self.labelWindowTop.setText(str(state.y))
167
- self.labelWindowWidth.setText(str(state.width))
168
- self.labelWindowHeight.setText(str(state.height))
169
-
170
201
  def _update_binning(self, state: BinningState):
171
202
  self.comboBinning.setCurrentText(f"{state.x}x{state.y}")
172
203
 
173
204
  def _update_gain(self, state: GainState):
174
- self.labelGain.setText(str(state.gain))
175
- self.labelGainOffset.setText(str(state.offset))
205
+ self.spinGain.setValue(state.gain)
206
+ self.spinGainOffset.setValue(state.offset)
176
207
 
177
208
  def _update_image_format(self, state: ImageFormatState):
178
209
  self.comboImageFormat.setCurrentText(state.image_format.name)
@@ -194,14 +225,6 @@ class CameraWidget(BaseWidget, Ui_CameraWidget):
194
225
  self.exposures_left = state.count_left
195
226
  self.update_gui()
196
227
 
197
- @qasync.asyncSlot()
198
- async def _window_changed(self):
199
- print("ok")
200
-
201
- @qasync.asyncSlot()
202
- async def _gain_changed(self):
203
- print("ok")
204
-
205
228
  @qasync.asyncSlot() # type: ignore
206
229
  async def set_full_frame(self) -> None:
207
230
  caps = await self.comm.get_capabilities(self.module, IWindow)
@@ -247,18 +270,75 @@ class CameraWidget(BaseWidget, Ui_CameraWidget):
247
270
 
248
271
  @qasync.asyncSlot() # type: ignore
249
272
  async def expose(self) -> None:
273
+ # set binning
274
+ async with self.comm.safe_proxy(self.module, IBinning) as proxy:
275
+ if proxy is not None:
276
+ binning = int(self.comboBinning.currentText()[0])
277
+ try:
278
+ await proxy.set_binning(binning, binning)
279
+ except Exception:
280
+ log.exception("bla")
281
+ QtWidgets.QMessageBox.information(self, "Error", "Could not set binning.")
282
+ return
283
+ else:
284
+ binning = 1
285
+
286
+ # set window
287
+ async with self.comm.safe_proxy(self.module, IWindow) as proxy:
288
+ if proxy is not None:
289
+ left, top = self.spinWindowLeft.value(), self.spinWindowTop.value()
290
+ width, height = self.spinWindowWidth.value(), self.spinWindowHeight.value()
291
+ try:
292
+ await proxy.set_window(left, top, width * binning, height * binning)
293
+ except Exception:
294
+ QtWidgets.QMessageBox.information(self, "Error", "Could not set window.")
295
+ return
296
+
297
+ # set image format
298
+ async with self.comm.safe_proxy(self.module, IImageFormat) as proxy:
299
+ if proxy is not None:
300
+ image_format = ImageFormat[self.comboImageFormat.currentText()]
301
+ await proxy.set_image_format(image_format)
302
+
303
+ # set exposure time
304
+ async with self.comm.safe_proxy(self.module, IExposureTime) as proxy:
305
+ if proxy is not None:
306
+ # get exp_time
307
+ exp_time = self.spinExpTime.value()
308
+
309
+ # unit
310
+ if self.comboExpTimeUnit.currentText() == "ms":
311
+ exp_time /= 1e3
312
+ elif self.comboExpTimeUnit.currentText() == "µs":
313
+ exp_time /= 1e6
314
+
315
+ # set it
316
+ await proxy.set_exposure_time(exp_time)
317
+
318
+ # set gain and offset
319
+ async with self.comm.safe_proxy(self.module, IGain) as proxy:
320
+ if proxy is not None:
321
+ await proxy.set_gain(self.spinGain.value())
322
+ await proxy.set_offset(self.spinGainOffset.value())
323
+
324
+ # set image type
325
+ image_type = ImageType.OBJECT
326
+ async with self.comm.safe_proxy(self.module, IImageType) as proxy:
327
+ if proxy is not None:
328
+ image_type = ImageType(self.comboImageType.currentText().lower())
329
+ await proxy.set_image_type(image_type)
330
+
331
+ # set initial image count
332
+ self.exposures_left = self.spinCount.value()
250
333
  broadcast = self.checkBroadcast.isChecked()
251
- count = self.spinCount.value()
252
334
 
253
- # if the module can grab a counted sequence server-side, let it -- progress comes
254
- # back via the DataSequenceState subscription
335
+ # if the module can grab a counted sequence server-side, let it
255
336
  async with self.comm.safe_proxy(self.module, IDataSequence) as proxy:
256
337
  if proxy is not None:
257
- await proxy.grab_sequence(count, broadcast)
338
+ await proxy.grab_sequence(self.exposures_left, broadcast)
258
339
  return
259
340
 
260
341
  # fall back to a client-side loop for modules that don't support IDataSequence
261
- self.exposures_left = count
262
342
  while self.exposures_left > 0:
263
343
  await self.datadisplay.grab_data(broadcast)
264
344
  self.exposures_left -= 1
@@ -33,7 +33,7 @@
33
33
  <rect>
34
34
  <x>0</x>
35
35
  <y>0</y>
36
- <width>238</width>
36
+ <width>239</width>
37
37
  <height>748</height>
38
38
  </rect>
39
39
  </property>
@@ -64,7 +64,7 @@
64
64
  </widget>
65
65
  </item>
66
66
  <item row="2" column="2">
67
- <widget class="ModifiedSpinBox" name="spinWindowWidth">
67
+ <widget class="QSpinBox" name="spinWindowWidth">
68
68
  <property name="minimum">
69
69
  <number>1</number>
70
70
  </property>
@@ -74,7 +74,7 @@
74
74
  </widget>
75
75
  </item>
76
76
  <item row="0" column="2">
77
- <widget class="ModifiedSpinBox" name="spinWindowLeft">
77
+ <widget class="QSpinBox" name="spinWindowLeft">
78
78
  <property name="maximum">
79
79
  <number>9999</number>
80
80
  </property>
@@ -109,14 +109,14 @@
109
109
  </widget>
110
110
  </item>
111
111
  <item row="1" column="2">
112
- <widget class="ModifiedSpinBox" name="spinWindowTop">
112
+ <widget class="QSpinBox" name="spinWindowTop">
113
113
  <property name="maximum">
114
114
  <number>9999</number>
115
115
  </property>
116
116
  </widget>
117
117
  </item>
118
118
  <item row="3" column="2">
119
- <widget class="ModifiedSpinBox" name="spinWindowHeight">
119
+ <widget class="QSpinBox" name="spinWindowHeight">
120
120
  <property name="minimum">
121
121
  <number>1</number>
122
122
  </property>
@@ -126,54 +126,54 @@
126
126
  </widget>
127
127
  </item>
128
128
  <item row="0" column="1">
129
- <widget class="WatchedLabel" name="labelWindowLeft">
129
+ <widget class="QLabel" name="labelWindowLeft">
130
130
  <property name="frameShape">
131
- <enum>QFrame::Shape::NoFrame</enum>
131
+ <enum>QFrame::Shape::Box</enum>
132
132
  </property>
133
133
  <property name="text">
134
134
  <string>-</string>
135
135
  </property>
136
136
  <property name="alignment">
137
- <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
137
+ <set>Qt::AlignmentFlag::AlignCenter</set>
138
138
  </property>
139
139
  </widget>
140
140
  </item>
141
141
  <item row="1" column="1">
142
- <widget class="WatchedLabel" name="labelWindowTop">
142
+ <widget class="QLabel" name="labelWindowTop">
143
143
  <property name="frameShape">
144
- <enum>QFrame::Shape::NoFrame</enum>
144
+ <enum>QFrame::Shape::Box</enum>
145
145
  </property>
146
146
  <property name="text">
147
147
  <string>-</string>
148
148
  </property>
149
149
  <property name="alignment">
150
- <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
150
+ <set>Qt::AlignmentFlag::AlignCenter</set>
151
151
  </property>
152
152
  </widget>
153
153
  </item>
154
154
  <item row="2" column="1">
155
- <widget class="WatchedLabel" name="labelWindowWidth">
155
+ <widget class="QLabel" name="labelWindowWidth">
156
156
  <property name="frameShape">
157
- <enum>QFrame::Shape::NoFrame</enum>
157
+ <enum>QFrame::Shape::Box</enum>
158
158
  </property>
159
159
  <property name="text">
160
160
  <string>-</string>
161
161
  </property>
162
162
  <property name="alignment">
163
- <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
163
+ <set>Qt::AlignmentFlag::AlignCenter</set>
164
164
  </property>
165
165
  </widget>
166
166
  </item>
167
167
  <item row="3" column="1">
168
- <widget class="WatchedLabel" name="labelWindowHeight">
168
+ <widget class="QLabel" name="labelWindowHeight">
169
169
  <property name="frameShape">
170
- <enum>QFrame::Shape::NoFrame</enum>
170
+ <enum>QFrame::Shape::Box</enum>
171
171
  </property>
172
172
  <property name="text">
173
173
  <string>-</string>
174
174
  </property>
175
175
  <property name="alignment">
176
- <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
176
+ <set>Qt::AlignmentFlag::AlignCenter</set>
177
177
  </property>
178
178
  </widget>
179
179
  </item>
@@ -248,7 +248,7 @@
248
248
  </widget>
249
249
  </item>
250
250
  <item row="0" column="2">
251
- <widget class="ModifiedSpinBox" name="spinGain">
251
+ <widget class="QSpinBox" name="spinGain">
252
252
  <property name="minimum">
253
253
  <number>1</number>
254
254
  </property>
@@ -258,9 +258,9 @@
258
258
  </widget>
259
259
  </item>
260
260
  <item row="1" column="2">
261
- <widget class="ModifiedSpinBox" name="spinGainOffset">
261
+ <widget class="QSpinBox" name="spinGainOffset">
262
262
  <property name="minimum">
263
- <number>0</number>
263
+ <number>1</number>
264
264
  </property>
265
265
  <property name="maximum">
266
266
  <number>9999</number>
@@ -268,28 +268,28 @@
268
268
  </widget>
269
269
  </item>
270
270
  <item row="0" column="1">
271
- <widget class="WatchedLabel" name="labelGain">
271
+ <widget class="QLabel" name="labelGain">
272
272
  <property name="frameShape">
273
- <enum>QFrame::Shape::NoFrame</enum>
273
+ <enum>QFrame::Shape::Box</enum>
274
274
  </property>
275
275
  <property name="text">
276
276
  <string>-</string>
277
277
  </property>
278
278
  <property name="alignment">
279
- <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
279
+ <set>Qt::AlignmentFlag::AlignCenter</set>
280
280
  </property>
281
281
  </widget>
282
282
  </item>
283
283
  <item row="1" column="1">
284
- <widget class="WatchedLabel" name="labelGainOffset">
284
+ <widget class="QLabel" name="labelGainOffset">
285
285
  <property name="frameShape">
286
- <enum>QFrame::Shape::NoFrame</enum>
286
+ <enum>QFrame::Shape::Box</enum>
287
287
  </property>
288
288
  <property name="text">
289
289
  <string>-</string>
290
290
  </property>
291
291
  <property name="alignment">
292
- <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
292
+ <set>Qt::AlignmentFlag::AlignCenter</set>
293
293
  </property>
294
294
  </widget>
295
295
  </item>
@@ -312,7 +312,7 @@
312
312
  <item row="0" column="2">
313
313
  <layout class="QHBoxLayout" name="layoutExpTime" stretch="1,0">
314
314
  <item>
315
- <widget class="ModifiedDoubleSpinBox" name="spinExpTime">
315
+ <widget class="QDoubleSpinBox" name="spinExpTime">
316
316
  <property name="suffix">
317
317
  <string/>
318
318
  </property>
@@ -352,7 +352,7 @@
352
352
  </layout>
353
353
  </item>
354
354
  <item row="0" column="1">
355
- <widget class="WatchedLabel" name="labelExpTime">
355
+ <widget class="QLabel" name="labelExpTime">
356
356
  <property name="frameShape">
357
357
  <enum>QFrame::Shape::Box</enum>
358
358
  </property>
@@ -1378,21 +1378,6 @@
1378
1378
  <extends>QWidget</extends>
1379
1379
  <header>..datadisplaywidget</header>
1380
1380
  </customwidget>
1381
- <customwidget>
1382
- <class>WatchedLabel</class>
1383
- <extends>QLabel</extends>
1384
- <header>..watchedlabel</header>
1385
- </customwidget>
1386
- <customwidget>
1387
- <class>ModifiedSpinBox</class>
1388
- <extends>QSpinBox</extends>
1389
- <header>..modifiedmixin</header>
1390
- </customwidget>
1391
- <customwidget>
1392
- <class>ModifiedDoubleSpinBox</class>
1393
- <extends>QDoubleSpinBox</extends>
1394
- <header>..modifiedmixin</header>
1395
- </customwidget>
1396
1381
  </customwidgets>
1397
1382
  <tabstops>
1398
1383
  <tabstop>scrollArea</tabstop>
@@ -15,14 +15,12 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
15
15
  QFont, QFontDatabase, QGradient, QIcon,
16
16
  QImage, QKeySequence, QLinearGradient, QPainter,
17
17
  QPalette, QPixmap, QRadialGradient, QTransform)
18
- from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QFrame,
18
+ from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QDoubleSpinBox,
19
19
  QGridLayout, QGroupBox, QHBoxLayout, QLabel,
20
20
  QProgressBar, QPushButton, QScrollArea, QSizePolicy,
21
21
  QSpacerItem, QSpinBox, QVBoxLayout, QWidget)
22
22
 
23
23
  from ..datadisplaywidget import DataDisplayWidget
24
- from ..modifiedmixin import (ModifiedDoubleSpinBox, ModifiedSpinBox)
25
- from ..watchedlabel import WatchedLabel
26
24
  from . import resources_rc
27
25
 
28
26
  class Ui_CameraWidget(object):
@@ -43,7 +41,7 @@ class Ui_CameraWidget(object):
43
41
  self.scrollArea.setWidgetResizable(True)
44
42
  self.scrollAreaWidgetContents = QWidget()
45
43
  self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents")
46
- self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 238, 748))
44
+ self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 295, 748))
47
45
  sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
48
46
  sizePolicy1.setHorizontalStretch(0)
49
47
  sizePolicy1.setVerticalStretch(0)
@@ -57,88 +55,57 @@ class Ui_CameraWidget(object):
57
55
  self.gridLayout_2 = QGridLayout(self.groupWindowing)
58
56
  self.gridLayout_2.setSpacing(0)
59
57
  self.gridLayout_2.setObjectName(u"gridLayout_2")
60
- self.label_3 = QLabel(self.groupWindowing)
61
- self.label_3.setObjectName(u"label_3")
58
+ self.label = QLabel(self.groupWindowing)
59
+ self.label.setObjectName(u"label")
62
60
 
63
- self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1)
61
+ self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
64
62
 
65
- self.spinWindowWidth = ModifiedSpinBox(self.groupWindowing)
63
+ self.label_2 = QLabel(self.groupWindowing)
64
+ self.label_2.setObjectName(u"label_2")
65
+
66
+ self.gridLayout_2.addWidget(self.label_2, 1, 0, 1, 1)
67
+
68
+ self.spinWindowWidth = QSpinBox(self.groupWindowing)
66
69
  self.spinWindowWidth.setObjectName(u"spinWindowWidth")
67
70
  self.spinWindowWidth.setMinimum(1)
68
71
  self.spinWindowWidth.setMaximum(9999)
69
72
 
70
- self.gridLayout_2.addWidget(self.spinWindowWidth, 2, 2, 1, 1)
71
-
72
- self.spinWindowLeft = ModifiedSpinBox(self.groupWindowing)
73
- self.spinWindowLeft.setObjectName(u"spinWindowLeft")
74
- self.spinWindowLeft.setMaximum(9999)
75
-
76
- self.gridLayout_2.addWidget(self.spinWindowLeft, 0, 2, 1, 1)
73
+ self.gridLayout_2.addWidget(self.spinWindowWidth, 2, 1, 1, 1)
77
74
 
78
75
  self.butFullFrame = QPushButton(self.groupWindowing)
79
76
  self.butFullFrame.setObjectName(u"butFullFrame")
80
77
 
81
- self.gridLayout_2.addWidget(self.butFullFrame, 4, 0, 1, 3)
78
+ self.gridLayout_2.addWidget(self.butFullFrame, 4, 0, 1, 2)
79
+
80
+ self.label_3 = QLabel(self.groupWindowing)
81
+ self.label_3.setObjectName(u"label_3")
82
+
83
+ self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1)
82
84
 
83
85
  self.label_4 = QLabel(self.groupWindowing)
84
86
  self.label_4.setObjectName(u"label_4")
85
87
 
86
88
  self.gridLayout_2.addWidget(self.label_4, 3, 0, 1, 1)
87
89
 
88
- self.label_2 = QLabel(self.groupWindowing)
89
- self.label_2.setObjectName(u"label_2")
90
-
91
- self.gridLayout_2.addWidget(self.label_2, 1, 0, 1, 1)
92
-
93
- self.label = QLabel(self.groupWindowing)
94
- self.label.setObjectName(u"label")
95
-
96
- self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
97
-
98
- self.spinWindowTop = ModifiedSpinBox(self.groupWindowing)
99
- self.spinWindowTop.setObjectName(u"spinWindowTop")
100
- self.spinWindowTop.setMaximum(9999)
101
-
102
- self.gridLayout_2.addWidget(self.spinWindowTop, 1, 2, 1, 1)
103
-
104
- self.spinWindowHeight = ModifiedSpinBox(self.groupWindowing)
90
+ self.spinWindowHeight = QSpinBox(self.groupWindowing)
105
91
  self.spinWindowHeight.setObjectName(u"spinWindowHeight")
106
92
  self.spinWindowHeight.setMinimum(1)
107
93
  self.spinWindowHeight.setMaximum(9999)
108
94
 
109
- self.gridLayout_2.addWidget(self.spinWindowHeight, 3, 2, 1, 1)
110
-
111
- self.labelWindowLeft = WatchedLabel(self.groupWindowing)
112
- self.labelWindowLeft.setObjectName(u"labelWindowLeft")
113
- self.labelWindowLeft.setFrameShape(QFrame.Shape.NoFrame)
114
- self.labelWindowLeft.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
115
-
116
- self.gridLayout_2.addWidget(self.labelWindowLeft, 0, 1, 1, 1)
117
-
118
- self.labelWindowTop = WatchedLabel(self.groupWindowing)
119
- self.labelWindowTop.setObjectName(u"labelWindowTop")
120
- self.labelWindowTop.setFrameShape(QFrame.Shape.NoFrame)
121
- self.labelWindowTop.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
95
+ self.gridLayout_2.addWidget(self.spinWindowHeight, 3, 1, 1, 1)
122
96
 
123
- self.gridLayout_2.addWidget(self.labelWindowTop, 1, 1, 1, 1)
124
-
125
- self.labelWindowWidth = WatchedLabel(self.groupWindowing)
126
- self.labelWindowWidth.setObjectName(u"labelWindowWidth")
127
- self.labelWindowWidth.setFrameShape(QFrame.Shape.NoFrame)
128
- self.labelWindowWidth.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
97
+ self.spinWindowLeft = QSpinBox(self.groupWindowing)
98
+ self.spinWindowLeft.setObjectName(u"spinWindowLeft")
99
+ self.spinWindowLeft.setMaximum(9999)
129
100
 
130
- self.gridLayout_2.addWidget(self.labelWindowWidth, 2, 1, 1, 1)
101
+ self.gridLayout_2.addWidget(self.spinWindowLeft, 0, 1, 1, 1)
131
102
 
132
- self.labelWindowHeight = WatchedLabel(self.groupWindowing)
133
- self.labelWindowHeight.setObjectName(u"labelWindowHeight")
134
- self.labelWindowHeight.setFrameShape(QFrame.Shape.NoFrame)
135
- self.labelWindowHeight.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
103
+ self.spinWindowTop = QSpinBox(self.groupWindowing)
104
+ self.spinWindowTop.setObjectName(u"spinWindowTop")
105
+ self.spinWindowTop.setMaximum(9999)
136
106
 
137
- self.gridLayout_2.addWidget(self.labelWindowHeight, 3, 1, 1, 1)
107
+ self.gridLayout_2.addWidget(self.spinWindowTop, 1, 1, 1, 1)
138
108
 
139
- self.gridLayout_2.setColumnStretch(0, 2)
140
- self.gridLayout_2.setColumnStretch(1, 1)
141
- self.gridLayout_2.setColumnStretch(2, 2)
142
109
 
143
110
  self.verticalLayout.addWidget(self.groupWindowing)
144
111
 
@@ -183,47 +150,30 @@ class Ui_CameraWidget(object):
183
150
  self.gridLayout = QGridLayout(self.groupGain)
184
151
  self.gridLayout.setSpacing(0)
185
152
  self.gridLayout.setObjectName(u"gridLayout")
186
- self.label_11 = QLabel(self.groupGain)
187
- self.label_11.setObjectName(u"label_11")
188
-
189
- self.gridLayout.addWidget(self.label_11, 0, 0, 1, 1)
190
-
191
153
  self.label_13 = QLabel(self.groupGain)
192
154
  self.label_13.setObjectName(u"label_13")
193
155
 
194
156
  self.gridLayout.addWidget(self.label_13, 1, 0, 1, 1)
195
157
 
196
- self.spinGain = ModifiedSpinBox(self.groupGain)
158
+ self.label_11 = QLabel(self.groupGain)
159
+ self.label_11.setObjectName(u"label_11")
160
+
161
+ self.gridLayout.addWidget(self.label_11, 0, 0, 1, 1)
162
+
163
+ self.spinGain = QSpinBox(self.groupGain)
197
164
  self.spinGain.setObjectName(u"spinGain")
198
165
  self.spinGain.setMinimum(1)
199
166
  self.spinGain.setMaximum(9999)
200
167
 
201
- self.gridLayout.addWidget(self.spinGain, 0, 2, 1, 1)
168
+ self.gridLayout.addWidget(self.spinGain, 0, 1, 1, 1)
202
169
 
203
- self.spinGainOffset = ModifiedSpinBox(self.groupGain)
170
+ self.spinGainOffset = QSpinBox(self.groupGain)
204
171
  self.spinGainOffset.setObjectName(u"spinGainOffset")
205
- self.spinGainOffset.setMinimum(0)
172
+ self.spinGainOffset.setMinimum(1)
206
173
  self.spinGainOffset.setMaximum(9999)
207
174
 
208
- self.gridLayout.addWidget(self.spinGainOffset, 1, 2, 1, 1)
209
-
210
- self.labelGain = WatchedLabel(self.groupGain)
211
- self.labelGain.setObjectName(u"labelGain")
212
- self.labelGain.setFrameShape(QFrame.Shape.NoFrame)
213
- self.labelGain.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
214
-
215
- self.gridLayout.addWidget(self.labelGain, 0, 1, 1, 1)
216
-
217
- self.labelGainOffset = WatchedLabel(self.groupGain)
218
- self.labelGainOffset.setObjectName(u"labelGainOffset")
219
- self.labelGainOffset.setFrameShape(QFrame.Shape.NoFrame)
220
- self.labelGainOffset.setAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
221
-
222
- self.gridLayout.addWidget(self.labelGainOffset, 1, 1, 1, 1)
175
+ self.gridLayout.addWidget(self.spinGainOffset, 1, 1, 1, 1)
223
176
 
224
- self.gridLayout.setColumnStretch(0, 2)
225
- self.gridLayout.setColumnStretch(1, 1)
226
- self.gridLayout.setColumnStretch(2, 2)
227
177
 
228
178
  self.verticalLayout.addWidget(self.groupGain)
229
179
 
@@ -238,9 +188,9 @@ class Ui_CameraWidget(object):
238
188
 
239
189
  self.layoutExpTime = QHBoxLayout()
240
190
  self.layoutExpTime.setObjectName(u"layoutExpTime")
241
- self.spinExpTime = ModifiedDoubleSpinBox(self.groupExpTime)
191
+ self.spinExpTime = QDoubleSpinBox(self.groupExpTime)
242
192
  self.spinExpTime.setObjectName(u"spinExpTime")
243
- self.spinExpTime.setDecimals(1)
193
+ self.spinExpTime.setDecimals(3)
244
194
  self.spinExpTime.setMaximum(999.000000000000000)
245
195
  self.spinExpTime.setValue(1.000000000000000)
246
196
 
@@ -257,18 +207,8 @@ class Ui_CameraWidget(object):
257
207
 
258
208
  self.layoutExpTime.setStretch(0, 1)
259
209
 
260
- self.gridLayout_5.addLayout(self.layoutExpTime, 0, 2, 1, 1)
210
+ self.gridLayout_5.addLayout(self.layoutExpTime, 0, 1, 1, 1)
261
211
 
262
- self.labelExpTime = WatchedLabel(self.groupExpTime)
263
- self.labelExpTime.setObjectName(u"labelExpTime")
264
- self.labelExpTime.setFrameShape(QFrame.Shape.Box)
265
- self.labelExpTime.setAlignment(Qt.AlignmentFlag.AlignCenter)
266
-
267
- self.gridLayout_5.addWidget(self.labelExpTime, 0, 1, 1, 1)
268
-
269
- self.gridLayout_5.setColumnStretch(0, 2)
270
- self.gridLayout_5.setColumnStretch(1, 1)
271
- self.gridLayout_5.setColumnStretch(2, 2)
272
212
 
273
213
  self.verticalLayout.addWidget(self.groupExpTime)
274
214
 
@@ -277,11 +217,10 @@ class Ui_CameraWidget(object):
277
217
  self.gridLayout_4 = QGridLayout(self.groupExposure)
278
218
  self.gridLayout_4.setSpacing(0)
279
219
  self.gridLayout_4.setObjectName(u"gridLayout_4")
280
- self.checkBroadcast = QCheckBox(self.groupExposure)
281
- self.checkBroadcast.setObjectName(u"checkBroadcast")
282
- self.checkBroadcast.setChecked(True)
220
+ self.labelImageType = QLabel(self.groupExposure)
221
+ self.labelImageType.setObjectName(u"labelImageType")
283
222
 
284
- self.gridLayout_4.addWidget(self.checkBroadcast, 2, 1, 1, 1)
223
+ self.gridLayout_4.addWidget(self.labelImageType, 0, 0, 1, 1)
285
224
 
286
225
  self.spinCount = QSpinBox(self.groupExposure)
287
226
  self.spinCount.setObjectName(u"spinCount")
@@ -375,10 +314,10 @@ class Ui_CameraWidget(object):
375
314
 
376
315
  self.gridLayout_4.addWidget(self.butAbort, 4, 0, 1, 2)
377
316
 
378
- self.comboImageType = QComboBox(self.groupExposure)
379
- self.comboImageType.setObjectName(u"comboImageType")
317
+ self.label_8 = QLabel(self.groupExposure)
318
+ self.label_8.setObjectName(u"label_8")
380
319
 
381
- self.gridLayout_4.addWidget(self.comboImageType, 0, 1, 1, 1)
320
+ self.gridLayout_4.addWidget(self.label_8, 1, 0, 1, 1)
382
321
 
383
322
  self.butExpose = QPushButton(self.groupExposure)
384
323
  self.butExpose.setObjectName(u"butExpose")
@@ -457,15 +396,16 @@ class Ui_CameraWidget(object):
457
396
 
458
397
  self.gridLayout_4.addWidget(self.butExpose, 3, 0, 1, 2)
459
398
 
460
- self.label_8 = QLabel(self.groupExposure)
461
- self.label_8.setObjectName(u"label_8")
399
+ self.checkBroadcast = QCheckBox(self.groupExposure)
400
+ self.checkBroadcast.setObjectName(u"checkBroadcast")
401
+ self.checkBroadcast.setChecked(True)
462
402
 
463
- self.gridLayout_4.addWidget(self.label_8, 1, 0, 1, 1)
403
+ self.gridLayout_4.addWidget(self.checkBroadcast, 2, 1, 1, 1)
464
404
 
465
- self.labelImageType = QLabel(self.groupExposure)
466
- self.labelImageType.setObjectName(u"labelImageType")
405
+ self.comboImageType = QComboBox(self.groupExposure)
406
+ self.comboImageType.setObjectName(u"comboImageType")
467
407
 
468
- self.gridLayout_4.addWidget(self.labelImageType, 0, 0, 1, 1)
408
+ self.gridLayout_4.addWidget(self.comboImageType, 0, 1, 1, 1)
469
409
 
470
410
 
471
411
  self.verticalLayout.addWidget(self.groupExposure)
@@ -530,24 +470,18 @@ class Ui_CameraWidget(object):
530
470
  def retranslateUi(self, CameraWidget):
531
471
  CameraWidget.setWindowTitle(QCoreApplication.translate("CameraWidget", u"Form", None))
532
472
  self.groupWindowing.setTitle("")
533
- self.label_3.setText(QCoreApplication.translate("CameraWidget", u"Width:", None))
473
+ self.label.setText(QCoreApplication.translate("CameraWidget", u"Left:", None))
474
+ self.label_2.setText(QCoreApplication.translate("CameraWidget", u"Top:", None))
534
475
  self.butFullFrame.setText(QCoreApplication.translate("CameraWidget", u"Full Frame", None))
476
+ self.label_3.setText(QCoreApplication.translate("CameraWidget", u"Width:", None))
535
477
  self.label_4.setText(QCoreApplication.translate("CameraWidget", u"Height:", None))
536
- self.label_2.setText(QCoreApplication.translate("CameraWidget", u"Top:", None))
537
- self.label.setText(QCoreApplication.translate("CameraWidget", u"Left:", None))
538
- self.labelWindowLeft.setText(QCoreApplication.translate("CameraWidget", u"-", None))
539
- self.labelWindowTop.setText(QCoreApplication.translate("CameraWidget", u"-", None))
540
- self.labelWindowWidth.setText(QCoreApplication.translate("CameraWidget", u"-", None))
541
- self.labelWindowHeight.setText(QCoreApplication.translate("CameraWidget", u"-", None))
542
478
  self.groupImageFormat.setTitle("")
543
479
  self.label_10.setText(QCoreApplication.translate("CameraWidget", u"Format:", None))
544
480
  self.groupBinning.setTitle("")
545
481
  self.label_5.setText(QCoreApplication.translate("CameraWidget", u"Binning:", None))
546
482
  self.groupGain.setTitle("")
547
- self.label_11.setText(QCoreApplication.translate("CameraWidget", u"Gain:", None))
548
483
  self.label_13.setText(QCoreApplication.translate("CameraWidget", u"Offset:", None))
549
- self.labelGain.setText(QCoreApplication.translate("CameraWidget", u"-", None))
550
- self.labelGainOffset.setText(QCoreApplication.translate("CameraWidget", u"-", None))
484
+ self.label_11.setText(QCoreApplication.translate("CameraWidget", u"Gain:", None))
551
485
  self.groupExpTime.setTitle("")
552
486
  self.label_12.setText(QCoreApplication.translate("CameraWidget", u"ExpTime:", None))
553
487
  self.spinExpTime.setSuffix("")
@@ -555,13 +489,12 @@ class Ui_CameraWidget(object):
555
489
  self.comboExpTimeUnit.setItemText(1, QCoreApplication.translate("CameraWidget", u"ms", None))
556
490
  self.comboExpTimeUnit.setItemText(2, QCoreApplication.translate("CameraWidget", u"\u00b5s", None))
557
491
 
558
- self.labelExpTime.setText(QCoreApplication.translate("CameraWidget", u"-", None))
559
492
  self.groupExposure.setTitle("")
560
- self.checkBroadcast.setText(QCoreApplication.translate("CameraWidget", u"Broadcast", None))
493
+ self.labelImageType.setText(QCoreApplication.translate("CameraWidget", u"Type:", None))
561
494
  self.butAbort.setText(QCoreApplication.translate("CameraWidget", u"Abort", None))
562
- self.butExpose.setText(QCoreApplication.translate("CameraWidget", u"Expose", None))
563
495
  self.label_8.setText(QCoreApplication.translate("CameraWidget", u"Count:", None))
564
- self.labelImageType.setText(QCoreApplication.translate("CameraWidget", u"Type:", None))
496
+ self.butExpose.setText(QCoreApplication.translate("CameraWidget", u"Expose", None))
497
+ self.checkBroadcast.setText(QCoreApplication.translate("CameraWidget", u"Broadcast", None))
565
498
  self.labelStatus.setText(QCoreApplication.translate("CameraWidget", u"IDLE", None))
566
499
  self.labelExposuresLeft.setText(QCoreApplication.translate("CameraWidget", u"IDLE", None))
567
500
  # retranslateUi
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobs-gui
3
- Version: 2.0.0.dev3
3
+ Version: 2.0.0.dev4
4
4
  Summary: A remote GUI for pyobs
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -12,7 +12,7 @@ Requires-Dist: colour<0.2,>=0.1.5
12
12
  Requires-Dist: matplotlib<4,>=3.10.1
13
13
  Requires-Dist: pyobs-core<3,>=2.0.0.dev28
14
14
  Requires-Dist: pyside6>=6.10.1
15
- Requires-Dist: qasync<0.28,>=0.27.1
15
+ Requires-Dist: qasync<0.29,>=0.27.1
16
16
  Requires-Dist: qfitswidget>=0.13.1
17
17
  Requires-Dist: qtawesome<2,>=1.4.0
18
18
  Requires-Dist: sunpy[all]>=7.0.1
@@ -3,7 +3,7 @@ pyobs_gui/acquisitionwidget.py,sha256=jhytcfVbopFknDoE_y3VXIQ7CgochPsZXqxq17ze-R
3
3
  pyobs_gui/autofocuswidget.py,sha256=zgkz9AzSxpvE_xC9kQnUWuFNQze7vOYIfDWGCDkima0,4192
4
4
  pyobs_gui/autoguidingwidget.py,sha256=ekahiYxuhUSQRMC84MXGtq0uMyS-_VF_C0WHA1VXvPc,6592
5
5
  pyobs_gui/base.py,sha256=onpw_6UnOUjArcXRrxYXdDm4osezfxRL2kG_hTGsk8M,14168
6
- pyobs_gui/camerawidget.py,sha256=aU4J37aedkqr5x-LUBFpPuz6qloKLqjFFq9jJe4FzYQ,13328
6
+ pyobs_gui/camerawidget.py,sha256=_XairBslsoRge-cddhMiJOWHuml86-H0DG_yWLg80YU,17194
7
7
  pyobs_gui/commandinputwidget.py,sha256=VZLUkkaJzjKBAlkz7dOexP_Rula15RpZLFWToavyVdc,1692
8
8
  pyobs_gui/compassmovewidget.py,sha256=-RiXcmPrpWwajPFqEujUnfeYD5vOjgfqdRwj51soJpM,3997
9
9
  pyobs_gui/coolingwidget.py,sha256=Ex2FWXhXGQswZkNRWxDGO8_gasz_clR76PV4w9JMHw8,1918
@@ -36,8 +36,8 @@ pyobs_gui/qt/autofocuswidget.ui,sha256=LB4qbaD2mWeVGAJCQ1xID5l8SIOBrY5K9bOVNCe2f
36
36
  pyobs_gui/qt/autofocuswidget_ui.py,sha256=xm4JChpLY8cF01Zx9gSvxtxwu9veFGUEv7mFpIYHPtQ,5848
37
37
  pyobs_gui/qt/autoguidingwidget.ui,sha256=859Qbgm9qvznxmBqjy749HJG4yzkpOCFpbMREmF197s,4494
38
38
  pyobs_gui/qt/autoguidingwidget_ui.py,sha256=aWCl6x1DAZVlcjYNeYTQPmGTddodFEXnxgcPN5TSjTA,5701
39
- pyobs_gui/qt/camerawidget.ui,sha256=ubcv1UCLHvb7Dp7alPXH_lma6qSJtetOazuPzRDSfXY,47431
40
- pyobs_gui/qt/camerawidget_ui.py,sha256=8uTtBuRBocNF76nHPZa4XEaEuMvrq2Zn-qYqOHQqQ9I,30532
39
+ pyobs_gui/qt/camerawidget.ui,sha256=t7PE1Sb0visQ5c7DAF4-2wff-C-q-oIt5ObJBgYoMfo,46530
40
+ pyobs_gui/qt/camerawidget_ui.py,sha256=irJgPaUjSFMx6dpzpnQvMTSr6zxP9UT0BqVaOTOGljU,26658
41
41
  pyobs_gui/qt/compassmoveplugin.py,sha256=Mr5NAPnzNLDgAvQBIm8ysqhhaZaOUf_PJtKzn3eTogM,932
42
42
  pyobs_gui/qt/compassmovewidget.py,sha256=fGNHkNJJGuEw4jF5hp4pYxjyrW607CNzxtOyv_4mtBk,229
43
43
  pyobs_gui/qt/compassmovewidget.ui,sha256=h2pEVaAEIlD8s-lXSfXj_YprpLBr4LkA3Q8juOfJp9c,2553
@@ -91,7 +91,7 @@ pyobs_gui/qt/resources/cloud-sun-solid.svg,sha256=qXGvtPuQYIAHlLc1Cqiy5M6s2-JOPF
91
91
  pyobs_gui/qt/resources/edit-solid.svg,sha256=R2lehJgb5DxyOXMmj5ACJsxOTqi9heXhj6WB9fdLelY,735
92
92
  pyobs_gui/qt/resources/search-solid.svg,sha256=8WR3B4MQyr76HrFvw6f7vQGyCWS7vQXF1WPWCWr3heQ,577
93
93
  pyobs_gui/qt/resources/undo-solid.svg,sha256=6O_Pyjo59fCCynMz5XhWU4wI1egQ3anNpToH9fpmISw,767
94
- pyobs_gui-2.0.0.dev3.dist-info/METADATA,sha256=Nt_MQqUZNi_MdZQ9qPESm2HZUg_CZySYjrN8qVVa5Nk,575
95
- pyobs_gui-2.0.0.dev3.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
96
- pyobs_gui-2.0.0.dev3.dist-info/licenses/LICENSE,sha256=gC8djBliCENDmuRvzCoejpWbsn8eqKx61Hc8bmDZ2LI,1099
97
- pyobs_gui-2.0.0.dev3.dist-info/RECORD,,
94
+ pyobs_gui-2.0.0.dev4.dist-info/METADATA,sha256=PR9S8dsGWqe4U12q5Qr9iF9bCWH9_buQm4bCgIjt_BE,575
95
+ pyobs_gui-2.0.0.dev4.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
96
+ pyobs_gui-2.0.0.dev4.dist-info/licenses/LICENSE,sha256=gC8djBliCENDmuRvzCoejpWbsn8eqKx61Hc8bmDZ2LI,1099
97
+ pyobs_gui-2.0.0.dev4.dist-info/RECORD,,