File indexing completed on 2024-05-19 13:33:13

0001 /***************************************************************************
0002  *   Copyright (C) 2003-2004 by David Saxton                               *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #ifndef VARIANT_H
0012 #define VARIANT_H
0013 
0014 #include <QObject>
0015 #include <QStringList>
0016 #include <QVariant>
0017 
0018 #include "filefilters.h"
0019 
0020 /// \todo Replace "Variant" with "Property"
0021 class Variant;
0022 typedef Variant Property;
0023 
0024 class QColor;
0025 class QString;
0026 
0027 typedef QMap<QString, QString> QStringMap;
0028 
0029 /**
0030 For information:
0031 QVariant::type() returns an enum for the current data type
0032 contained. e.g. returns QVariant::Color or QVariant::Rect
0033 @author Daniel Clarke
0034 @author David Saxton
0035 */
0036 class Variant : public QObject
0037 {
0038     Q_OBJECT
0039 public:
0040     class Type
0041     {
0042     public:
0043         enum Value {
0044             None,
0045             Int,          // Integer
0046             Raw,          // QByteArray
0047             Double,       // Real number
0048             String,       // Editable string
0049             Multiline,    // String that may contain linebreaks
0050             RichText,     // HTML formatted text
0051             Select,       // Selection of strings
0052             Combo,        // Editable combination of strings
0053             FileName,     // Filename on local filesystem
0054             Color,        // Color
0055             Bool,         // Boolean
0056             VarName,      // Variable name
0057             Port,         // Port name
0058             Pin,          // Pin name
0059             PenStyle,     // Pen Style
0060             PenCapStyle,  // Pen Cap Style
0061             SevenSegment, // Pin Map for Seven Segment Display
0062             KeyPad        // Pin Map for Keypad
0063         };
0064     };
0065 
0066     Variant(const QString &id, Type::Value type);
0067     ~Variant() override;
0068 
0069     QString id() const
0070     {
0071         return m_id;
0072     }
0073 
0074     /**
0075      * Returns the type of Variant (see Variant::Type::Value)
0076      */
0077     Variant::Type::Value type() const
0078     {
0079         return m_type;
0080     }
0081     /**
0082      * Sets the variant type
0083      */
0084     void setType(Type::Value type);
0085     /**
0086      * Returns the filters used for file dialogs (if this is of type Type::FileName)
0087      */
0088     FileFilters fileFilters() const
0089     {
0090         return m_fileFilters;
0091     }
0092     void setFileFilters(const FileFilters &fileFilters)
0093     {
0094         m_fileFilters = fileFilters;
0095     }
0096     /**
0097      * The selection of colours to be used in the combo box - e.g.
0098      * ColorCombo::LED.
0099      * @see ColorCombo::ColorScheme
0100      */
0101     int colorScheme() const
0102     {
0103         return m_colorScheme;
0104     }
0105     void setColorScheme(int colorScheme)
0106     {
0107         m_colorScheme = colorScheme;
0108     }
0109     /**
0110      * This function is for convenience; it sets both the toolbar and editor
0111      * caption.
0112      */
0113     void setCaption(const QString &caption)
0114     {
0115         setToolbarCaption(caption);
0116         setEditorCaption(caption);
0117     }
0118     /**
0119      * This text is displayed to the left of the entry widget in the toolbar
0120      */
0121     QString toolbarCaption() const
0122     {
0123         return m_toolbarCaption;
0124     }
0125     void setToolbarCaption(const QString &caption)
0126     {
0127         m_toolbarCaption = caption;
0128     }
0129     /**
0130      * This text is displayed to the left of the entry widget in the item editor
0131      */
0132     QString editorCaption() const
0133     {
0134         return m_editorCaption;
0135     }
0136     void setEditorCaption(const QString &caption)
0137     {
0138         m_editorCaption = caption;
0139     }
0140     /**
0141      * Unit of number, (e.g. V (volts) / F (farads))
0142      */
0143     QString unit() const
0144     {
0145         return m_unit;
0146     }
0147     void setUnit(const QString &unit)
0148     {
0149         m_unit = unit;
0150     }
0151     /**
0152      * The smallest (as in negative, not absoluteness) value that the user can
0153      * set this to.
0154      */
0155     double minValue() const
0156     {
0157         return m_minValue;
0158     }
0159     void setMinValue(double value);
0160     /**
0161      * The largest (as in positive, not absoluteness) value that the user can
0162      * set this to.
0163      */
0164     double maxValue() const
0165     {
0166         return m_maxValue;
0167     }
0168     void setMaxValue(double value);
0169     /**
0170      * The smallest absolute value that the user can set this to, before the
0171      * value is considered zero.
0172      */
0173     double minAbsValue() const
0174     {
0175         return m_minAbsValue;
0176     }
0177     void setMinAbsValue(double val);
0178     QVariant defaultValue() const
0179     {
0180         return m_defaultValue;
0181     }
0182     /**
0183      * If this data is marked as advanced, it will only display in the item
0184      * editor (and not in the toolbar)
0185      */
0186     void setAdvanced(bool advanced)
0187     {
0188         m_bAdvanced = advanced;
0189     }
0190     bool isAdvanced() const
0191     {
0192         return m_bAdvanced;
0193     }
0194     /**
0195      * If this data is marked as hidden, it will not be editable from anywhere
0196      * in the user interface
0197      */
0198     void setHidden(bool hidden)
0199     {
0200         m_bHidden = hidden;
0201     }
0202     bool isHidden() const
0203     {
0204         return m_bHidden;
0205     }
0206     /**
0207      * Returns the best possible attempt at representing the data in a string
0208      * for display. Used by the properties list view.
0209      */
0210     QString displayString() const;
0211     /**
0212      * The list of values that the data is allowed to take (if it is string)
0213      * that is displayed to the user.
0214      */
0215     QStringList allowed() const
0216     {
0217         return m_allowed.values();
0218     }
0219     /**
0220      * @param allowed A list of pairs of (id, i18n-name) of allowed values.
0221      */
0222     void setAllowed(const QStringMap &allowed)
0223     {
0224         m_allowed = allowed;
0225     }
0226     void setAllowed(const QStringList &allowed);
0227     void appendAllowed(const QString &id, const QString &i18nName);
0228     void appendAllowed(const QString &allowed);
0229     /**
0230      * @return whether the current value is different to the default value.
0231      */
0232     bool changed() const;
0233     QVariant value() const
0234     {
0235         return m_value;
0236     }
0237     void setValue(QVariant val);
0238 
0239 signals:
0240     /**
0241      * Emitted when the value changes.
0242      * NOTE: The order of data given is the new value, and then the old value
0243      * This is done so that slots that don't care about the old value don't
0244      * have to accept it
0245      */
0246     void valueChanged(QVariant newValue, QVariant oldValue);
0247     /**
0248      * Emitted for variants of string-like type.
0249      */
0250     void valueChanged(const QString &newValue);
0251     /**
0252      * Emitted for variants of string-like type.
0253      * This signal is needed for updating values in KComboBox-es, see KComboBox::setCurrentItem(),
0254      *   second bool parameter, insert.
0255      */
0256     void valueChangedStrAndTrue(const QString &newValue, bool trueBool);
0257     /**
0258      * Emitted for variants of int-like type.
0259      */
0260     void valueChanged(int newValue);
0261     /**
0262      * Emitted for variants of double-like type.
0263      */
0264     void valueChanged(double newValue);
0265     /**
0266      * Emitted for variants of color-like type.
0267      */
0268     void valueChanged(const QColor &newValue);
0269     /**
0270      * Emitted for variants of bool-like type.
0271      */
0272     void valueChanged(bool newValue);
0273 
0274 private:
0275     QVariant m_value; // the actual data
0276     QVariant m_defaultValue;
0277     QString m_unit;
0278     const QString m_id;
0279     double m_minAbsValue;
0280     double m_minValue;
0281     double m_maxValue;
0282     QString m_toolbarCaption; // Short description shown in e.g. properties dialog
0283     QString m_editorCaption;  // Text displayed before the data entry widget in the toolbar
0284     bool m_bAdvanced;         // If advanced, only display data in item editor
0285     bool m_bHidden;           // If hidden, do not allow user to change data
0286     FileFilters m_fileFilters; // If type() == Type::FileName these are the filters used in file dialogs.
0287     bool m_bSetDefault;       // If false, then the default will be set to the first thing this variant is set to
0288     Type::Value m_type;
0289     QStringMap m_allowed;
0290     int m_colorScheme;
0291 };
0292 
0293 #endif