summaryrefslogtreecommitdiff
path: root/raphodo/toggleview.py
blob: e1f6ea304ecd914447504d4d66ca4040c9e69069 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# Copyright (C) 2016 Damon Lynch <damonlynch@gmail.com>

# This file is part of Rapid Photo Downloader.
#
# Rapid Photo Downloader is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Rapid Photo Downloader is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Rapid Photo Downloader.  If not,
# see <http://www.gnu.org/licenses/>.

"""
Widget containing Header with Toggle Switch, and contains widget that appears or
disappears depending on the toggle switch's state.

Portions modeled on Canonical's QExpander, which is an 'Expander widget
similar to the GtkExpander', Copyright 2012 Canonical Ltd
"""

__author__ = 'Damon Lynch'
__copyright__ = "Copyright 2016, Damon Lynch"

from typing import Optional
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QSize
from PyQt5.QtGui import QColor, QPalette
from PyQt5.QtWidgets import (QHBoxLayout, QLabel, QSizePolicy, QVBoxLayout,
                             QWidget)

from raphodo.toggleswitch import QToggleSwitch
from raphodo.panelview import QPanelView
from raphodo.viewutils import QFramedWidget


class BlankWidget(QFramedWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        palette = QPalette()
        palette.setColor(QPalette.Window, palette.color(palette.Base))
        self.setAutoFillBackground(True)
        self.setPalette(palette)


class QToggleView(QPanelView):
    """
    A header bar with tooggle switch over a widget that is switched on/off.
    """

    valueChanged = pyqtSignal(bool)

    def __init__(self, label: str,
                 display_alternate: bool,
                 toggleToolTip: Optional[str],
                 headerColor: Optional[QColor]=None,
                 headerFontColor: Optional[QColor]=None,
                 on: bool=True,
                 parent: QWidget=None) -> None:

        super().__init__(label=label, headerColor=headerColor, headerFontColor=headerFontColor,
                         parent=parent)
        # Override base class definition:
        self.headerLayout.setContentsMargins(5, 0, 5, 0)

        if display_alternate:
            self.alternateWidget = BlankWidget()
            layout = self.layout()  # type: QVBoxLayout
            layout.addWidget(self.alternateWidget)
        else:
            self.alternateWidget = None


        self.toggleSwitch = QToggleSwitch(background=headerColor, parent=self)
        self.toggleSwitch.valueChanged.connect(self.toggled)
        if toggleToolTip:
            self.toggleSwitch.setToolTip(toggleToolTip)
        self.addHeaderWidget(self.toggleSwitch)
        self.toggleSwitch.setOn(on)

    def addWidget(self, widget: QWidget) -> None:
        super().addWidget(widget)
        self.toggled(0)

    def on(self) -> bool:
        """Return if widget is expanded."""

        return self.toggleSwitch.on()

    def setOn(self, isOn: bool) -> None:
        """Expand the widget or not."""

        self.toggleSwitch.setOn(isOn)

    @pyqtSlot(int)
    def toggled(self, value: int) -> None:
        if self.content is not None:
            self.content.setVisible(self.on())
            if self.alternateWidget is not None:
                self.alternateWidget.setVisible(not self.on())

        self.valueChanged.emit(self.on())

    def minimumSize(self) -> QSize:
        size = super().minimumSize()
        width = size.width()
        height = self.minimumHeight()
        return QSize(width, height)

    def minimumHeight(self) -> int:
        if not self.toggleSwitch.on():
            return self.header.height()
        else:
            return super().minimumSize().height()