Exemple #1
0
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)
Exemple #2
0
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)
Exemple #3
0
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,
        )
Exemple #6
0
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, )
Exemple #7
0
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, )
Exemple #8
0
 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)
Exemple #9
0
 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
Exemple #12
0
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
Exemple #13
0
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)
Exemple #14
0
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
Exemple #15
0
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)