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 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
/*
* SPDX-FileCopyrightText: 2009, 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
*
* SPDX-License-Identifier: GPL-2.0-or-later OR MIT
*/
#include "breezeheaderviewdata.h"
#include <QHoverEvent>
#include <QTextStream>
namespace Breeze
{
//______________________________________________
HeaderViewData::HeaderViewData(QObject *parent, QWidget *target, int duration)
: AnimationData(parent, target)
{
_current._animation = new Animation(duration, this);
setupAnimation(currentIndexAnimation(), "currentOpacity");
currentIndexAnimation().data()->setDirection(Animation::Forward);
_previous._animation = new Animation(duration, this);
setupAnimation(previousIndexAnimation(), "previousOpacity");
previousIndexAnimation().data()->setDirection(Animation::Backward);
}
//______________________________________________
bool HeaderViewData::updateState(const QPoint &position, bool hovered)
{
if (!enabled()) {
return false;
}
const QHeaderView *local(qobject_cast<const QHeaderView *>(target().data()));
if (!local) {
return false;
}
const int index(local->logicalIndexAt(position));
if (index < 0) {
return false;
}
if (hovered) {
if (index != currentIndex()) {
if (currentIndex() >= 0) {
setPreviousIndex(currentIndex());
setCurrentIndex(-1);
previousIndexAnimation().data()->restart();
}
setCurrentIndex(index);
currentIndexAnimation().data()->restart();
return true;
} else {
return false;
}
} else if (index == currentIndex()) {
setPreviousIndex(currentIndex());
setCurrentIndex(-1);
previousIndexAnimation().data()->restart();
return true;
} else {
return false;
}
}
//______________________________________________
Animation::Pointer HeaderViewData::animation(const QPoint &position) const
{
if (!enabled()) {
return Animation::Pointer();
}
const QHeaderView *local(qobject_cast<const QHeaderView *>(target().data()));
if (!local) {
return Animation::Pointer();
}
int index(local->logicalIndexAt(position));
if (index < 0) {
return Animation::Pointer();
} else if (index == currentIndex()) {
return currentIndexAnimation();
} else if (index == previousIndex()) {
return previousIndexAnimation();
} else {
return Animation::Pointer();
}
}
//______________________________________________
qreal HeaderViewData::opacity(const QPoint &position) const
{
if (!enabled()) {
return OpacityInvalid;
}
const QHeaderView *local(qobject_cast<const QHeaderView *>(target().data()));
if (!local) {
return OpacityInvalid;
}
int index(local->logicalIndexAt(position));
if (index < 0) {
return OpacityInvalid;
} else if (index == currentIndex()) {
return currentOpacity();
} else if (index == previousIndex()) {
return previousOpacity();
} else {
return OpacityInvalid;
}
}
//__________________________________________________________
void HeaderViewData::setDirty() const
{
QHeaderView *header = qobject_cast<QHeaderView *>(target().data());
if (!header) {
return;
}
// get first and last index, sorted
const int lastIndex(qMax(previousIndex(), currentIndex()));
if (lastIndex < 0) {
return;
}
int firstIndex(qMin(previousIndex(), currentIndex()));
if (firstIndex < 0) {
firstIndex = lastIndex;
}
// find relevant rectangle to be updated, in viewport coordinate
QWidget *viewport(header->viewport());
const int left = header->sectionViewportPosition(firstIndex);
const int right = header->sectionViewportPosition(lastIndex) + header->sectionSize(lastIndex);
// trigger update
if (header->orientation() == Qt::Horizontal) {
viewport->update(left, 0, right - left, header->height());
} else {
viewport->update(0, left, header->width(), right - left);
}
}
}
|