summaryrefslogtreecommitdiff
path: root/client/collapser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'client/collapser.cc')
-rw-r--r--client/collapser.cc132
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();
+}