kde-extraapps/gwenview/lib/slidecontainer.cpp
Ivailo Monev cbf29a08cf generic: make changes required for building against Katie
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2015-11-25 10:01:00 +00:00

161 lines
3.4 KiB
C++

/*
Gwenview: an image viewer
Copyright 2007 Aurélien Gâteau <agateau@kde.org>
This program 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 2
of the License, or (at your option) any later version.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// Self
#include "moc_slidecontainer.cpp"
// KDE
#include <KDebug>
// Qt
#include <QEvent>
#include <QPropertyAnimation>
#include <QtGui/qevent.h>
namespace Gwenview
{
static const int SLIDE_DURATION = 250;
SlideContainer::SlideContainer(QWidget* parent)
: QFrame(parent)
{
mContent = 0;
mSlidingOut = false;
setFixedHeight(0);
}
QWidget* SlideContainer::content() const
{
return mContent;
}
void SlideContainer::setContent(QWidget* content)
{
if (mContent) {
mContent->setParent(0);
mContent->removeEventFilter(this);
}
mContent = content;
if (mContent) {
mContent->setParent(this);
mContent->installEventFilter(this);
mContent->hide();
}
}
void SlideContainer::animTo(int newHeight)
{
delete mAnim.data();
QPropertyAnimation* anim = new QPropertyAnimation(this, "slideHeight", this);
anim->setDuration(SLIDE_DURATION);
anim->setStartValue(slideHeight());
anim->setEndValue(newHeight);
anim->start(QAbstractAnimation::DeleteWhenStopped);
connect(anim, SIGNAL(finished()), SLOT(slotAnimFinished()));
mAnim = anim;
}
void SlideContainer::slideIn()
{
mSlidingOut = false;
mContent->show();
mContent->adjustSize();
delete mAnim.data();
if (height() == mContent->height()) {
return;
}
animTo(mContent->height());
}
void SlideContainer::slideOut()
{
if (height() == 0) {
return;
}
mSlidingOut = true;
animTo(0);
}
QSize SlideContainer::sizeHint() const
{
if (mContent) {
return mContent->sizeHint();
} else {
return QSize();
}
}
QSize SlideContainer::minimumSizeHint() const
{
if (mContent) {
return mContent->minimumSizeHint();
} else {
return QSize();
}
}
void SlideContainer::resizeEvent(QResizeEvent* event)
{
if (mContent) {
if (event->oldSize().width() != width()) {
adjustContentGeometry();
}
}
}
void SlideContainer::adjustContentGeometry()
{
if (mContent) {
mContent->setGeometry(0, height() - mContent->height(), width(), mContent->height());
}
}
bool SlideContainer::eventFilter(QObject*, QEvent* event)
{
if (event->type() == QEvent::Resize) {
if (!mSlidingOut && height() != 0) {
animTo(mContent->height());
}
}
return false;
}
int SlideContainer::slideHeight() const
{
return isVisible() ? height() : 0;
}
void SlideContainer::setSlideHeight(int value)
{
setFixedHeight(value);
adjustContentGeometry();
}
void SlideContainer::slotAnimFinished()
{
if (height() == 0) {
mSlidingOut = false;
slidedOut();
} else {
slidedIn();
}
}
} // namespace