qt5base-lts/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.cpp
Jason McDonald 5635823e17 Remove "All rights reserved" line from license headers.
As in the past, to avoid rewriting various autotests that contain
line-number information, an extra blank line has been inserted at the
end of the license text to ensure that this commit does not change the
total number of lines in the license header.

Change-Id: I311e001373776812699d6efc045b5f742890c689
Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
2012-01-30 03:54:59 +01:00

360 lines
16 KiB
C++

/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** 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.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QGraphicsView>
#include <QStyleOptionGraphicsItem>
#include <QGraphicsSceneResizeEvent>
#include <QPixmap>
#include <QFont>
#include "themeevent.h"
#include "theme.h"
#include "topbar.h"
#include "mainview.h"
TopBar::TopBar(QGraphicsView* mainView, QGraphicsWidget* parent) :
GvbWidget(parent), m_mainView(mainView), m_isLimeTheme(false),
m_orientation(TopBar::None), m_topBarPixmap(), m_sizesBlue(), m_sizesLime()
{
setDefaultSizes();
m_titleFont = Theme::p()->font(Theme::TitleBar);
m_statusFont = Theme::p()->font(Theme::StatusBar);
connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange()));
}
TopBar::~TopBar()
{
}
void TopBar::resizeEvent(QGraphicsSceneResizeEvent* /*event*/)
{
//Check orientation
QString topbarName;
QSize mainViewSize = m_mainView->size();
int rotationAngle = static_cast<MainView*>(m_mainView)->rotationAngle();
if(rotationAngle == 90 || rotationAngle == 270 ) {
int wd = mainViewSize.width();
int ht = mainViewSize.height();
mainViewSize.setWidth(ht);
mainViewSize.setHeight(wd);
}
bool m_orientationChanged = false;
if(mainViewSize.height() >= mainViewSize.width()) {
if(m_orientation == TopBar::Landscape)
m_orientationChanged = true;
m_orientation = TopBar::Portrait;
topbarName = "topbar.svg";
}
else {
if(m_orientation == TopBar::Portrait)
m_orientationChanged = true;
m_orientation = TopBar::Landscape;
topbarName = "topbar_horisontal.svg";
}
//Calculate new size, resize by height, don't make it wider than the screen
QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ?
m_sizesBlue : m_sizesLime;
//Get current size for topbarpixmap
QSize currentSize = !m_topBarPixmap.isNull() && !m_orientationChanged ?
m_topBarPixmap.size() : sizes[topbarName];
QSize newSize = !m_orientationChanged ? QSize(currentSize) : sizes[topbarName];
//Scale according to aspect ratio
newSize.scale(size().toSize(), Qt::KeepAspectRatio);
//fix width to window widht if previous scaling produced too narrow image
if(newSize.width() < size().width()) {
newSize.scale(size().toSize(), Qt::KeepAspectRatioByExpanding);
}
//Calculate scaling factor for rest of the graphics scaling
qreal scaleFactor = (newSize.width() *1.0) / (currentSize.width() * 1.0);
//Scale graphics, if the scalefactor applies
//This is really heavy since the SVG graphics are read again from the resource
if(scaleFactor != 1 || m_topBarPixmap.isNull() ) {
m_topBarPixmap = Theme::p()->pixmap(topbarName, newSize );
m_topBarUserIcon = Theme::p()->pixmap("user_default_icon.svg",
!m_topBarUserIcon.isNull() && !m_orientationChanged ? m_topBarUserIcon.size()* scaleFactor : sizes["user_default_icon.svg"] * scaleFactor);
m_topBarUserStatus = Theme::p()->pixmap("user_status_online.svg",
!m_topBarUserStatus.isNull() && !m_orientationChanged ? m_topBarUserStatus.size() * scaleFactor : sizes["user_status_online.svg"] * scaleFactor);
m_topBarStatusBarLeft = Theme::p()->pixmap("status_field_left.svg",
!m_topBarStatusBarLeft.isNull() && !m_orientationChanged ? m_topBarStatusBarLeft.size()* scaleFactor : sizes["status_field_left.svg"] * scaleFactor);
m_topBarStatusBarRight = Theme::p()->pixmap("status_field_right.svg",
!m_topBarStatusBarRight.isNull() && !m_orientationChanged ? m_topBarStatusBarRight.size()* scaleFactor : sizes["status_field_right.svg"] * scaleFactor);
m_topBarStatusBarMiddle = Theme::p()->pixmap("status_field_middle.svg",
!m_topBarStatusBarMiddle.isNull() && !m_orientationChanged ? m_topBarStatusBarMiddle.size() * scaleFactor : QSize(185, sizes["status_field_middle.svg"].height()) * scaleFactor);
//Update the sizeHint to match the size of the scaled m_topBarPixmap
updateGeometry();
//Point Update - Positions relative to the Top Bar "Backgroud" size.
//TODO: consider some layout instead of calculating relative locations
QSize topBarPixmapSize = m_topBarPixmap.size();
QSize topBarUserIconSize = m_topBarUserIcon.size();
QSize topBarUserStatusSize = m_topBarUserStatus.size();
QSize topBarStatusBarLeftSize = m_topBarStatusBarLeft.size();
QSize topBarStatusBarMiddleSize = m_topBarStatusBarMiddle.size();
//Location for Title text 5% width, 35% heigth of the background pixmap
m_topBarTitlePoint = QPoint(topBarPixmapSize.width()* 0.05,
topBarPixmapSize.height() * 0.35);
//User Icon location
//Placing 70% of the width and 10% of the height of the top bar background
m_topBarUserIconPoint = QPoint((topBarPixmapSize.width() * 0.7), (topBarPixmapSize.height() * 0.1));
//If Blue theme is in use - position user status icon on the right side of the user icon
if(!m_isLimeTheme) {
//Place the status icon on top of the right edge of the user icon, lower it by 35% of the height of the user icon
m_topBarUserStatusPoint = QPoint( ( (m_topBarUserIconPoint.x()+topBarUserIconSize.width() ) -
( topBarUserStatusSize.width()/2 )),
(m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.35 )));
}
//If Lime theme is in use - position user status icon on the left side of the user icon
else {
//Place the status icon on top of the left side of the user icon, lower it by 50% of the height of the user icon
//and move left by 5% of the icon
m_topBarUserStatusPoint = QPoint( m_topBarUserIconPoint.x() + ( topBarUserIconSize.width() * 0.05),
(m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.5 )));
}
//Status bar
//Placing the left side of the status bar 5% of the width, 50% of the height of the top bar background
//Set the text baseline 80% of the height of the status bar
m_topBarStatusBarLeftPoint = QPoint( (topBarPixmapSize.width()* 0.05),
(topBarPixmapSize.height() * 0.5));
m_topBarStatusBarMiddlePoint = QPoint( (m_topBarStatusBarLeftPoint.x() + topBarStatusBarLeftSize.width()),
(m_topBarStatusBarLeftPoint.y()));
m_topBarStatusBarRightPoint = QPoint( (m_topBarStatusBarMiddlePoint.x() + topBarStatusBarMiddleSize.width()),
(m_topBarStatusBarMiddlePoint.y() ) );
m_topBarStatusBarTextPoint = QPoint(m_topBarStatusBarMiddlePoint.x(),
m_topBarStatusBarMiddlePoint.y() + (topBarStatusBarMiddleSize.height()*0.8) );
} //if scalefactor
}
void TopBar::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget*/ )
{
//Topbar background
painter->drawPixmap(option->exposedRect, m_topBarPixmap, option->exposedRect);
//User Icon
painter->drawPixmap(m_topBarUserIconPoint, m_topBarUserIcon);
//User Status
painter->drawPixmap(m_topBarUserStatusPoint, m_topBarUserStatus);
//Status bar
painter->drawPixmap(m_topBarStatusBarLeftPoint, m_topBarStatusBarLeft);
painter->drawPixmap(m_topBarStatusBarMiddlePoint, m_topBarStatusBarMiddle);
painter->drawPixmap(m_topBarStatusBarRightPoint, m_topBarStatusBarRight);
//Title text
painter->save();
painter->setFont(m_titleFont);
painter->setOpacity(0.7);
painter->setPen(Qt::white);
painter->drawText(m_topBarTitlePoint, QString("Contacts") );
//Status text
painter->setFont(m_statusFont);
painter->setOpacity(1.0);
painter->drawText(m_topBarStatusBarTextPoint, QString("My Status (fixed)") );
painter->restore();
}
QRectF TopBar::boundingRect() const
{
//It's possible that m_topBarPixmap is not allocated yet,
//in this case default size is used for setting boundingRect
QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ?
m_sizesBlue : m_sizesLime;
if(!m_topBarPixmap.isNull())
return QRectF(0, 0, m_topBarPixmap.size().width(), m_topBarPixmap.size().height());
else
return QRectF(0, 0, sizes["topbar.svg"].width(), sizes["topbar.svg"].height());
}
void TopBar::themeChange()
{
m_titleFont = Theme::p()->font(Theme::TitleBar);
m_statusFont = Theme::p()->font(Theme::StatusBar);
//Calculate the scaling factor
QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ?
m_sizesBlue : m_sizesLime;
QString topbarString= m_orientation == TopBar::Portrait ?
"topbar.svg" : "topbar_horisontal.svg";
QSize topBarSize = sizes[topbarString];
QSize newSize = QSize(topBarSize);
//Scale according to aspect ratio
newSize.scale(size().toSize(), Qt::KeepAspectRatio);
//fix width to window widht if previous scaling produced too narrow image
if(newSize.width() < size().width()) {
newSize.scale(size().toSize(), Qt::KeepAspectRatioByExpanding);
}
//Calculate scaling factor for rest of the graphics scaling
qreal scaleFactor = (newSize.width() *1.0) / (topBarSize.width() * 1.0);
//Background
m_topBarPixmap = Theme::p()->pixmap(topbarString, sizes[topbarString] * scaleFactor);
//User Icon
m_topBarUserIcon = Theme::p()->pixmap("user_default_icon.svg", sizes["user_default_icon.svg"] * scaleFactor);
//User Status
m_topBarUserStatus = Theme::p()->pixmap("user_status_online.svg", sizes["user_status_online.svg"] * scaleFactor);
//Status Bar
m_topBarStatusBarLeft = Theme::p()->pixmap("status_field_left.svg", sizes["status_field_left.svg"] * scaleFactor);
m_topBarStatusBarRight = Theme::p()->pixmap("status_field_right.svg", sizes["status_field_right.svg"] * scaleFactor);
m_topBarStatusBarMiddle = Theme::p()->pixmap("status_field_middle.svg",
QSize(185, sizes["status_field_middle.svg"].height())* scaleFactor);
//Update Drawing points for Top Bar elements, points are relative to the top bar background size
QSize topBarPixmapSize = m_topBarPixmap.size();
QSize topBarUserIconSize = m_topBarUserIcon.size();
QSize topBarUserStatusSize = m_topBarUserStatus.size();
QSize topBarStatusBarLeftSize = m_topBarStatusBarLeft.size();
QSize topBarStatusBarMiddleSize = m_topBarStatusBarMiddle.size();
//Theme Check
(Theme::p()->theme() == Theme::Lime) ? m_isLimeTheme = true : m_isLimeTheme = false;
//User Icon location
//Placing 70% of the width and 10% of the height of the top bar background
m_topBarUserIconPoint = QPoint((0.7*topBarPixmapSize.width()), (0.1*topBarPixmapSize.height()));
//If Blue theme is in use - position user status icon on the right side of the user icon
if(!m_isLimeTheme) {
//Place the status icon on top of the right edge of the user icon, lower it by 35% of the height of the user icon
m_topBarUserStatusPoint = QPoint( ( (m_topBarUserIconPoint.x()+topBarUserIconSize.width() ) - ( topBarUserStatusSize.width()/2 )),
(m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.35 )));
}
//If Lime theme is in use - position user status icon on the left side of the user icon
else {
//Place the status icon on top of the left side of the user icon, lower it by 50% of the height of the user icon
//and move left by 5% of the icon
m_topBarUserStatusPoint = QPoint( m_topBarUserIconPoint.x() + ( topBarUserIconSize.width() * 0.05),
(m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.5 )));
}
//Status bar
//Placing the left side of the status bar 5% of the width, 50% of the height of the top bar background
//Set the text baseline 80% of the height of the status bar
m_topBarStatusBarLeftPoint = QPoint( (topBarPixmapSize.width()* 0.05),
(topBarPixmapSize.height() * 0.5));
m_topBarStatusBarMiddlePoint = QPoint( (m_topBarStatusBarLeftPoint.x() + topBarStatusBarLeftSize.width()),
(m_topBarStatusBarLeftPoint.y()));
m_topBarStatusBarRightPoint = QPoint( (m_topBarStatusBarMiddlePoint.x() + topBarStatusBarMiddleSize.width()),
(m_topBarStatusBarMiddlePoint.y() ) );
m_topBarStatusBarTextPoint = QPoint(m_topBarStatusBarMiddlePoint.x(),
m_topBarStatusBarMiddlePoint.y() + (topBarStatusBarMiddleSize.height()*0.8) );
update();
}
QSizeF TopBar::sizeHint(Qt::SizeHint which,
const QSizeF &constraint) const
{
//It's possible that m_topBarPixmap is not allocated yet,
//in this case default size is used for setting size hint
QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ?
m_sizesBlue : m_sizesLime;
int height = !m_topBarPixmap.isNull() ?
m_topBarPixmap.height() : sizes["topbar.svg"].height();
switch (which)
{
case Qt::MinimumSize:
return QSizeF(-1, height);
case Qt::MaximumSize:
return QSizeF(-1, height);
default:
return QGraphicsWidget::sizeHint(which, constraint);
}
}
void TopBar::setDefaultSizes()
{
m_sizesBlue["topbar.svg"] = QSize(356,96);
m_sizesBlue["topbar_horisontal.svg"] = QSize(636,96);
m_sizesBlue["user_default_icon.svg"] = QSize(68,68);
m_sizesBlue["user_status_online.svg"] = QSize(38,38);
m_sizesBlue["status_field_left.svg"] = QSize(14,24);
m_sizesBlue["status_field_right.svg"] = QSize(10,24);
m_sizesBlue["status_field_middle.svg"] = QSize(14,24);
m_sizesLime["topbar.svg"] = QSize(356,96);
m_sizesLime["topbar_horisontal.svg"] = QSize(636,96);
m_sizesLime["user_default_icon.svg"] = QSize(84,68);
m_sizesLime["user_status_online.svg"] = QSize(24,24);
m_sizesLime["status_field_left.svg"] = QSize(14,24);
m_sizesLime["status_field_right.svg"] = QSize(10,24);
m_sizesLime["status_field_middle.svg"] = QSize(14,24);
}
void TopBar::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QRect rect = m_topBarStatusBarMiddle.rect();
rect.moveTopLeft(m_topBarStatusBarMiddlePoint);
QPointF scenePoint = event->scenePos();
if(rect.contains(scenePoint.toPoint())) {
emit clicked();
}
}