annotate base/PropertyContainer.h @ 1412:b7a9edee85e0 scale-ticks

Change loop to something that feels more correct, though it makes no difference to the tests here. More tests, one failing.
author Chris Cannam
date Thu, 04 May 2017 08:32:41 +0100
parents 576be7933ec7
children 48e9f538e6e9
rev   line source
Chris@49 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@52 4 Sonic Visualiser
Chris@52 5 An audio file viewer and annotation editor.
Chris@52 6 Centre for Digital Music, Queen Mary, University of London.
Chris@202 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@0 8
Chris@52 9 This program is free software; you can redistribute it and/or
Chris@52 10 modify it under the terms of the GNU General Public License as
Chris@52 11 published by the Free Software Foundation; either version 2 of the
Chris@52 12 License, or (at your option) any later version. See the file
Chris@52 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@1331 16 #ifndef SV_PROPERTY_CONTAINER_H
Chris@1331 17 #define SV_PROPERTY_CONTAINER_H
Chris@0 18
Chris@46 19 #include "Command.h"
Chris@46 20
Chris@0 21 #include <QString>
Chris@0 22 #include <QObject>
Chris@0 23 #include <vector>
Chris@0 24
Chris@28 25 class PlayParameters;
Chris@190 26 class RangeMapper;
Chris@0 27
Chris@29 28 class PropertyContainer : public QObject
Chris@0 29 {
Chris@29 30 Q_OBJECT
Chris@29 31
Chris@0 32 public:
Chris@27 33 virtual ~PropertyContainer() { }
Chris@27 34
Chris@0 35 typedef QString PropertyName;
Chris@0 36 typedef std::vector<PropertyName> PropertyList;
Chris@0 37
Chris@0 38 enum PropertyType {
Chris@0 39 ToggleProperty, // on or off
Chris@0 40 RangeProperty, // range of integers
Chris@0 41 ValueProperty, // range of integers given string labels
Chris@277 42 ColourProperty, // colours, get/set as ColourDatabase indices
Chris@1331 43 ColourMapProperty, // colour maps, get/set as ColourMapper::StandardMap enum
Chris@116 44 UnitsProperty, // unit from UnitDatabase, get/set unit id
Chris@0 45 InvalidProperty, // property not found!
Chris@0 46 };
Chris@0 47
Chris@0 48 /**
Chris@0 49 * Get a list of the names of all the supported properties on this
Chris@94 50 * container. These should be fixed (i.e. not internationalized).
Chris@0 51 */
Chris@0 52 virtual PropertyList getProperties() const;
Chris@0 53
Chris@0 54 /**
Chris@94 55 * Return the human-readable (and i18n'ised) name of a property.
Chris@94 56 */
Chris@94 57 virtual QString getPropertyLabel(const PropertyName &) const = 0;
Chris@94 58
Chris@94 59 /**
Chris@0 60 * Return the type of the given property, or InvalidProperty if
Chris@0 61 * the property is not supported on this container.
Chris@0 62 */
Chris@0 63 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@0 64
Chris@0 65 /**
Chris@340 66 * Return an icon for the property, if any.
Chris@340 67 */
Chris@340 68 virtual QString getPropertyIconName(const PropertyName &) const;
Chris@340 69
Chris@340 70 /**
Chris@0 71 * If this property has something in common with other properties
Chris@0 72 * on this container, return a name that can be used to group them
Chris@0 73 * (in order to save screen space, for example). e.g. "Window
Chris@0 74 * Type" and "Window Size" might both have a group name of "Window".
Chris@0 75 * If this property is not groupable, return the empty string.
Chris@0 76 */
Chris@0 77 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@0 78
Chris@0 79 /**
Chris@0 80 * Return the minimum and maximum values for the given property
Chris@0 81 * and its current value in this container. Min and/or max may be
Chris@0 82 * passed as NULL if their values are not required.
Chris@0 83 */
Chris@0 84 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@245 85 int *min, int *max, int *deflt) const;
Chris@0 86
Chris@0 87 /**
Chris@0 88 * If the given property is a ValueProperty, return the display
Chris@0 89 * label to be used for the given value for that property.
Chris@0 90 */
Chris@0 91 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@0 92 int value) const;
Chris@0 93
Chris@190 94 /**
Chris@984 95 * If the given property is a ValueProperty, return the icon to be
Chris@984 96 * used for the given value for that property, if any.
Chris@984 97 */
Chris@984 98 virtual QString getPropertyValueIconName(const PropertyName &,
Chris@984 99 int value) const;
Chris@984 100
Chris@984 101 /**
Chris@190 102 * If the given property is a RangeProperty, return a new
Chris@190 103 * RangeMapper object mapping its integer range onto an underlying
Chris@190 104 * floating point value range for human-intelligible display, if
Chris@190 105 * appropriate. The RangeMapper should be allocated with new, and
Chris@190 106 * the caller takes responsibility for deleting it. Return NULL
Chris@190 107 * (as in the default implementation) if there is no such mapping.
Chris@190 108 */
Chris@190 109 virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const;
Chris@190 110
Chris@29 111 virtual QString getPropertyContainerName() const = 0;
Chris@29 112 virtual QString getPropertyContainerIconName() const = 0;
Chris@29 113
Chris@29 114 virtual PlayParameters *getPlayParameters() { return 0; }
Chris@29 115
Chris@29 116 signals:
Chris@141 117 void propertyChanged(PropertyContainer::PropertyName);
Chris@224 118
Chris@29 119 public slots:
Chris@0 120 /**
Chris@0 121 * Set a property. This is used for all property types. For
Chris@0 122 * boolean properties, zero is false and non-zero true; for
Chris@277 123 * colours, the integer value is an index into the colours in the
Chris@277 124 * global ColourDatabase.
Chris@0 125 */
Chris@0 126 virtual void setProperty(const PropertyName &, int value);
Chris@46 127
Chris@46 128 /**
Chris@387 129 * Obtain a command that sets the given property, which can be
Chris@387 130 * added to the command history for undo/redo. Returns NULL
Chris@387 131 * if the property is already set to the given value.
Chris@46 132 */
Chris@387 133 virtual Command *getSetPropertyCommand(const PropertyName &, int value);
Chris@46 134
Chris@199 135 /**
Chris@199 136 * Set a property using a fuzzy match. Compare nameString with
Chris@199 137 * the property labels and underlying names, and if it matches one
Chris@199 138 * (with preference given to labels), try to convert valueString
Chris@199 139 * appropriately and set it. The valueString should contain a
Chris@199 140 * value label for value properties, a mapped value for range
Chris@199 141 * properties, "on" or "off" for toggle properties, a colour or
Chris@199 142 * unit name, or the underlying integer value for the property.
Chris@199 143 *
Chris@199 144 * Note that as property and value labels may be translatable, the
Chris@199 145 * results of this function may vary by locale. It is intended
Chris@199 146 * for handling user-originated strings, _not_ persistent storage.
Chris@199 147 *
Chris@199 148 * The default implementation should work for most subclasses.
Chris@199 149 */
Chris@528 150 virtual void setPropertyFuzzy(QString nameString, QString valueString);
Chris@199 151
Chris@199 152 /**
Chris@387 153 * As above, but returning a command.
Chris@199 154 */
Chris@387 155 virtual Command *getSetPropertyCommand(QString nameString, QString valueString);
Chris@199 156
Chris@46 157 protected:
Chris@46 158
Chris@46 159 class SetPropertyCommand : public Command
Chris@46 160 {
Chris@46 161 public:
Chris@46 162 SetPropertyCommand(PropertyContainer *pc, const PropertyName &pn, int);
Chris@46 163 virtual ~SetPropertyCommand() { }
Chris@46 164
Chris@46 165 virtual void execute();
Chris@46 166 virtual void unexecute();
Chris@46 167 virtual QString getName() const;
Chris@46 168
Chris@46 169 protected:
Chris@46 170 PropertyContainer *m_pc;
Chris@46 171 PropertyName m_pn;
Chris@46 172 int m_value;
Chris@46 173 int m_oldValue;
Chris@46 174 };
Chris@199 175
Chris@199 176 virtual bool convertPropertyStrings(QString nameString, QString valueString,
Chris@199 177 PropertyName &name, int &value);
Chris@0 178 };
Chris@0 179
Chris@0 180 #endif