annotate layer/ImageLayer.h @ 561:aced8ec09bc8

* Complete the overhaul of CSV file import; now you can pick the purpose for each column in the file, and SV should do the rest. The most significant practical improvement here is that we can now handle files in which time and duration do not necessarily appear in known columns.
author Chris Cannam
date Mon, 19 Jul 2010 17:08:56 +0000
parents 69089c9dc42e
children 5b72899d692b
rev   line source
Chris@303 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@303 2
Chris@303 3 /*
Chris@303 4 Sonic Visualiser
Chris@303 5 An audio file viewer and annotation editor.
Chris@303 6 Centre for Digital Music, Queen Mary, University of London.
Chris@303 7 This file copyright 2006-2007 Chris Cannam and QMUL.
Chris@303 8
Chris@303 9 This program is free software; you can redistribute it and/or
Chris@303 10 modify it under the terms of the GNU General Public License as
Chris@303 11 published by the Free Software Foundation; either version 2 of the
Chris@303 12 License, or (at your option) any later version. See the file
Chris@303 13 COPYING included with this distribution for more information.
Chris@303 14 */
Chris@303 15
Chris@303 16 #ifndef _IMAGE_LAYER_H_
Chris@303 17 #define _IMAGE_LAYER_H_
Chris@303 18
Chris@303 19 #include "Layer.h"
Chris@303 20 #include "data/model/ImageModel.h"
Chris@303 21
Chris@303 22 #include <QObject>
Chris@303 23 #include <QColor>
Chris@303 24 #include <QImage>
Chris@305 25 #include <QMutex>
Chris@303 26
Chris@303 27 #include <map>
Chris@303 28
Chris@303 29 class View;
Chris@303 30 class QPainter;
Chris@318 31 class FileSource;
Chris@303 32
Chris@303 33 class ImageLayer : public Layer
Chris@303 34 {
Chris@303 35 Q_OBJECT
Chris@303 36
Chris@303 37 public:
Chris@303 38 ImageLayer();
Chris@305 39 virtual ~ImageLayer();
Chris@303 40
Chris@303 41 virtual void paint(View *v, QPainter &paint, QRect rect) const;
Chris@303 42
Chris@303 43 virtual QString getFeatureDescription(View *v, QPoint &) const;
Chris@303 44
Chris@303 45 virtual bool snapToFeatureFrame(View *v, int &frame,
Chris@303 46 size_t &resolution,
Chris@303 47 SnapType snap) const;
Chris@303 48
Chris@303 49 virtual void drawStart(View *v, QMouseEvent *);
Chris@303 50 virtual void drawDrag(View *v, QMouseEvent *);
Chris@303 51 virtual void drawEnd(View *v, QMouseEvent *);
Chris@303 52
Chris@303 53 virtual void editStart(View *v, QMouseEvent *);
Chris@303 54 virtual void editDrag(View *v, QMouseEvent *);
Chris@303 55 virtual void editEnd(View *v, QMouseEvent *);
Chris@303 56
Chris@303 57 virtual void moveSelection(Selection s, size_t newStartFrame);
Chris@303 58 virtual void resizeSelection(Selection s, Selection newSize);
Chris@303 59 virtual void deleteSelection(Selection s);
Chris@303 60
Chris@359 61 virtual void copy(View *v, Selection s, Clipboard &to);
Chris@359 62 virtual bool paste(View *v, const Clipboard &from, int frameOffset,
Chris@303 63 bool interactive);
Chris@303 64
Chris@303 65 virtual bool editOpen(View *, QMouseEvent *); // on double-click
Chris@303 66
Chris@303 67 virtual const Model *getModel() const { return m_model; }
Chris@303 68 void setModel(ImageModel *model);
Chris@303 69
Chris@303 70 virtual PropertyList getProperties() const;
Chris@303 71 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@303 72 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@303 73 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@303 74 int *min, int *max, int *deflt) const;
Chris@303 75 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@303 76 int value) const;
Chris@303 77 virtual void setProperty(const PropertyName &, int value);
Chris@303 78
Chris@303 79 virtual ColourSignificance getLayerColourSignificance() const {
Chris@303 80 return ColourAbsent;
Chris@303 81 }
Chris@303 82
Chris@303 83 virtual bool isLayerScrollable(const View *v) const;
Chris@303 84
Chris@303 85 virtual bool isLayerEditable() const { return true; }
Chris@303 86
Chris@303 87 virtual int getCompletion(View *) const { return m_model->getCompletion(); }
Chris@303 88
Chris@303 89 virtual bool getValueExtents(float &min, float &max,
Chris@303 90 bool &logarithmic, QString &unit) const;
Chris@303 91
Chris@316 92 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 93 QString extraAttributes = "") const;
Chris@303 94
Chris@303 95 virtual void setLayerDormant(const View *v, bool dormant);
Chris@303 96
Chris@303 97 void setProperties(const QXmlAttributes &attributes);
Chris@303 98
Chris@312 99 virtual bool addImage(long frame, QString url); // using a command
Chris@312 100
Chris@305 101 protected slots:
Chris@464 102 void checkAddSources();
Chris@464 103 void fileSourceReady();
Chris@305 104
Chris@303 105 protected:
Chris@303 106 ImageModel::PointList getLocalPoints(View *v, int x, int y) const;
Chris@303 107
Chris@304 108 bool getImageOriginalSize(QString name, QSize &size) const;
Chris@303 109 QImage getImage(View *v, QString name, QSize maxSize) const;
Chris@303 110
Chris@304 111 void drawImage(View *v, QPainter &paint, const ImageModel::Point &p,
Chris@304 112 int x, int nx) const;
Chris@304 113
Chris@303 114 //!!! how to reap no-longer-used images?
Chris@303 115
Chris@303 116 typedef std::map<QString, QImage> ImageMap;
Chris@303 117 typedef std::map<const View *, ImageMap> ViewImageMap;
Chris@318 118 typedef std::map<QString, FileSource *> FileSourceMap;
Chris@304 119
Chris@303 120 static ImageMap m_images;
Chris@305 121 static QMutex m_imageMapMutex;
Chris@303 122 mutable ViewImageMap m_scaled;
Chris@464 123 mutable FileSourceMap m_fileSources;
Chris@305 124
Chris@305 125 QString getLocalFilename(QString img) const;
Chris@464 126 void checkAddSource(QString img) const;
Chris@303 127
Chris@303 128 ImageModel *m_model;
Chris@303 129 bool m_editing;
Chris@303 130 QPoint m_editOrigin;
Chris@303 131 ImageModel::Point m_originalPoint;
Chris@303 132 ImageModel::Point m_editingPoint;
Chris@303 133 ImageModel::EditCommand *m_editingCommand;
Chris@376 134
Chris@376 135 void finish(ImageModel::EditCommand *command) {
Chris@376 136 Command *c = command->finish();
Chris@376 137 if (c) CommandHistory::getInstance()->addCommand(c, false);
Chris@376 138 }
Chris@303 139 };
Chris@303 140
Chris@303 141 #endif
Chris@303 142