def on_actionCombine_triggered(self): current = self.currentPlot.dataset.uid dlg = dialogFromUi(self, 'panels/dataops.ui') for i in range(self.datasetList.count()): item = self.datasetList.item(i) newitem = QListWidgetItem(item.text(), dlg.otherList) newitem.setData(32, item.data(32)) if itemuid(item) == current: dlg.otherList.setCurrentItem(newitem) # paint the current set in grey to indicate it's not allowed # to be selected newitem.setBackground(self.palette().brush(QPalette.Mid)) newitem.setFlags(Qt.NoItemFlags) if dlg.exec_() != QDialog.Accepted: return items = dlg.otherList.selectedItems() sets = [self.data.uid2set[current]] for item in items: if itemuid(item) == current: return self.showError('Cannot combine set with itself.') sets.append(self.data.uid2set[itemuid(item)]) for rop, rb in [(TOGETHER, dlg.opTogether), (COMBINE, dlg.opCombine), (ADD, dlg.opAdd), (SUBTRACT, dlg.opSubtract), (DIVIDE, dlg.opDivide)]: if rb.isChecked(): op = rop break self._combine(op, sets)
def editParam(self, pname): if not self.paraminfo[pname]['settable'] or self.client.viewonly: return mainunit = self.paramvalues.get('unit', 'main') punit = (self.paraminfo[pname]['unit'] or '').replace('main', mainunit) dlg = dialogFromUi(self, 'panels/devices_param.ui') dlg.target = DeviceParamEdit(self, dev=self.devname, param=pname) dlg.target.setClient(self.client) dlg.paramName.setText('Parameter: %s.%s' % (self.devname, pname)) dlg.paramDesc.setText(self.paraminfo[pname]['description']) dlg.paramValue.setText(str(self.paramvalues[pname]) + ' ' + punit) dlg.targetLayout.addWidget(dlg.target) dlg.resize(dlg.sizeHint()) dlg.target.setFocus() if dlg.exec_() != QDialog.Accepted: return try: new_value = dlg.target.getValue() except ValueError: self.log.exception('invalid value for typed value') # shouldn't happen, but if it does, at least give an indication that # something went wrong QMessageBox.warning( self, 'Error', 'The entered value is invalid ' 'for this parameter.') return if self.devrepr == self.devname: self.device_panel.exec_command('%s.%s = %r' % (self.devname, pname, new_value)) else: self.device_panel.exec_command( 'set(%s, %s, %r)' % (self.devrepr, srepr(pname), new_value))
def execScript(self, script): action = 'queue' if self.current_status != 'idle': qwindow = dialogFromUi(self, 'panels/question.ui') qwindow.questionText.setText('A script is currently running. What' ' do you want to do?') icon = qwindow.style().standardIcon qwindow.iconLabel.setPixmap( icon(QStyle.SP_MessageBoxQuestion).pixmap(32, 32)) b0 = QPushButton(icon(QStyle.SP_DialogCancelButton), 'Cancel') b1 = QPushButton(icon(QStyle.SP_DialogOkButton), 'Queue script') b2 = QPushButton(icon(QStyle.SP_MessageBoxWarning), 'Execute now!') qwindow.buttonBox.addButton(b0, QDialogButtonBox.ApplyRole) qwindow.buttonBox.addButton(b1, QDialogButtonBox.ApplyRole) qwindow.buttonBox.addButton(b2, QDialogButtonBox.ApplyRole) qwindow.buttonBox.setFocus() result = [0] def pushed(btn): if btn is b1: result[0] = 1 elif btn is b2: result[0] = 2 qwindow.accept() qwindow.buttonBox.clicked.connect(pushed) qwindow.exec_() if result[0] == 0: return elif result[0] == 2: action = 'execute' if action == 'queue': self.client.run(script) else: self.client.tell('exec', script)
def on_actionSetLimits_triggered(self): dlg = dialogFromUi(self, 'panels/devices_limits.ui') dlg.descLabel.setText('Adjust user limits of %s:' % self.devname) dlg.limitMin.setText(self.limitMin.text()) dlg.limitMax.setText(self.limitMax.text()) abslimits = self.client.getDeviceParam(self.devname, 'abslimits') offset = self.client.getDeviceParam(self.devname, 'offset') if offset is not None: abslimits = abslimits[0] - offset, abslimits[1] - offset dlg.limitMinAbs.setText(str(abslimits[0])) dlg.limitMaxAbs.setText(str(abslimits[1])) target = DeviceParamEdit(dlg, dev=self.devname, param='userlimits') target.setClient(self.client) btn = dlg.buttonBox.addButton('Reset to maximum range', QDialogButtonBox.ResetRole) def callback(): self.device_panel.exec_command('resetlimits(%s)' % self.devrepr) dlg.reject() btn.clicked.connect(callback) dlg.targetLayout.addWidget(target) res = dlg.exec_() if res != QDialog.Accepted: return newlimits = target.getValue() if newlimits[0] < abslimits[0] or newlimits[1] > abslimits[1]: QMessageBox.warning( self, 'Error', 'The entered limits are not ' 'within the absolute limits for the device.') # retry self.on_actionSetLimits_triggered() return self.device_panel.exec_command('set(%s, "userlimits", %s)' % (self.devrepr, newlimits))
def on_addDevBtn_clicked(self): devlist = self.client.getDeviceList( 'nicos.core.device.Moveable', special_clause='d.valuetype is float') devlist = [ item for item in devlist if item.startswith(('sam_', 'hexapod_')) or '_sam_' in item ] dlg = dialogFromUi( self, findResource('nicos_mlz/kws1/gui/sampleconf_adddev.ui')) dlg.widget = None def callback(index): devname = devlist[index] if dlg.widget: dlg.widget.deleteLater() dlg.valueFrame.layout().takeAt(0) dlg.widget = typedvalue.DeviceValueEdit(dlg, dev=devname) dlg.widget.setClient(self.client) dlg.valueFrame.layout().insertWidget(0, dlg.widget) dlg.devBox.currentIndexChanged.connect(callback) dlg.devBox.addItems(devlist) if not dlg.exec_(): return self._addRow(dlg.devBox.currentText(), str(dlg.widget.getValue()))
def modifyData(self): visible_curves = self.visibleCurves() # get input from the user: which curves should be modified how dlg = dialogFromUi(self, 'panels/modify.ui') def checkAll(): for i in range(dlg.list.count()): dlg.list.item(i).setCheckState(Qt.Checked) dlg.selectall.clicked.connect(checkAll) for i, descr in visible_curves: li = QListWidgetItem(descr, dlg.list) if len(visible_curves) == 1: li.setCheckState(Qt.Checked) dlg.operation.setFocus() else: li.setCheckState(Qt.Unchecked) if dlg.exec_() != QDialog.Accepted: return # evaluate selection op = dlg.operation.text() curves = [] for i in range(dlg.list.count()): li = dlg.list.item(i) if li.checkState() == Qt.Checked: curves.append(i) # modify curve data for i in curves: curve = self.plotcurves[visible_curves[i][0]] self._modifyCurve(curve, op) self.update()
def on_addDevBtn_clicked(self): dev_list = self.client.getDeviceList('nicos.core.device.Moveable', only_explicit=False) # Only get the sample changer related motors dev_list = [ item for item in dev_list if item.startswith('sc_') and 'motor' in item ] dlg = dialogFromUi( self, findResource('nicos_ess/loki/gui/ui_files/sampleconf_adddev.ui')) dlg.widget = None def callback(index): dev_name = dev_list[index] if dlg.widget: dlg.widget.deleteLater() dlg.valueFrame.layout().takeAt(0) dlg.widget = typedvalue.DeviceValueEdit(dlg, dev=dev_name) dlg.widget.setClient(self.client) dlg.valueFrame.layout().insertWidget(0, dlg.widget) dlg.devBox.currentIndexChanged.connect(callback) dlg.devBox.addItems(dev_list) if not dlg.exec_(): return if dlg.widget is not None: self._addRow(dlg.devBox.currentText(), str(dlg.widget.getValue()))
def on_readDevsBtn_clicked(self): dlg = dialogFromUi(self, findResource( 'nicos_mlz/kws1/gui/sampleconf_readpos.ui')) if self.instrument == 'kws1': dlg.kws3Box.hide() elif self.instrument == 'kws2': dlg.kws3Box.hide() dlg.hexaBox.hide() elif self.instrument == 'kws3': dlg.rotBox.hide() dlg.transBox.hide() dlg.hexaBox.hide() dlg.kws3Box.setChecked(True) if not dlg.exec_(): return if dlg.rotBox.isChecked(): self._addRow('sam_rot', self._readDev('sam_rot')) if dlg.transBox.isChecked(): self._addRow('sam_trans_x', self._readDev('sam_trans_x')) self._addRow('sam_trans_y', self._readDev('sam_trans_y')) if dlg.hexaBox.isChecked(): for axis in ('dt', 'tx', 'ty', 'tz', 'rx', 'ry', 'rz'): self._addRow('hexapod_' + axis, self._readDev('hexapod_' + axis)) if dlg.kws3Box.isChecked(): self._addRow('sam_x', self._readDev('sam_x')) self._addRow('sam_y', self._readDev('sam_y'))
def chooseProposal(self, proposals): dlg = dialogFromUi(self, 'panels/setup_exp_proposal.ui') dlg.list.setItemDelegate(ProposalDelegate(dlg)) for prop in proposals: item = QListWidgetItem('', dlg.list) item.setData(Qt.UserRole, prop) if not dlg.exec_(): return sel = dlg.list.currentRow() return proposals[sel]
def choose_proposal(self, proposals): dlg = dialogFromUi(self, 'panels/setup_exp_proposal.ui') dlg.list.setItemDelegate(ProposalDelegate(dlg)) for prop in proposals: prop_copy = deepcopy(prop) prop_copy['users'] = [{'name': combineUsers(prop['users'])}] item = QListWidgetItem('', dlg.list) item.setData(Qt.UserRole, prop_copy) if not dlg.exec_(): return sel = dlg.list.currentRow() return proposals[sel]
def on_actionAddComment_triggered(self): dlg = dialogFromUi(self, 'panels/elog_comment.ui') dlg.helpFrame.setVisible(False) dlg.mdLabel.linkActivated.connect( lambda link: dlg.helpFrame.setVisible(True)) if dlg.exec_() != QDialog.Accepted: return text = dlg.freeFormText.toPlainText() if not text: return self.client.eval('LogEntry(%r)' % text) self.timer.start(750)
def _get_new_value(self, window_title, desc): dlg = dialogFromUi(self, 'panels/devices_newpos.ui') dlg.setWindowTitle(window_title) dlg.descLabel.setText(desc) dlg.oldValue.setText(self.valuelabel.text()) target = DeviceValueEdit(dlg, dev=self.devname) target.setClient(self.client) dlg.targetLayout.addWidget(target) target.setFocus() res = dlg.exec_() if res != QDialog.Accepted: return None return target.getValue()
def on_remarkBtn_clicked(self): dlg = dialogFromUi(self, 'panels/expinfo_remark.ui') def callback(): self.showInfo('The remark will be added to the logbook as a ' 'heading and will also appear in the data files.') dlg.buttonBox.helpRequested.connect(callback) for ch in dlg.findChildren(NicosWidget): ch.setClient(self.client) dlg.remarkEdit.setFocus() if not dlg.exec_(): return self.client.run('Remark(%r)' % dlg.remarkEdit.getValue())
def on_settingAdd_clicked(self): dlg = dialogFromUi(self, 'dialogs/settings_conn.ui') if dlg.exec_() != QDialog.Accepted: return if not dlg.name.text(): return name = dlg.name.text() while name in self.connpresets: name += '_' cdata = ConnectionData(dlg.host.text(), dlg.port.value(), dlg.login.text(), None, dlg.viewonly.isChecked()) self.connpresets[name] = cdata QListWidgetItem(name + ' (%s:%s)' % (cdata.host, cdata.port), self.settinglist).setData(32, name)
def on_actionAttachElog_triggered(self): newdlg = dialogFromUi(self, 'panels/plot_attach.ui') suffix = self.currentPlot.SAVE_EXT newdlg.filename.setText( safeName('data_%s' % self.currentPlot.dataset.name + suffix)) ret = newdlg.exec_() if ret != QDialog.Accepted: return descr = newdlg.description.text() fname = newdlg.filename.text() pathname = self.currentPlot.saveQuietly() with open(pathname, 'rb') as fp: remotefn = self.client.ask('transfer', fp.read()) if remotefn is not None: self.client.eval('_LogAttach(%r, [%r], [%r])' % (descr, remotefn, fname)) os.unlink(pathname)
def on_settingEdit_clicked(self): item = self.settinglist.currentItem() if item is None: return cdata = self.connpresets[item.data(32)] dlg = dialogFromUi(self, 'dialogs/settings_conn.ui') dlg.name.setText(item.data(32)) dlg.name.setEnabled(False) dlg.host.setText(cdata.host) dlg.port.setValue(cdata.port) dlg.login.setText(cdata.user) dlg.viewonly.setChecked(cdata.viewonly) if dlg.exec_() != QDialog.Accepted: return cdata.host = dlg.host.text() cdata.port = dlg.port.value() cdata.user = dlg.login.text() cdata.viewonly = dlg.viewonly.isChecked() item.setText('%s (%s:%s)' % (dlg.name.text(), cdata.host, cdata.port))
def on_actionAbout_triggered(self): import nicos.authors if self.client.isconnected: dinfo = self.client.daemon_info.copy() dinfo['server_host'] = self.client.host else: dinfo = {} dlg = dialogFromUi(self, 'dialogs/about.ui') dlg.clientVersion.setText(nicos_version) dlg.pyVersion.setText( '%s/%s/%s' % (sys.version.split()[0], QT_VERSION_STR, PYQT_VERSION_STR)) dlg.serverHost.setText(dinfo.get('server_host', 'not connected')) dlg.nicosRoot.setText(dinfo.get('nicos_root', '')) dlg.serverVersion.setText(dinfo.get('daemon_version', '')) dlg.customPath.setText(dinfo.get('custom_path', '')) dlg.customVersion.setText(dinfo.get('custom_version', '')) dlg.contributors.setPlainText(nicos.authors.authors_list) dlg.adjustSize() dlg.exec_()
def selectCurve(self): """Let the user select a visible plot curve. If there is only one curve, return it directly. """ visible_curves = self.visibleDataCurves() if not visible_curves: return if len(visible_curves) > 1: dlg = dialogFromUi(self, 'panels/selector.ui') dlg.setWindowTitle('Select curve to fit') dlg.label.setText('Select a curve:') for _, descr in visible_curves: QListWidgetItem(descr, dlg.list) dlg.list.setCurrentRow(0) if dlg.exec_() != QDialog.Accepted: return fitcurve = visible_curves[dlg.list.currentRow()][0] else: fitcurve = visible_curves[0][0] return self.plotcurves[fitcurve]
def on_actionAttachFile_triggered(self): dlg = dialogFromUi(self, 'panels/elog_attach.ui') def on_fileSelect_clicked(): self.selectInputFile(dlg.fileName, 'Choose a file to attach') dlg.fileRename.setFocus() dlg.fileSelect.clicked.connect(on_fileSelect_clicked) if dlg.exec_() != QDialog.Accepted: return fname = dlg.fileName.text() if not path.isfile(fname): return self.showError('The given file name is not a valid file.') newname = dlg.fileRename.text() if not newname: newname = path.basename(fname) desc = dlg.fileDesc.text() filecontent = open(fname, 'rb').read() remotefn = self.client.ask('transfer', filecontent) if remotefn is not None: self.client.eval('_LogAttach(%r, [%r], [%r])' % (desc, remotefn, newname)) self.timer.start(750)
def on_actionGenerate_triggered(self): def read_axes(): ax1, ax2 = dlg._info[2], dlg._info[4] for (ax, box) in [(ax1, dlg.ax1Box), (ax2, dlg.ax2Box)]: if not ax: continue x = self.client.eval('%s.read()' % ax, None) if x is None: QMessageBox.warning(dlg, 'Error', 'Could not read %s.' % ax) return box.setText('%.1f' % x) def btn_toggled(checked): if checked: dlg._info = dlg.sender()._info ax1, ax2 = dlg._info[2], dlg._info[4] for ax, lbl, box, revbox in [ (ax1, dlg.ax1Lbl, dlg.ax1Box, dlg.ax1RevBox), (ax2, dlg.ax2Lbl, dlg.ax2Box, None) ]: if ax: lbl.setText(ax) lbl.show() box.show() if revbox: revbox.show() revbox.setText('%s starts at far end' % ax) else: lbl.hide() box.hide() if revbox: revbox.hide() dlg = dialogFromUi(self, findResource( 'nicos_mlz/kws1/gui/sampleconf_gen.ui')) dlg.ax1Box.setValidator(DoubleValidator(self)) dlg.ax2Box.setValidator(DoubleValidator(self)) dlg.readBtn.clicked.connect(read_axes) nrows = int(math.ceil(len(self.holder_info) / 2.0)) row, col = 0, 0 for name, info in self.holder_info: btn = QRadioButton(name, dlg) btn._info = info btn.toggled.connect(btn_toggled) dlg.optionFrame.layout().addWidget(btn, row, col) if (row, col) == (0, 0): btn.setChecked(True) row += 1 if row == nrows: row = 0 col += 1 if not dlg.exec_(): return rows, levels, ax1, dax1, ax2, dax2 = dlg._info sax1 = float(dlg.ax1Box.text()) if ax1 else 0 sax2 = float(dlg.ax2Box.text()) if ax2 else 0 if dlg.ax1RevBox.isChecked(): dax1 = -dax1 n = 0 for i in range(levels): for j in range(rows): n += 1 position = {} if ax1: position[ax1] = round(sax1 + j * dax1, 1) if ax2: position[ax2] = round(sax2 + i * dax2, 1) config = dict( name = str(n), comment = '', detoffset = -335.0, thickness = 1.0, timefactor = 1.0, aperture = (0, 0, 10, 10), position = position, ) self.configs.append(config) firstitem = None for config in self.configs: newitem = QListWidgetItem(config['name'], self.list) firstitem = firstitem or newitem # select the first item self.list.setCurrentItem(firstitem) self.on_list_itemClicked(firstitem) self.fileGroup.setEnabled(False) self.sampleGroup.setEnabled(True) self.dirty = True
def on_actionGenerate_triggered(self): def read_axes(): ax1, ax2 = dlg._info[2], dlg._info[4] for (ax, box) in [(ax1, dlg.ax1Box), (ax2, dlg.ax2Box)]: if not ax: continue x = self.client.eval('%s.read()' % ax, None) if x is None: QMessageBox.warning(dlg, 'Error', f'Could not read {ax}.') return box.setText(f'x:.1f') def btn_toggled(checked): if checked: dlg._info = dlg.sender()._info ax1, ax2 = dlg._info[2], dlg._info[4] for ax, lbl, box, revbox in [ (ax1, dlg.ax1Lbl, dlg.ax1Box, dlg.ax1RevBox), (ax2, dlg.ax2Lbl, dlg.ax2Box, None) ]: if ax: lbl.setText(ax) lbl.show() box.show() if revbox: revbox.show() revbox.setText(f'{ax} starts at far end') else: lbl.hide() box.hide() if revbox: revbox.hide() if not self.holder_info: self.showError('Cannot auto-generate sample list as no sample ' 'changers are defined') return dlg = dialogFromUi( self, findResource('nicos_ess/loki/gui/ui_files/sampleconf_gen.ui')) dlg.ax1Box.setValidator(DoubleValidator(self)) dlg.ax2Box.setValidator(DoubleValidator(self)) dlg.readBtn.clicked.connect(read_axes) n_rows = int(math.ceil(len(self.holder_info) / 2.0)) row, col = 0, 0 for name, info in self.holder_info: btn = QRadioButton(name, dlg) btn._info = info btn.toggled.connect(btn_toggled) dlg.optionFrame.layout().addWidget(btn, row, col) if (row, col) == (0, 0): btn.setChecked(True) row += 1 if row == n_rows: row = 0 col += 1 if dlg.exec_() != QDialog.Accepted: return self._generate_configs(dlg) first_item = None for config in self.configs: new_item = QListWidgetItem(config['name'], self.list) first_item = first_item or new_item # select the first item self.list.setCurrentItem(first_item) self.on_list_itemClicked(first_item) self.sampleGroup.setEnabled(True) self.applyBtn.setEnabled(True)