summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/client.pro2
-rw-r--r--client/collapser.cc132
-rw-r--r--client/collapser.h63
3 files changed, 197 insertions, 0 deletions
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 <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();
+}
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 <QWidget>
+#include <QTime>
+
+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__*/