diff options
Diffstat (limited to 'src/__TODO/AboutDialogGraphicsView.cpp')
| -rw-r--r-- | src/__TODO/AboutDialogGraphicsView.cpp | 220 | 
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(); +} | 
