/usr/include/KChart/KChartAbstractCoordinatePlane.h is in libkchart-dev 2.6.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 | /**
* Copyright (C) 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved.
*
* This file is part of the KD Chart library.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* 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. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KCHARTABSTRACTCOORDINATEPLANE_H
#define KCHARTABSTRACTCOORDINATEPLANE_H
#include <QObject>
#include <QList>
#include "KChartAbstractArea.h"
#include "KChartAbstractDiagram.h"
#include "KChartEnums.h"
namespace KChart {
class Chart;
class GridAttributes;
class DataDimension;
typedef QList<DataDimension> DataDimensionsList;
/**
* @brief Base class common for all coordinate planes, CartesianCoordinatePlane, PolarCoordinatePlane, TernaryCoordinatePlane
*/
class KCHART_EXPORT AbstractCoordinatePlane : public AbstractArea
{
Q_OBJECT
KCHART_DECLARE_PRIVATE_DERIVED_PARENT( AbstractCoordinatePlane, Chart* )
friend class AbstractGrid;
public:
enum AxesCalcMode { Linear, Logarithmic };
protected:
explicit AbstractCoordinatePlane( Chart* parent = 0 );
public:
virtual ~AbstractCoordinatePlane();
/**
* Adds a diagram to this coordinate plane.
* @param diagram The diagram to add.
*
* \sa replaceDiagram, takeDiagram
*/
virtual void addDiagram( AbstractDiagram* diagram );
/**
* Replaces the old diagram, or appends the
* diagram, it there is none yet.
*
* @param diagram The diagram to be used instead of the old diagram.
* This parameter must not be zero, or the method will do nothing.
*
* @param oldDiagram The diagram to be removed by the new diagram. This
* diagram will be deleted automatically. If the parameter is omitted,
* the very first diagram will be replaced. In case, there was no
* diagram yet, the new diagram will just be added.
*
* \note If you want to re-use the old diagram, call takeDiagram and
* addDiagram, instead of using replaceDiagram.
*
* \sa addDiagram, takeDiagram
*/
virtual void replaceDiagram( AbstractDiagram* diagram, AbstractDiagram* oldDiagram = 0 );
/**
* Removes the diagram from the plane, without deleting it.
*
* The plane no longer owns the diagram, so it is
* the caller's responsibility to delete the diagram.
*
* \sa addDiagram, replaceDiagram
*/
virtual void takeDiagram( AbstractDiagram* diagram );
/**
* @return The first diagram associated with this coordinate plane.
*/
AbstractDiagram* diagram();
/**
* @return The list of diagrams associated with this coordinate plane.
*/
AbstractDiagramList diagrams();
/**
* @return The list of diagrams associated with this coordinate plane.
*/
ConstAbstractDiagramList diagrams() const;
/**
* Distribute the available space among the diagrams and axes.
*/
virtual void layoutDiagrams() = 0;
/**
* Translate the given point in value space coordinates to a position
* in pixel space.
* @param diagramPoint The point in value coordinates.
* @returns The translated point.
*/
virtual const QPointF translate( const QPointF& diagramPoint ) const = 0;
/**
* @return Whether zooming with a rubber band using the mouse is enabled.
*/
bool isRubberBandZoomingEnabled() const;
/**
* Enables or disables zooming with a rubber band using the mouse.
*/
void setRubberBandZoomingEnabled( bool enable );
/**
* @return The zoom factor in horizontal direction, that is applied
* to all coordinate transformations.
*/
virtual qreal zoomFactorX() const { return 1.0; }
/**
* @return The zoom factor in vertical direction, that is applied
* to all coordinate transformations.
*/
virtual qreal zoomFactorY() const { return 1.0; }
/**
* Sets both zoom factors in one go.
* \sa setZoomFactorX,setZoomFactorY
*/
virtual void setZoomFactors( qreal factorX, qreal factorY ) { Q_UNUSED( factorX ); Q_UNUSED( factorY ); }
/**
* Sets the zoom factor in horizontal direction, that is applied
* to all coordinate transformations.
* @param factor The new zoom factor
*/
virtual void setZoomFactorX( qreal factor ) { Q_UNUSED( factor ); }
/**
* Sets the zoom factor in vertical direction, that is applied
* to all coordinate transformations.
* @param factor The new zoom factor
*/
virtual void setZoomFactorY( qreal factor ) { Q_UNUSED( factor ); }
/**
* @return The center point (in value coordinates) of the
* coordinate plane, that is used for zoom operations.
*/
virtual QPointF zoomCenter() const { return QPointF(0.0, 0.0); }
/**
* Set the point (in value coordinates) to be used as the
* center point in zoom operations.
* @param center The point to use.
*/
virtual void setZoomCenter( const QPointF& center ) { Q_UNUSED( center ); }
/**
* Set the grid attributes to be used by this coordinate plane.
* To disable grid painting, for example, your code should like this:
* \code
* GridAttributes ga = plane->globalGridAttributes();
* ga.setGlobalGridVisible( false );
* plane->setGlobalGridAttributes( ga );
* \endcode
* \sa globalGridAttributes
* \sa CartesianCoordinatePlane::setGridAttributes
*/
void setGlobalGridAttributes( const GridAttributes & );
/**
* @return The grid attributes used by this coordinate plane.
* \sa setGlobalGridAttributes
* \sa CartesianCoordinatePlane::gridAttributes
*/
GridAttributes globalGridAttributes() const;
/**
* Returns the dimensions used for drawing the grid lines.
*
* Returned data is the result of (cached) grid calculations,
* so - if you need that information for your own tasks - make sure to
* call again this function after every data modification that has changed
* the data range, since grid calculation is based upon the data range,
* thus the grid start/end might have changed if the data was changed.
*
* @note Returned list will contain different numbers of DataDimension,
* depending on the kind of coordinate plane used.
* For CartesianCoordinatePlane two DataDimension are returned: the first
* representing grid lines in X direction (matching the Abscissa axes)
* and the second indicating vertical grid lines (or Ordinate axes, resp.).
*
* @return The dimensions used for drawing the grid lines.
* @sa DataDimension
*/
DataDimensionsList gridDimensionsList();
/**
* Set another coordinate plane to be used as the reference plane
* for this one.
* @param plane The coordinate plane to be used the reference plane
* for this one.
* @see referenceCoordinatePlane
*/
void setReferenceCoordinatePlane( AbstractCoordinatePlane * plane );
/**
* There are two ways, in which planes can be caused to interact, in
* where they are put layouting wise: The first is the reference plane. If
* such a reference plane is set, on a plane, it will use the same cell in the
* layout as that one. In addition to this, planes can share an axis. In that case
* they will be laid out in relation to each other as suggested by the position
* of the axis. If, for example Plane1 and Plane2 share an axis at position Left,
* that will result in the layout: Axis Plane1 Plane 2, vertically. If Plane1
* also happens to be Plane2's reference plane, both planes are drawn over each
* other. The reference plane concept allows two planes to share the same space
* even if neither has any axis, and in case there are shared axis, it is used
* to decided, whether the planes should be painted on top of each other or
* laid out vertically or horizontally next to each other.
* @return The reference coordinate plane associated with this one.
*/
AbstractCoordinatePlane * referenceCoordinatePlane() const;
/**
* @return Whether this plane should have spacers in the corners
* formed by the presence of axes.
*/
bool isCornerSpacersEnabled() const;
/**
* Enables or disables the use of spacers in the plane corners.
*/
void setCornerSpacersEnabled( bool enable );
virtual AbstractCoordinatePlane* sharedAxisMasterPlane( QPainter* p = 0 ); // KChart 3: const method?
/** pure virtual in QLayoutItem */
virtual bool isEmpty() const;
/** pure virtual in QLayoutItem */
virtual Qt::Orientations expandingDirections() const;
/** pure virtual in QLayoutItem */
virtual QSize maximumSize() const;
/** pure virtual in QLayoutItem */
virtual QSize minimumSize() const;
/** pure virtual in QLayoutItem */
virtual QSize sizeHint() const;
/** pure virtual in QLayoutItem
*
* \note Do not call this function directly, unless you know
* exactly what you are doing. Geometry management is done
* by KD Chart's internal layouting measures.
*/
virtual void setGeometry( const QRect& r );
/** pure virtual in QLayoutItem */
virtual QRect geometry() const;
virtual void mousePressEvent( QMouseEvent* event );
virtual void mouseDoubleClickEvent( QMouseEvent* event );
virtual void mouseMoveEvent( QMouseEvent* event );
virtual void mouseReleaseEvent( QMouseEvent* event );
/**
* Called internally by KChart::Chart
*/
void setParent( Chart* parent );
Chart* parent();
const Chart* parent() const;
/**
* Tests, if a point is visible on the coordinate plane.
*
* \note Before calling this function the point must have been translated into coordinate plane space.
*/
#if defined(Q_COMPILER_MANGLES_RETURN_TYPE)
const bool isVisiblePoint( const QPointF& point ) const;
#else
bool isVisiblePoint( const QPointF& point ) const;
#endif
public Q_SLOTS:
/**
* Calling update() on the plane triggers the global KChart::Chart::update()
*/
void update();
/**
* Calling relayout() on the plane triggers the global KChart::Chart::slotRelayout()
*/
void relayout();
/**
* Calling layoutPlanes() on the plane triggers the global KChart::Chart::slotLayoutPlanes()
*/
void layoutPlanes();
/**
* Used by the chart to clear the cached grid data.
*/
void setGridNeedsRecalculate();
Q_SIGNALS:
/** Emitted when this coordinate plane is destroyed. */
void destroyedCoordinatePlane( AbstractCoordinatePlane* );
/** Emitted when plane needs to update its drawings. */
void needUpdate();
/** Emitted when plane needs to trigger the Chart's layouting. */
void needRelayout();
/** Emitted when plane needs to trigger the Chart's layouting of the coord. planes. */
void needLayoutPlanes();
/** Emitted upon change of a property of the Coordinate Plane or any of its components. */
void propertiesChanged();
void boundariesChanged();
/** Emitted after the geometry of the Coordinate Plane has been changed.
* and control has returned to the event loop.
*
* Parameters are the old geometry, the new geometry.
*/
void geometryChanged( QRect, QRect );
private:
Q_SIGNALS:
// Emitted from inside the setGeometry()
// This is connected via QueuedConnection to the geometryChanged() Signal
// that users can connect to safely then.
void internal_geometryChanged( QRect, QRect );
/** Emitted upon change of the view coordinate system */
void viewportCoordinateSystemChanged();
protected:
virtual DataDimensionsList getDataDimensionsList() const = 0;
//KCHART_DECLARE_PRIVATE_DERIVED( AbstractCoordinatePlane )
};
/**
* \brief Helper class for one dimension of data, e.g. for the rows in a data model,
* or for the labels of an axis, or for the vertical lines in a grid.
*
* isCalculated specifies whether this dimension's values are calculated or counted.
* (counted == "Item 1", "Item 2", "Item 3" ...)
*
* sequence is the GranularitySequence, as specified at for the respective
* coordinate plane.
*
* Step width is an optional parameter, to be omitted (or set to Zero, resp.)
* if the step width is unknown.
*
* The default c'tor just gets you counted values from 1..10, using step width 1,
* used by the CartesianGrid, when showing an empty plane without any diagrams.
*/
class DataDimension{
public:
DataDimension()
: start( 1.0 )
, end( 10.0 )
, isCalculated( false )
, calcMode( AbstractCoordinatePlane::Linear )
, sequence( KChartEnums::GranularitySequence_10_20 )
, stepWidth( 1.0 )
, subStepWidth( 0.0 )
{}
DataDimension( qreal start_,
qreal end_,
bool isCalculated_,
AbstractCoordinatePlane::AxesCalcMode calcMode_,
KChartEnums::GranularitySequence sequence_,
qreal stepWidth_=0.0,
qreal subStepWidth_=0.0 )
: start( start_ )
, end( end_ )
, isCalculated( isCalculated_ )
, calcMode( calcMode_ )
, sequence( sequence_ )
, stepWidth( stepWidth_ )
, subStepWidth( subStepWidth_ )
{}
/**
* Returns the size of the distance,
* equivalent to the width() (or height(), resp.) of a QRectF.
*
* Note that this value can be negative, e.g. indicating axis labels
* going in reversed direction.
*/
qreal distance() const
{
return end-start;
}
bool operator==( const DataDimension& r ) const
{
return
(start == r.start) &&
(end == r.end) &&
(sequence == r.sequence) &&
(isCalculated == r.isCalculated) &&
(calcMode == r.calcMode) &&
(stepWidth == r.stepWidth) &&
(subStepWidth == r.subStepWidth);
}
bool operator!=( const DataDimension& other ) const
{ return !operator==( other ); }
qreal start;
qreal end;
bool isCalculated;
AbstractCoordinatePlane::AxesCalcMode calcMode;
KChartEnums::GranularitySequence sequence;
qreal stepWidth;
qreal subStepWidth;
};
#if !defined(QT_NO_DEBUG_STREAM)
QDebug operator<<( QDebug stream, const DataDimension& r );
#endif
}
#endif
|