def generateButtons(self, parent=None):
     """ Generate buttons due to colorDic """
     self.colorButtons = []
     for color in self.colorList:
         button = QPushButton(parent)
         button.setObjectName(color[0])
         button.setStyleSheet('QPushButton { background-color: %s; }' %
                              color[1])
         button.setFixedSize(self.iconWidth / 2, self.iconHeight / 2)
         button.setCheckable(True)
         self.colorButtons.append(button)
Beispiel #2
0
class Template(base.BaseWidget):
    templateChecked = Signal(object)

    def __init__(self, parent=None):
        super(Template, self).__init__(parent=parent)

    def ui(self):
        super(Template, self).ui()

        self.setMaximumWidth(160)
        self.setMaximumHeight(200)

        widget_layout = layouts.VerticalLayout(spacing=0, margins=(2, 2, 2, 2))
        main_frame = QFrame()
        main_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised)
        main_frame.setLineWidth(1)
        main_frame.setLayout(widget_layout)
        self.main_layout.addWidget(main_frame)

        self.template_btn = QPushButton('', self)
        self.template_btn.setCheckable(True)
        self.template_btn.setIcon(self.get_icon())
        self.template_btn.setIconSize(QSize(120, 120))
        template_lbl = label.BaseLabel(self.name, parent=self)
        template_lbl.setObjectName('templateLabel')
        template_lbl.setAlignment(Qt.AlignCenter)
        widget_layout.addWidget(self.template_btn)
        widget_layout.addWidget(template_lbl)

    def setup_signals(self):
        self.template_btn.toggled.connect(self._on_selected_template)

    def get_icon(self):
        return resources.icon(name='project', extension='png')

    def _on_selected_template(self, template):
        self.templateChecked.emit(self)
Beispiel #3
0
def create_flat_button(
    icon=None,
    icon_size=None,
    name='',
    text=200,
    background_color=[54, 51, 51],
    ui_color=68,
    border_color=180,
    push_col=120,
    checkable=True,
    w_max=None,
    w_min=None,
    h_max=None,
    h_min=None,
    policy=None,
    tip=None,
    flat=True,
    hover=True,
    destroy_flag=False,
    context=None,
):

    btn = QPushButton()
    btn.setText(name)
    btn.setCheckable(checkable)
    if icon:
        if isinstance(icon, QIcon):
            btn.setIcon(icon)
        else:
            btn.setIcon(QIcon(icon))
    btn.setFlat(flat)
    if flat:
        change_button_color(button=btn,
                            text_color=text,
                            bg_color=ui_color,
                            hi_color=background_color,
                            mode='button',
                            hover=hover,
                            destroy=destroy_flag,
                            ds_color=border_color)
        btn.toggled.connect(
            lambda: change_button_color(button=btn,
                                        text_color=text,
                                        bg_color=ui_color,
                                        hi_color=background_color,
                                        mode='button',
                                        toggle=True,
                                        hover=hover,
                                        destroy=destroy_flag,
                                        ds_color=border_color))
    else:
        change_button_color(button=btn,
                            text_color=text,
                            bg_color=background_color,
                            hi_color=push_col,
                            mode='button',
                            hover=hover,
                            destroy=destroy_flag,
                            ds_color=border_color)

    if w_max:
        btn.setMaximumWidth(w_max)
    if w_min:
        btn.setMinimumWidth(w_min)
    if h_max:
        btn.setMaximumHeight(h_max)
    if h_min:
        btn.setMinimumHeight(h_min)
    if icon_size:
        btn.setIconSize(QSize(*icon_size))
    if policy:
        btn.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding)
    if tip:
        btn.setToolTip(tip)
    if context:
        btn.setContextMenuPolicy(Qt.CustomContextMenu)
        btn.customContextMenuRequested.connect(context)

    return btn
