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.
koffice/kexi/3rdparty/kolibs/koUnitWidgets.h

247 lines
7.4 KiB

/* This file is part of the KDE project
Copyright (C) 2002, Rob Buis(buis@kde.org)
Copyright (C) 2004, Nicolas GOUTTE <goutte@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef __KOUNITWIDGETS_H__
#define __KOUNITWIDGETS_H__
#include <knuminput.h>
#include <knumvalidator.h>
#include <klineedit.h>
#include <kcombobox.h>
#include <KoUnit.h>
#include <koffice_export.h>
// ----------------------------------------------------------------
// Support classes
class KoUnitDoubleBase;
// ### TODO: put it out of the public header file (if possible)
/**
* Validator for the unit widget classes
* \internal
* \since 1.4 (change of behavior)
*/
class KOFFICEUI_EXPORT KoUnitDoubleValidator : public KDoubleValidator
{
public:
KoUnitDoubleValidator( KoUnitDoubleBase *base, QObject *parent, const char *name = 0 );
virtual QValidator::State validate( QString &, int & ) const;
private:
KoUnitDoubleBase *m_base;
};
/**
* Base for the unit widgets
* \since 1.4 (change of behavior)
*/
class KOFFICEUI_EXPORT KoUnitDoubleBase
{
public:
KoUnitDoubleBase( KoUnit::Unit unit, unsigned int precision ) : m_unit( unit ), m_precision( precision ) {}
virtual ~KoUnitDoubleBase() {}
virtual void changeValue( double ) = 0;
virtual void setUnit( KoUnit::Unit = KoUnit::U_PT ) = 0;
void setValueInUnit( double value, KoUnit::Unit unit )
{
changeValue( KoUnit::ptToUnit( KoUnit::fromUserValue( value, unit ), m_unit ) );
}
void setPrecision( unsigned int precision ) { m_precision = precision; };
protected:
friend class KoUnitDoubleValidator;
/**
* Transform the double in a nice text, using locale symbols
* @param value the number as double
* @return the resulting string
*/
QString getVisibleText( double value ) const;
/**
* Transfrom a string into a double, while taking care of locale specific symbols.
* @param str the string to transform into a number
* @param ok true, if the conversion was succesful
* @return the value as double
*/
double toDouble( const QString& str, bool* ok ) const;
protected:
KoUnitDoubleValidator *m_validator;
KoUnit::Unit m_unit;
unsigned int m_precision;
};
// ----------------------------------------------------------------
// Widget classes
/**
* Spin box for double precision numbers with unit display
* \since 1.4 (change of behavior)
*/
class KOFFICEUI_EXPORT KoUnitDoubleSpinBox : public KDoubleSpinBox, public KoUnitDoubleBase
{
Q_OBJECT
public:
KoUnitDoubleSpinBox( QWidget *parent = 0L, const char *name = 0L );
// lower, upper, step and value are in pt
KoUnitDoubleSpinBox( QWidget *parent, double lower, double upper, double step, double value = 0.0,
KoUnit::Unit unit = KoUnit::U_PT, unsigned int precision = 2, const char *name = 0 );
// added so the class can be used in .ui files(by Tymoteusz Majewski, maju7@o2.pl)
virtual void changeValue( double );
virtual void setUnit( KoUnit::Unit = KoUnit::U_PT );
/// @return the current value, converted in points
double value( void ) const;
/// Set minimum value in points.
void setMinValue(double min);
/// Set maximum value in points.
void setMaxValue(double max);
/// Set step size in the current unit.
void setLineStep(double step);
/// Set step size in points.
void setLineStepPt(double step);
/// Set minimum, maximum value and the step size (all in points) (by Tymoteusz Majewski, maju7@o2.pl)
void setMinMaxStep( double min, double max, double step );
signals:
/// emitted like valueChanged in the parent, but this one emits the point value
void valueChangedPt( double );
private:
double m_lowerInPoints; ///< lowest value in points
double m_upperInPoints; ///< highest value in points
double m_stepInPoints; ///< step in points
private slots:
// exists to do emits for valueChangedPt
void privateValueChanged();
};
/**
* Line edit for double precision numbers with unit display
* \since 1.4 (change of behavior)
*/
class KOFFICEUI_EXPORT KoUnitDoubleLineEdit : public KLineEdit, public KoUnitDoubleBase
{
Q_OBJECT
public:
KoUnitDoubleLineEdit( QWidget *parent = 0L, const char *name = 0L );
KoUnitDoubleLineEdit( QWidget *parent, double lower, double upper, double value = 0.0, KoUnit::Unit unit = KoUnit::U_PT, unsigned int precision = 2, const char *name = 0 );
virtual void changeValue( double );
virtual void setUnit( KoUnit::Unit = KoUnit::U_PT );
/// @return the current value, converted in points
double value( void ) const;
protected:
bool eventFilter( QObject* obj, QEvent* ev );
private:
double m_value;
double m_lower;
double m_upper;
double m_lowerInPoints; ///< lowest value in points
double m_upperInPoints; ///< highest value in points
};
/**
* Combo box for double precision numbers with unit display
* \since 1.4 (change of behavior)
*/
class KOFFICEUI_EXPORT KoUnitDoubleComboBox : public KComboBox, public KoUnitDoubleBase
{
Q_OBJECT
public:
KoUnitDoubleComboBox( QWidget *parent = 0L, const char *name = 0L );
KoUnitDoubleComboBox( QWidget *parent, double lower, double upper, double value = 0.0, KoUnit::Unit unit = KoUnit::U_PT, unsigned int precision = 2, const char *name = 0 );
virtual void changeValue( double );
void updateValue( double );
virtual void setUnit( KoUnit::Unit = KoUnit::U_PT );
/// @return the current value, converted in points
double value( void ) const;
void insertItem( double, int index = -1 );
protected:
bool eventFilter( QObject* obj, QEvent* ev );
signals:
void valueChanged(double);
private slots:
void slotActivated( int );
protected:
double m_value;
double m_lower;
double m_upper;
double m_lowerInPoints; ///< lowest value in points
double m_upperInPoints; ///< highest value in points
};
/**
* Combo box (with spin control) for double precision numbers with unit display
* \since 1.4 (change of behavior)
*/
class KOFFICEUI_EXPORT KoUnitDoubleSpinComboBox : public QWidget
{
Q_OBJECT
public:
KoUnitDoubleSpinComboBox( QWidget *parent = 0L, const char *name = 0L );
KoUnitDoubleSpinComboBox( QWidget *parent, double lower, double upper, double step, double value = 0.0, KoUnit::Unit unit = KoUnit::U_PT, unsigned int precision = 2, const char *name = 0 );
void insertItem( double, int index = -1 );
void updateValue( double );
/// @return the current value, converted in points
double value( void ) const;
signals:
void valueChanged(double);
private slots:
void slotUpClicked();
void slotDownClicked();
private:
KoUnitDoubleComboBox *m_combo;
double m_step;
};
#endif