summaryrefslogtreecommitdiff
path: root/raphodo/panelview.py
diff options
context:
space:
mode:
Diffstat (limited to 'raphodo/panelview.py')
-rw-r--r--raphodo/panelview.py136
1 files changed, 136 insertions, 0 deletions
diff --git a/raphodo/panelview.py b/raphodo/panelview.py
new file mode 100644
index 0000000..52b381f
--- /dev/null
+++ b/raphodo/panelview.py
@@ -0,0 +1,136 @@
+# 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, which can have an optional widget
+attached to the right side.
+
+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 (Qt, QSize)
+from PyQt5.QtGui import (QColor, QFontMetrics, QFont)
+from PyQt5.QtWidgets import (QHBoxLayout, QLabel, QSizePolicy, QVBoxLayout,
+ QWidget, QScrollArea, QFrame)
+
+from raphodo.constants import minPanelWidth
+
+class QPanelView(QWidget):
+ """
+ A header bar with a child widget.
+ """
+
+ def __init__(self, label: str,
+ headerColor: Optional[QColor]=None,
+ headerFontColor: Optional[QColor]=None,
+ parent: QWidget=None) -> None:
+
+ super().__init__(parent)
+
+ self.header = QWidget(self)
+ if headerColor is not None:
+ headerStyle = """QWidget { background-color: %s; }""" % headerColor.name()
+ self.header.setStyleSheet(headerStyle)
+ self.header.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed)
+
+ self.headerLayout = QHBoxLayout()
+ self.headerLayout.setContentsMargins(5, 2, 5, 2)
+
+ self.label = QLabel(label.upper())
+ if headerFontColor is not None:
+ headerFontStyle = "QLabel {color: %s;}" % headerFontColor.name()
+ self.label.setStyleSheet(headerFontStyle)
+
+ self.header.setLayout(self.headerLayout)
+ self.headerLayout.addWidget(self.label)
+ self.headerLayout.addStretch()
+
+ self.headerWidget = None
+
+ self.content = None
+ layout = QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(0)
+ self.setLayout(layout)
+ layout.addWidget(self.header)
+
+ def addWidget(self, widget: QWidget) -> None:
+ """
+ Add a widget to the Panel View.
+
+ Any previous widget will be removed.
+
+ :param widget: widget to add
+ """
+
+ if self.content is not None:
+ self.layout().removeWidget(self.content)
+ self.content = widget
+ self.layout().addWidget(self.content)
+
+ def addHeaderWidget(self, widget: QWidget) -> None:
+ """
+ Add a widget to the the header bar, on the right side.
+
+ Any previous widget will be removed.
+
+ :param widget: widget to add
+ """
+ if self.headerWidget is not None:
+ self.headerLayout.removeWidget(self.headerWidget)
+ self.headerWidget = widget
+ self.headerLayout.addWidget(widget)
+
+ def text(self) -> str:
+ """Return the text of the label."""
+ return self.label.text()
+
+ def setText(self, text: str) -> None:
+ """Set the text of the label."""
+ self.label.setText(text)
+
+ def minimumSize(self) -> QSize:
+ if self.content is None:
+ font_height = QFontMetrics(QFont).height()
+ width = minPanelWidth()
+ height = font_height * 2
+ else:
+ width = self.content.minimumWidth()
+ height = self.content.minimumHeight()
+ return QSize(width, self.header.height() + height)
+
+
+class QComputerScrollArea(QScrollArea):
+ """
+ Places a QPanelView into a Scroll Area
+ """
+
+ def __init__(self, panelView: QPanelView, parent=None):
+ super().__init__(parent)
+ self.setFrameShape(QFrame.NoFrame)
+ self.setWidgetResizable(True)
+ self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+ self.panelView = panelView
+ self.setWidget(panelView)
+ self.setMinimumSize(panelView.minimumSize()) \ No newline at end of file