Beispiel #4
0
class MyToolBar(QWidget):
    """ ToolBar widget """

    # signal
    trigger = Signal(int)

    def __init__(self, flags, parent=None):
        super(MyToolBar, self).__init__(parent)

        self.setWindowFlags(Qt.ToolTip)
        self.paddingX = 5
        self.paddingY = 2
        self.iconWidth = self.iconHeight = 28
        self.setFixedHeight(self.iconHeight + 2 * self.paddingY)
        # self.setFixedWidth(300)

        self.rectButton = None
        self.ellipseButton = None
        self.arrowButton = None
        self.lineButton = None
        self.freePenButton = None
        self.textButton = None
        self.undoButton = None
        self.cancelButton = None
        self.okButton = None
        self.saveButton = None
        self.button_list = []

        self.initWindow(flags)

    def initDrawButtons(self, flags):
        self.drawButtonGroup = QButtonGroup(self)

        # draw action buttons
        if flags & constant.RECT:
            self.rectButton = QPushButton(self)
            self.rectButton.setIcon(QIcon(":/resource/icon/rect.png"))
            self.rectButton.setFixedSize(self.iconWidth, self.iconHeight)
            self.rectButton.setCheckable(True)
            self.drawButtonGroup.addButton(self.rectButton)
            self.hlayout.addWidget(self.rectButton)
            self.button_list.append(self.rectButton)

        if flags & constant.ELLIPSE:
            self.ellipseButton = QPushButton(self)
            self.ellipseButton.setIcon(QIcon(":/resource/icon/ellipse.png"))
            self.ellipseButton.setFixedSize(self.iconWidth, self.iconHeight)
            self.ellipseButton.setCheckable(True)
            self.drawButtonGroup.addButton(self.ellipseButton)
            self.hlayout.addWidget(self.ellipseButton)
            self.button_list.append(self.ellipseButton)

        if flags & constant.ARROW:
            self.arrowButton = QPushButton(self)
            self.arrowButton.setIcon(QIcon(":/resource/icon/arrow.png"))
            self.arrowButton.setFixedSize(self.iconWidth, self.iconHeight)
            self.arrowButton.setCheckable(True)
            self.drawButtonGroup.addButton(self.arrowButton)
            self.hlayout.addWidget(self.arrowButton)
            self.button_list.append(self.arrowButton)

        if flags & constant.LINE:
            self.lineButton = QPushButton(self)
            self.lineButton.setIcon(QIcon(":/resource/icon/line.png"))
            self.lineButton.setFixedSize(self.iconWidth, self.iconHeight)
            self.lineButton.setCheckable(True)
            self.drawButtonGroup.addButton(self.lineButton)
            self.hlayout.addWidget(self.lineButton)
            self.button_list.append(self.lineButton)

        if flags & constant.FREEPEN:
            self.freePenButton = QPushButton(self)
            self.freePenButton.setIcon(QIcon(":/resource/icon/pen.png"))
            self.freePenButton.setFixedSize(self.iconWidth, self.iconHeight)
            self.freePenButton.setCheckable(True)
            self.drawButtonGroup.addButton(self.freePenButton)
            self.hlayout.addWidget(self.freePenButton)
            self.button_list.append(self.freePenButton)

        if flags & constant.TEXT:
            self.textButton = QPushButton(self)
            self.textButton.setIcon(QIcon(":/resource/icon/text.png"))
            self.textButton.setFixedSize(self.iconWidth, self.iconHeight)
            self.textButton.setCheckable(True)
            self.drawButtonGroup.addButton(self.textButton)
            self.hlayout.addWidget(self.textButton)
            self.button_list.append(self.textButton)

        self.drawButtonGroup.buttonClicked.connect(self.buttonToggled)

    def initOtherButtons(self, flags):
        # other action buttons
        if len(self.button_list) != 0:
            self.separator1 = QFrame(self)
            self.separator1.setFrameShape(QFrame.VLine)
            self.separator1.setFrameShadow(QFrame.Sunken)
            self.hlayout.addWidget(self.separator1)

            self.undoButton = QPushButton(self)
            self.undoButton.setIcon(QIcon(":/resource/icon/undo.png"))
            self.undoButton.setFixedSize(self.iconWidth, self.iconWidth)
            self.undoButton.clicked.connect(self.otherButtonsClicked)
            self.hlayout.addWidget(self.undoButton)

        if flags & constant.SAVE_TO_FILE:
            self.saveButton = QPushButton(self)
            self.saveButton.setIcon(QIcon(":/resource/icon/save.png"))
            self.saveButton.setFixedSize(self.iconWidth, self.iconHeight)
            self.saveButton.clicked.connect(self.otherButtonsClicked)
            self.hlayout.addWidget(self.saveButton)

        self.separator2 = QFrame(self)
        self.separator2.setFrameShape(QFrame.VLine)
        self.separator2.setFrameShadow(QFrame.Sunken)
        self.hlayout.addWidget(self.separator2)

        self.cancelButton = QPushButton(self)
        self.cancelButton.setIcon(QIcon(":/resource/icon/close.png"))
        self.cancelButton.setFixedSize(self.iconWidth, self.iconHeight)
        self.cancelButton.clicked.connect(self.otherButtonsClicked)

        if flags & constant.CLIPBOARD:
            self.okButton = QPushButton(self)
            self.okButton.setIcon(QIcon(":/resource/icon/check.png"))
            self.okButton.setFixedSize(self.iconWidth, self.iconHeight)
            self.okButton.clicked.connect(self.otherButtonsClicked)
            self.hlayout.addWidget(self.okButton)

        self.hlayout.addWidget(self.cancelButton)

    def initWindow(self, flags):
        self.hlayout = QHBoxLayout()
        self.hlayout.setSpacing(2)
        self.hlayout.setContentsMargins(10, 2, 10, 2)
        self.setLayout(self.hlayout)

        self.initDrawButtons(flags)
        self.initOtherButtons(flags)

    # slots
    def buttonToggled(self, button):
        """
        :type button: QPushButton
        :param button:
        :return:
        """
        if button == self.rectButton:
            self.trigger.emit(ACTION_RECT)
        elif button == self.ellipseButton:
            self.trigger.emit(ACTION_ELLIPSE)
        elif button == self.arrowButton:
            self.trigger.emit(ACTION_ARROW)
        elif button == self.lineButton:
            self.trigger.emit(ACTION_LINE)
        elif button == self.freePenButton:
            self.trigger.emit(ACTION_FREEPEN)
        elif button == self.textButton:
            self.trigger.emit(ACTION_TEXT)
        else:
            pass

    def otherButtonsClicked(self):
        if self.sender() == self.undoButton:
            self.trigger.emit(ACTION_UNDO)
        elif self.sender() == self.cancelButton:
            self.trigger.emit(ACTION_CANCEL)
        elif self.sender() == self.okButton:
            self.trigger.emit(ACTION_SURE)
        elif self.sender() == self.saveButton:
            self.trigger.emit(ACTION_SAVE)
