Beispiel #1
0
class TabBar(ComboTabBar):
    _s_tabMetrics = None
    MIMETYPE = 'application/app.tabbar.tab'

    @classmethod
    def tabMetrics(cls):
        if not cls._s_tabMetrics:
            cls._s_tabMetrics = TabBarTabMetrics()
        return cls._s_tabMetrics

    def __init__(self, window, tabWidget):
        '''
        @param: window BrowserWindow
        @param: tabWidget TabWidget
        '''
        super(TabBar, self).__init__()
        self._window = window
        self._tabWidget = tabWidget
        self._hideTabBarWithOneTab = False
        self._showCloseOnInactive = False
        self._normalTabWidth = 0
        self._activeTabWidth = 0
        self._dragStartPosition = QPoint()  # QPoint
        self._forceHidden = False
        self._lastTab = None  # QPointer<WebTab>

        self.setObjectName('tabbar')
        self.setElideMode(Qt.ElideRight)
        self.setFocusPolicy(Qt.NoFocus)
        self.setTabsCloseable(False)
        self.setMouseTracking(True)
        self.setDocumentModel(True)
        self.setAcceptDrops(True)
        self.setDrawBase(False)
        self.setMovable(True)

        self.currentChanged.connect(self._currentTabChanged)

        # ComboTabBar features
        self.setUsesScrollButtons(True)
        self.setCloseButtonsToolTip(_('Close Tab'))
        self.overFlowChanged.connect(self._overflowChanged)

        self.tabMetrics().init()

        if gVar.app.isPrivate():
            privateBrowsing = QLabel(self)
            privateBrowsing.setObjectName('private-browsing-icon')
            privateBrowsing.setPixmap(
                IconProvider.privateBrowsingIcon().pixmap(16))
            privateBrowsing.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            privateBrowsing.setFixedWidth(30)
            self.addCornerWidget(privateBrowsing, Qt.TopLeftCorner)

    def loadSettings(self):
        settings = Settings()
        settings.beginGroup('Browser-Tabs-Settings')
        self._hideTabBarWithOneTab = settings.value('hideTabsWithOneTab',
                                                    False)
        activateLastTab = settings.value('ActivateLastTabWhenCloseActual',
                                         False)
        self._showCloseOnInactive = settings.value('showCloseOnInactiveTabs',
                                                   0)
        settings.endGroup()

        self.setSelectionBehaviorOnRemove(
            activateLastTab and QTabBar.SelectPreviousTab
            or QTabBar.SelectRightTab)
        self.setVisible(not (self.count() <= 1 and self._hideTabBarWithOneTab))

        self.setUpLayout()

    def tabWidget(self):
        return self._tabWidget

    # override
    def setVisible(self, visible):
        if self._forceHidden:
            super(TabBar, self).setVisible(False)
            return

        # Make sure to honor use preference
        if visible:
            visible = not (self.count() <= 1 and self._hideTabBarWithOneTab)

        super(TabBar, self).setVisible(visible)

    def setForceHidden(self, hidden):
        self._forceHidden = hidden
        self.setVisible(not self._forceHidden)

    def setTabText(self, index, text):
        tabText = text

        # Avoid Alt+letter shortcuts
        tabText.replace('&', '&&')

        tab = self.webTab(index)
        if tab and tab.isPinned():
            tabText = ''

        self.setTabToolTip(index, text)
        super(TabBar, self).setTabText(index, tabText)

    # override
    def wheelEvent(self, event):
        if gVar.app.plugins().processWheelEvent(const.ON_TabBar, self, event):
            return

        super().wheelEvent(event)

    # Q_SIGNALS
    moveAddTabButton = pyqtSignal(int)  # posX

    # private Q_SLOTS
    def _currentTabChanged(self, index):
        if not self.validIndex(index):
            return

        # Don't hide close buttons when dragging tabs
        if self._dragStartPosition.isNull():
            self._showCloseButton(index)
            if self._lastTab:
                self._hideCloseButton(self._lastTab.tabIndex())
            QTimer.singleShot(100, self.ensureVisible)

        self._lastTab = self.webTab(index)
        self._tabWidget.currentTabChanged(index)

    def _overflowChanged(self, overflowed):
        # Make sure close buttons on inactive tabs are hidden
        # This is needed for when leaving fullscreen from non-overflowed to
        # overflowed state
        if overflowed and self._showCloseOnInactive != 1:
            self.setTabsCloseable(False)
            self._showCloseButton(self.currentIndex())

    #def _closeTabFromButton(self):
    #    pass

    # private:
    def _validIndex(self, index):
        return index > 0 and index < self.count()

    # override
    def _tabInserted(self, index):
        # Initialize pinned tab metrics
        if self.tabMetrics()._pinnedWidth() == -1:

            def tabInsertedFunc():
                if self.tabMetrics()._pinnedWidth() != -1:
                    return
                w = self.tabButton(0, self.iconButtonPosition())
                if w and w.parentWidget():
                    # QRect
                    wg = w.parentWidget().geometry()
                    wr = QStyle.visualRect(self.layoutDirection(), wg,
                                           w.geometry())
                    self.tabMetrics().setPinnedWidth(
                        self.iconButtonSize().width() + wr.x() * 2)
                    self.setUpLayout()

            QTimer.singleShot(0, tabInsertedFunc)

    # override
    def _tabRemoved(self, index):
        self._showCloseButton(self.currentIndex())
        self.setVisible(not (self.count() <= 1 and self._hideTabBarWithOneTab))

        # Make sure to move add tab button to correct position when where are no
        # normal tabs
        if self.normalTabsCount() == 0:
            xForAddTabButton = self.cornerWidth(
                Qt.TopLeftCorner) + self._pinTabBarWidth()
            if QApplication.layoutDirection() == Qt.RightToLeft:
                xForAddTabButton = self.width() - xForAddTabButton
            self.moveAddTabButton.emit(xForAddTabButton)

    def _hideCloseButton(self, index):
        if not self.validIndex(index) or self.tabsCloseable():
            return

        button = self.tabButton(index, self.closeButtonPosition())
        if not isinstance(button, CloseButton):
            return

        self.setTabButton(index, self.closeButtonPosition(), None)
        button.deleteLater()

    def _showCloseButton(self, index):
        if not self.validIndex(index):
            return

        # WebTab
        webTab = self._tabWidget.widget(index)
        button = self.tabButton(index, self.closeButtonPosition())

        if button or (webTab and webTab.isPinned()):
            return

        self.insertCloseButton(index)

    def _updatePinnedTabCloseButton(self, index):
        if not self.validIndex(index):
            return

        webTab = self._tabWidget.widget(index)
        button = self.tabButton(index, self.closeButtonPosition())
        pinned = webTab.isPinned()

        if pinned:
            if button:
                button.hide()
        else:
            if button:
                button.show()
            else:
                self._showCloseButton(index)

    # override
    def contextMenuEvent(self, event):
        '''
        @param: event QContextMenuEvent
        '''
        if self.isDragInProgress():
            return

        index = self.tabAt(event.pos())

        menu = TabContextMenu(index, self._window)

        # Prevent choosing first option with double rightclick
        pos = event.globalPos()
        p = QPoint(pos.x(), pos.y() + 1)
        menu.exec_(p)

    # override
    def mouseDoubleClickEvent(self, event):
        '''
        @param: event QMouseEvent
        '''
        if gVar.app.plugins().processMouseDoubleClick(const.ON_TabBar, self,
                                                      event):
            return

        if event.buttons() == Qt.LeftButton and self.emptyArea(event.pos()):
            self._tabWidget.addViewByUrl(QUrl(), const.NT_SelectedTabAtTheEnd,
                                         True)
            return

        super().mouseDoubleClickEvent(event)

    # override
    def mousePressEvent(self, event):
        '''
        @param: event QMouseEvent
        '''
        super().mousePressEvent(event)

        if gVar.app.plugins().processMousePress(const.ON_TabBar, self, event):
            return

        if event.buttons() == Qt.LeftButton and not self.emptyArea(
                event.pos()):
            self._dragStartPosition = event.pos()
        else:
            self._dragStartPosition = QPoint()

    # override
    def mouseMoveEvent(self, event):
        '''
        @param: event QMouseEvent
        '''
        super().mouseMoveEvent(event)

        if gVar.app.plugins().processMouseMove(const.ON_TabBar, self, event):
            return

        if self.count() == 1 and gVar.app.windowCount() == 1:
            return

        if not self._dragStartPosition.isNull():
            offset = 0
            eventY = event.pos().y()
            if eventY < 0:
                offset = abs(eventY)
            elif eventY > self.height():
                offset = eventY - self.height()
            if offset > QApplication.startDragDistance() * 3:
                global_ = self.mapToGlobal(self._dragStartPosition)
                w = QApplication.widgetAt(global_)
                if w:
                    mouse = QMouseEvent(QEvent.MouseButtonRelease,
                                        w.mapFromGlobal(global_),
                                        Qt.LeftButton, Qt.LeftButton,
                                        event.modifiers())
                    QApplication.sendEvent(w, mouse)
                drag = QDrag(self)
                mime = QMimeData()
                mime.setData(self.MIMETYPE, b'')
                drag.setMimeData(mime)
                drag.setPixmap(self.tabPixmap(self.currentIndex()))
                if drag.exec_() == Qt.IgnoreAction:
                    self._tabWidget.detachTabByIndex(self.currentIndex())
                return

    # override
    def mouseReleaseEvent(self, event):
        '''
        @param: event QMouseEvent
        '''
        super().mouseReleaseEvent(event)

        self._dragStartPosition = QPoint()

        if gVar.app.plugins().processMouseRelease(const.ON_TabBar, self,
                                                  event):
            return

        if not self.rect().contains(event.pos()):
            return

        if event.button() == Qt.MiddleButton:
            if self.emptyArea(event.pos()):
                self._tabWidget.addViewByUrl(QUrl(),
                                             const.NT_SelectedTabAtTheEnd,
                                             True)
                return

            id_ = self.tabAt(event.pos())
            if id_ != -1:
                self._tabWidget.requestCloseTab(id_)
                return

    _NoAction = 0
    _SelectTab = 1
    _PrependTab = 2
    _AppendTab = 3

    @classmethod
    def tabDropAction(cls, pos, tabRect, allowSelect):
        if not tabRect.contains(pos):
            return cls._NoAction

        # QPoint
        c = tabRect.center()
        # QSize
        csize = QSize(tabRect.width() * 0.7, tabRect.height() * 0.7)
        center = QRect(c.x() - csize.width() // 2,
                       c.y() - csize.height() // 2, csize.width(),
                       csize.height())

        if allowSelect and center.contains(pos):
            return cls._SelectTab
        elif pos.x() < c.x():
            return cls._PrependTab
        else:
            return cls._AppendTab

    # override
    def dragEnterEvent(self, event):
        '''
        @param: event QDragEnterEvent
        '''
        # QMimeData
        mime = event.mimeData()

        if mime.hasText() or mime.hasUrls() or (mime.hasFormat(self.MIMETYPE)
                                                and event.source()):
            event.acceptProposedAction()
            return

        super().dragEnterEvent(event)

    # override
    def dragMoveEvent(self, event):
        '''
        @param: event QDragMoveEvent
        '''
        index = self.tabAt(event.pos())
        mime = event.mimeData()

        if index == -1:
            super().dragMoveEvent(event)
            return

        dropAction = self.tabDropAction(event.pos(), self.tabRect(index),
                                        not mime.hasFormat(self.MIMETYPE))
        if dropAction == self._PrependTab:
            self.showDropIndicator(index, self.BeforTab)
        elif dropAction == self._AppendTab:
            self.showDropIndicator(index, self.AfterTab)
        else:
            self.clearDropIndicator()

    # override
    def dragLeaveEvent(self, event):
        '''
        @param: event QDragLeaveEvent
        '''
        self.clearDropIndicator()

        super().dragLeaveEvent(event)

    # override
    def dropEvent(self, event):  # noqa C901
        '''
        @param: event QDropEvent
        '''
        self.clearDropIndicator()

        mime = event.mimeData()

        if not mime.hasText() and not mime.hasUrls() and not mime.hasFormat(
                self.MIMETYPE):
            super().dropEvent(event)
            return

        event.acceptProposedAction()

        sourceTabBar = event.source()
        if not isinstance(sourceTabBar, TabBar):
            sourceTabBar = None

        index = self.tabAt(event.pos())
        if index == -1:
            if mime.hasUrls():
                for url in mime.urls():
                    self._tabWidget.addViewByUrl(url,
                                                 const.NT_SelectedTabAtTheEnd)
            elif mime.hasText():
                self._tabWidget.addViewByReq(
                    gVar.app.searchEnginesManager(
                    ).searchResultWithDefaultEngine(mime.text()),
                    const.NT_SelectedNewEmptyTab)
            elif mime.hasFormat(self.MIMETYPE) and sourceTabBar:
                tab = sourceTabBar.webTab()
                if tab:
                    sourceTabBar._tabWidget.detachTab(tab)
                    tab.setPinned(False)
                    self._tabWidget.addViewByTab(tab, const.NT_SelectedTab)
        else:
            req = LoadRequest()
            tab = self._tabWidget.webTab(index)
            rect = self.tabRect(index)
            # DropAction
            action = self.tabDropAction(event.pos(), rect,
                                        not mime.hasFormat(self.MIMETYPE))
            if mime.hasUrls():
                req = LoadRequest(mime.urls()[0])
            elif mime.hasText():
                req = gVar.app.searchEnginesManager().searchResult(mime.text())
            if action == self._SelectTab:
                if req.isValid():
                    tab.load(req)
            elif action in (self._PrependTab, self._AppendTab):
                if action == self._PrependTab:
                    newIndex = index
                else:
                    newIndex = index + 1
                if req.isValid():
                    self._tabWidget.addViewByReqTitle(
                        req, '', const.NT_SelectedNewEmptyTab, False, newIndex,
                        index < self.pinnedTabsCount())
                elif mime.hasFormat(self.MIMETYPE) and sourceTabBar:
                    tab = sourceTabBar.webTab()
                    if tab:
                        if sourceTabBar == self:
                            if newIndex > tab.tabIndex():
                                toIndex = newIndex - 1
                            else:
                                toIndex = newIndex
                            tab.moveTab(toIndex)
                        else:
                            sourceTabBar._tabWidget.detachTab(tab)
                            tab.setPinned(index < self.pinnedTabsCount())
                            self._tabWidget.insertView(newIndex, tab,
                                                       const.NT_SelectedTab)

    # override
    def tabSizeHint(self, index, fast):  # noqa C901
        '''
        @return: QSize
        '''
        if not self._window.isVisible():
            # Don't calculate it when window is not visible
            # It produces invalid size anyway
            return QSize(-1, -1)

        pinnedTabWidth = self._comboTabBarPixelMetric(
            ComboTabBar.PinnedTabWidth)
        minTabWidth = self._comboTabBarPixelMetric(
            ComboTabBar.NormalTabMinimumWidth)

        size = super().tabSizeHint(index)

        # The overflowed tabs have same size and we can use this fast method
        if fast:
            if index >= self.pinnedTabsCount():
                size.setWidth(minTabWidth)
            else:
                size.setWidth(pinnedTabWidth)
            return size

        webTab = self._tabWidget.widget(index)
        tabBar = self

        if isinstance(webTab, WebTab) and webTab.isPinned():
            size.setWidth(pinnedTabWidth)
        else:
            availableWidth = self._mainTabBarWidth(
            ) - self._comboTabBarPixelMetric(self.ExtraReservedWidth)
            if availableWidth < 0:
                return QSize(-1, -1)

            normalTabsCount = super().normalTabsCount()
            maxTabWidth = self._comboTabBarPixelMetric(
                ComboTabBar.NormalTabMaximumWidth)

            if availableWidth >= maxTabWidth * normalTabsCount:
                self._normalTabWidth = maxTabWidth
                size.setWidth(self._normalTabWidth)
            elif normalTabsCount > 0:
                minActiveTabWidth = self._comboTabBarPixelMetric(
                    ComboTabBar.ActiveTabMinimumWidth)

                maxWidthForTab = availableWidth // normalTabsCount

                if maxWidthForTab < minActiveTabWidth:
                    if normalTabsCount > 1:
                        maxWidthForTab = (availableWidth - minActiveTabWidth
                                          ) // (normalTabsCount - 1)
                    else:
                        maxWidthForTab = 0

                tryAdjusting = availableWidth >= (minTabWidth *
                                                  normalTabsCount)

                if self._showCloseOnInactive != 1 and self.tabsCloseable() and \
                        availableWidth < (minTabWidth + 25) * normalTabsCount:
                    # Hiding close buttons to save some space
                    tabBar.setTabsCloseable(False)
                    tabBar._showCloseButton(self.currentIndex())
                if self._showCloseOnInactive == 1:
                    # Always showing close buttons
                    tabBar.setTabsCloseable(True)
                    tabBar._showCloseButton(self.currentIndex())

                if tryAdjusting:
                    self._normalTabWidth = maxWidthForTab

                    # Fill any empty space (we've got from rounding) with active tab
                    if index == self.mainTabBarCurrentIndex():
                        self._activeTabWidth = availableWidth - maxWidthForTab * (
                            normalTabsCount - 1)
                        size.setWidth(self._activeTabWidth)
                    else:
                        size.setWidth(self._normalTabWidth)

            # Restore close buttons according to preferences
            if self._showCloseOnInactive != 2 and not self.tabsCloseable() and \
                    availableWidth >= (minTabWidth + 25) * normalTabsCount:
                tabBar.setTabsCloseable(True)

                # Hide close buttons on pinned tabs
                for idx in range(self.count()):
                    tabBar._updatePinnedTabCloseButton(idx)

        if index == self.count() - 1:
            lastMainActiveTab = self._tabWidget.widget(
                self.mainTabBarCurrentIndex())
            cornerWidth = self.cornerWidth(Qt.TopLeftCorner)
            pinTabBarWidth = self._pinTabBarWidth()
            xForAddTabButton = cornerWidth + pinTabBarWidth + \
                self.normalTabsCount() * self._normalTabWidth

            if isinstance(
                    lastMainActiveTab,
                    WebTab) and self._activeTabWidth > self._normalTabWidth:
                xForAddTabButton += self._activeTabWidth - self._normalTabWidth

            if QApplication.layoutDirection() == Qt.RightToLeft:
                xForAddTabButton = self.width() - xForAddTabButton

            tabBar.moveAddTabButton.emit(xForAddTabButton)

        return size

    def _comboTabBarPixelMetric(self, sizeType):
        '''
        @param: sizeType ComboTabBar::SizeType
        '''
        if sizeType == self.PinnedTabWidth:
            result = self.tabMetrics()._pinnedWidth()
            if result > 0: return result
            else: return 32
        elif sizeType == self.ActiveTabMinimumWidth:
            return self.tabMetrics()._activeMinWidth()
        elif sizeType == self.NormalTabMinimumWidth:
            return self.tabMetrics()._normalMinWidth()
        elif sizeType == self.OverflowedTabWidth:
            return self.tabMetrics()._overflowedWidth()
        elif sizeType == self.NormalTabMaximumWidth:
            return self.tabMetrics()._normalMaxWidth()
        elif sizeType == self.ExtraReservedWidth:
            return self._tabWidget.extraReservedWidth()

        return -1

    def webTab(self, index=-1):
        '''
        @return: WebTab
        '''
        if index == -1:
            result = self._tabWidget.widget(self.currentIndex())
        else:
            result = self._tabWidget.widget(index)
        if isinstance(result, WebTab):
            return result
        else:
            return None
