Files
create/src/Gui/QSint/actionpanel/taskheader_p.cpp
2015-07-07 11:10:13 +02:00

275 lines
5.2 KiB
C++

#include "taskheader_p.h"
#include "actionpanelscheme.h"
#include "actionlabel.h"
#include <QtCore/QVariant>
#include <QtCore/QEvent>
#include <QtCore/QTimer>
#include <QHBoxLayout>
#include <QPainter>
#include <QMouseEvent>
#include <QApplication>
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(0)
{
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->setMargin(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();
} else {
myExpandable = false;
if (!myButton)
return;
myButton->removeEventFilter(this);
myButton->setParent(0);
delete myButton;
myButton = 0;
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();
}
void TaskHeader::enterEvent ( QEvent * /*event*/ )
{
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) {
emit activated();
m_fold = !m_fold;
changeIcons();
}
}
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) {
emit activated();
}
}
void TaskHeader::keyPressEvent ( QKeyEvent * event )
{
switch (event->key())
{
case Qt::Key_Down:
{
QKeyEvent ke(QEvent::KeyPress, Qt::Key_Tab, 0);
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, 0);
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);
}
}