diff options
Diffstat (limited to 'client/collapser.cc')
-rw-r--r-- | client/collapser.cc | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/client/collapser.cc b/client/collapser.cc new file mode 100644 index 0000000..391f9b1 --- /dev/null +++ b/client/collapser.cc @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * collapser.cc + * + * Mon Sep 15 09:48:46 CEST 2008 + * Copyright 2008 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro 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. + * + * Pracro 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 Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "collapser.h" + +#include <QHBoxLayout> + +#define ANIM_TIME 250 +#define ANIM_INTERVAL 25 + +Collapser::Collapser(QWidget *collapsed, QWidget *expanded, bool setcollapsed) +{ + setLayout(new QHBoxLayout()); + layout()->setContentsMargins(0,0,0,0); + + this->collapsed = collapsed; + collapsed->show(); + c_height = collapsed->height(); + collapsed->setVisible(false); + + this->expanded = expanded; + expanded->show(); + e_height = expanded->height(); + expanded->setVisible(false); + + collapsed->setVisible(false); + expanded->setVisible(false); + + setCollapsed(setcollapsed); +} + +bool Collapser::isCollapsed() +{ + return is_collapsed; +} + +void Collapser::setCollapsed(bool setcollapsed) +{ + if(this->is_collapsed == setcollapsed) return; + + if(setcollapsed) collapse(); + else expand(); +} + +void Collapser::collapse() +{ + t_anim.start(); + + + is_collapsed = true; + timer_id = startTimer(ANIM_INTERVAL); +} + +void Collapser::expand() +{ + t_anim.start(); + + // show expanded + collapsed->setVisible(false); + layout()->removeWidget(collapsed); + layout()->addWidget(expanded); + expanded->setVisible(true); + + is_collapsed = false; + timer_id = startTimer(ANIM_INTERVAL); +} + +void Collapser::toggleCollapse() +{ + if(!is_collapsed) collapse(); + + else expand(); +} + +void Collapser::anim() +{ + killTimer(timer_id); + + double x = (double)(t_anim.elapsed()) / ANIM_TIME; + double y = 1; + + if(x < 1) { + y = x * x * x; + + timer_id = startTimer(ANIM_INTERVAL); + } else { + + if(is_collapsed) { + // show collapsed + expanded->setVisible(false); + layout()->removeWidget(expanded); + layout()->addWidget(collapsed); + collapsed->setVisible(true); + + } + + } + + if(!is_collapsed) { + setFixedHeight((1 - y) * c_height + y * e_height); + } else { + setFixedHeight((1 - y) * e_height + y * c_height); + } +} + +void Collapser::timerEvent(QTimerEvent *) +{ + anim(); +} |