Files
create/src/Gui/QSint/actionpanel/taskheader_p.cpp
wmayer 09ae3b2ab8 Gui: Qt6 port
* QString::indexOf() is now marked as [[nodiscard]]
* Replace deprecated methods of QMessageBox
* QMouseEvent::globalPos() is deprecated, use globalPosition().toPoint()
* QWidget::enterEvent() requires a QEnterEvent as argument
* QLibraryInfo::location() is deprecated, use path()
* QVariant::Type is deprecated, use QMetaType::Type
* QVariant::canConvert(int) is deprecated, use QVariant::canConvert(QMetaType) or QVariant::canConvert<T>()
* QMessageBox::standardIcon is deprecated, use QStyle::standardIcon()
* Replace deprecated method QMessageBox::question(), ...
* QApplication::fontMetrics() is deprecated
* QDropEvent::mouseButtons() is deprecated, use buttons()
* QDropEvent::keyboardModifiers() is deprecated, use modifiers()
* Constructor of QFontDatabase is deprecated, use static methods instead
* Qt::AA_DisableHighDpiScaling is deprecated
* Qt::AA_EnableHighDpiScaling is deprecated
* Qt::AA_UseHighDpiPixmaps is deprecated
2022-12-31 21:54:45 +01:00

297 lines
6.1 KiB
C++

/***************************************************************************
* *
* Copyright: https://code.google.com/p/qsint/ *
* License: LGPL *
* *
***************************************************************************/
#include "taskheader_p.h"
#include <QApplication>
#include <QEvent>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QPainter>
#include <QStyle>
#include <QTimer>
namespace QSint
{
TaskHeader::TaskHeader(const QIcon &icon, const QString &title, bool expandable, QWidget *parent)
: BaseClass(parent),
myExpandable(expandable),
m_over(false),
m_buttonOver(false),
m_fold(true),
m_opacity(0.1),
myButton(nullptr)
{
setProperty("class", "header");
myTitle = new ActionLabel(this);
myTitle->setProperty("class", "header");
myTitle->setText(title);
myTitle->setIcon(icon);
myTitle->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
connect(myTitle, SIGNAL(clicked()), this, SLOT(fold()));
QHBoxLayout *hbl = new QHBoxLayout();
hbl->setContentsMargins(2, 2, 2, 2);
setLayout(hbl);
hbl->addWidget(myTitle);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
setScheme(ActionPanelScheme::defaultScheme());
//myTitle->setSchemePointer(&myLabelScheme);
setExpandable(myExpandable);
}
void TaskHeader::setExpandable(bool expandable)
{
if (expandable) {
myExpandable = true;
if (myButton)
return;
myButton = new QLabel(this);
myButton->installEventFilter(this);
myButton->setFixedSize(myScheme->headerButtonSize);
layout()->addWidget(myButton);
changeIcons();
myButton->setProperty("fold", m_fold);
} else {
myExpandable = false;
if (!myButton)
return;
myButton->removeEventFilter(this);
myButton->setParent(nullptr);
delete myButton;
myButton = nullptr;
changeIcons();
}
}
bool TaskHeader::eventFilter(QObject *obj, QEvent *event)
{
switch (event->type()) {
case QEvent::MouseButtonPress:
if (myExpandable)
fold();
return true;
case QEvent::Enter:
m_buttonOver = true;
changeIcons();
return true;
case QEvent::Leave:
m_buttonOver = false;
changeIcons();
return true;
default:;
}
return BaseClass::eventFilter(obj, event);
}
void TaskHeader::setScheme(ActionPanelScheme *scheme)
{
if (scheme) {
myScheme = scheme;
//myLabelScheme = &(scheme->headerLabelScheme);
setStyleSheet(myScheme->actionStyle);
if (myExpandable) {
//setCursor(myLabelScheme->cursorOver ? Qt::PointingHandCursor : cursor());
changeIcons();
}
setFixedHeight(scheme->headerSize);
update();
}
}
void TaskHeader::paintEvent ( QPaintEvent * event )
{
QPainter p(this);
if (myScheme->headerAnimation)
p.setOpacity(m_opacity+0.7);
// p.setPen(m_over ? myScheme->headerBorderOver : myScheme->headerBorder);
// p.setBrush(m_over ? myScheme->headerBackgroundOver : myScheme->headerBackground);
// myScheme->headerCorners.draw(&p, rect());
BaseClass::paintEvent(event);
}
void TaskHeader::animate()
{
if (!myScheme->headerAnimation)
return;
if (!isEnabled()) {
m_opacity = 0.1;
update();
return;
}
if (m_over) {
if (m_opacity >= 0.3) {
m_opacity = 0.3;
return;
}
m_opacity += 0.05;
} else {
if (m_opacity <= 0.1) {
m_opacity = 0.1;
return;
}
m_opacity = qMax(0.1, m_opacity-0.05);
}
QTimer::singleShot(100, this, SLOT(animate()));
update();
}
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
void TaskHeader::enterEvent ( QEvent * /*event*/ )
#else
void TaskHeader::enterEvent ( QEnterEvent * /*event*/ )
#endif
{
m_over = true;
if (isEnabled())
QTimer::singleShot(100, this, SLOT(animate()));
update();
}
void TaskHeader::leaveEvent ( QEvent * /*event*/ )
{
m_over = false;
if (isEnabled())
QTimer::singleShot(100, this, SLOT(animate()));
update();
}
void TaskHeader::fold()
{
if (myExpandable) {
Q_EMIT activated();
}
}
void TaskHeader::setFold(bool on)
{
if (myExpandable) {
m_fold = on;
changeIcons();
if (myButton) {
myButton->setProperty("fold", m_fold);
if (myButton->style()) {
myButton->style()->unpolish(myButton);
myButton->style()->polish(myButton);
myButton->update();
}
}
}
}
void TaskHeader::changeIcons()
{
if (!myButton)
return;
if (m_buttonOver)
{
if (m_fold)
myButton->setPixmap(myScheme->headerButtonFoldOver);
else
myButton->setPixmap(myScheme->headerButtonUnfoldOver);
} else
{
if (m_fold)
myButton->setPixmap(myScheme->headerButtonFold);
else
myButton->setPixmap(myScheme->headerButtonUnfold);
}
myButton->setFixedSize(myScheme->headerButtonSize);
}
void TaskHeader::mouseReleaseEvent ( QMouseEvent * event )
{
if (event->button() == Qt::LeftButton) {
Q_EMIT activated();
}
}
void TaskHeader::keyPressEvent ( QKeyEvent * event )
{
switch (event->key())
{
case Qt::Key_Down:
{
QKeyEvent ke(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QApplication::sendEvent(this, &ke);
return;
}
case Qt::Key_Up:
{
QKeyEvent ke(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier);
QApplication::sendEvent(this, &ke);
return;
}
default:;
}
BaseClass::keyPressEvent(event);
}
void TaskHeader::keyReleaseEvent ( QKeyEvent * event )
{
switch (event->key())
{
case Qt::Key_Down:
{
QKeyEvent ke(QEvent::KeyRelease, Qt::Key_Tab, Qt::NoModifier);
QApplication::sendEvent(this, &ke);
return;
}
case Qt::Key_Up:
{
QKeyEvent ke(QEvent::KeyRelease, Qt::Key_Tab, Qt::ShiftModifier);
QApplication::sendEvent(this, &ke);
return;
}
default:;
}
BaseClass::keyReleaseEvent(event);
}
}