Fix some small linting issues. (#41)

* fix some linting

* add tests

* update versions

* update setup
This commit is contained in:
Talley Lambert
2021-11-21 19:09:34 -05:00
committed by GitHub
parent 789b98f892
commit d7afa8824c
5 changed files with 78 additions and 37 deletions

View File

@@ -5,11 +5,11 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/asottile/setup-cfg-fmt
rev: v1.17.0
rev: v1.20.0
hooks:
- id: setup-cfg-fmt
- repo: https://github.com/PyCQA/flake8
rev: 3.9.2
rev: 4.0.1
hooks:
- id: flake8
additional_dependencies: [flake8-typing-imports==1.7.0]
@@ -20,20 +20,20 @@ repos:
- id: autoflake
args: ["--in-place", "--remove-all-unused-imports"]
- repo: https://github.com/PyCQA/isort
rev: 5.8.0
rev: 5.10.1
hooks:
- id: isort
- repo: https://github.com/asottile/pyupgrade
rev: v2.19.1
rev: v2.29.1
hooks:
- id: pyupgrade
args: [--py37-plus, --keep-runtime-typing]
- repo: https://github.com/psf/black
rev: 21.5b2
rev: 21.11b1
hooks:
- id: black
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.910
rev: v0.910-1
hooks:
- id: mypy
exclude: examples

View File

@@ -1,7 +1,6 @@
"""Example for QCollapsible"""
from PySide2.QtWidgets import QLabel
from superqt import QCollapsible
from superqt.qtcompat.QtWidgets import QApplication, QPushButton, QLabel
from superqt.qtcompat.QtWidgets import QApplication, QLabel, QPushButton
app = QApplication([])

View File

@@ -20,6 +20,7 @@ classifiers =
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: Implementation :: CPython
Topic :: Desktop Environment
Topic :: Software Development
@@ -40,7 +41,7 @@ include_package_data = True
package_dir =
=src
setup_requires =
setuptools_scm
setuptools-scm
zip_safe = False
[options.packages.find]

View File

@@ -1,13 +1,18 @@
"""A collapsible widget to hide and unhide child widgets"""
from typing import Optional
from ..qtcompat.QtCore import QAbstractAnimation, QEasingCurve, QPropertyAnimation, Qt, QMargins
from ..qtcompat.QtCore import (
QAbstractAnimation,
QEasingCurve,
QMargins,
QPropertyAnimation,
Qt,
)
from ..qtcompat.QtWidgets import QFrame, QPushButton, QVBoxLayout, QWidget
class QCollapsible(QFrame):
"""
A collapsible widget to hide and unhide child widgets.
"""A collapsible widget to hide and unhide child widgets.
Based on https://stackoverflow.com/a/68141638
"""
@@ -21,9 +26,8 @@ class QCollapsible(QFrame):
self._toggle_btn = QPushButton(self._COLLAPSED + title)
self._toggle_btn.setCheckable(True)
self._toggle_btn.setChecked(False)
self._toggle_btn.setStyleSheet("text-align: left; background: transparent;")
self._toggle_btn.clicked.connect(self._toggle)
self._toggle_btn.toggled.connect(self._toggle)
# frame layout
self.setLayout(QVBoxLayout())
@@ -41,44 +45,69 @@ class QCollapsible(QFrame):
_content = QWidget()
_content.setLayout(QVBoxLayout())
_content.setMaximumHeight(0)
_content.layout().setContentsMargins(QMargins(5,0,0,0))
_content.layout().setContentsMargins(QMargins(5, 0, 0, 0))
self.setContent(_content)
def setText(self, text: str):
"""Set the text of the toggle button."""
current = self._toggle_btn.text()[: len(self._EXPANDED)]
self._toggle_btn.setText(current + text)
def text(self) -> str:
"""Return the text of the toggle button."""
return self._toggle_btn.text()[len(self._EXPANDED) :]
def setContent(self, content: QWidget):
"""Replace central widget (the widget that gets expanded/collapsed)."""
self._content = content
self.layout().addWidget(self._content)
self._animation.setTargetObject(content)
def content(self) -> QWidget:
"""Return the current content widget."""
return self._content
def setDuration(self, msecs: int):
"""Set duration of the collapse/expand animation."""
self._animation.setDuration(msecs)
def setEasingCurve(self, easing: QEasingCurve):
"""Set the easing curve for the collapse/expand animation"""
self._animation.setEasingCurve(easing)
def addWidget(self, widget: QWidget):
"""Add a widget to the central content widget's layout."""
self._content.layout().addWidget(widget)
def removeWidget(self, widget: QWidget):
"""Remove widget from the central content widget's layout."""
self._content.layout().removeWidget(widget)
def expand(self, animate: bool = True):
"""Expand (show) the collapsible section"""
self._expand_collapse(QAbstractAnimation.Direction.Forward, animate)
def collapse(self, animate: bool = True):
"""Collapse (hide) the collapsible section"""
self._expand_collapse(QAbstractAnimation.Direction.Backward, animate)
def expanded(self):
def isExpanded(self) -> bool:
"""Return whether the collapsible section is visible"""
return self._toggle_btn.isChecked()
def _expand_collapse(self, direction: QAbstractAnimation.Direction, animate:bool = True):
if self._locked is True:
def setLocked(self, locked: bool = True):
"""Set whether collapse/expand is disabled"""
self._locked = locked
self._toggle_btn.setCheckable(not locked)
def locked(self) -> bool:
"""Return True if collapse/expand is disabled"""
return self._locked
def _expand_collapse(
self, direction: QAbstractAnimation.Direction, animate: bool = True
):
if self._locked:
return
forward = direction == QAbstractAnimation.Direction.Forward
@@ -87,21 +116,13 @@ class QCollapsible(QFrame):
self._toggle_btn.setChecked(forward)
self._toggle_btn.setText(text + self._toggle_btn.text()[len(self._EXPANDED) :])
_content_height = self._content.sizeHint().height() + 10
if animate:
self._animation.setDirection(direction)
self._animation.setEndValue(self._content.sizeHint().height() + 10)
self._animation.setEndValue(_content_height)
self._animation.start()
else:
height = 0 if forward==False else (self._content.sizeHint().height() + 10)
self._content.setMaximumHeight(height)
self._content.setMaximumHeight(_content_height if forward else 0)
def _toggle(self):
if self._locked is True:
self._toggle_btn.setChecked(not self._toggle_btn.isChecked)
self.expand() if self._toggle_btn.isChecked() else self.collapse()
def setLocked(self, locked: bool = True):
self._locked = locked
def locked(self) -> bool:
return self._locked
self.expand() if self.isExpanded() else self.collapse()

View File

@@ -9,12 +9,12 @@ def test_checked_initialization(qtbot):
"""Test simple collapsible"""
wdg1 = QCollapsible("Advanced analysis")
wdg1.expand(False)
assert wdg1.expanded() is True
assert wdg1.isExpanded()
assert wdg1._content.maximumHeight() > 0
wdg2 = QCollapsible("Advanced analysis")
wdg1.collapse(False)
assert wdg2.expanded() is False
assert not wdg2.isExpanded()
assert wdg2._content.maximumHeight() == 0
@@ -27,11 +27,11 @@ def test_content_hide_show(qtbot):
collapsible.addWidget(QPushButton(f"Content button {i + 1}"))
collapsible.collapse(False)
assert collapsible.expanded() is False
assert not collapsible.isExpanded()
assert collapsible._content.maximumHeight() == 0
collapsible.expand(False)
assert collapsible.expanded() is True
assert collapsible.isExpanded()
assert collapsible._content.maximumHeight() > 0
@@ -41,12 +41,24 @@ def test_locking(qtbot):
assert wdg1.locked() is False
wdg1.setLocked(True)
assert wdg1.locked() is True
assert not wdg1.isExpanded()
# Simulate button press
wdg1._toggle_btn.setChecked(True)
wdg1._toggle()
assert not wdg1.isExpanded()
assert wdg1.expanded() is False
wdg1._toggle()
assert not wdg1.isExpanded()
wdg1.expand()
assert not wdg1.isExpanded()
wdg1._toggle_btn.setChecked(False)
assert not wdg1.isExpanded()
wdg1.setLocked(False)
wdg1.expand()
assert wdg1.isExpanded()
assert wdg1._toggle_btn.isChecked()
def test_changing_animation_settings(qtbot):
@@ -64,3 +76,11 @@ def test_changing_content(qtbot):
wdg = QCollapsible()
wdg.setContent(content)
assert wdg._content == content
def test_changing_text(qtbot):
"""Test changing the content"""
wdg = QCollapsible()
wdg.setText("Hi new text")
assert wdg.text() == "Hi new text"
assert wdg._toggle_btn.text() == QCollapsible._COLLAPSED + "Hi new text"