summaryrefslogtreecommitdiffstats
path: root/src/__TODO/AboutDialogGraphicsView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/__TODO/AboutDialogGraphicsView.cpp')
-rw-r--r--src/__TODO/AboutDialogGraphicsView.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/__TODO/AboutDialogGraphicsView.cpp b/src/__TODO/AboutDialogGraphicsView.cpp
new file mode 100644
index 0000000..3c031f2
--- /dev/null
+++ b/src/__TODO/AboutDialogGraphicsView.cpp
@@ -0,0 +1,220 @@
+/***************************************************************************
+* Copyright (C) 2006-2012 by Thomas Schweitzer *
+* thomas-schweitzer(at)arcor.de *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License version 2.0 as *
+* published by the Free Software Foundation. *
+* *
+* This program 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 this program in the file LICENSE.GPL; if not, write to the *
+* Free Software Foundation, Inc., *
+* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+***************************************************************************/
+
+#include "AboutDialogGraphicsView.h"
+
+#include "AboutDialog.h"
+
+#include <tqtgui.h>
+#include <tntqdesktopwidget.h>
+#include <tqdate.h>
+#include <tqtimeline.h>
+#include <tntqsplashscreen.h>
+
+/*!
+ \class AboutDialogGraphicsView
+ \brief A container for the real \a AboutDialog. Makes the 3D animation possible.
+
+ The 3D animation shall suggest the user, that he is looking at his desktop, while
+ this animation is done. Since this is not directly possible, \a AboutDialogGraphicsView
+ when shown starts in frameless fullscreen mode with a screenshot of the desktop as background.
+*/
+
+/*!
+ \brief The constructor initializes everything needed for the 3D animation.
+ */
+AboutDialogGraphicsView::AboutDialogGraphicsView(AboutDialog *aboutDialog, TQWidget *parentWindow) :
+ TQGraphicsView(parentWindow), _aboutDialog(NULL), _graphicsProxyWidget(NULL),
+ _parentWindow(NULL), _timeLine(NULL), _aboutDialogAsSplashScreen(NULL)
+{
+ _parentWindow = parentWindow;
+ setWindowFlags(TQt::SplashScreen);
+
+#ifdef Q_OS_LINUX
+ TQRect availableGeometry = TQApplication::desktop()->availableGeometry();
+ TQRect newGeometry = TQRect(availableGeometry.x(),
+ availableGeometry.y(), availableGeometry.width(), availableGeometry.height());
+#else
+ TQRect newGeometry = TQRect(-1, -1,
+ TQApplication::desktop()->rect().width() + 2,
+ TQApplication::desktop()->rect().height() + 2);
+#endif
+ setGeometry(newGeometry);
+
+ _aboutDialog = aboutDialog;
+
+ _windowTitleBarWidth = 0;
+ _windowPosOffset = 0;
+
+ TQGraphicsScene *scene = new TQGraphicsScene(this);
+ setSceneRect(newGeometry);
+ _aboutDialogAsSplashScreen = new TQSplashScreen(this);
+ _graphicsProxyWidget = scene->addWidget(_aboutDialogAsSplashScreen);
+ _graphicsProxyWidget->setWindowFlags(TQt::ToolTip);
+
+ setScene(scene);
+ setRenderHint(TQPainter::Antialiasing);
+
+ setCacheMode(TQGraphicsView::CacheBackground);
+ setViewportUpdateMode(TQGraphicsView::BoundingRectViewportUpdate);
+
+ connect(_aboutDialog, SIGNAL(finished(int)), this, SLOT(hide()));
+
+ //setWindowOpacity(0.9);
+
+ setVerticalScrollBarPolicy(TQt::ScrollBarAlwaysOff);
+ setHorizontalScrollBarPolicy(TQt::ScrollBarAlwaysOff);
+ setStyleSheet("AboutDialogGraphicsView { border: 0px; }");
+
+ _timeLine = new TQTimeLine(1000, this);
+ _timeLine->setFrameRange(270, 0);
+ //_timeLine->setUpdateInterval(10);
+ //_timeLine->setCurveShape(TQTimeLine::EaseInCurve);
+ connect(_timeLine, SIGNAL(frameChanged(int)), this, SLOT(updateStep(int)));
+}
+
+AboutDialogGraphicsView::~AboutDialogGraphicsView(void)
+{
+}
+
+/*!
+ \brief Grabs a screenshot of the full desktop and shows that as background. Above that background the
+ AboutDialog 3D animation is shown. Also grabs the content of the AboutDialog itself.
+ */
+void AboutDialogGraphicsView::show()
+{
+ // Because on X11 system the window decoration is only available after a widget has been shown
+ // once,
+ // we can detect _windowTitleBarWidth here for the first time.
+ _windowTitleBarWidth = _parentWindow->geometry().y() - _parentWindow->y();
+ // If the _windowTitleBarWidth could not be determined, try it a second way. Even the chances are
+ // low to get good results.
+ if (_windowTitleBarWidth == 0)
+ {
+ _windowTitleBarWidth = _parentWindow->frameGeometry().height() -
+ _parentWindow->geometry().height();
+ }
+#ifdef Q_OS_LINUX
+ if (_windowTitleBarWidth == 0)
+ {
+ //TODO: 27 pixel is a fix value for the Ubuntu 10.4 default window theme and so just a
+ // workaround for that specific case.
+ _windowPosOffset = 27;
+ _windowTitleBarWidth = 27;
+ }
+#endif
+ TQPixmap originalPixmap = TQPixmap::grabWindow(
+ TQApplication::desktop()->winId(),
+ TQApplication::desktop()->availableGeometry().x(),
+ TQApplication::desktop()->availableGeometry().y(), geometry().width(),
+ geometry().height());
+ TQBrush brush(originalPixmap);
+ TQTransform transform;
+ transform.translate(0, TQApplication::desktop()->availableGeometry().y());
+ brush.setTransform(transform);
+
+ setBackgroundBrush(brush);
+
+ _aboutDialogAsSplashScreen->setPixmap(TQPixmap::grabWidget(_aboutDialog));
+ _graphicsProxyWidget->setGeometry(_aboutDialog->geometry());
+ _aboutDialog->hide();
+ _graphicsProxyWidget->setPos(_parentWindow->geometry().x() +
+ (_parentWindow->geometry().width() - _graphicsProxyWidget->geometry().width()) / 2,
+ _parentWindow->y() + _windowTitleBarWidth - _windowPosOffset);
+
+ TQRectF r = _graphicsProxyWidget->boundingRect();
+ _graphicsProxyWidget->setTransform(TQTransform().translate(
+ r.width() / 2, -_windowTitleBarWidth).rotate(270, TQt::XAxis)
+ //.rotate(90, TQt::YAxis)
+ //.rotate(5, TQt::ZAxis)
+ //.scale(1 + 1.5 * step, 1 + 1.5 * step)
+ .translate(-r.width() / 2, _windowTitleBarWidth));
+
+ _graphicsProxyWidget->show();
+ //_aboutDialogAsSplashScreen->show();
+ TQGraphicsView::show();
+
+ connect(_timeLine, SIGNAL(finished()), this, SLOT(showAboutDialog()));
+ _timeLine->setDirection(TQTimeLine::Forward);
+ _timeLine->start();
+}
+
+/*!
+ \brief Does the next calculation/transformation step.
+ */
+void AboutDialogGraphicsView::updateStep(int step)
+{
+ TQRectF r = _graphicsProxyWidget->boundingRect();
+ _graphicsProxyWidget->setTransform(TQTransform().translate(
+ r.width() / 2, -_windowTitleBarWidth).rotate(step, TQt::XAxis)
+ //.rotate(step, TQt::YAxis)
+ //.rotate(step * 5, TQt::ZAxis)
+ //.scale(1 + 1.5 * step, 1 + 1.5 * step)
+ .translate(-r.width() / 2, _windowTitleBarWidth));
+ //update();
+}
+
+/*!
+ \brief Stops the 3D animation, moves the AboutDialog to the correct place and really shows it.
+ */
+void AboutDialogGraphicsView::showAboutDialog()
+{
+ //hide();
+ disconnect(_timeLine, SIGNAL(finished()), this, SLOT(showAboutDialog()));
+ _aboutDialog->move(int(_parentWindow->geometry().x() +
+ (_parentWindow->geometry().width() - _graphicsProxyWidget->geometry().width()) / 2),
+ _parentWindow->y() + _windowTitleBarWidth - _windowPosOffset);
+ _aboutDialog->exec();
+}
+
+/*!
+ \brief Does not directly hide the AboutDialog but instead starts the "fade out" 3D animation.
+ */
+void AboutDialogGraphicsView::hide()
+{
+ _graphicsProxyWidget->setPos(_parentWindow->geometry().x() +
+ (_parentWindow->geometry().width() - _graphicsProxyWidget->geometry().width()) / 2,
+ _parentWindow->y() + _windowTitleBarWidth - _windowPosOffset);
+
+ TQRectF r = _graphicsProxyWidget->boundingRect();
+ _graphicsProxyWidget->setTransform(TQTransform().translate(
+ r.width() / 2, -_windowTitleBarWidth).rotate(0, TQt::XAxis)
+ //.rotate(90, TQt::YAxis)
+ //.rotate(5, TQt::ZAxis)
+ //.scale(1 + 1.5 * step, 1 + 1.5 * step)
+ .translate(-r.width() / 2, _windowTitleBarWidth));
+
+ _graphicsProxyWidget->show();
+ //_aboutDialogAsSplashScreen->show();
+ TQGraphicsView::show();
+
+ connect(_timeLine, SIGNAL(finished()), this, SLOT(hideReally()));
+ _timeLine->setDirection(TQTimeLine::Backward);
+ _timeLine->start();
+}
+
+/*!
+ \brief This slot really hides this AboutDialog container.
+ */
+void AboutDialogGraphicsView::hideReally()
+{
+ disconnect(_timeLine, SIGNAL(finished()), this, SLOT(hideReally()));
+ TQGraphicsView::hide();
+ _parentWindow->activateWindow();
+}