Chris@49
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@8
|
2
|
Chris@8
|
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@52
|
7 This file copyright 2006 Chris Cannam.
|
Chris@8
|
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@8
|
14 */
|
Chris@8
|
15
|
Chris@8
|
16 #ifndef _SELECTION_H_
|
Chris@8
|
17 #define _SELECTION_H_
|
Chris@8
|
18
|
Chris@8
|
19 #include <cstddef>
|
Chris@24
|
20 #include <set>
|
Chris@8
|
21
|
Chris@46
|
22 #include "XmlExportable.h"
|
Chris@46
|
23
|
Chris@925
|
24 /**
|
Chris@925
|
25 * A selection object simply represents a range in time, via start and
|
Chris@925
|
26 * end frame.
|
Chris@925
|
27 *
|
Chris@925
|
28 * The end frame is the index of the frame just *after* the end of the
|
Chris@925
|
29 * selection. For example a selection of length 10 frames starting at
|
Chris@925
|
30 * time 0 will have start frame 0 and end frame 10. This will be
|
Chris@925
|
31 * contiguous with (rather than overlapping with) a selection that
|
Chris@925
|
32 * starts at frame 10.
|
Chris@925
|
33 *
|
Chris@925
|
34 * Any selection with equal start and end frames is empty,
|
Chris@925
|
35 * representing "no selection". All empty selections are equal under
|
Chris@925
|
36 * the comparison operators. The default constructor makes an empty
|
Chris@925
|
37 * selection with start and end frames equal to zero.
|
Chris@925
|
38 */
|
Chris@8
|
39 class Selection
|
Chris@8
|
40 {
|
Chris@8
|
41 public:
|
Chris@8
|
42 Selection();
|
Chris@8
|
43 Selection(size_t startFrame, size_t endFrame);
|
Chris@8
|
44 Selection(const Selection &);
|
Chris@8
|
45 Selection &operator=(const Selection &);
|
Chris@8
|
46 virtual ~Selection();
|
Chris@8
|
47
|
Chris@8
|
48 bool isEmpty() const;
|
Chris@8
|
49 size_t getStartFrame() const;
|
Chris@8
|
50 size_t getEndFrame() const;
|
Chris@9
|
51 bool contains(size_t frame) const;
|
Chris@8
|
52
|
Chris@8
|
53 bool operator<(const Selection &) const;
|
Chris@8
|
54 bool operator==(const Selection &) const;
|
Chris@8
|
55
|
Chris@8
|
56 protected:
|
Chris@8
|
57 size_t m_startFrame;
|
Chris@8
|
58 size_t m_endFrame;
|
Chris@8
|
59 };
|
Chris@8
|
60
|
Chris@46
|
61 class MultiSelection : public XmlExportable
|
Chris@24
|
62 {
|
Chris@24
|
63 public:
|
Chris@24
|
64 MultiSelection();
|
Chris@24
|
65 virtual ~MultiSelection();
|
Chris@24
|
66
|
Chris@24
|
67 typedef std::set<Selection> SelectionList;
|
Chris@24
|
68
|
Chris@24
|
69 const SelectionList &getSelections() const;
|
Chris@24
|
70 void setSelection(const Selection &selection);
|
Chris@24
|
71 void addSelection(const Selection &selection);
|
Chris@24
|
72 void removeSelection(const Selection &selection);
|
Chris@24
|
73 void clearSelections();
|
Chris@24
|
74
|
Chris@300
|
75 void getExtents(size_t &startFrame, size_t &endFrame) const;
|
Chris@300
|
76
|
Chris@24
|
77 /**
|
Chris@24
|
78 * Return the selection that contains a given frame.
|
Chris@24
|
79 * If defaultToFollowing is true, and if the frame is not in a
|
Chris@24
|
80 * selected area, return the next selection after the given frame.
|
Chris@24
|
81 * Return the empty selection if no appropriate selection is found.
|
Chris@24
|
82 */
|
Chris@36
|
83 Selection getContainingSelection(size_t frame, bool defaultToFollowing) const;
|
Chris@24
|
84
|
Chris@314
|
85 virtual void toXml(QTextStream &stream, QString indent = "",
|
Chris@314
|
86 QString extraAttributes = "") const;
|
Chris@46
|
87
|
Chris@24
|
88 protected:
|
Chris@24
|
89 SelectionList m_selections;
|
Chris@24
|
90 };
|
Chris@24
|
91
|
Chris@24
|
92
|
Chris@8
|
93 #endif
|