Beispiel #5
0
    def _build_ui(self):
        layout = QGridLayout()

        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)

        self.tree = QTreeWidget()
        self.tree.setSelectionMode(QTreeWidget.ExtendedSelection)
        self.tree.setHeaderLabels([
            "name", "status", "server", "prioritize", "kill", "delete",
            "browse"
        ])
        self.tree.setUniformRowHeights(True)

        self.tree.setColumnWidth(0, 150)
        layout.addWidget(self.tree, 0, 0, 6, 1, Qt.AlignTop)

        row = 0

        pause_button = QPushButton(
            "pause new jobs"
            if not self.session.seqcrow_job_manager.paused else "resume jobs")
        pause_button.setCheckable(True)
        pause_button.clicked.connect(lambda check: pause_button.setText(
            "pause new jobs" if not check else "resume jobs"))
        pause_button.setChecked(self.session.seqcrow_job_manager.paused)
        pause_button.clicked.connect(self.pause_queue)
        layout.addWidget(pause_button, row, 1, 1, 1, Qt.AlignTop)

        row += 1

        open_button = QPushButton("open structure")
        open_button.clicked.connect(self.open_jobs)
        layout.addWidget(open_button, row, 1, 1, 1, Qt.AlignTop)

        row += 1

        log_button = QPushButton("log")
        log_button.clicked.connect(self.open_log)
        layout.addWidget(log_button, row, 1, 1, 1, Qt.AlignTop)

        row += 1

        output_button = QPushButton("raw output")
        output_button.clicked.connect(self.open_output)
        layout.addWidget(output_button, row, 1, 1, 1, Qt.AlignTop)

        row += 1

        refresh_button = QToolButton()
        refresh_button.setSizePolicy(QSizePolicy.Fixed,
                                     QSizePolicy.MinimumExpanding)
        refresh_button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        refresh_button.setIcon(
            QIcon(refresh_button.style().standardIcon(
                QStyle.SP_BrowserReload)))
        refresh_button.setText('check jobs')
        refresh_button.clicked.connect(
            lambda *args: self.session.seqcrow_job_manager.triggers.
            activate_trigger(JOB_QUEUED, "refresh"))
        layout.addWidget(refresh_button, row, 1, 1, 1, Qt.AlignTop)

        row += 1

        for i in range(0, row - 1):
            layout.setRowStretch(i, 0)

        layout.setRowStretch(row - 1, 1)
        layout.setColumnStretch(0, 1)
        layout.setColumnStretch(1, 0)

        self.tool_window.ui_area.setLayout(layout)

        self.tool_window.manage(None)
