You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
7.6 KiB
233 lines
7.6 KiB
/***************************************************************************
|
|
qdata.h
|
|
-------------------
|
|
version :
|
|
begin :
|
|
|
|
copyright : (C) 2000 by Kamil Dobkowski
|
|
email : kamildobk@poczta.onet.pl
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
|
|
#ifndef QSDATA_H
|
|
#define QSDATA_H
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include"qsgattr.h"
|
|
#include"qsmatrix.h"
|
|
#include"qsserializable.h"
|
|
#include<qobject.h>
|
|
#include<qstring.h>
|
|
#include<math.h>
|
|
|
|
//-------------------------------------------------------------------------------------------------------------//
|
|
|
|
/**
|
|
* \brief Object which contains data ( list of matrices )
|
|
*
|
|
* Object, which contains data - a list of matrices, see setMatrix(), matrix(). This class is
|
|
* inherited by all dataset types: QSSurface, QSCurve, etc. and axes : QSAxes2D, QSAxes3D etc.
|
|
* For example an ordinary XYPlot ( QSCurve ) contains XVector, YVector, DX Vector, DYVector. and draws all succesive
|
|
* ( x, y ,dx, dy ) points as a curve with error bars. This object can own child QSData objects, for example: axes
|
|
* contains curves ( but curves have no furher child object ) - see child(), childCount(), childIndex(). This is only an
|
|
* interface class and does not contain implementation of matrix list.
|
|
* If you are going to change data ( change value of some matrix element, etc ) you have to notify QSData object using
|
|
* dataChanging(), dataChanged() before and after the change, and it notifies outside world about this fact using
|
|
* sigDataChanged() .
|
|
* @see QSMatrix
|
|
* @author Kamil Dobkowski
|
|
*/
|
|
class QSData : public QObject, public QSSerializable
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
/**
|
|
* Column type
|
|
*/
|
|
enum ColumnType {
|
|
ColumnUnknown = 0,
|
|
ColumnX,
|
|
ColumnY,
|
|
ColumnZ,
|
|
ColumnV,
|
|
ColumnDX,
|
|
ColumnDY,
|
|
ColumnSize,
|
|
ColumnWidth,
|
|
ColumnLineStyle,
|
|
ColumnFillStyle,
|
|
ColumnPointStyle,
|
|
ColumnPointFill,
|
|
ColumnArrowStyle,
|
|
ColumnFontFamily,
|
|
ColumnFontSize,
|
|
ColumnFontBold,
|
|
ColumnFontItalic,
|
|
ColumnRed,
|
|
ColumnGreen,
|
|
ColumnBlue,
|
|
ColumnAlpha,
|
|
ColumnByte,
|
|
ColumnInt,
|
|
ColumnBool,
|
|
ColumnString
|
|
};
|
|
/**
|
|
* Constructor
|
|
*/
|
|
QSData( QObject *parent=NULL, QSData *parentObject=NULL, const char *name=0 );
|
|
/**
|
|
* Destructor. It should delete all child object as well.
|
|
*/
|
|
virtual ~QSData();
|
|
/**
|
|
* The same as setName() but emits nameChanged( const char *newName ).
|
|
*/
|
|
virtual void setObjectName( const char *name );
|
|
/**
|
|
* The same as name()
|
|
*/
|
|
const char *objectName() const { return name(); }
|
|
/**
|
|
* Sets a new matrix as the given channel in the plot.
|
|
*/
|
|
virtual bool setMatrix( int channel, QSMatrix *m );
|
|
/**
|
|
* Returns matrix 'channel' if any, or NULL.
|
|
*/
|
|
virtual QSMatrix *matrix( int channel ) const;
|
|
/**
|
|
* Gives ownership of the matrix to caller and
|
|
* sets data to newMatrix.
|
|
*/
|
|
virtual QSMatrix *takeMatrix( int channel, QSMatrix *newMatrix = NULL );
|
|
/**
|
|
* Deletes the choosen matrix.
|
|
*/
|
|
virtual void deleteMatrix( int channel );
|
|
/**
|
|
* Returns the total number of channels.
|
|
*/
|
|
virtual int channelCount() const;
|
|
/**
|
|
* This function is called before data is changed by 'setMatrix'
|
|
* method. You should also call it by hand, when you are going to change
|
|
* the data in any matrix..
|
|
* It informs derived classes to stop a drawing process if it is in progress at the
|
|
* moment.
|
|
* Default implementation calls dataChanging( this, channel ),
|
|
*/
|
|
virtual void dataChanging( int channel = -1 );
|
|
/**
|
|
* This function is called after data has changed by 'setMatrix'
|
|
* method. You should also call it by hand, when you have changed
|
|
* the data in any matrix.
|
|
* It informs derived classes to mark old max and min data values as invalid,
|
|
* and informs them that they should repaint themselves.
|
|
* Default implementation calls dataChanging( this, channel ),
|
|
*/
|
|
virtual void dataChanged( int channel = -1 );
|
|
/**
|
|
* Returns the parent object.
|
|
*/
|
|
virtual QSData *parentObject() const { return m_parent_object; }
|
|
/**
|
|
* Number of child QSData objects
|
|
*/
|
|
virtual int childCount() const { return 0; }
|
|
/**
|
|
* Returns a child object
|
|
*/
|
|
virtual QSData *child( int index ) const { return NULL; }
|
|
/**
|
|
* Returns a child index.
|
|
*/
|
|
virtual int childIndex( QSData *child ) const;
|
|
/**
|
|
* Returns a variable name ( 'x', 'y', 'z', 'v' etc ) for use in formulas.
|
|
*/
|
|
virtual QString channelVariable( int channel ) const { return QString::null; }
|
|
/**
|
|
* Metadata - type of the given column. It should be reimplemented in derived classes.
|
|
* Used to create editors in sheet
|
|
*/
|
|
virtual ColumnType columnType( int channel, int column ) const { return ColumnUnknown; }
|
|
/**
|
|
* Restores all QObject properties. Loads all matrices
|
|
*/
|
|
virtual void loadStateFromStream( QDataStream& stream, QSObjectFactory *factory );
|
|
/**
|
|
* Saves all QObjects properties. Saves all matrices.
|
|
*/
|
|
virtual void saveStateToStream( QDataStream& stream, QSObjectFactory *factory );
|
|
|
|
signals:
|
|
/**
|
|
* Name of this object has changed
|
|
*/
|
|
void sigNameChanged( const char *name );
|
|
/**
|
|
* Name of this object has changed
|
|
*/
|
|
void sigNameChanged( QSData *thisOrChildObject, const char *name );
|
|
/**
|
|
* Data has changed in this or any child object.
|
|
*/
|
|
void sigDataChanged( QSData *thisOrChildObject, int channel );
|
|
/**
|
|
* A new child object was added to the child list.
|
|
*/
|
|
void sigChildAdded( QSData *newChild );
|
|
/**
|
|
* Child object is about to be removed from the list.
|
|
*/
|
|
void sigChildRemoved( QSData *removedChild );
|
|
/**
|
|
* Index of some child object was changed ( the list was reordered ).
|
|
*/
|
|
void sigChildOrder();
|
|
/**
|
|
* sigChildAdded() + sigChildRemoved() + sigChildOrder()
|
|
*/
|
|
void sigChildListChanged();
|
|
/**
|
|
* Ups ! It is emmited from destructor of this object.
|
|
*/
|
|
void sigDeleted( QSData *thisObject );
|
|
|
|
protected:
|
|
/**
|
|
* Does nothing. This function collects all 'dataChanging()' calls from this object and child objects.
|
|
* if parent is not NULL calls parent->dataChanging( this, channel );
|
|
*/
|
|
virtual void dataChanging( QSData *object, int channel = -1 );
|
|
/**
|
|
* Emits sigDataChanged(). This function collects all 'dataChanged()' calls from this object and child objects.
|
|
* and if parent is not NULL calls parent->dataChanged( this, channel );
|
|
*/
|
|
virtual void dataChanged( QSData *object, int channel = -1 );
|
|
/**
|
|
*
|
|
*/
|
|
virtual void nameChanged( QSData *object, const char *newName );
|
|
|
|
QSData *m_parent_object;
|
|
};
|
|
|
|
#endif
|
|
|
|
|