lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam and QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _PROPERTY_CONTAINER_H_ lbajardsilogic@0: #define _PROPERTY_CONTAINER_H_ lbajardsilogic@0: lbajardsilogic@0: #include "Command.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: class PlayParameters; lbajardsilogic@0: class RangeMapper; lbajardsilogic@0: lbajardsilogic@0: class PropertyContainer : public QObject lbajardsilogic@0: { lbajardsilogic@0: Q_OBJECT lbajardsilogic@0: lbajardsilogic@0: public: lbajardsilogic@0: virtual ~PropertyContainer() { } lbajardsilogic@0: lbajardsilogic@0: typedef QString PropertyName; lbajardsilogic@0: typedef std::vector PropertyList; lbajardsilogic@0: lbajardsilogic@0: enum PropertyType { lbajardsilogic@4: ToggleProperty, // on or off lbajardsilogic@4: RangeProperty, // range of integers lbajardsilogic@4: ValueProperty, // range of integers given string labels lbajardsilogic@4: ColourProperty, // colours, get/set as qRgb lbajardsilogic@0: UnitsProperty, // unit from UnitDatabase, get/set unit id lbajardsilogic@4: InvalidProperty, // property not found! lbajardsilogic@4: StringProperty, //string value that can be set to any value lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Get a list of the names of all the supported properties on this lbajardsilogic@0: * container. These should be fixed (i.e. not internationalized). lbajardsilogic@0: */ lbajardsilogic@0: virtual PropertyList getProperties() const; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return the human-readable (and i18n'ised) name of a property. lbajardsilogic@0: */ lbajardsilogic@0: virtual QString getPropertyLabel(const PropertyName &) const = 0; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return the type of the given property, or InvalidProperty if lbajardsilogic@0: * the property is not supported on this container. lbajardsilogic@0: */ lbajardsilogic@0: virtual PropertyType getPropertyType(const PropertyName &) const; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * If this property has something in common with other properties lbajardsilogic@0: * on this container, return a name that can be used to group them lbajardsilogic@0: * (in order to save screen space, for example). e.g. "Window lbajardsilogic@0: * Type" and "Window Size" might both have a group name of "Window". lbajardsilogic@0: * If this property is not groupable, return the empty string. lbajardsilogic@0: */ lbajardsilogic@0: virtual QString getPropertyGroupName(const PropertyName &) const; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return the minimum and maximum values for the given property lbajardsilogic@0: * and its current value in this container. Min and/or max may be lbajardsilogic@0: * passed as NULL if their values are not required. lbajardsilogic@0: */ lbajardsilogic@0: virtual int getPropertyRangeAndValue(const PropertyName &, lbajardsilogic@0: int *min, int *max, int *deflt) const; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * If the given property is a ValueProperty, return the display lbajardsilogic@0: * label to be used for the given value for that property. lbajardsilogic@0: */ lbajardsilogic@0: virtual QString getPropertyValueLabel(const PropertyName &, lbajardsilogic@0: int value) const; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * If the given property is a RangeProperty, return a new lbajardsilogic@0: * RangeMapper object mapping its integer range onto an underlying lbajardsilogic@0: * floating point value range for human-intelligible display, if lbajardsilogic@0: * appropriate. The RangeMapper should be allocated with new, and lbajardsilogic@0: * the caller takes responsibility for deleting it. Return NULL lbajardsilogic@0: * (as in the default implementation) if there is no such mapping. lbajardsilogic@0: */ lbajardsilogic@0: virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const; lbajardsilogic@0: lbajardsilogic@0: virtual QString getPropertyContainerName() const = 0; lbajardsilogic@0: virtual QString getPropertyContainerIconName() const = 0; lbajardsilogic@0: lbajardsilogic@0: virtual PlayParameters *getPlayParameters() { return 0; } lbajardsilogic@0: lbajardsilogic@0: signals: lbajardsilogic@0: void propertyChanged(PropertyContainer::PropertyName); lbajardsilogic@0: lbajardsilogic@0: public slots: lbajardsilogic@0: /** lbajardsilogic@0: * Set a property. This is used for all property types. For lbajardsilogic@0: * boolean properties, zero is false and non-zero true; for lbajardsilogic@0: * colours, the integer value should be treated as a qRgb. lbajardsilogic@0: */ lbajardsilogic@0: virtual void setProperty(const PropertyName &, int value); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Set a property using a command, supporting undo and redo. lbajardsilogic@0: * The default implementation should work for most subclasses. lbajardsilogic@0: */ lbajardsilogic@0: virtual void setPropertyWithCommand(const PropertyName &, int value); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Set a property using a fuzzy match. Compare nameString with lbajardsilogic@0: * the property labels and underlying names, and if it matches one lbajardsilogic@0: * (with preference given to labels), try to convert valueString lbajardsilogic@0: * appropriately and set it. The valueString should contain a lbajardsilogic@0: * value label for value properties, a mapped value for range lbajardsilogic@0: * properties, "on" or "off" for toggle properties, a colour or lbajardsilogic@0: * unit name, or the underlying integer value for the property. lbajardsilogic@0: * lbajardsilogic@0: * Note that as property and value labels may be translatable, the lbajardsilogic@0: * results of this function may vary by locale. It is intended lbajardsilogic@0: * for handling user-originated strings, _not_ persistent storage. lbajardsilogic@0: * lbajardsilogic@0: * The default implementation should work for most subclasses. lbajardsilogic@0: */ lbajardsilogic@0: virtual void setProperty(QString nameString, QString valueString); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * As above, but using a command. lbajardsilogic@0: */ lbajardsilogic@0: virtual void setPropertyWithCommand(QString nameString, QString valueString); lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: lbajardsilogic@0: class SetPropertyCommand : public Command lbajardsilogic@0: { lbajardsilogic@0: public: lbajardsilogic@0: SetPropertyCommand(PropertyContainer *pc, const PropertyName &pn, int); lbajardsilogic@0: virtual ~SetPropertyCommand() { } lbajardsilogic@0: lbajardsilogic@0: virtual void execute(); lbajardsilogic@0: virtual void unexecute(); lbajardsilogic@0: virtual QString getName() const; lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: PropertyContainer *m_pc; lbajardsilogic@0: PropertyName m_pn; lbajardsilogic@0: int m_value; lbajardsilogic@0: int m_oldValue; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: virtual bool convertPropertyStrings(QString nameString, QString valueString, lbajardsilogic@0: PropertyName &name, int &value); lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #endif