|
3 | 3 | from eqt.ui import FormDialog |
4 | 4 | from eqt.ui.SessionDialogs import AppSettingsDialog, ErrorDialog |
5 | 5 | from PySide2 import QtCore, QtGui, QtWidgets |
6 | | -from PySide2.QtWidgets import QCheckBox, QDoubleSpinBox, QLabel, QLineEdit, QComboBox |
| 6 | +from PySide2.QtWidgets import QCheckBox, QDoubleSpinBox, QLabel, QLineEdit, QComboBox, QPushButton |
7 | 7 | import numpy as np |
8 | 8 | from ccpi.viewer.utils import Converter |
9 | 9 | from ccpi.viewer.utils.conversion import cilRawCroppedReader |
@@ -260,48 +260,6 @@ def preview(self): |
260 | 260 | reader2.SetTypeCodeName(dt.name) |
261 | 261 | reader2.SetStoredArrayShape(shape) |
262 | 262 | reader2.Update() |
263 | | - # image = reader2.GetOutput() |
264 | | - |
265 | | - # rawfname = os.path.join(tempfile.gettempdir(),"test.raw") |
266 | | - |
267 | | - # offset = offset * bytes_per_element |
268 | | - # slices_to_read = 1 |
269 | | - # if shape[2] > 1: |
270 | | - # slices_to_read = 2 |
271 | | - # with open(self.fname, 'br') as f: |
272 | | - # f.seek(offset) |
273 | | - # raw_data = f.read(slice_size*bytes_per_element* slices_to_read) |
274 | | - # with open(rawfname, 'wb') as f2: |
275 | | - # f2.write(raw_data) |
276 | | - |
277 | | - # reader2 = vtk.vtkImageReader2() |
278 | | - # reader2.SetFileName(rawfname) |
279 | | - |
280 | | - # vtktype = Converter.dtype_name_to_vtkType[dt.name] |
281 | | - # reader2.SetDataScalarType(vtktype) |
282 | | - |
283 | | - # if isBigEndian: |
284 | | - # reader2.SetDataByteOrderToBigEndian() |
285 | | - # else: |
286 | | - # reader2.SetDataByteOrderToLittleEndian() |
287 | | - |
288 | | - # reader2.SetFileDimensionality(len(shape)) |
289 | | - # vtkshape = shape[:] |
290 | | - # if not isFortran: |
291 | | - # # need to reverse the shape (again) |
292 | | - # vtkshape = shape[::-1] |
293 | | - # # vtkshape = shape[:] |
294 | | - # slice_idx = 0 |
295 | | - # if dimensionality == 3: |
296 | | - # slice_idx = vtkshape[2]//2 |
297 | | - # reader2.SetDataExtent(0, vtkshape[0]-1, 0, vtkshape[1]-1, slice_idx, slice_idx+slices_to_read-1) |
298 | | - # # DataSpacing and DataOrigin should be added to the interface |
299 | | - # reader2.SetDataSpacing(1, 1, 1) |
300 | | - # reader2.SetDataOrigin(0, 0, 0) |
301 | | - |
302 | | - # print("reading") |
303 | | - # reader2.Update() |
304 | | - # read one slice in the middle and display it in a viewer in a modal dialog |
305 | 263 |
|
306 | 264 | diag = QtWidgets.QDialog(parent=self) |
307 | 265 | diag.setModal(True) |
@@ -338,6 +296,148 @@ def preview(self): |
338 | 296 | diag.open() |
339 | 297 |
|
340 | 298 |
|
| 299 | +class SaveableRawInputDialog(RawInputDialog): |
| 300 | + ''' |
| 301 | + This is a dialog window which allows the user to set information |
| 302 | + for a raw file, including: |
| 303 | + - dimensionality |
| 304 | + - size of dimensions |
| 305 | + - data type |
| 306 | + - endianness |
| 307 | + - fortran ordering |
| 308 | +
|
| 309 | + The dialog can let the user preview the data and verify that it is correct. |
| 310 | +
|
| 311 | + The dialog allows you to save load settings under a memorable name. |
| 312 | + You can reload settings you have saved previously, by selecting their associated name from a dropdown. |
| 313 | + ''' |
| 314 | + |
| 315 | + def __init__(self, parent, fname, qsettings=None): |
| 316 | + super(SaveableRawInputDialog, self).__init__(parent, fname) |
| 317 | + |
| 318 | + if qsettings is None: |
| 319 | + qsettings = QtCore.QSettings("CCPi", "CILViewer Raw Dialog") |
| 320 | + self.settings = qsettings |
| 321 | + |
| 322 | + self.formWidget.addSpanningWidget(QCheckBox("Edit Parameters"), 'enable_edit') |
| 323 | + self.getWidget('enable_edit').setChecked(True) |
| 324 | + self.getWidget('enable_edit').stateChanged.connect(self._change_edit_state) |
| 325 | + |
| 326 | + self.formWidget.addTitle(QLabel('Load Settings'), 'load_settings_title') |
| 327 | + load_label = QLabel('Settings Name: ') |
| 328 | + load_drop_down = QComboBox() |
| 329 | + self.formWidget.addWidget(load_drop_down, load_label, 'load_name') |
| 330 | + self._update_load_combobox() |
| 331 | + |
| 332 | + load_button = QPushButton('Load Settings') |
| 333 | + load_button.clicked.connect(self._load_settings) |
| 334 | + self.formWidget.addSpanningWidget(load_button, 'load') |
| 335 | + |
| 336 | + self.buttonBox.addButton(QtWidgets.QDialogButtonBox.Save) |
| 337 | + self.buttonBox.button(QtWidgets.QDialogButtonBox.Save).clicked.connect(self._open_save_dialog) |
| 338 | + |
| 339 | + def _update_load_combobox(self): |
| 340 | + load_drop_down = self.getWidget('load_name') |
| 341 | + load_drop_down.clear() |
| 342 | + load_drop_down.addItems(self._get_settings_names_for_dialog()) |
| 343 | + |
| 344 | + def _change_edit_state(self, editable=True): |
| 345 | + '''Changes the edit state of the form''' |
| 346 | + |
| 347 | + widgets = self.getWidgets() |
| 348 | + for widget in widgets.values(): |
| 349 | + widget.setEnabled(editable) |
| 350 | + |
| 351 | + if not editable: |
| 352 | + widgets_to_preserve = [ |
| 353 | + 'load_name', 'load', 'enable_edit', 'load_name', 'load_settings_title', 'preview_slice', |
| 354 | + 'preview_button' |
| 355 | + ] |
| 356 | + for widget in widgets_to_preserve: |
| 357 | + self.getWidget(widget, 'field').setEnabled(True) |
| 358 | + try: |
| 359 | + self.getWidget(widget, 'label').setEnabled(True) |
| 360 | + except: |
| 361 | + pass |
| 362 | + |
| 363 | + def _open_save_dialog(self): |
| 364 | + '''Opens dialog for specifiying name to save settings under''' |
| 365 | + dialog = FormDialog(self) |
| 366 | + dialog.formWidget.addTitle(QLabel('Save Settings'), 'save_settings_title') |
| 367 | + save_label = QLabel('Settings Name: ') |
| 368 | + save_box = QLineEdit() |
| 369 | + dialog.formWidget.addWidget(save_box, save_label, 'save_name') |
| 370 | + dialog.Cancel.clicked.connect(dialog.close) |
| 371 | + dialog.Ok.clicked.connect(self._save_settings) |
| 372 | + dialog.Ok.clicked.connect(dialog.close) |
| 373 | + dialog.open() |
| 374 | + self.save_dialog = dialog |
| 375 | + |
| 376 | + def _get_settings_save_name(self): |
| 377 | + return self.save_dialog.getWidget('save_name').text() |
| 378 | + |
| 379 | + def _save_settings(self): |
| 380 | + ''' |
| 381 | + Adds a dictionary to the qsettings 'raw_dialog' |
| 382 | + dictionary : |
| 383 | + key: name entered by the user |
| 384 | + value: the status of all widgets on the form |
| 385 | + ''' |
| 386 | + settings_dict = self.settings.value('raw_dialog', {}) |
| 387 | + |
| 388 | + settings_name = self._get_settings_save_name() |
| 389 | + |
| 390 | + self.saveAllWidgetStates() |
| 391 | + current_widget_status = self.getSavedWidgetStates() |
| 392 | + |
| 393 | + settings_dict[settings_name] = current_widget_status |
| 394 | + |
| 395 | + self.settings.setValue('raw_dialog', settings_dict) |
| 396 | + |
| 397 | + self._update_load_combobox() |
| 398 | + |
| 399 | + def _get_settings_names_for_dialog(self): |
| 400 | + ''' |
| 401 | + Retrive from self.settings the names of all settings previously saved in the |
| 402 | + 'raw_dialog' entry |
| 403 | + ''' |
| 404 | + settings_dict = self.settings.value('raw_dialog', {}) |
| 405 | + return settings_dict.keys() |
| 406 | + |
| 407 | + def _get_name_of_state_to_load(self): |
| 408 | + return self.formWidget.getWidget('load_name').currentText() |
| 409 | + |
| 410 | + def _load_settings(self): |
| 411 | + ''' |
| 412 | + Load all of the widget states saved in the 'raw_dialog' entry of |
| 413 | + self.settings under the name selected by the user from the load_name combobox |
| 414 | +
|
| 415 | + Disable editing of parameters. |
| 416 | + ''' |
| 417 | + settings_found = False |
| 418 | + if self.settings.value('raw_dialog'): |
| 419 | + settings_dict = self.settings.value('raw_dialog', {}) |
| 420 | + |
| 421 | + name_of_state = self._get_name_of_state_to_load() |
| 422 | + state = settings_dict.get(name_of_state) |
| 423 | + |
| 424 | + if state is not None: |
| 425 | + |
| 426 | + # save current stae |
| 427 | + |
| 428 | + self.applyWidgetStates(state) |
| 429 | + self.getWidget('enable_edit').setChecked(False) |
| 430 | + |
| 431 | + # load current state of dropdown |
| 432 | + settings_found = True |
| 433 | + |
| 434 | + self.getWidget('load_name').setCurrentText(name_of_state) |
| 435 | + |
| 436 | + if not settings_found: |
| 437 | + # create error dialog: |
| 438 | + print("Settings not found") |
| 439 | + |
| 440 | + |
341 | 441 | class HDF5InputDialog(FormDialog): |
342 | 442 | ''' |
343 | 443 | This is a dialog window which allows the user to set: |
|
0 commit comments