--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbcore/utils/hbthetestwidget_p.cpp Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,402 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbCore module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at developer.feedback@nokia.com.
+**
+****************************************************************************/
+
+#include "hbthetestwidget_p.h"
+#include "hbinstance.h"
+#include "hbnamespace_p.h"
+#include <hbapplication.h>
+#include "hbtoolbutton_p.h"
+#include "hbstyleoptiontoolbutton.h"
+#include "hbcolorscheme.h"
+#include "hbtextitem.h"
+
+#ifdef Q_OS_SYMBIAN
+#include <eikenv.h>
+#include <apgtask.h> // TApaTaskList, TApaTask
+#endif
+
+#include <QGraphicsSceneMouseEvent>
+#include <QGraphicsGridLayout>
+#include <QGraphicsWidget>
+#include <QTextStream>
+#include <QFile>
+#include <QDir>
+#include <QTimer>
+#include <hbaction.h>
+
+#include <QDebug> // for qWarning
+
+#ifdef HB_TEXT_MEASUREMENT_UTILITY
+#include "hbtextmeasurementutility_p.h"
+#endif //HB_TEXT_MEASUREMENT_UTILITY
+
+//#ifdef Q_OS_SYMBIAN
+//#include <coemain.h>
+//#include <fbs.h>
+//#endif
+
+const int KWidth = 140; // container size, button width is KWidth/2
+const int KHeight = 140; // container size, button height is KHeight/2
+// how much must button be dragged before it is actually moved
+const int KThreshold = 16;
+
+HbTheTestButton::HbTheTestButton(QGraphicsItem *parent)
+: HbToolButton(parent),
+ mPressedDown(false)
+{
+ setAttribute(Hb::InteractionDisabled); // no feedback from test button
+ mPosition = scenePos();
+ mScreenSize = HbDeviceProfile::profile(this).logicalSize();
+}
+
+HbTheTestButton::~HbTheTestButton()
+{
+}
+
+QSizeF HbTheTestButton::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
+{
+ switch(which){
+ case Qt::MinimumSize: //fallthrough
+ case Qt::MaximumSize: //fallthrough
+ return QSizeF(KWidth/2, KHeight/2);
+ default:
+ return HbAbstractButton::sizeHint( which, constraint );
+ }
+}
+
+/*!
+ \reimp
+ Removed tooltip support.
+ */
+void HbTheTestButton::updatePrimitives()
+{
+ HbToolButtonPrivate *d = static_cast<HbToolButtonPrivate *>(HbToolButton::d_ptr);
+
+ HbStyleOptionToolButton option;
+ if (d->action) {
+ setCheckable(d->action->isCheckable());
+ setChecked(d->action->isChecked());
+ setEnabled(d->action->isEnabled());
+ }
+
+ initStyleOption(&option);
+ if (d->frameItem) {
+ style()->updatePrimitive(d->frameItem, HbStyle::P_ToolButton_frame, &option);
+ }
+ if (d->textItem) {
+ style()->updatePrimitive(d->textItem, HbStyle::P_ToolButton_text, &option);
+ }
+ if (d->iconItem) {
+ style()->updatePrimitive(d->iconItem, HbStyle::P_ToolButton_icon, &option);
+ }
+}
+
+/*!
+ reimp
+*/
+void HbTheTestButton::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ HbToolButton::mousePressEvent(event);
+ mPressedDown = true;
+ mMoved = false;
+ mPressedPos = event->scenePos();
+ mPosition = scenePos() - pos();
+ event->accept();
+}
+
+/*!
+ reimp
+*/
+void HbTheTestButton::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (!mMoved) {
+ HbToolButton::mouseReleaseEvent(event);
+ }
+ mMoved = false;
+ mPressedDown = false;
+ event->accept();
+}
+
+/*!
+ reimp
+
+*/
+void HbTheTestButton::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ HbToolButton::mouseMoveEvent(event);
+ QPointF moved = mPressedPos - event->scenePos();
+ if (mMoved || (mPressedDown && ((qAbs(moved.x()) > KThreshold) ||
+ (qAbs(moved.y()) > KThreshold)))) {
+ QPointF newPosition = mPosition - moved;
+ if ((newPosition.x() + pos().x()) < 0) {
+ newPosition.setX(0 - pos().x());
+ }
+ if ((newPosition.y() + pos().y()) < 0) {
+ newPosition.setY(0 - pos().y());
+ }
+
+ if (newPosition.x() > (mScreenSize.width() - KWidth/2 - pos().x())) {
+ newPosition.setX(mScreenSize.width() - KWidth/2 - pos().x());
+ }
+ if (newPosition.y() > (mScreenSize.height() - KHeight/2 - pos().y())) {
+ newPosition.setY(mScreenSize.height() - KHeight/2 - pos().y());
+ }
+ HbTheTestWidget *parentWidget = qgraphicsitem_cast<HbTheTestWidget*>(parentItem());
+ if (parentWidget) {
+ mMoved = true;
+ parentWidget->setPos(newPosition);
+ }
+ setDown(false);
+ }
+}
+
+
+
+
+class HbTheTestWidgetPrivate
+{
+public:
+ HbMainWindow *mMainWindow;
+ HbTheTestButton *mButton1;
+ HbTheTestButton *mButton2;
+ HbTheTestButton *mButton3;
+ HbTheTestButton *mButton4;
+ QGraphicsGridLayout *mLayout;
+};
+
+/*!
+ \class HbTheTestWidget
+ \internal
+ \proto
+*/
+HbTheTestWidget::HbTheTestWidget(HbMainWindow *mainWindow, QGraphicsItem *parent)
+: HbWidget(parent)
+{
+ d = new HbTheTestWidgetPrivate;
+ d->mMainWindow = mainWindow;
+
+ d->mLayout = new QGraphicsGridLayout();
+ d->mLayout->setContentsMargins( qreal(0.0), qreal(0.0), qreal(0.0), qreal(0.0) );
+ d->mLayout->setSpacing(0.0);
+ setLayout(d->mLayout);
+
+ HbAction *action1 = new HbAction(QString("1"),this);
+ d->mButton1 = new HbTheTestButton(this);
+ d->mButton1->setAction(action1);
+ d->mButton1->setToolButtonStyle(HbToolButton::ToolButtonText);
+
+ HbAction *action2 = new HbAction(QString("2"),this);
+ d->mButton2 = new HbTheTestButton(this);
+ d->mButton2->setAction(action2);
+ d->mButton2->setToolButtonStyle(HbToolButton::ToolButtonText);
+
+ HbAction *action3 = new HbAction(QString("3"),this);
+ d->mButton3 = new HbTheTestButton(this);
+ d->mButton3->setAction(action3);
+ d->mButton3->setToolButtonStyle(HbToolButton::ToolButtonText);
+
+ HbAction *action4 = new HbAction(QString("4"),this);
+ d->mButton4 = new HbTheTestButton(this);
+ d->mButton4->setAction(action4);
+ d->mButton4->setToolButtonStyle(HbToolButton::ToolButtonText);
+
+ d->mLayout->addItem(d->mButton1, 0, 0);
+ d->mLayout->addItem(d->mButton2, 0, 1);
+ d->mLayout->addItem(d->mButton3, 1, 0);
+ d->mLayout->addItem(d->mButton4, 1, 1);
+
+ QSize screenSize = HbDeviceProfile::profile(this).logicalSize();
+ setPos((screenSize.width()-KWidth)/2,(screenSize.height()-KHeight)/2);
+
+ QObject::connect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)),
+ this, SLOT(orientationChanged(Qt::Orientation)));
+}
+
+
+HbTheTestWidget::~HbTheTestWidget()
+{
+ delete d;
+}
+
+void HbTheTestWidget::orientationChanged(Qt::Orientation newOrientation)
+{
+ Q_UNUSED(newOrientation)
+ QSize screenSize = HbDeviceProfile::profile(this).logicalSize();
+ setPos((screenSize.width()-KWidth)/2,(screenSize.height()-KHeight)/2);
+ d->mButton1->mScreenSize = screenSize;
+ d->mButton2->mScreenSize = screenSize;
+ d->mButton3->mScreenSize = screenSize;
+ d->mButton4->mScreenSize = screenSize;
+}
+
+QSizeF HbTheTestWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
+{
+ switch(which){
+ case Qt::MinimumSize: //fallthrough
+ case Qt::MaximumSize: //fallthrough
+ return QSizeF(KWidth, KHeight);
+ default:
+ return HbWidget::sizeHint( which, constraint );
+ }
+}
+
+HbTheTestButton *HbTheTestWidget::button1()
+{
+ if (d) {
+ return d->mButton1;
+ }
+ return 0;
+}
+
+HbTheTestButton *HbTheTestWidget::button2()
+{
+ if (d) {
+ return d->mButton2;
+ }
+ return 0;
+}
+
+HbTheTestButton *HbTheTestWidget::button3()
+{
+ if (d) {
+ return d->mButton3;
+ }
+ return 0;
+}
+
+HbTheTestButton *HbTheTestWidget::button4()
+{
+ if (d) {
+ return d->mButton4;
+ }
+ return 0;
+}
+
+// slots that can be used in test buttons start here
+
+void HbTheTestWidget::textLayoutMeasure()
+{
+#ifdef HB_TEXT_MEASUREMENT_UTILITY
+ HbTextMeasurementUtility *measureUtility = HbTextMeasurementUtility::instance();
+ measureUtility->measureItems();
+#endif //HB_TEXT_MEASUREMENT_UTILITY
+}
+
+void HbTheTestWidget::textLayoutWriteReport()
+{
+#ifdef HB_TEXT_MEASUREMENT_UTILITY
+ HbTextMeasurementUtility *measureUtility = HbTextMeasurementUtility::instance();
+ HbDeviceProfile profile = HbDeviceProfile::profile(d->mMainWindow);
+ if (!HbApplication::applicationName().isEmpty()) {
+ measureUtility->writeReport(profile, HbApplication::applicationName());
+ } else {
+ measureUtility->writeReport(profile, "unknown_application");
+ }
+ measureUtility->reset();
+#endif //HB_TEXT_MEASUREMENT_UTILITY
+}
+
+void HbTheTestWidget::toggleOrientation()
+{
+ d->mMainWindow->toggleOrientation();
+}
+
+void HbTheTestWidget::toggleMirroring()
+{
+ Qt::LayoutDirection dir = d->mMainWindow->layoutDirection();
+ d->mMainWindow->setLayoutDirection(dir == Qt::LeftToRight ? Qt::RightToLeft : Qt::LeftToRight);
+}
+
+void HbTheTestWidget::setApplicationBackground()
+{
+#ifdef Q_OS_SYMBIAN
+ TApaTask task(CEikonEnv::Static()->WsSession());
+ task.SetWgId(CEikonEnv::Static()->RootWin().Identifier());
+ task.SendToBackground();
+#endif
+}
+
+void HbTheTestWidget::screenCapture()
+{
+ setVisible(false);
+ QTimer::singleShot(1000, this, SLOT(doScreenCapture()));
+}
+
+void HbTheTestWidget::doScreenCapture()
+{
+#if defined (Q_OS_WIN32)
+ QString filePath("c:\\");
+ filePath = QDir::toNativeSeparators(filePath);
+#elif defined (Q_OS_SYMBIAN)
+ QString filePath("f:\\");
+ filePath = QDir::toNativeSeparators(filePath);
+ if (!QDir(filePath).exists()) {
+ filePath = "e:\\";
+ filePath = QDir::toNativeSeparators(filePath);
+ if (!QDir(filePath).exists()) {
+ filePath = "c:\\"; // this should always exist
+ filePath = QDir::toNativeSeparators(filePath);
+ }
+ }
+#elif defined (Q_OS_UNIX)
+ QString filePath(QDir::tempPath());
+ filePath.append(QDir::separator());
+#endif
+
+ filePath.append("data");
+ filePath.append(QDir::separator());
+ filePath.append("hb_screenshots");
+
+ QDir dir(filePath);
+ if (!dir.exists()) {
+ dir.mkpath(filePath);
+ }
+
+ if (!HbApplication::applicationName().isEmpty()) {
+ filePath.append(HbApplication::applicationName());
+ } else {
+ filePath.append("unknown_application");
+ }
+ filePath.append(".png");
+
+//#ifdef Q_OS_SYMBIAN
+ // todo: not fail-safe code
+// TSize screenSize = CCoeEnv::Static()->ScreenDevice()->SizeInPixels();
+// TDisplayMode displayMode = CCoeEnv::Static()->ScreenDevice()->DisplayMode();
+
+// CFbsBitmap *bitmap = new (ELeave) CFbsBitmap();
+// User::LeaveIfError(bitmap->Create(screenSize, displayMode));
+
+// CCoeEnv::Static()->ScreenDevice()->CopyScreenToBitmap(bitmap);
+// QPixmap screenPixmap = QPixmap::fromSymbianCFbsBitmap(bitmap);
+//#else
+ QPixmap screenPixmap = QPixmap::grabWindow(
+ QApplication::activeWindow()->winId());
+//#endif
+ QString format = "png";
+ screenPixmap.save(filePath.toLatin1(), format.toLatin1());
+ setVisible(true);
+}
+