From eff75e9193b0e1d9175f49e003977d524c6a2d36 Mon Sep 17 00:00:00 2001 From: deva Date: Tue, 16 Sep 2008 10:15:57 +0000 Subject: New collapser class --- client/client.pro | 2 + client/collapser.cc | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++ client/collapser.h | 63 +++++++++++++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 client/collapser.cc create mode 100644 client/collapser.h diff --git a/client/client.pro b/client/client.pro index de6c7fc..2ce4fa7 100644 --- a/client/client.pro +++ b/client/client.pro @@ -23,6 +23,7 @@ unix { } HEADERS += \ + collapser.h \ formatparser.h \ lua.h \ macro.h \ @@ -49,6 +50,7 @@ HEADERS += \ SOURCES += \ pracro.cc \ + collapser.cc \ formatparser.cc \ lua.cc \ macro.cc \ 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 + +#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(); +} diff --git a/client/collapser.h b/client/collapser.h new file mode 100644 index 0000000..6e9c8b4 --- /dev/null +++ b/client/collapser.h @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * collapser.h + * + * 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. + */ +#ifndef __PRACRO_COLLAPSER_H__ +#define __PRACRO_COLLAPSER_H__ + +#include +#include + +class Collapser : public QWidget { +Q_OBJECT +public: + Collapser(QWidget *collapsed, QWidget *expanded, bool setcollapsed = true); + + bool isCollapsed(); + void setCollapsed(bool setcollapsed); + +public slots: + void collapse(); + void expand(); + void toggleCollapse(); + +protected: + void timerEvent(QTimerEvent *); + +private: + QWidget *collapsed; + int c_height; + + QWidget *expanded; + int e_height; + + bool is_collapsed; + + void anim(); + QTime t_anim; + int timer_id; +}; + +#endif/*__PRACRO_COLLAPSER_H__*/ -- cgit v1.2.3