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