Exemplo n.º 1
0
    def create_button(self, parent, label=""):
        """ Returns an adapted button.
        """
        control = QPushButton(check_parent(parent))
        control.setText(label)
        control.setAutoDefault(False)

        return control_adapter_for(control)
Exemplo n.º 2
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
Exemplo n.º 3
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)
Exemplo n.º 4
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)
Exemplo n.º 6
0
    def setupUi(self, editTeamDialog):
    
        editTeamDialog.setObjectName("editTeamDialog")
        editTeamDialog.setMinimumSize(QSize(500, 550))
        editTeamDialog.setMaximumSize(QSize(500, 550))
        
        self.mainVerticalLayout = QVBoxLayout(editTeamDialog)
        self.topLayout = QHBoxLayout()
        self.teamUserInfoLayout = QGridLayout()

        managerLabel = QLabel()
        self.teamUserInfoLayout.addWidget(managerLabel, 0, 0)

        teamLabel = QLabel()
        self.teamUserInfoLayout.addWidget(teamLabel, 1, 0)
        self.teamNameEdit = QLineEdit()
        self.teamNameEdit.setMinimumWidth(200)
        self.teamUserInfoLayout.addWidget(self.teamNameEdit, 1, 1)

        emailLabel = QLabel()
        self.teamUserInfoLayout.addWidget(emailLabel, 2, 0)
        self.emailEdit = QLineEdit()
        self.teamUserInfoLayout.addWidget(self.emailEdit, 2, 1)

        self.topLayout.addLayout(self.teamUserInfoLayout)
        self.topLayout.addStretch()

        self.mainVerticalLayout.addLayout(self.topLayout)
        self.mainVerticalLayout.addItem(QSpacerItem(0, 15))
        
        #self.mainVerticalLayout.addStretch()

        self.formationLayout = QHBoxLayout()

        self.formationRadioButtons = RadioButtonGroup("Formation", Formation.formations)
        self.formationRadioButtons.setFlat(True)
        self.formationLayout.addWidget(self.formationRadioButtons)
        self.formationLayout.addStretch()

        self.mainVerticalLayout.addLayout(self.formationLayout)
        
        self.playersGroupBox = QGroupBox()

        self.gridLayout = QGridLayout(self.playersGroupBox)

        self.goalkeeperLabel = QLabel(self.playersGroupBox)
        self.gridLayout.addWidget(self.goalkeeperLabel, 0, 0)

        self.positionLabels = [QLabel(self.playersGroupBox) for i in range(11)]
        self.searchBoxes = [QLineEdit(self.playersGroupBox) for i in range(11)]
        self.selections = [QComboBox(self.playersGroupBox) for i in range(11)]
        self.clubLabels = [QLabel(self.playersGroupBox) for i in range(11)]
        self.valueLabels = [QLabel(self.playersGroupBox) for i in range(11)]
        
        for i, positionLabel in enumerate(self.positionLabels):
            self.gridLayout.addWidget(positionLabel, i, 0)
        
        for i, searchBox in enumerate(self.searchBoxes):
            searchBox.setToolTip("Search for a player by code or name")
            self.gridLayout.addWidget(searchBox, i, 1)
            searchBox.returnPressed.connect(partial(self.playerSearch, i))
        
        for i, selection in enumerate(self.selections):
            selection.setToolTip("Select a player")
            selection.setSizeAdjustPolicy(QComboBox.AdjustToContentsOnFirstShow)
            selection.setCurrentIndex(-1)
            self.gridLayout.addWidget(selection, i, 2)
        
        clubWidth = self.clubLabels[0].fontMetrics().width("Wolverhampton Wanderers")
        for i, clubLabel in enumerate(self.clubLabels):
            clubLabel.setFixedWidth(clubWidth)
            self.gridLayout.addWidget(clubLabel, i, 3)
            
        valueWidth = self.valueLabels[0].fontMetrics().width("0.0")
        for i, valueLabel in enumerate(self.valueLabels):
            valueLabel.setFixedWidth(valueWidth)
            self.gridLayout.addWidget(valueLabel, i, 4)

        
        self.mainVerticalLayout.addWidget(self.playersGroupBox)
        self.mainVerticalLayout.addItem(QSpacerItem(0, 15))
        
        self.totalCostLayout = QHBoxLayout()
        self.totalCostLabel = QLabel()
        self.totalCostLayout.addWidget(self.totalCostLabel)

        self.mainVerticalLayout.addLayout(self.totalCostLayout)
        self.mainVerticalLayout.addItem(QSpacerItem(0, 15))
        
        self.buttonLayout = QHBoxLayout()
        
        okButton = QPushButton("OK")
        okButton.setAutoDefault(False)
        cancelButton = QPushButton("Cancel")
        cancelButton.setAutoDefault(False)
        self.buttonLayout.addWidget(okButton)
        self.buttonLayout.addWidget(cancelButton)
        buttonSpacer = QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.buttonLayout.addItem(buttonSpacer)
        self.mainVerticalLayout.addLayout(self.buttonLayout)

        okButton.clicked.connect(editTeamDialog.accept)
        cancelButton.clicked.connect(editTeamDialog.reject)

        managerLabel.setText("Manager")
        teamLabel.setText("Team Name")
        emailLabel.setText("Email")

        self.playersGroupBox.setTitle("Players")

        for formationRadioButton in self.formationRadioButtons:
            formationRadioButton.clicked.connect(partial(self.formationChanged, str(formationRadioButton.text())))
        
        self.totalCostLabel.setText("Total Cost")
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
class MainWindow(QWidget):
    # noinspection PyUnresolvedReferences
    def __init__(self, clipboard):
        super().__init__()
        self.clipboard = clipboard
        self.setWindowIcon(QIcon('Logo_rendered_edited.png'))
        self.layout = QBoxLayout(QBoxLayout.TopToBottom, self)
        self.generator = CtSesam()
        self.iterations = 4096
        # Master password
        self.master_password_label = QLabel("&Master-Passwort:")
        self.maser_password_edit = QLineEdit()
        self.maser_password_edit.setEchoMode(QLineEdit.EchoMode.Password)
        self.maser_password_edit.textChanged.connect(self.reset_iterations)
        self.maser_password_edit.returnPressed.connect(self.move_focus)
        self.maser_password_edit.setMaximumHeight(28)
        self.master_password_label.setBuddy(self.maser_password_edit)
        self.layout.addWidget(self.master_password_label)
        self.layout.addWidget(self.maser_password_edit)
        # Domain
        self.domain_label = QLabel("&Domain:")
        self.domain_edit = QLineEdit()
        self.domain_edit.textChanged.connect(self.reset_iterations)
        self.domain_edit.returnPressed.connect(self.move_focus)
        self.domain_edit.setMaximumHeight(28)
        self.domain_label.setBuddy(self.domain_edit)
        self.layout.addWidget(self.domain_label)
        self.layout.addWidget(self.domain_edit)
        # Username
        self.username_label = QLabel("&Username:"******"Sonderzeichen")
        self.special_characters_checkbox.setChecked(True)
        self.special_characters_checkbox.stateChanged.connect(self.reset_iterations)
        self.layout.addWidget(self.special_characters_checkbox)
        self.letters_checkbox = QCheckBox("Buchstaben")
        self.letters_checkbox.setChecked(True)
        self.letters_checkbox.stateChanged.connect(self.reset_iterations)
        self.layout.addWidget(self.letters_checkbox)
        self.digits_checkbox = QCheckBox("Zahlen")
        self.digits_checkbox.setChecked(True)
        self.digits_checkbox.stateChanged.connect(self.reset_iterations)
        self.layout.addWidget(self.digits_checkbox)
        # Length slider
        self.length_label = QLabel("&Länge:")
        self.length_display = QLabel()
        self.length_label_layout = QBoxLayout(QBoxLayout.LeftToRight)
        self.length_label_layout.addWidget(self.length_label)
        self.length_label_layout.addWidget(self.length_display)
        self.length_label_layout.addStretch()
        self.length_slider = QSlider(Qt.Horizontal)
        self.length_slider.setMinimum(4)
        self.length_slider.setMaximum(20)
        self.length_slider.setPageStep(1)
        self.length_slider.setValue(10)
        self.length_display.setText(str(self.length_slider.sliderPosition()))
        self.length_slider.valueChanged.connect(self.length_slider_changed)
        self.length_label.setBuddy(self.length_slider)
        self.layout.addLayout(self.length_label_layout)
        self.layout.addWidget(self.length_slider)
        # Button
        self.generate_button = QPushButton("Erzeugen")
        self.generate_button.clicked.connect(self.generate_password)
        self.generate_button.setAutoDefault(True)
        self.layout.addWidget(self.generate_button)
        # Password
        self.password_label = QLabel("&Passwort:")
        self.password = QLabel()
        self.password.setTextFormat(Qt.PlainText)
        self.password.setAlignment(Qt.AlignCenter)
        self.password.setFont(QFont("Helvetica", 18, QFont.Bold))
        self.password_label.setBuddy(self.password)
        self.layout.addWidget(self.password_label)
        self.layout.addWidget(self.password)
        # Iteration display
        self.message_label = QLabel()
        self.message_label.setTextFormat(Qt.RichText)
        self.message_label.setVisible(False)
        self.layout.addWidget(self.message_label)
        # Window layout
        self.layout.addStretch()
        self.setGeometry(0, 30, 300, 400)
        self.setWindowTitle("c't SESAM")
        self.maser_password_edit.setFocus()
        self.show()

    def length_slider_changed(self):
        self.length_display.setText(str(self.length_slider.sliderPosition()))
        self.reset_iterations()

    def reset_iterations(self):
        self.iterations = 4096
        self.message_label.setVisible(False)
        self.password.setText('')
        self.clipboard.setText('')

    def move_focus(self):
        line_edits = [self.maser_password_edit, self.domain_edit, self.username_edit]
        for i, edit in enumerate(line_edits):
            if edit.hasFocus() and i + 1 < len(line_edits):
                line_edits[i + 1].setFocus()
                return True
        self.generate_button.setFocus()

    def generate_password(self):
        if len(self.domain_edit.text()) <= 0:
            self.reset_iterations()
            self.message_label.setText(
                '<span style="font-size: 10px; color: #aa0000;">Bitte geben Sie eine Domain an.</span>')
            self.message_label.setVisible(True)
            return False
        if self.letters_checkbox.isChecked() or \
           self.digits_checkbox.isChecked() or \
           self.special_characters_checkbox.isChecked():
            self.generator.set_password_characters(
                use_letters=self.letters_checkbox.isChecked(),
                use_digits=self.digits_checkbox.isChecked(),
                use_special_characters=self.special_characters_checkbox.isChecked())
        else:
            self.reset_iterations()
            self.message_label.setText(
                '<span style="font-size: 10px; color: #aa0000;">Bei den aktuellen Einstellungen ' +
                'kann kein Passwort berechnet werden.</span>')
            self.message_label.setVisible(True)
            return False
        password = self.generator.generate(
            master_password=self.maser_password_edit.text(),
            domain=self.domain_edit.text(),
            username=self.username_edit.text(),
            length=self.length_slider.sliderPosition(),
            iterations=self.iterations
        )
        self.password.setText(password)
        self.password.setTextInteractionFlags(Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard)
        self.clipboard.setText(password)
        self.message_label.setText(
            '<span style="font-size: 10px; color: #888888;">Das Passwort wurde ' + str(self.iterations) +
            ' mal gehasht <br />und in die Zwischenablage kopiert.</span>')
        self.message_label.setVisible(True)
        self.iterations += 1
Exemplo n.º 9
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
Exemplo n.º 10
0
    def setupUi(self, editTeamDialog):

        editTeamDialog.setObjectName("editTeamDialog")
        editTeamDialog.setMinimumSize(QSize(500, 550))
        editTeamDialog.setMaximumSize(QSize(500, 550))

        self.mainVerticalLayout = QVBoxLayout(editTeamDialog)
        self.topLayout = QHBoxLayout()
        self.teamUserInfoLayout = QGridLayout()

        managerLabel = QLabel()
        self.teamUserInfoLayout.addWidget(managerLabel, 0, 0)

        teamLabel = QLabel()
        self.teamUserInfoLayout.addWidget(teamLabel, 1, 0)
        self.teamNameEdit = QLineEdit()
        self.teamNameEdit.setMinimumWidth(200)
        self.teamUserInfoLayout.addWidget(self.teamNameEdit, 1, 1)

        emailLabel = QLabel()
        self.teamUserInfoLayout.addWidget(emailLabel, 2, 0)
        self.emailEdit = QLineEdit()
        self.teamUserInfoLayout.addWidget(self.emailEdit, 2, 1)

        self.topLayout.addLayout(self.teamUserInfoLayout)
        self.topLayout.addStretch()

        self.mainVerticalLayout.addLayout(self.topLayout)
        self.mainVerticalLayout.addItem(QSpacerItem(0, 15))

        #self.mainVerticalLayout.addStretch()

        self.formationLayout = QHBoxLayout()

        self.formationRadioButtons = RadioButtonGroup("Formation",
                                                      Formation.formations)
        self.formationRadioButtons.setFlat(True)
        self.formationLayout.addWidget(self.formationRadioButtons)
        self.formationLayout.addStretch()

        self.mainVerticalLayout.addLayout(self.formationLayout)

        self.playersGroupBox = QGroupBox()

        self.gridLayout = QGridLayout(self.playersGroupBox)

        self.goalkeeperLabel = QLabel(self.playersGroupBox)
        self.gridLayout.addWidget(self.goalkeeperLabel, 0, 0)

        self.positionLabels = [QLabel(self.playersGroupBox) for i in range(11)]
        self.searchBoxes = [QLineEdit(self.playersGroupBox) for i in range(11)]
        self.selections = [QComboBox(self.playersGroupBox) for i in range(11)]
        self.clubLabels = [QLabel(self.playersGroupBox) for i in range(11)]
        self.valueLabels = [QLabel(self.playersGroupBox) for i in range(11)]

        for i, positionLabel in enumerate(self.positionLabels):
            self.gridLayout.addWidget(positionLabel, i, 0)

        for i, searchBox in enumerate(self.searchBoxes):
            searchBox.setToolTip("Search for a player by code or name")
            self.gridLayout.addWidget(searchBox, i, 1)
            searchBox.returnPressed.connect(partial(self.playerSearch, i))

        for i, selection in enumerate(self.selections):
            selection.setToolTip("Select a player")
            selection.setSizeAdjustPolicy(
                QComboBox.AdjustToContentsOnFirstShow)
            selection.setCurrentIndex(-1)
            self.gridLayout.addWidget(selection, i, 2)

        clubWidth = self.clubLabels[0].fontMetrics().width(
            "Wolverhampton Wanderers")
        for i, clubLabel in enumerate(self.clubLabels):
            clubLabel.setFixedWidth(clubWidth)
            self.gridLayout.addWidget(clubLabel, i, 3)

        valueWidth = self.valueLabels[0].fontMetrics().width("0.0")
        for i, valueLabel in enumerate(self.valueLabels):
            valueLabel.setFixedWidth(valueWidth)
            self.gridLayout.addWidget(valueLabel, i, 4)

        self.mainVerticalLayout.addWidget(self.playersGroupBox)
        self.mainVerticalLayout.addItem(QSpacerItem(0, 15))

        self.totalCostLayout = QHBoxLayout()
        self.totalCostLabel = QLabel()
        self.totalCostLayout.addWidget(self.totalCostLabel)

        self.mainVerticalLayout.addLayout(self.totalCostLayout)
        self.mainVerticalLayout.addItem(QSpacerItem(0, 15))

        self.buttonLayout = QHBoxLayout()

        okButton = QPushButton("OK")
        okButton.setAutoDefault(False)
        cancelButton = QPushButton("Cancel")
        cancelButton.setAutoDefault(False)
        self.buttonLayout.addWidget(okButton)
        self.buttonLayout.addWidget(cancelButton)
        buttonSpacer = QSpacerItem(0, 0, QSizePolicy.Expanding,
                                   QSizePolicy.Minimum)
        self.buttonLayout.addItem(buttonSpacer)
        self.mainVerticalLayout.addLayout(self.buttonLayout)

        okButton.clicked.connect(editTeamDialog.accept)
        cancelButton.clicked.connect(editTeamDialog.reject)

        managerLabel.setText("Manager")
        teamLabel.setText("Team Name")
        emailLabel.setText("Email")

        self.playersGroupBox.setTitle("Players")

        for formationRadioButton in self.formationRadioButtons:
            formationRadioButton.clicked.connect(
                partial(self.formationChanged,
                        str(formationRadioButton.text())))

        self.totalCostLabel.setText("Total Cost")
Exemplo n.º 11
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
Exemplo n.º 12
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)