Beispiel #2
0
class Edicion(edicion[0], edicion[1]):
    trigger_comentario = pyqtSignal(str)
    trigger_deslock = pyqtSignal(str)

    def __init__(self, main):
        super().__init__()
        self.setupUi(self)
        self.pos = [0, 0]
        self.main = main
        self.comentarios.clicked.connect(self.mostrar_comentarios)
        self.comentar.clicked.connect(self.comentar_foto)
        self.trigger_comentario.connect(main.cliente.enviar_comentario)
        self.trigger_deslock.connect(main.cliente.deslock)
        self.veces_click = 0
        self.contscroll.hide()
        self.vbox = QVBoxLayout(self.contscroll)
        self.color.clicked.connect(self.mostrar_colores)
        self.selected_color = QColor(110, 20, 50)
        self.frame = QFrame(self)
        self.frame.setGeometry(110 - 20, 25, 15, 15)
        self.frame.setStyleSheet('QWidget {background-color: %s}' %
                                 self.selected_color.name())
        self.puede = None
        self.recortar.clicked.connect(self.recorte)
        self.blur.clicked.connect(self.edit_blur)
        self.origin = QPoint()
        self.imag = None
        self.recortar = []

    def edit_blur(self):
        self.edicion.mousePressEvent = self.blur_press

    def blur_press(self, event):
        position = event.pos()
        """acá deberia inicializar los cambios para la edicion"""

    def mostrar_comentarios(self):
        if self.veces_click % 2 == 0:
            self.contscroll.show()
        else:
            self.contscroll.hide()
        self.veces_click += 1

    def imagen(self, nombre):
        self.imag = nombre
        self.edicion.hide()
        self.edicion.origin = QPoint()
        self.edicion.ruber = QRubberBand(QRubberBand.Rectangle, self.edicion)
        self.pixmap4 = QPixmap(nombre).scaled(781, 621)
        self.pixmap = self.pixmap4.toImage()
        self.edicion.setPixmap(self.pixmap4)
        self.edicion.setAlignment(Qt.AlignCenter)
        self.edicion.show()
        self.show()

    def recorte(self):
        self.edicion.mouseMoveEvent = self.move_event
        self.edicion.mouseReleaseEvent = self.realase_event
        self.edicion.mousePressEvent = self.press_event

    def move_event(self, event):
        if not self.origin.isNull():
            self.edicion.ruber.setGeometry(
                QRect(self.origin, event.pos()).normalized())

    def realase_event(self, event):
        if event.button() == Qt.LeftButton:
            self.edicion.ruber.hide()
            self.recortar.append([event.pos().x(), event.pos().y()])
            self.realizar_recorte()

    def realizar_recorte(self):
        """obtengo mal los bytes de la imagen que se muestra así que no funciona
        bien uwu """

        byts, ind_ihdr, ind_idat, ind_iend = leer_imagen(self.imag + '.png')
        new_idr = idr(byts, ind_ihdr)
        largo, ancho, largo_ihdr, largo_idat, largo_iend = obtner_largos(
            byts, ind_ihdr, ind_idat, ind_iend)
        matriz = obtener_matriz(byts, largo, ancho, ind_idat, largo_idat)
        print(self.recortar)

        for i in range(self.recortar[0][0], self.recortar[0][1]):
            for j in range(self.recortar[1][0], self.recortar[1][1]):
                matriz[i][j] = [255, 255, 255]

        m_con0 = agregar_ceros(matriz)
        tr = transformar(m_con0)
        idat = crear_idat(tr, byts, ind_idat)

        foto = byts[0:8] + new_idr + idat + byts[ind_iend - 4:ind_iend + 4 +
                                                 largo_iend + 4]
        os.remove(self.imag + '.png')
        time.sleep(0.5)

        with open(self.imag + '.png', 'wb') as fil:
            fil.write(foto)

        self.imagen(self.imag)

    def press_event(self, event):
        if event.button() == Qt.LeftButton:
            self.recortar.append([event.pos().x(), event.pos().y()])
            self.origin = QPoint(event.pos())
            self.edicion.ruber.setGeometry(QRect(self.origin, QSize()))
            self.edicion.ruber.show()

    def pixelSelect(self, event):
        position = QPoint(event.pos().x(), event.pos().y())
        color = QColor.fromRgb(self.pixmap.pixel(position))
        print(color.red(), color.green(), color.blue())

    def comentar_foto(self):
        fecha_hora = datetime.datetime.now()
        fecha = '{}/{}/{}'.format(fecha_hora.day, fecha_hora.month,
                                  fecha_hora.year)
        hora = '{}:{}'.format(fecha_hora.hour, fecha_hora.minute)
        self.trigger_comentario.emit(fecha + ' ' + hora + ' ' + ' ' +
                                     self.main.cliente.nombre + ' : ' +
                                     self.comentario.text())
        self.comentario.setText('')

    def comentarr(self, list):
        for coment in list:
            self.label = QLabel(self.contscroll)
            self.label.move(self.pos[0], self.pos[1])
            self.label.setText(' ' + coment)
            self.vbox.addWidget(self.label)
            self.label.show()
            self.pos[1] = self.pos[1] + 25

    def closeEvent(self, event):
        event.accept()
        self.main.show()
        self.trigger_deslock.emit(self.imag)
        self.imag = None

    def mostrar_colores(self):
        if self.puede:
            self.edicion.mousePressEvent = self.pixelSelect
            selected_color = QColorDialog.getColor()
            matrix = (selected_color.red(), selected_color.green(),
                      selected_color.blue())
            if selected_color.isValid():
                self.frame.setStyleSheet('QWidget {background-color: %s}' %
                                         selected_color.name())