/* -*- 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 #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(); }