##// END OF EJS Templates
Optimize string truncation algorithm...
Optimize string truncation algorithm Use binary search for truncating strings instead of linear search. Change-Id: I31cde493328e3192a53802aa65dea61975b9e87f Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>

File last commit:

r2539:74f3dbde7a75
r2541:563b21497627
Show More
cartesianchartaxis.cpp
195 lines | 6.1 KiB | text/x-c | CppLexer
/ src / axis / cartesianchartaxis.cpp
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
#include "cartesianchartaxis_p.h"
#include "qabstractaxis.h"
#include "qabstractaxis_p.h"
#include "chartpresenter_p.h"
#include "abstractchartlayout_p.h"
#include "abstractdomain_p.h"
#include "linearrowitem_p.h"
#include <QValueAxis>
#include <QLogValueAxis>
#include <QGraphicsLayout>
QTCOMMERCIALCHART_BEGIN_NAMESPACE
CartesianChartAxis::CartesianChartAxis(QAbstractAxis *axis, QGraphicsItem *item , bool intervalAxis)
: ChartAxisElement(axis, item, intervalAxis)
{
Q_ASSERT(item);
}
CartesianChartAxis::~CartesianChartAxis()
{
}
void CartesianChartAxis::createItems(int count)
{
if (arrowItems().size() == 0) {
QGraphicsLineItem *arrow = new LineArrowItem(this, this);
arrow->setPen(axis()->linePen());
arrowGroup()->addToGroup(arrow);
}
if (intervalAxis() && gridItems().size() == 0) {
for (int i = 0 ; i < 2 ; i ++){
QGraphicsLineItem *item = new QGraphicsLineItem(this);
item->setPen(axis()->gridLinePen());
gridGroup()->addToGroup(item);
}
}
for (int i = 0; i < count; ++i) {
QGraphicsLineItem *arrow = new QGraphicsLineItem(this);
QGraphicsLineItem *grid = new QGraphicsLineItem(this);
QGraphicsTextItem *label = new QGraphicsTextItem(this);
QGraphicsTextItem *title = titleItem();
arrow->setPen(axis()->linePen());
grid->setPen(axis()->gridLinePen());
label->setFont(axis()->labelsFont());
label->setDefaultTextColor(axis()->labelsBrush().color());
label->setRotation(axis()->labelsAngle());
title->setFont(axis()->titleFont());
title->setDefaultTextColor(axis()->titleBrush().color());
title->setHtml(axis()->titleText());
arrowGroup()->addToGroup(arrow);
gridGroup()->addToGroup(grid);
labelGroup()->addToGroup(label);
if ((gridItems().size()) % 2 && gridItems().size() > 2) {
QGraphicsRectItem* shades = new QGraphicsRectItem(this);
shades->setPen(axis()->shadesPen());
shades->setBrush(axis()->shadesBrush());
shadeGroup()->addToGroup(shades);
}
}
}
void CartesianChartAxis::deleteItems(int count)
{
QList<QGraphicsItem *> lines = gridItems();
QList<QGraphicsItem *> labels = labelItems();
QList<QGraphicsItem *> shades = shadeItems();
QList<QGraphicsItem *> axis = arrowItems();
for (int i = 0; i < count; ++i) {
if (lines.size() % 2 && lines.size() > 1)
delete(shades.takeLast());
delete(lines.takeLast());
delete(labels.takeLast());
delete(axis.takeLast());
}
}
void CartesianChartAxis::updateLayout(QVector<qreal> &layout)
{
int diff = ChartAxisElement::layout().size() - layout.size();
if (diff > 0)
deleteItems(diff);
else if (diff < 0)
createItems(-diff);
if (animation()) {
switch (presenter()->state()) {
case ChartPresenter::ZoomInState:
animation()->setAnimationType(AxisAnimation::ZoomInAnimation);
animation()->setAnimationPoint(presenter()->statePoint());
break;
case ChartPresenter::ZoomOutState:
animation()->setAnimationType(AxisAnimation::ZoomOutAnimation);
animation()->setAnimationPoint(presenter()->statePoint());
break;
case ChartPresenter::ScrollUpState:
case ChartPresenter::ScrollLeftState:
animation()->setAnimationType(AxisAnimation::MoveBackwordAnimation);
break;
case ChartPresenter::ScrollDownState:
case ChartPresenter::ScrollRightState:
animation()->setAnimationType(AxisAnimation::MoveForwardAnimation);
break;
case ChartPresenter::ShowState:
animation()->setAnimationType(AxisAnimation::DefaultAnimation);
break;
}
animation()->setValues(ChartAxisElement::layout(), layout);
presenter()->startAnimation(animation());
} else {
setLayout(layout);
updateGeometry();
}
}
bool CartesianChartAxis::isEmpty()
{
return axisGeometry().isEmpty()
|| gridGeometry().isEmpty()
|| qFuzzyCompare(min(), max());
}
void CartesianChartAxis::setGeometry(const QRectF &axis, const QRectF &grid)
{
m_gridRect = grid;
setAxisGeometry(axis);
if (isEmpty())
return;
QVector<qreal> layout = calculateLayout();
updateLayout(layout);
}
QSizeF CartesianChartAxis::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{
Q_UNUSED(which);
Q_UNUSED(constraint);
return QSizeF();
}
void CartesianChartAxis::handleArrowPenChanged(const QPen &pen)
{
foreach (QGraphicsItem *item, arrowItems())
static_cast<QGraphicsLineItem *>(item)->setPen(pen);
}
void CartesianChartAxis::handleGridPenChanged(const QPen &pen)
{
foreach (QGraphicsItem *item, gridItems())
static_cast<QGraphicsLineItem *>(item)->setPen(pen);
}
void CartesianChartAxis::handleShadesBrushChanged(const QBrush &brush)
{
foreach (QGraphicsItem *item, shadeItems())
static_cast<QGraphicsRectItem *>(item)->setBrush(brush);
}
void CartesianChartAxis::handleShadesPenChanged(const QPen &pen)
{
foreach (QGraphicsItem *item, shadeItems())
static_cast<QGraphicsRectItem *>(item)->setPen(pen);
}
#include "moc_cartesianchartaxis_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE