File: C:/Users/fred/anaconda3/Lib/site-packages/navigator_updater/widgets/__init__.py
# -*- coding: utf-8 -*-
# pylint: disable=invalid-name,no-name-in-module,too-many-lines,unused-argument
# -----------------------------------------------------------------------------
# Copyright 2016 Anaconda, Inc.
#
# May be copied and distributed freely only as part of an Anaconda or
# Miniconda installation.
# -----------------------------------------------------------------------------
"""Widgets module."""
from qtpy.QtCore import Qt, Signal
from qtpy.QtWidgets import QFrame, QLabel, QPushButton, QSizePolicy, QToolButton, QWidget
# --- Base widgets
# -----------------------------------------------------------------------------
class WidgetBase(QWidget):
"""Widget base implementation."""
sig_hovered = Signal(bool)
sig_focused = Signal(bool)
def _fix_style(self):
# Mac related issues
self.setAttribute(Qt.WA_LayoutUsesWidgetRect, True)
self.setFocusPolicy(Qt.StrongFocus)
def _fix_layout(self, layout):
if layout:
layout.setSpacing(0)
layout.setContentsMargins(0, 0, 0, 0)
items = (layout.itemAt(i).widget() for i in range(layout.count()))
for w in items:
if w:
new_layout = w.layout()
self._fix_layout(new_layout)
def focusInEvent(self, event):
"""Override Qt method."""
QWidget.focusInEvent(self, event)
self.setProperty('focused', True)
def focusOutEvent(self, event):
"""Override Qt method."""
QWidget.focusOutEvent(self, event)
self.setProperty('focused', False)
def enterEvent(self, event):
"""Override Qt method."""
QWidget.enterEvent(self, event)
self.setProperty('hovered', True)
def leaveEvent(self, event):
"""Override Qt method."""
QWidget.leaveEvent(self, event)
self.setProperty('hovered', False)
def setDisabled(self, value):
"""Override Qt method."""
QWidget.setDisabled(self, value)
self.setProperty('disabled', value)
self.setProperty('enabled', not value)
def setEnabled(self, value):
"""Override Qt method."""
QWidget.setEnabled(self, value)
self.setProperty('enabled', value)
self.setProperty('disabled', not value)
def setProperty(self, name, value):
"""Override Qt method."""
QWidget.setProperty(self, name, value)
self.style().unpolish(self)
self.style().polish(self)
self.update()
def setLayout(self, layout):
"""Override Qt method."""
self._fix_layout(layout)
QWidget.setLayout(self, layout)
class ButtonBase(QPushButton, WidgetBase):
"""Base button used in CSS styling."""
def __init__(self, *args, **kwargs):
"""Base button used in CSS styling."""
super().__init__(*args, **kwargs)
self.setAutoDefault(False)
self.setDefault(False)
self.setAttribute(Qt.WA_LayoutUsesWidgetRect, True)
self.setFocusPolicy(Qt.StrongFocus)
def mousePressEvent(self, event):
"""Override Qt method."""
super().mousePressEvent(event)
self.setProperty('pressed', True)
def mouseReleaseEvent(self, event):
"""Override Qt method."""
super().mouseReleaseEvent(event)
self.setProperty('pressed', False)
class ButtonToolBase(QToolButton, WidgetBase):
"""Base button used in CSS styling."""
def __init__(self, parent=None, text=''):
"""Base button used in CSS styling."""
super().__init__(parent=parent)
self.setCheckable(False)
self.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
self.setText(text)
self.setFocusPolicy(Qt.StrongFocus) # Needed on OSX
self.setAttribute(Qt.WA_LayoutUsesWidgetRect, True) # Needed on OSX
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
class FrameBase(QFrame, WidgetBase):
"""Button used in CSS styling."""
def __init__(self, *args, **kwargs):
"""Button used in CSS styling."""
super().__init__(*args, **kwargs)
self.setFocusPolicy(Qt.NoFocus) # Needed on OSX
self.setAttribute(Qt.WA_LayoutUsesWidgetRect, True) # Needed on OSX
def setLayout(self, layout):
"""Override Qt method."""
self._fix_layout(layout)
super().setLayout(layout)
class LabelBase(QLabel, WidgetBase):
"""Label used in CSS styling."""
def __init__(self, *args, **kwargs):
"""Label used in CSS styling."""
super().__init__(*args, **kwargs)
self.setFocusPolicy(Qt.NoFocus) # Needed on OSX
self.setAttribute(Qt.WA_LayoutUsesWidgetRect, True) # Needed on OSX
class ButtonNormal(ButtonBase):
"""Button used in CSS styling."""
class ButtonPrimary(ButtonBase):
"""Button used in CSS styling."""
class ButtonDanger(ButtonBase):
"""Button used in CSS styling."""
class SpacerHorizontal(LabelBase):
"""Label used in CSS styling."""
class SpacerVertical(LabelBase):
"""Label used in CSS styling."""