class PenSetWidget(QWidget):

    penSizeTrigger = Signal(int)
    penColorTrigger = Signal(str)
    fontChangeTrigger = Signal(QFont)

    def __init__(self, parent=None):
        super(PenSetWidget, self).__init__(parent)

        self.paddingX = 5
        self.paddingY = 2
        self.iconWidth = self.iconHeight = 24
        self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
        self.setWindowFlags(Qt.ToolTip)

        self.initWindows()

        self.prevSizeButton = self.penSize1
        self.penSize1.setChecked(True)
        self.presentColor.setStyleSheet(
            'QPushButton { background-color: %s; }' % PENCOLOR)

    def generateButtons(self, parent=None):
        """ Generate buttons due to colorDic """
        self.colorButtons = []
        for color in self.colorList:
            button = QPushButton(parent)
            button.setObjectName(color[0])
            button.setStyleSheet('QPushButton { background-color: %s; }' %
                                 color[1])
            button.setFixedSize(self.iconWidth / 2, self.iconHeight / 2)
            button.setCheckable(True)
            self.colorButtons.append(button)

    def initWindows(self):
        self.mainLayout = QHBoxLayout()
        self.setLayout(self.mainLayout)
        self.mainLayout.setSpacing(0)
        self.mainLayout.setContentsMargins(5, 2, 5, 2)

        self.initPenSizeButtons()
        self.initFontWidget()
        self.initPenColorButtons()

        self.separator = QFrame(self)
        self.separator.setFrameShape(QFrame.VLine)
        self.separator.setFrameShadow(QFrame.Sunken)

        self.mainLayout.addWidget(self.penSize)
        self.mainLayout.addWidget(self.changeFontButton)
        self.mainLayout.addWidget(self.separator)

        self.mainLayout.addWidget(self.colorSet)

    def initPenSizeButtons(self):
        self.penSize = QWidget(self)
        self.penSizeLayout = QHBoxLayout()
        self.penSize.setLayout(self.penSizeLayout)
        # adjust pen size
        self.penSize1 = QPushButton(self.penSize)
        self.penSize1.setIcon(QIcon(":/resource/icon/pensize1.png"))
        self.penSize1.setObjectName('1')
        self.penSize1.setFixedSize(self.iconWidth, self.iconHeight)
        self.penSize1.setCheckable(True)

        self.penSize2 = QPushButton(self.penSize)
        self.penSize2.setIcon(QIcon(":/resource/icon/pensize2.png"))
        self.penSize2.setObjectName('2')
        self.penSize2.setFixedSize(self.iconWidth, self.iconHeight)
        self.penSize2.setCheckable(True)

        self.penSize3 = QPushButton(self.penSize)
        self.penSize3.setIcon(QIcon(":/resource/icon/pensize3.png"))
        self.penSize3.setObjectName('3')
        self.penSize3.setFixedSize(self.iconWidth, self.iconHeight)
        self.penSize3.setCheckable(True)

        self.sizeButtonGroup = QButtonGroup(self.penSize)
        self.sizeButtonGroup.addButton(self.penSize1)
        self.sizeButtonGroup.addButton(self.penSize2)
        self.sizeButtonGroup.addButton(self.penSize3)
        self.sizeButtonGroup.buttonClicked.connect(self.sizeButtonToggled)

        self.penSizeLayout.addWidget(self.penSize1)
        self.penSizeLayout.addWidget(self.penSize2)
        self.penSizeLayout.addWidget(self.penSize3)

        self.penSizeLayout.setSpacing(5)
        self.penSizeLayout.setContentsMargins(0, 0, 0, 0)

    def initPenColorButtons(self):
        self.colorSet = QWidget(self)
        self.colorLayout = QHBoxLayout()
        self.colorLayout.setSpacing(5)
        self.colorLayout.setContentsMargins(5, 0, 5, 0)
        self.colorSet.setLayout(self.colorLayout)

        self.presentColor = QPushButton(self.colorSet)
        self.presentColor.setFixedSize(self.iconWidth, self.iconHeight)
        self.presentColor.setEnabled(False)

        # adjust pen color

        self.colorPick = QWidget(self.colorSet)
        self.colorGrid = QGridLayout()
        self.colorGrid.setSpacing(0)
        self.colorGrid.setContentsMargins(5, 0, 5, 0)
        self.colorPick.setLayout(self.colorGrid)

        self.colorList = [('white', '#ffffff'), ('red', '#ff0000'),
                          ('green', '#00ff00'), ('blue', '#0000ff'),
                          ('cyan', '#00ffff'), ('magenta', '#ff00ff'),
                          ('yellow', '#ffff00'), ('gray', '#a0a0a4'),
                          ('black', '#000000'), ('darkRed', '#800000'),
                          ('darkGreen', '#008000'), ('darkBlue', '#000080'),
                          ('darkCyan', '#008080'), ('darkMagenta', '#800080'),
                          ('darkYellow', '#808000'), ('darkGray', '#808080')]

        self.generateButtons()

        self.colorButtonGroup = QButtonGroup(self)
        for button in self.colorButtons:
            self.colorButtonGroup.addButton(button)
        self.colorButtonGroup.buttonClicked.connect(self.colorButtonToggled)

        # set the layout
        tmp = 0
        for x in range(0, 2):
            for y in range(0, int(len(self.colorList) / 2)):
                self.colorGrid.addWidget(self.colorButtons[tmp], x, y)
                tmp += 1

        self.colorGrid.setSpacing(0)
        self.colorGrid.setContentsMargins(0, 0, 0, 0)

        self.colorLayout.addWidget(self.presentColor)
        self.colorLayout.addWidget(self.colorPick)

    def initFontWidget(self):
        self.fontDialog = QFontDialog()
        self.changeFontButton = QPushButton(self)
        self.fontDialog.setCurrentFont(QFont('Sans serif'))
        self.changeFontButton.setText('{0} {1}'.format(
            self.fontDialog.currentFont().family(),
            self.fontDialog.currentFont().pointSize()))
        self.changeFontButton.clicked.connect(self.fontButtonClicked)

    def showFontWidget(self):
        self.changeFontButton.show()
        self.penSize1.hide()
        self.penSize2.hide()
        self.penSize3.hide()

    def showPenWidget(self):
        self.changeFontButton.hide()
        self.penSize1.show()
        self.penSize2.show()
        self.penSize3.show()

    # slots
    def colorButtonToggled(self, button):
        self.presentColor.setStyleSheet(
            'QPushButton { background-color: %s; }' % button.objectName())
        self.penColorTrigger.emit(button.objectName())

    def sizeButtonToggled(self, button):
        self.penSizeTrigger.emit(int(button.objectName()) * 2)

    def fontButtonClicked(self):
        ok = True
        font = QFontDialog.getFont(self)
        if font[1]:
            self.changeFontButton.setText('{0} {1}'.format(
                font[0].family(), font[0].pointSize()))
            self.fontChangeTrigger.emit(font[0])
