def getColorPolygonAndBrushStyle(
            initial_color: Union[QColor, Qt.GlobalColor, QGradient] = QColor(),
            initial_polygon: NodePolygon = NodePolygon.Circle,
            initial_brushstyle: Qt.BrushStyle = Qt.NoBrush,
            parent: Optional[QWidget] = None, title: str = '',
            options: Union[QColorDialog.ColorDialogOptions,
                           QColorDialog.ColorDialogOption] = QColorDialog.ColorDialogOptions()) \
            -> (QColor, NodePolygon):

        dlg = QColorDialog(parent)

        # Add buttons to select polygon
        polygons_group = QButtonGroup(parent)
        polygons_layout = QHBoxLayout(parent)
        for p in NodePolygon:
            if p == NodePolygon.Custom:
                continue

            button = QToolButton(parent)
            button.setCheckable(True)
            button.setText(p.name)
            button.setIcon(QIcon(nodePolygonToPixmap(p, button.iconSize())))

            if p == initial_polygon:
                button.setChecked(True)
            polygons_group.addButton(button)
            polygons_group.setId(button, p.value)
            polygons_layout.addWidget(button)
        dlg.layout().insertLayout(dlg.layout().count()-1, polygons_layout)

        # Add buttons to select brush style
        brushstyle_group = QButtonGroup(parent)
        brushstyle_layout = QHBoxLayout(parent)
        for p in NODE_BRUSH_STYLES:
            button = QToolButton(parent)
            button.setCheckable(True)
            button.setIcon(QIcon(nodeBrushStyleToPixmap(p, button.iconSize())))

            if p == initial_brushstyle:
                button.setChecked(True)
            brushstyle_group.addButton(button)
            brushstyle_group.setId(button, p)
            brushstyle_layout.addWidget(button)
        dlg.layout().insertLayout(dlg.layout().count()-1, brushstyle_layout)

        if title:
            dlg.setWindowTitle(title)
        dlg.setOptions(options)
        dlg.setCurrentColor(initial_color)
        dlg.exec_()
        return (dlg.selectedColor(),
                NodePolygon(polygons_group.checkedId()),
                brushstyle_group.checkedId(),
                )
    def _add_button(self, parent, index, button_info):
        if hasattr(parent, '_title'):
            self._adjust_title(parent)

        # split title into two lines if long
        orig_title = button_info.title
        title = orig_title
        if '\n' not in title and len(title) > 6:
            title = split_title(title)

        if button_info.highlight_icon is None:
            icon = button_info.icon
        else:
            icon = button_info.highlight_icon

        if not button_info.group:
            group_first = group_follow = False
        else:
            buttons = self._groups.setdefault(parent, {})
            group_first = button_info.group not in buttons  # first button in drop down
            group_follow = not group_first  # subsequent buttons
        if not group_follow:
            b = QToolButton(parent)
            if button_info.vr_mode is not None:
                b.vr_mode = button_info.vr_mode
            b.setAutoRaise(True)
            if icon is None:
                style = Qt.ToolButtonTextOnly
            else:
                if not self.show_button_titles:
                    style = Qt.ToolButtonIconOnly
                elif self.compact:
                    style = Qt.ToolButtonTextBesideIcon
                else:
                    style = Qt.ToolButtonTextUnderIcon
            b.setToolButtonStyle(style)
        if icon is None:
            action = QAction(title)
        else:
            action = QAction(icon, title)
        if button_info.description:
            action.setToolTip(button_info.description)
        if button_info.callback is not None:
            action.triggered.connect(button_info.callback)
        actions = self._actions.setdefault(orig_title, [])
        actions.append(action)
        if group_follow:
            button = self._groups[parent][button_info.group]
            button.addAction(action)
        else:
            if not group_first:
                b.setDefaultAction(action)
            else:
                b.setPopupMode(b.MenuButtonPopup)
                b.triggered.connect(
                    lambda action, b=b: self._update_button_action(b, action))
                self._groups[parent][button_info.group] = b
                b.addAction(action)
                self._update_button_action(b, action)

        # print('Font height:', b.fontMetrics().height())  # DEBUG
        # print('Font size:', b.fontInfo().pixelSize())  # DEBUG
        # print('Icon size:', b.iconSize())  # DEBUG
        if not group_follow:
            if self.compact:
                row = index % self.compact_height
                if row < self.compact_height:
                    parent._layout.setRowStretch(row, 1)
                column = index // self.compact_height
                parent._layout.addWidget(b, row, column,
                                         Qt.AlignLeft | Qt.AlignVCenter)
            else:
                if not self.show_button_titles or button_info.icon is None:
                    align = Qt.AlignCenter
                else:
                    align = Qt.AlignTop
                b.setIconSize(2 * b.iconSize())
                parent._layout.addWidget(b, 0, index, align)
        global _debug
        if _debug:
            _debug = False
            policy = b.sizePolicy()
            print('expanding:', int(policy.expandingDirections()))
            print('horizontal policy:', policy.horizontalPolicy())
            print('horizontal stretch:', policy.horizontalStretch())
            print('vertical policy:', policy.verticalPolicy())
            print('vertical stretch:', policy.verticalStretch())