38be0d1383
This is the beginning of revision history for this module. If you want to look at revision history older than this, please refer to the Qt Git wiki for how to use Git history grafting. At the time of writing, this wiki is located here: http://qt.gitorious.org/qt/pages/GitIntroductionWithQt If you have already performed the grafting and you don't see any history beyond this commit, try running "git log" with the "--follow" argument. Branched from the monolithic repo, Qt master branch, at commit 896db169ea224deb96c59ce8af800d019de63f12
360 lines
16 KiB
C++
360 lines
16 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
** All rights reserved.
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
**
|
|
** This file is part of the examples of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** No Commercial Usage
|
|
** This file contains pre-release code and may not be distributed.
|
|
** You may use this file in accordance with the terms and conditions
|
|
** contained in the Technology Preview License Agreement accompanying
|
|
** this package.
|
|
**
|
|
** GNU Lesser General Public License Usage
|
|
** Alternatively, 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 qt-info@nokia.com.
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
** $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();
|
|
}
|
|
}
|