Beispiel #7
0
    def __init__(self, *args, initial_elements=[], select_multiple=True, **kwargs):
        super().__init__(*args, **kwargs)
        
        layout = QGridLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        
        self._elements = {ele: ElementButton(ele) for ele in ELEMENTS if not any(ele == x for x in ['Bq', 'X'])}
        for ele in self._elements.keys():
            self._elements[ele].setTristate(False)
            if select_multiple:
                self._elements[ele].stateChanged.connect(lambda state, ele=ele: self.elementSelectionChanged.emit())
            else:
                self._elements[ele].stateChanged.connect(lambda state, ele=ele: self._single_ele_clicked(state, ele))
        
        elements_widget = QWidget()
        elements_layout = QGridLayout(elements_widget)
        elements_layout.setContentsMargins(0, 0, 0, 0)

        elements_layout.addWidget(self._elements['H'],  0,  0, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['He'], 0, 17, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Li'], 1,  0, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Be'], 1,  1, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['B'],  1, 12, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['C'],  1, 13, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['N'],  1, 14, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['O'],  1, 15, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['F'],  1, 16, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ne'], 1, 17, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Na'], 2,  0, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Mg'], 2,  1, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Al'], 2, 12, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Si'], 2, 13, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['P'],  2, 14, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['S'],  2, 15, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Cl'], 2, 16, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ar'], 2, 17, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['K'],  3,  0, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ca'], 3,  1, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Sc'], 3,  2, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ti'], 3,  3, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['V'],  3,  4, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Cr'], 3,  5, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Mn'], 3,  6, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Fe'], 3,  7, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Co'], 3,  8, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ni'], 3,  9, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Cu'], 3, 10, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Zn'], 3, 11, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ga'], 3, 12, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ge'], 3, 13, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['As'], 3, 14, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Se'], 3, 15, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Br'], 3, 16, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Kr'], 3, 17, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Rb'], 4,  0, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Sr'], 4,  1, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Y'],  4,  2, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Zr'], 4,  3, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Nb'], 4,  4, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Mo'], 4,  5, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Tc'], 4,  6, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ru'], 4,  7, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Rh'], 4,  8, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Pd'], 4,  9, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ag'], 4, 10, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Cd'], 4, 11, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['In'], 4, 12, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Sn'], 4, 13, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Sb'], 4, 14, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Te'], 4, 15, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['I'],  4, 16, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Xe'], 4, 17, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Cs'], 5,  0, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ba'], 5,  1, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Hf'], 5,  3, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ta'], 5,  4, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['W'],  5,  5, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Re'], 5,  6, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Os'], 5,  7, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ir'], 5,  8, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Pt'], 5,  9, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Au'], 5, 10, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Hg'], 5, 11, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Tl'], 5, 12, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Pb'], 5, 13, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Bi'], 5, 14, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Po'], 5, 15, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['At'], 5, 16, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Rn'], 5, 17, Qt.AlignLeft | Qt.AlignTop)
        if 'Fr' in ELEMENTS:
            elements_layout.addWidget(self._elements['Fr'], 6,  0, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Ra'], 6,  1, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Rf'], 6,  3, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Db'], 6,  4, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Sg'], 6,  5, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Bh'], 6,  6, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Hs'], 6,  7, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Mt'], 6,  8, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Ds'], 6,  9, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Rg'], 6, 10, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Cn'], 6, 11, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Nh'], 6, 12, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Fl'], 6, 13, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Mc'], 6, 14, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Lv'], 6, 15, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Ts'], 6, 16, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Og'], 6, 17, Qt.AlignLeft | Qt.AlignTop)
        
        elements_layout.addWidget(self._elements['La'], 7,  2, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ce'], 7,  3, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Pr'], 7,  4, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Nd'], 7,  5, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Pm'], 7,  6, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Sm'], 7,  7, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Eu'], 7,  8, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Gd'], 7,  9, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Tb'], 7, 10, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Dy'], 7, 11, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Ho'], 7, 12, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Er'], 7, 13, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Tm'], 7, 14, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Yb'], 7, 15, Qt.AlignLeft | Qt.AlignTop)
        elements_layout.addWidget(self._elements['Lu'], 7, 16, Qt.AlignLeft | Qt.AlignTop)
        if 'Ac' in ELEMENTS:
            elements_layout.addWidget(self._elements['Ac'], 8,  2, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Th'], 8,  3, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Pa'], 8,  4, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['U'],  8,  5, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Np'], 8,  6, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Pu'], 8,  7, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Am'], 8,  8, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Cm'], 8,  9, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Bk'], 8, 10, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Cf'], 8, 11, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Es'], 8, 12, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Fm'], 8, 13, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Md'], 8, 14, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['No'], 8, 15, Qt.AlignLeft | Qt.AlignTop)
            elements_layout.addWidget(self._elements['Lr'], 8, 16, Qt.AlignLeft | Qt.AlignTop)
        
        if select_multiple:
            organic_button = QPushButton("organic chemists'")
            organic_button.setCheckable(True)
            organic_button.clicked.connect(self._select_ochem)
            #layout.addWidget(organic_button, 9, col, Qt.AlignTop)        
    
            z_lt_37_button = QPushButton("H-Kr")
            z_lt_37_button.setCheckable(True)
            z_lt_37_button.clicked.connect(self._select_z_lt_37)
            layout.addWidget(z_lt_37_button, 9, 0, Qt.AlignTop)        
    
            z_ge_37_button = QPushButton("row 5+")
            z_ge_37_button.setCheckable(True)
            z_ge_37_button.clicked.connect(self._select_z_ge_37)
            layout.addWidget(z_ge_37_button, 9, 1, Qt.AlignTop)
    
            z_le_86_button = QPushButton("H-Rn")
            z_le_86_button.setCheckable(True)
            z_le_86_button.clicked.connect(self._select_z_le_86)
            layout.addWidget(z_le_86_button, 9, 2, Qt.AlignTop)
    
            tm_button = QPushButton("transition metals")
            tm_button.setCheckable(True)
            tm_button.clicked.connect(self._select_tm)
            layout.addWidget(tm_button, 9, 3, Qt.AlignTop)       
    
            all_button = QPushButton("all")
            all_button.clicked.connect(self._select_all)
            all_button.clicked.connect(lambda *args: organic_button.setChecked(False))
            all_button.clicked.connect(lambda *args: tm_button.setChecked(False))        
            all_button.clicked.connect(lambda *args: organic_button.setChecked(False))
            all_button.clicked.connect(lambda *args: z_lt_37_button.setChecked(False))
            all_button.clicked.connect(lambda *args: z_ge_37_button.setChecked(False))
            all_button.clicked.connect(lambda *args: z_le_86_button.setChecked(False))
            layout.addWidget(all_button, 10, 0, Qt.AlignTop)
            
            invert = QPushButton("invert")
            invert.clicked.connect(self._invert)
            invert.clicked.connect(lambda *args: organic_button.setChecked(False))
            invert.clicked.connect(lambda *args: tm_button.setChecked(False))        
            invert.clicked.connect(lambda *args: organic_button.setChecked(False))
            invert.clicked.connect(lambda *args: z_lt_37_button.setChecked(False))
            invert.clicked.connect(lambda *args: z_ge_37_button.setChecked(False))
            invert.clicked.connect(lambda *args: z_le_86_button.setChecked(False))
            layout.addWidget(invert, 10, 2, Qt.AlignTop)
    
            clear = QPushButton("clear")
            clear.clicked.connect(self._clear)
            clear.clicked.connect(lambda *args: organic_button.setChecked(False))
            clear.clicked.connect(lambda *args: tm_button.setChecked(False))        
            clear.clicked.connect(lambda *args: organic_button.setChecked(False))
            clear.clicked.connect(lambda *args: z_lt_37_button.setChecked(False))
            clear.clicked.connect(lambda *args: z_ge_37_button.setChecked(False))
            clear.clicked.connect(lambda *args: z_le_86_button.setChecked(False))
            layout.addWidget(clear, 10, 1, Qt.AlignTop)
    
            reset = QPushButton("reset")
            reset.clicked.connect(self._reset)
            reset.clicked.connect(lambda *args: organic_button.setChecked(False))
            reset.clicked.connect(lambda *args: tm_button.setChecked(False))        
            reset.clicked.connect(lambda *args: organic_button.setChecked(False))
            reset.clicked.connect(lambda *args: z_lt_37_button.setChecked(False))
            reset.clicked.connect(lambda *args: z_ge_37_button.setChecked(False))
            reset.clicked.connect(lambda *args: z_le_86_button.setChecked(False))
            layout.addWidget(reset, 10, 3, Qt.AlignTop)
            
            layout.addWidget(elements_widget, 0, 0, 7, 4, Qt.AlignLeft | Qt.AlignTop)
    
            self.setSelectedElements(initial_elements)
            self._initial_elements = initial_elements
    
            layout.setRowStretch(0, 0)
            layout.setRowStretch(1, 0)
            layout.setRowStretch(2, 0)
            layout.setRowStretch(3, 0)
            layout.setRowStretch(4, 0)
            layout.setRowStretch(5, 0)
            layout.setRowStretch(6, 0)
            layout.setRowStretch(7, 0)
            layout.setRowStretch(8, 0)
            layout.setRowStretch(9, 0)
            layout.setRowStretch(10, 1)
            layout.setColumnStretch(0, 0)
            layout.setColumnStretch(1, 1)
            layout.setColumnStretch(2, 1)
            layout.setColumnStretch(3, 1)
        
        else:
            layout.addWidget(elements_widget)
            if len(initial_elements) > 0:
                self.setSelectedElements([initial_elements[0]])
                self._initial_elements = [initial_elements[0]]