class ProfileCreation(QDialog): ''' classdocs ''' profileCreated = Signal(Athlete) def __init__(self): ''' Constructor ''' QDialog.__init__(self) self._initGUI() self.athleteProfile = False def _initGUI(self): self.setWindowTitle("Profile Creation") self.profileWidget = ProfileFormWidget() self.buttonBox = QDialogButtonBox(QDialogButtonBox.Cancel) self.okBtn = QPushButton("Ok") self.okBtn.setDefault(True) self.okBtn.clicked.connect(self._createProfile) self.buttonBox.addButton(self.okBtn, QDialogButtonBox.AcceptRole) vLayout = QVBoxLayout() vLayout.addWidget(QLabel("<h3>Create a new profile!</h3><hr>")) vLayout.addWidget(self.profileWidget) vLayout.addWidget(self.buttonBox) self.setLayout(vLayout) def _createProfile(self): athleteProfile = self.profileWidget.getProfile() self.profileCreated.emit(athleteProfile)
def qmy_button(parent, todo, display_text, the_row=None, the_col=None): new_but = QPushButton(display_text) new_but.setContentsMargins(1, 1, 1, 1) new_but.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) new_but.setFont(QFont('SansSerif', 12)) new_but.setAutoDefault(False) new_but.setDefault(False) if the_row is not None: parent.addWidget(new_but, the_row, the_col) else: parent.addWidget(new_but) new_but.clicked.connect(todo) return new_but
class TextDialog(QDialog): NAME = "TextDialog" TEXT_DIALOG_OK = "TEXT_DIALOG_OK" TEXT_DIALOG_CANCEL = "TEXT_DIALOG_CANCEL" def __init__(self, *args, **kwargs): super(TextDialog, self).__init__(*args, **kwargs) self.edit_line = QLineEdit() self.ok_btn = QPushButton("&Ok") # noinspection PyUnresolvedReferences self.ok_btn.clicked.connect(self.accept) self.ok_btn.setDefault(True) self.cancel_btn = QPushButton("&Cancel") # noinspection PyUnresolvedReferences self.cancel_btn.clicked.connect(self.reject) self.h_layout = QHBoxLayout() self.v_layout = QVBoxLayout() self.h_layout.addStretch(0) self.h_layout.addWidget(self.ok_btn) self.h_layout.addWidget(self.cancel_btn) self.v_layout.addWidget(self.edit_line) self.v_layout.addLayout(self.h_layout) self.setLayout(self.v_layout) # noinspection PyUnresolvedReferences self.accepted.connect(self.on_accept) # noinspection PyUnresolvedReferences self.rejected.connect(self.on_reject) def on_accept(self): Facade.getInstance().sendNotification( TextDialog.TEXT_DIALOG_OK, {"text": self.edit_line.text()}, ) def on_reject(self): Facade.getInstance().sendNotification( TextDialog.TEXT_DIALOG_CANCEL, )
class ComboDialog(QDialog): COMBO_DIALOG_OK = "COMBO_DIALOG_OK" COMBO_DIALOG_CANCEL = "COMBO_DIALOG_CANCEL" def __init__(self, *args, **kwargs): super(ComboDialog, self).__init__(*args, **kwargs) self.combo_box = QComboBox() self.ok_btn = QPushButton("&Ok") # noinspection PyUnresolvedReferences self.ok_btn.clicked.connect(self.accept) self.ok_btn.setDefault(True) self.cancel_btn = QPushButton("&Cancel") # noinspection PyUnresolvedReferences self.cancel_btn.clicked.connect(self.reject) self.h_layout = QHBoxLayout() self.v_layout = QVBoxLayout() self.h_layout.addStretch(0) self.h_layout.addWidget(self.ok_btn) self.h_layout.addWidget(self.cancel_btn) self.v_layout.addWidget(self.combo_box) self.v_layout.addLayout(self.h_layout) self.setLayout(self.v_layout) # noinspection PyUnresolvedReferences self.accepted.connect(self.on_accept) # noinspection PyUnresolvedReferences self.rejected.connect(self.on_reject) def on_accept(self): Facade.getInstance().sendNotification( ComboDialog.COMBO_DIALOG_OK, ) def on_reject(self): Facade.getInstance().sendNotification( ComboDialog.COMBO_DIALOG_CANCEL, )
class TextDialog(QDialog): NAME = "TextDialog" TEXT_DIALOG_OK = "TEXT_DIALOG_OK" TEXT_DIALOG_CANCEL = "TEXT_DIALOG_CANCEL" def __init__(self, *args, **kwargs): super(TextDialog, self).__init__(*args, **kwargs) self.edit_line = QLineEdit() self.ok_btn = QPushButton("&Ok") # noinspection PyUnresolvedReferences self.ok_btn.clicked.connect(self.accept) self.ok_btn.setDefault(True) self.cancel_btn = QPushButton("&Cancel") # noinspection PyUnresolvedReferences self.cancel_btn.clicked.connect(self.reject) self.h_layout = QHBoxLayout() self.v_layout = QVBoxLayout() self.h_layout.addStretch(0) self.h_layout.addWidget(self.ok_btn) self.h_layout.addWidget(self.cancel_btn) self.v_layout.addWidget(self.edit_line) self.v_layout.addLayout(self.h_layout) self.setLayout(self.v_layout) # noinspection PyUnresolvedReferences self.accepted.connect(self.on_accept) # noinspection PyUnresolvedReferences self.rejected.connect(self.on_reject) def on_accept(self): Facade.getInstance().sendNotification( TextDialog.TEXT_DIALOG_OK, {"text": self.edit_line.text()}, ) def on_reject(self): Facade.getInstance().sendNotification(TextDialog.TEXT_DIALOG_CANCEL, )
class ComboDialog(QDialog): COMBO_DIALOG_OK = "COMBO_DIALOG_OK" COMBO_DIALOG_CANCEL = "COMBO_DIALOG_CANCEL" def __init__(self, *args, **kwargs): super(ComboDialog, self).__init__(*args, **kwargs) self.combo_box = QComboBox() self.ok_btn = QPushButton("&Ok") # noinspection PyUnresolvedReferences self.ok_btn.clicked.connect(self.accept) self.ok_btn.setDefault(True) self.cancel_btn = QPushButton("&Cancel") # noinspection PyUnresolvedReferences self.cancel_btn.clicked.connect(self.reject) self.h_layout = QHBoxLayout() self.v_layout = QVBoxLayout() self.h_layout.addStretch(0) self.h_layout.addWidget(self.ok_btn) self.h_layout.addWidget(self.cancel_btn) self.v_layout.addWidget(self.combo_box) self.v_layout.addLayout(self.h_layout) self.setLayout(self.v_layout) # noinspection PyUnresolvedReferences self.accepted.connect(self.on_accept) # noinspection PyUnresolvedReferences self.rejected.connect(self.on_reject) def on_accept(self): Facade.getInstance().sendNotification(ComboDialog.COMBO_DIALOG_OK, ) def on_reject(self): Facade.getInstance().sendNotification( ComboDialog.COMBO_DIALOG_CANCEL, )
def __init__(self, display_text, todo, arg_dict, help_instance = None, max_field_size = None): super(qButtonWithArgumentsClass, self).__init__() self.todo = todo self.setContentsMargins(1, 1, 1, 1) newframe = QHBoxLayout() self.setLayout(newframe) newframe.setSpacing(1) newframe.setContentsMargins(1, 1, 1, 1) new_but = QPushButton(display_text) new_but.setContentsMargins(1, 1, 1, 1) new_but.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) new_but.setFont(regular_font) new_but.setAutoDefault(False) new_but.setDefault(False) newframe.addWidget(new_but) new_but.clicked.connect(self.doit) self.arg_hotfields = [] for k in sorted(arg_dict.keys()): if isinstance(arg_dict[k], list): the_list = arg_dict[k] if len(the_list) == 0: qe = qHotField(k, str, "", the_list, pos = "top", max_size = max_field_size) else: qe = qHotField(k, type(arg_dict[k][0]), arg_dict[k][0], the_list, pos = "top", max_size = max_field_size) else: qe = qHotField(k, type(arg_dict[k]), arg_dict[k], pos = "top", max_size = max_field_size) newframe.addWidget(qe) newframe.setAlignment(qe, QtCore.Qt.AlignLeft) self.arg_hotfields.append(qe) newframe.addStretch() if hasattr(todo, "help_text"): if (help_instance == None): print "No help instance specified." else: help_button_widget = help_instance.create_button(display_text, todo.help_text) newframe.addWidget(help_button_widget) QtGui.QToolTip.setFont(regular_font) self.setToolTip(todo.help_text)
def __init__(self, display_text, todo, arg_dict, help_instance = None): super(qOldButtonWithArgumentsClass, self).__init__() self.todo = todo self.arg_dict = arg_dict # self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.setContentsMargins(1, 1, 1, 1) newframe = QHBoxLayout() self.setLayout(newframe) newframe.setSpacing(1) newframe.setContentsMargins(1, 1, 1, 1) new_but = QPushButton(display_text) new_but.setContentsMargins(1, 1, 1, 1) new_but.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) new_but.setFont(QFont('SansSerif', 12)) new_but.setAutoDefault(False) new_but.setDefault(False) newframe.addWidget(new_but) new_but.clicked.connect(self.doit) for k in sorted(arg_dict.keys()): if isinstance(self.arg_dict[k], list): the_list = self.arg_dict[k] self.arg_dict[k] = "" qe = qLabeledPopup(k, self.arg_dict, the_list, "top") elif isinstance(self.arg_dict[k], bool): qe = qLabeledCheck(k, self.arg_dict, "top") else: qe = qLabeledEntry(k, self.arg_dict, "top") newframe.addWidget(qe) newframe.addStretch() if hasattr(todo, "help_text"): if (help_instance == None): print "No help instance specified." else: help_button_widget = help_instance.create_button(display_text, todo.help_text) newframe.addWidget(help_button_widget)
class AddPresetDialog(QDialog): def __init__(self, parent=None): super(AddPresetDialog, self).__init__(parent) self.setWindowTitle(self.tr("Add IMAP Server Preset")) self.resize(388, 125) self.buttonBox = QDialogButtonBox(self) self.buttonBox.setGeometry(QRect(184, 80, 181, 32)) self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setCenterButtons(False) self.save_btn = QPushButton("&Save") self.save_btn.setDefault(True) self.save_btn.setEnabled(False) self.cancel_btn = QPushButton(self.tr("&Cancel")) self.cancel_btn.setCheckable(True) self.cancel_btn.setAutoDefault(False) self.buttonBox.addButton(self.save_btn, QDialogButtonBox.AcceptRole) self.buttonBox.addButton(self.cancel_btn, QDialogButtonBox.RejectRole) self.preset_name_le = QLineEdit(self) self.preset_name_le.setGeometry(QRect(134, 12, 231, 20)) self.lb_name = QLabel(self) self.lb_name.setGeometry(QRect(14, 16, 58, 14)) self.lb_name.setText(self.tr("Name")) self.server_address_le = QLineEdit(self) self.server_address_le.setGeometry(QRect(134, 45, 231, 20)) self.lb_server = QLabel(self) self.lb_server.setGeometry(QRect(14, 48, 81, 16)) self.lb_server.setText(self.tr("IMAP Server")) self.lb_info = QLabel(self) self.lb_info.setGeometry(QRect(14, 90, 161, 16)) self.lb_info.setText(self.tr("(SSL is always on.)")) self.buttonBox.accepted.connect(self.act_save_preset) self.buttonBox.rejected.connect(self.reject) self.init_settings() self.settings.beginGroup("Server Presets") self.presetNameList = [] for preset in self.settings.allKeys(): self.presetNameList.append(preset) self.settings.endGroup() self.preset_name_le.textChanged.connect(self.check_preset_name_availability) self.server_address_le.textChanged.connect(self.check_server_address) # --------------------------------------------------------------------- def init_settings(self): QCoreApplication.setOrganizationName("erdinc.me") QCoreApplication.setOrganizationDomain("erdinc.me") QCoreApplication.setApplicationName("IMAPLinkParser") self.settings = QSettings() # self.settings.clear() # --------------------------------------------------------------------- @Slot() def act_save_preset(self): try: self.settings.beginGroup("Server Presets") self.settings.setValue(self.preset_name_le.text(), self.server_address_le.text()) self.settings.endGroup() except: self.reject() self.accept() # --------------------------------------------------------------------- @Slot(unicode) def check_preset_name_availability(self, text): if text in self.presetNameList: self.save_btn.setEnabled(False) self.lb_info.setText('<p style="color:red;">Preset name exists!') else: if self.server_address_le.text() and self.preset_name_le.text(): self.save_btn.setEnabled(True) self.lb_info.setText(self.tr("(SSL is always on.)")) else: self.save_btn.setEnabled(False) self.lb_info.setText(self.tr("(SSL is always on.)")) # --------------------------------------------------------------------- @Slot(unicode) def check_server_address(self): if self.server_address_le.text(): preset = self.preset_name_le.text() if preset and preset not in self.presetNameList: self.save_btn.setEnabled(True) else: self.save_btn.setEnabled(False)
class AddAccountDialog(QDialog): # --------------------------------------------------------------------- def __init__(self, parent=None): super(AddAccountDialog, self).__init__(parent) # self.setAttribute(Qt.WA_DeleteOnClose) lbMinWidth = 150 leMinWidth = 200 self.isMatch = False # self.keyDialog.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setWindowTitle("Create a new account preset") baseLayout = QVBoxLayout(self) nameLayout = QHBoxLayout() keyLayout = QHBoxLayout() keyConfirmLayout = QHBoxLayout() baseLayout.addLayout(nameLayout) baseLayout.addLayout(keyLayout) baseLayout.addLayout(keyConfirmLayout) lb_name = QLabel('Account Preset Name: ', self) lb_name.setMinimumWidth(lbMinWidth) self.name_le = QLineEdit(self) self.name_le.setMinimumWidth(leMinWidth) nameLayout.addWidget(lb_name) nameLayout.addWidget(self.name_le) lb_key = QLabel('Encryption Key: ', self) lb_key.setMinimumWidth(lbMinWidth) self.key_le = QLineEdit(self) # self.key_le.setPlaceholderText('Encryption Key') self.key_le.setEchoMode(self.key_le.Password) self.key_le.setMinimumWidth(leMinWidth) keyLayout.addWidget(lb_key) keyLayout.addWidget(self.key_le) lb_keyConfirm = QLabel('Confirm Key: ', self) lb_keyConfirm.setMinimumWidth(lbMinWidth) self.keyConfirm_le = QLineEdit(self) # self.keyConfirm_le.setPlaceholderText('Encryption Key') self.keyConfirm_le.setEchoMode(self.key_le.Password) self.keyConfirm_le.setMinimumWidth(leMinWidth) keyConfirmLayout.addWidget(lb_keyConfirm) keyConfirmLayout.addWidget(self.keyConfirm_le) self.okBtn = QPushButton(self.tr("&Ok")) self.okBtn.setDefault(True) self.okBtn.setEnabled(False) cancelBtn = QPushButton(self.tr("&Cancel")) cancelBtn.setAutoDefault(False) buttonBox = QDialogButtonBox(Qt.Horizontal, self) buttonBox.addButton(self.okBtn, QDialogButtonBox.AcceptRole) buttonBox.addButton(cancelBtn, QDialogButtonBox.RejectRole) baseLayout.addWidget(buttonBox) self.name_le.textChanged.connect(self.name_confirmator) self.key_le.textChanged.connect(self.key_confirmator) self.keyConfirm_le.textChanged.connect(self.key_confirmator) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) # --------------------------------------------------------------------- @Slot(unicode) def name_confirmator(self, name): if name and self.isMatch: self.okBtn.setEnabled(True) else: self.okBtn.setEnabled(False) # --------------------------------------------------------------------- def key_confirmator(self): if self.keyConfirm_le.text() == self.key_le.text(): if not self.keyConfirm_le.text(): self.key_le.setStyleSheet("QLineEdit {background: white;}") self.keyConfirm_le.setStyleSheet("QLineEdit {background: white;}") self.okBtn.setEnabled(False) self.isMatch = False else: self.key_le.setStyleSheet("QLineEdit {background: #BBFFAA;}") self.keyConfirm_le.setStyleSheet("QLineEdit {background: #BBFFAA;}") self.isMatch = True if self.name_le.text(): self.okBtn.setEnabled(True) else: self.okBtn.setEnabled(False) else: self.key_le.setStyleSheet("QLineEdit {background: #FFAAAA;}") self.keyConfirm_le.setStyleSheet("QLineEdit {background: #FFAAAA;}") self.okBtn.setEnabled(False) self.isMatch = False # --------------------------------------------------------------------- @staticmethod def getAccountPresetNameAndEncryptionKey(parent=None): dialog = AddAccountDialog(parent) result = dialog.exec_() if result: name = dialog.name_le.text() key = dialog.key_le.text() dialog.key_le.clear() dialog.keyConfirm_le.clear() return result, name, key else: return result
class ConfiguratorWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) # Destroying the C++ object right after closing the dialog box, # otherwise it may be garbage-collected in another QThread # (e.g. the editor's analysis thread in Spyder), thus leading to # a segmentation fault on UNIX or an application crash on Windows self.setAttribute(Qt.WA_DeleteOnClose) self.statusBar().showMessage('Ready') self.saveButton = QPushButton(self.tr("Save")) self.saveButton.setDefault(True) self.quitButton = QPushButton(self.tr("Quit")) self.quitButton.setAutoDefault(False) buttonBox = QDialogButtonBox() buttonBox.addButton(self.saveButton, QDialogButtonBox.ActionRole) buttonBox.addButton(self.quitButton, QDialogButtonBox.RejectRole) self.connect(self.saveButton, SIGNAL('clicked()'), self.save_file) self.connect(self.quitButton, SIGNAL('clicked()'), self.close) """ bbox = QDialogButtonBox(QDialogButtonBox.Apply |QDialogButtonBox.Cancel) self.apply_btn = bbox.button(QDialogButtonBox.Apply) self.connect(bbox, SIGNAL("accepted()"), SLOT("accept()")) self.connect(bbox, SIGNAL("rejected()"), SLOT("reject()")) self.connect(bbox, SIGNAL("clicked(QAbstractButton*)"), self.button_clicked) """ self.lineedits = {} self.comboboxes = {} self.spinboxes = {} self.availability_label = None self.job_name_widget = self.create_lineedit('Job Name', 'job_name') self.job_script_widget = self.create_lineedit('Job Script', 'job_script') self.job_output_widget = self.create_lineedit('Job Output', 'job_output') self.project_name_widget = self.create_lineedit('Project/Account', 'project_name') self.queue_widget = self.create_combobox('Queue', [], 'queues') self.availability_label = QLabel('Available:') self.num_tasks_widget = self.create_spinbox('Number tasks', '', 'ntasks', NoDefault, 1, 1, 1, 'total number of tasks') self.task_per_node_widget = self.create_spinbox('Task per node', '', 'task_per_node', NoDefault, 1, 2, 1, 'tasks per node') self.runtime_widget = self.create_spinbox('Runtime', 'hrs', 'runtime', NoDefault, 1, 36, 1, 'runtime in hrs') self.app_script_widget = self.create_combobox('Application Script', [('mycluster-zcfd.bsh','mycluster-zcfd.bsh'), ('mycluster-paraview.bsh','mycluster-paraview.bsh'), ('mycluster-fluent.bsh','mycluster-fluent.bsh')], 'app_script') # hsplitter = QSplitter() # hsplitter.addWidget(self.pages_widget) btnlayout = QHBoxLayout() btnlayout.addStretch(1) btnlayout.addWidget(buttonBox) vlayout = QVBoxLayout() # vlayout.addWidget(hsplitter) vlayout.addWidget(self.job_name_widget) vlayout.addWidget(self.job_script_widget) vlayout.addWidget(self.job_output_widget) vlayout.addWidget(self.project_name_widget) hlayout = QHBoxLayout() hlayout.addWidget(self.queue_widget) hlayout.addWidget(self.availability_label) vlayout.addLayout(hlayout) vlayout.addWidget(self.num_tasks_widget) vlayout.addWidget(self.task_per_node_widget) vlayout.addWidget(self.runtime_widget) vlayout.addWidget(self.app_script_widget) vlayout.addSpacing(10) vlayout.addLayout(btnlayout) self.widget = QWidget() self.widget.setLayout(vlayout) self.setCentralWidget(self.widget) # self.setGeometry(300, 300, 350, 250) self.setWindowTitle("MyCluster Job Configurator") self.lineedits['job_name'].textChanged.connect(self.job_name_changed) self.lineedits['job_script'].textChanged.connect(self.job_script_changed) self.lineedits['job_name'].setText('myjob') self.lineedits['project_name'].setText('default') #self.lineedits['app_script'].setText('myscript.bsh') self.comboboxes['app_script'].setEditable(True) self.comboboxes['app_script'].lineEdit().editingFinished.connect(self.check_app_script) from mycluster import mycluster mycluster.init() self.init_queue_info() def save_file(self): from mycluster import mycluster if mycluster.scheduler: index = self.comboboxes['queues'].currentIndex() data = self.comboboxes['queues'].itemData(index) jobqueue = data.split(' ')[0] index = self.comboboxes['app_script'].currentIndex() data = self.comboboxes['app_script'].itemData(index) app_script = data.split(' ')[0] # Add checks mycluster.create_submit(jobqueue, script_name=self.lineedits['job_script'].text()+'.job', my_script=app_script, my_name=self.lineedits['job_name'].text(), my_output=self.lineedits['job_output'].text()+'.out', num_tasks=self.spinboxes['ntasks'].value(), project_name=self.lineedits['project_name'].text(), wall_clock=self.spinboxes['runtime'].value(), tasks_per_node=self.spinboxes['task_per_node'].value(),) def init_queue_info(self): from mycluster import mycluster if mycluster.scheduler: for q in mycluster.queues(): # nc = mycluster.scheduler.node_config(q) tpn = mycluster.scheduler.tasks_per_node(q) avail = mycluster.scheduler.available_tasks(q) self.comboboxes['queues'].addItem(q+' max task: '+str(avail['max tasks']), q+' '+str(avail['max tasks'])+' '+str(tpn)+ ' '+str(avail['available'])) self.comboboxes['queues'].currentIndexChanged.connect(self.queue_changed) self.queue_changed() def queue_changed(self): if self.comboboxes['queues'].count(): index = self.comboboxes['queues'].currentIndex() data = self.comboboxes['queues'].itemData(index) self.spinboxes['ntasks'].setMaximum(int(data.split(' ')[1])) self.spinboxes['task_per_node'].setMaximum(int(data.split(' ')[2])) self.spinboxes['task_per_node'].setValue(int(data.split(' ')[2])) self.availability_label.setText('Available: ' + data.split(' ')[3] + ' tasks') def job_name_changed(self, text): # print 'job name changed' self.lineedits['job_script'].setText(text) self.lineedits['job_output'].setText(text) def job_script_changed(self, text): # Check for file exist if os.path.isfile(text + '.job'): self.statusBar().showMessage('Warning file: ' + text + '.job already exists') else: self.statusBar().showMessage('Ready') def check_app_script(self): text = self.comboboxes['app_script'].lineEdit().text() if not os.path.isfile(text): self.statusBar().showMessage('Warning file: ' + text + ' does not exists') else: self.statusBar().showMessage('Ready') pass def show_and_raise(self): self.show() self.raise_() def button_clicked(self, button): if button is self.apply_btn: # Apply button was clicked pass def create_lineedit(self, text, option, default=NoDefault, tip=None, alignment=Qt.Horizontal): label = QLabel(text) label.setWordWrap(True) edit = QLineEdit() layout = QVBoxLayout() if alignment == Qt.Vertical else QHBoxLayout() layout.addWidget(label) layout.addWidget(edit) layout.setContentsMargins(0, 0, 0, 0) if tip: edit.setToolTip(tip) self.lineedits[option] = edit widget = QWidget(self) widget.setLayout(layout) return widget def create_spinbox(self, prefix, suffix, option, default=NoDefault, min_=None, max_=None, step=None, tip=None): if prefix: plabel = QLabel(prefix) else: plabel = None if suffix: slabel = QLabel(suffix) else: slabel = None spinbox = QSpinBox() if min_ is not None: spinbox.setMinimum(min_) if max_ is not None: spinbox.setMaximum(max_) if step is not None: spinbox.setSingleStep(step) if tip is not None: spinbox.setToolTip(tip) self.spinboxes[option] = spinbox layout = QHBoxLayout() for subwidget in (plabel, spinbox, slabel): if subwidget is not None: layout.addWidget(subwidget) layout.addStretch(1) layout.setContentsMargins(0, 0, 0, 0) widget = QWidget(self) widget.setLayout(layout) return widget def create_combobox(self, text, choices, option, default=NoDefault, tip=None): """choices: couples (name, key)""" label = QLabel(text) combobox = QComboBox() if tip is not None: combobox.setToolTip(tip) # combobox.setEditable(True) for name, key in choices: combobox.addItem(name, key) # to_qvariant(key)) self.comboboxes[option] = combobox layout = QHBoxLayout() for subwidget in (label, combobox): layout.addWidget(subwidget) layout.addStretch(1) layout.setContentsMargins(0, 0, 0, 0) widget = QWidget(self) widget.setLayout(layout) return widget
class ProfileSelection(QDialog): ''' classdocs ''' removeProfile = Signal(Athlete_Model) profileSelected = Signal(Athlete_Model) profileUpdate_request = Signal(Athlete_Model, Athlete_Model) lastProfileDeleted = Signal() def __init__(self, athletesList): ''' Constructor ''' QDialog.__init__(self) self.setWindowTitle("Profile Selection") self.athletesList = athletesList self._initGUI() def _initGUI(self): topHLayout = QHBoxLayout() hLayout = QHBoxLayout() vLayout = QVBoxLayout() # Label greeterText = QLabel("Welcome to <b>Pushup app</b>." + \ "<br><br> Select a profile:") vLayout.addWidget(greeterText) # List self.list = QListWidget() self.list.setMinimumWidth(150) self.list.setSelectionMode(QAbstractItemView.SingleSelection) # SingleSelection is the default value, but I prefer to be sure self.list.itemSelectionChanged.connect(self._activateButtons) for athlete in self.athletesList: iconW = QIcon.fromTheme("user-available") # doens't work on Mac and Windows # http://qt-project.org/doc/qt-4.8/qicon.html#fromTheme listW = QListWidgetItem(iconW, athlete._name) listW.setData(Qt.UserRole, athlete) self.list.addItem(listW) topHLayout.addWidget(self.list) self.profileWidget = ProfileFormWidget() self.profileWidget.hide() topHLayout.addWidget(self.profileWidget) vLayout.addLayout(topHLayout) vLayout.addLayout(hLayout) # Buttons self.okBtn = QPushButton("Ok") self.okBtn.setDisabled(True) self.okBtn.setDefault(True) self.okBtn.clicked.connect(self._okButtonSlot) self.list.itemDoubleClicked.connect(self._okButtonSlot) cancelBtn = QPushButton("Cancel") cancelBtn.clicked.connect(self._cancelButtonSlot) self.editBtn = QPushButton("Edit") self.editBtn.setDisabled(True) self.editBtn.setCheckable(True) self.editBtn.clicked.connect(self._toggleProfileEdit) self.saveBtn = QPushButton("Save changes") # Saves the changes made on the profile self.saveBtn.hide() self.saveBtn.clicked.connect(self._saveButtonSlot) self.removeProfileBtn = QPushButton("Remove Profile") self.removeProfileBtn.setDisabled(True) self.removeProfileBtn.clicked.connect(self._removeProfile_Dialog) hLayout.addWidget(self.editBtn) hLayout.addWidget(self.removeProfileBtn) hLayout.addWidget(cancelBtn) hLayout.addWidget(self.okBtn) hLayout.addWidget(self.saveBtn) self.setLayout(vLayout) def getSelectedProfile(self): selectedListItem = self.list.selectedItems()[0] athleteProfile = selectedListItem.data(Qt.UserRole) return athleteProfile def updateList(self, athletes): self.list.clear() self.athletesList = athletes for athlete in self.athletesList: iconW = QIcon.fromTheme("user-available") # doens't work on Mac and Windows # http://qt-project.org/doc/qt-4.8/qicon.html#fromTheme listW = QListWidgetItem(iconW, athlete._name) listW.setData(Qt.UserRole, athlete) self.list.addItem(listW) def resetWidget(self): """ Resets the widget to the initial laoyout. Should be used only in specific cases """ self.editBtn.setChecked(False) self._toggleProfileEdit() def _removeProfile_Dialog(self): """Runs a prompt dialog. Ask the user if he really wants to remove the selected profile. """ confirmationDialog = QMessageBox() confirmationDialog.setText("Do you really want to remove the selected profile ?") confirmationDialog.setInformativeText("Profile deletion can not be undone") confirmationDialog.setIcon(QMessageBox.Question) confirmationDialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No) confirmationDialog.accepted.connect(self._emitRemoveProfile) ret = confirmationDialog.exec_() if ret==QMessageBox.Yes: self._emitRemoveProfile() def _emitRemoveProfile(self): athlete = self.getSelectedProfile() rowToDelete = 0 for index, element in enumerate(self.athletesList): if element == athlete: rowToDelete = index self.list.takeItem(rowToDelete) self.athletesList.remove(athlete) self.removeProfile.emit(athlete) def _okButtonSlot(self): athlete = self.list.selectedItems()[0].data(Qt.UserRole) self.accept() # is it correct ? Maybe self.close() is better ? # Or should I redefine the accept() method ? #athleteProfile = self.getSelectedProfile() self.profileSelected.emit(athlete) def _cancelButtonSlot(self): if len(self.athletesList) == 0: self.lastProfileDeleted.emit() self.reject() def _saveButtonSlot(self): selectedProfile = self.getSelectedProfile() updatedProfile = self.profileWidget.getProfile() self.profileUpdate_request.emit(selectedProfile, updatedProfile) #self._toggleProfileEdit() def _toggleProfileEdit(self): if self.editBtn.isChecked(): self.profileWidget.setProfile(self.getSelectedProfile()) self.profileWidget.show() self.saveBtn.show() self.okBtn.hide() self.removeProfileBtn.hide() else: self.saveBtn.hide() self.profileWidget.hide() self.okBtn.show() self.removeProfileBtn.show() def _activateButtons(self): selectedItems = self.list.selectedItems() if len(selectedItems)!=0 : self.okBtn.setDisabled(False) self.removeProfileBtn.setDisabled(False) self.editBtn.setDisabled(False) else : self.okBtn.setDisabled(True) self.removeProfileBtn.setDisabled(True) self.editBtn.setDisabled(True)
class ConfiguratorWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) # Destroying the C++ object right after closing the dialog box, # otherwise it may be garbage-collected in another QThread # (e.g. the editor's analysis thread in Spyder), thus leading to # a segmentation fault on UNIX or an application crash on Windows self.setAttribute(Qt.WA_DeleteOnClose) self.statusBar().showMessage('Ready') self.saveButton = QPushButton(self.tr("Save")) self.saveButton.setDefault(True) self.quitButton = QPushButton(self.tr("Quit")) self.quitButton.setAutoDefault(False) buttonBox = QDialogButtonBox() buttonBox.addButton(self.saveButton, QDialogButtonBox.ActionRole) buttonBox.addButton(self.quitButton, QDialogButtonBox.RejectRole) self.connect(self.saveButton, SIGNAL('clicked()'), self.save_file) self.connect(self.quitButton, SIGNAL('clicked()'), self.close) """ bbox = QDialogButtonBox(QDialogButtonBox.Apply |QDialogButtonBox.Cancel) self.apply_btn = bbox.button(QDialogButtonBox.Apply) self.connect(bbox, SIGNAL("accepted()"), SLOT("accept()")) self.connect(bbox, SIGNAL("rejected()"), SLOT("reject()")) self.connect(bbox, SIGNAL("clicked(QAbstractButton*)"), self.button_clicked) """ self.lineedits = {} self.comboboxes = {} self.spinboxes = {} self.availability_label = None self.job_name_widget = self.create_lineedit('Job Name', 'job_name') self.job_script_widget = self.create_lineedit('Job Script', 'job_script') self.job_output_widget = self.create_lineedit('Job Output', 'job_output') self.project_name_widget = self.create_lineedit( 'Project/Account', 'project_name') self.queue_widget = self.create_combobox('Queue', [], 'queues') self.availability_label = QLabel('Available:') self.num_tasks_widget = self.create_spinbox('Number tasks', '', 'ntasks', NoDefault, 1, 1, 1, 'total number of tasks') self.task_per_node_widget = self.create_spinbox( 'Task per node', '', 'task_per_node', NoDefault, 1, 2, 1, 'tasks per node') self.runtime_widget = self.create_spinbox('Runtime', 'hrs', 'runtime', NoDefault, 1, 36, 1, 'runtime in hrs') self.app_script_widget = self.create_combobox( 'Application Script', [('mycluster-zcfd.bsh', 'mycluster-zcfd.bsh'), ('mycluster-paraview.bsh', 'mycluster-paraview.bsh'), ('mycluster-fluent.bsh', 'mycluster-fluent.bsh')], 'app_script') # hsplitter = QSplitter() # hsplitter.addWidget(self.pages_widget) btnlayout = QHBoxLayout() btnlayout.addStretch(1) btnlayout.addWidget(buttonBox) vlayout = QVBoxLayout() # vlayout.addWidget(hsplitter) vlayout.addWidget(self.job_name_widget) vlayout.addWidget(self.job_script_widget) vlayout.addWidget(self.job_output_widget) vlayout.addWidget(self.project_name_widget) hlayout = QHBoxLayout() hlayout.addWidget(self.queue_widget) hlayout.addWidget(self.availability_label) vlayout.addLayout(hlayout) vlayout.addWidget(self.num_tasks_widget) vlayout.addWidget(self.task_per_node_widget) vlayout.addWidget(self.runtime_widget) vlayout.addWidget(self.app_script_widget) vlayout.addSpacing(10) vlayout.addLayout(btnlayout) self.widget = QWidget() self.widget.setLayout(vlayout) self.setCentralWidget(self.widget) # self.setGeometry(300, 300, 350, 250) self.setWindowTitle("MyCluster Job Configurator") self.lineedits['job_name'].textChanged.connect(self.job_name_changed) self.lineedits['job_script'].textChanged.connect( self.job_script_changed) self.lineedits['job_name'].setText('myjob') self.lineedits['project_name'].setText('default') #self.lineedits['app_script'].setText('myscript.bsh') self.comboboxes['app_script'].setEditable(True) self.comboboxes['app_script'].lineEdit().editingFinished.connect( self.check_app_script) from mycluster import mycluster mycluster.init() self.init_queue_info() def save_file(self): from mycluster import mycluster if mycluster.scheduler: index = self.comboboxes['queues'].currentIndex() data = self.comboboxes['queues'].itemData(index) jobqueue = data.split(' ')[0] index = self.comboboxes['app_script'].currentIndex() data = self.comboboxes['app_script'].itemData(index) app_script = data.split(' ')[0] # Add checks mycluster.create_submit( jobqueue, script_name=self.lineedits['job_script'].text() + '.job', my_script=app_script, my_name=self.lineedits['job_name'].text(), my_output=self.lineedits['job_output'].text() + '.out', num_tasks=self.spinboxes['ntasks'].value(), project_name=self.lineedits['project_name'].text(), wall_clock=self.spinboxes['runtime'].value(), tasks_per_node=self.spinboxes['task_per_node'].value(), ) def init_queue_info(self): from mycluster import mycluster if mycluster.scheduler: for q in mycluster.queues(): # nc = mycluster.scheduler.node_config(q) tpn = mycluster.scheduler.tasks_per_node(q) avail = mycluster.scheduler.available_tasks(q) self.comboboxes['queues'].addItem( q + ' max task: ' + str(avail['max tasks']), q + ' ' + str(avail['max tasks']) + ' ' + str(tpn) + ' ' + str(avail['available'])) self.comboboxes['queues'].currentIndexChanged.connect( self.queue_changed) self.queue_changed() def queue_changed(self): if self.comboboxes['queues'].count(): index = self.comboboxes['queues'].currentIndex() data = self.comboboxes['queues'].itemData(index) self.spinboxes['ntasks'].setMaximum(int(data.split(' ')[1])) self.spinboxes['task_per_node'].setMaximum(int(data.split(' ')[2])) self.spinboxes['task_per_node'].setValue(int(data.split(' ')[2])) self.availability_label.setText('Available: ' + data.split(' ')[3] + ' tasks') def job_name_changed(self, text): # print 'job name changed' self.lineedits['job_script'].setText(text) self.lineedits['job_output'].setText(text) def job_script_changed(self, text): # Check for file exist if os.path.isfile(text + '.job'): self.statusBar().showMessage('Warning file: ' + text + '.job already exists') else: self.statusBar().showMessage('Ready') def check_app_script(self): text = self.comboboxes['app_script'].lineEdit().text() if not os.path.isfile(text): self.statusBar().showMessage('Warning file: ' + text + ' does not exists') else: self.statusBar().showMessage('Ready') pass def show_and_raise(self): self.show() self.raise_() def button_clicked(self, button): if button is self.apply_btn: # Apply button was clicked pass def create_lineedit(self, text, option, default=NoDefault, tip=None, alignment=Qt.Horizontal): label = QLabel(text) label.setWordWrap(True) edit = QLineEdit() layout = QVBoxLayout() if alignment == Qt.Vertical else QHBoxLayout() layout.addWidget(label) layout.addWidget(edit) layout.setContentsMargins(0, 0, 0, 0) if tip: edit.setToolTip(tip) self.lineedits[option] = edit widget = QWidget(self) widget.setLayout(layout) return widget def create_spinbox(self, prefix, suffix, option, default=NoDefault, min_=None, max_=None, step=None, tip=None): if prefix: plabel = QLabel(prefix) else: plabel = None if suffix: slabel = QLabel(suffix) else: slabel = None spinbox = QSpinBox() if min_ is not None: spinbox.setMinimum(min_) if max_ is not None: spinbox.setMaximum(max_) if step is not None: spinbox.setSingleStep(step) if tip is not None: spinbox.setToolTip(tip) self.spinboxes[option] = spinbox layout = QHBoxLayout() for subwidget in (plabel, spinbox, slabel): if subwidget is not None: layout.addWidget(subwidget) layout.addStretch(1) layout.setContentsMargins(0, 0, 0, 0) widget = QWidget(self) widget.setLayout(layout) return widget def create_combobox(self, text, choices, option, default=NoDefault, tip=None): """choices: couples (name, key)""" label = QLabel(text) combobox = QComboBox() if tip is not None: combobox.setToolTip(tip) # combobox.setEditable(True) for name, key in choices: combobox.addItem(name, key) # to_qvariant(key)) self.comboboxes[option] = combobox layout = QHBoxLayout() for subwidget in (label, combobox): layout.addWidget(subwidget) layout.addStretch(1) layout.setContentsMargins(0, 0, 0, 0) widget = QWidget(self) widget.setLayout(layout) return widget
class Form(QDialog): def __init__(self, state, parent=None): super().__init__(parent) Lib.prepareModalDialog(self) self.state = state self.setWindowTitle("Recreate Entries — {}".format( QApplication.applicationName())) self.createWidgets() self.layoutWidgets() self.populate() self.updateUi() self.createConnections() settings = QSettings() self.updateToolTips( bool( int( settings.value(Gopt.Key.ShowDialogToolTips, Gopt.Default.ShowDialogToolTips)))) def createWidgets(self): self.listWidget = Widgets.List.HtmlListWidget(self.state) self.tooltips.append((self.listWidget, """\ <p><b>Recreatable Entries view</b></p> <p>The list of this index's recreatable entries.</p>""")) self.recreateSubentriesCheckBox = QCheckBox("Recreate &Subentries") self.recreateSubentriesCheckBox.setChecked(True) self.tooltips.append((self.recreateSubentriesCheckBox, """\ <p><b>Recreate Subentries</b></p> <p>If checked, when an entry or subentry is recreated, all of its subentries, and their subentries, and so on (if any), will also be recrected if possible.</p>""")) self.recreateButton = QPushButton(QIcon(":/recreate.svg"), "&Recreate") self.recreateButton.setDefault(True) self.recreateButton.setAutoDefault(True) self.tooltips.append((self.recreateButton, """\ <p><b>Recreate</b></p> <p>Recreate the current entry or subentry (and its subentries and their subentries, and so on, if the <b>Recreate Subentries</b> checkbox is checked), and then close the dialog.</p> <p>Note that it is possible to get rid of the recreated entries by clicking <b>Index→Undo</b> immediately after the dialog closes. (Or, at any later time by simply deleting them.)""")) self.deleteButton = QPushButton(QIcon(":/delete.svg"), "&Delete...") self.tooltips.append((self.deleteButton, """\ <p><b>Delete</b></p> <p>Permanently delete the current recreatable entry or subentry from this index's list of recreatable entries.</p>""")) self.helpButton = QPushButton(QIcon(":/help.svg"), "Help") self.tooltips.append( (self.helpButton, "Help on the Recreate Entries dialog")) self.closeButton = QPushButton(QIcon(":/dialog-close.svg"), "&Close") self.tooltips.append((self.closeButton, """<p><b>Close</b></p> <p>Close the dialog.</p>""")) def layoutWidgets(self): buttonBox = QDialogButtonBox() buttonBox.addButton(self.recreateButton, QDialogButtonBox.ActionRole) buttonBox.addButton(self.deleteButton, QDialogButtonBox.ActionRole) buttonBox.addButton(self.closeButton, QDialogButtonBox.AcceptRole) buttonBox.addButton(self.helpButton, QDialogButtonBox.HelpRole) layout = QVBoxLayout() layout.addWidget(self.listWidget) layout.addWidget(self.recreateSubentriesCheckBox) layout.addWidget(buttonBox) self.setLayout(layout) def createConnections(self): self.recreateButton.clicked.connect(self.recreate) self.deleteButton.clicked.connect(self.delete) self.closeButton.clicked.connect(self.reject) self.helpButton.clicked.connect(self.help) def help(self): self.state.help("xix_ref_dlg_recreate.html") def updateUi(self): enable = self.listWidget.currentRow() > -1 self.recreateButton.setEnabled(enable) self.deleteButton.setEnabled(enable) def populate(self): self.listWidget.clear() for entry in self.state.model.deletedEntries(): pages = "" if entry.pages: pages = ", {}".format(entry.pages) top = MAIN_INDICATOR if entry.peid == ROOT else SUB_INDICATOR item = QListWidgetItem("{} {}{}".format( top, Lib.elidePatchHtml(entry.term, self.state), Lib.elidePatchHtml(pages, self.state))) item.setData(Qt.UserRole, entry.eid) self.listWidget.addItem(item) if self.listWidget.count(): self.listWidget.setCurrentRow(0) def recreate(self): # No need to restore focus widget item = self.listWidget.currentItem() if item: eid = item.data(Qt.UserRole) subentries = self.recreateSubentriesCheckBox.isChecked() with Lib.DisableUI(self): self.state.model.recreateEntry(eid, subentries) say("Recreated", SAY_TIMEOUT) self.accept() def delete(self): widget = QApplication.focusWidget() item = self.listWidget.currentItem() if item: eid = item.data(Qt.UserRole) if self.state.model.hasDeletedEntry(eid): with Lib.Qt.DisableUI(self, forModalDialog=True): reply = QMessageBox.question( self, "Delete Revivable Entry — {}".format( QApplication.applicationName()), "<p>Permanently delete revivable entry<br>“{}”?". format(item.text()), QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if reply == QMessageBox.Yes: with Lib.DisableUI(self): self.state.model.deleteDeletedEntry(eid) self.populate() self.updateUi() Lib.restoreFocus(widget)