You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
6.1 KiB
202 lines
6.1 KiB
/*
|
|
Rosegarden
|
|
A sequencer and musical notation editor.
|
|
|
|
This program is Copyright 2000-2008
|
|
Guillaume Laurent <glaurent@telegraph-road.org>,
|
|
Chris Cannam <cannam@all-day-breakfast.com>,
|
|
Richard Bown <bownie@bownie.com>
|
|
|
|
The moral right of the authors to claim authorship of this work
|
|
has been asserted.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version. See the file
|
|
COPYING included with this distribution for more information.
|
|
*/
|
|
|
|
#ifndef _CLIPBOARD_H_
|
|
#define _CLIPBOARD_H_
|
|
|
|
#include <set>
|
|
#include "Segment.h"
|
|
#include "Selection.h"
|
|
|
|
namespace Rosegarden
|
|
{
|
|
class EventSelection;
|
|
|
|
/**
|
|
* Simple container for segments, that can serve as a clipboard for
|
|
* editing operations. Conceptually it has two "modes",
|
|
* single-segment and multiple-segment, although there's no particular
|
|
* distinction behind the scenes. The Clipboard owns all the segments
|
|
* it contains -- they should always be deep copies, not aliases.
|
|
*/
|
|
|
|
class Clipboard
|
|
{
|
|
public:
|
|
typedef std::multiset<Segment *, Segment::SegmentCmp> segmentcontainer;
|
|
typedef segmentcontainer::iterator iterator;
|
|
typedef segmentcontainer::const_iterator const_iterator;
|
|
|
|
Clipboard();
|
|
Clipboard(const Clipboard &);
|
|
Clipboard &operator=(const Clipboard &);
|
|
virtual ~Clipboard();
|
|
|
|
/**
|
|
* Empty the clipboard.
|
|
*/
|
|
void clear();
|
|
|
|
/**
|
|
* Return true if the clipboard is empty.
|
|
*/
|
|
bool isEmpty() const;
|
|
|
|
iterator begin() { return m_segments.begin(); }
|
|
const_iterator begin() const { return m_segments.begin(); }
|
|
iterator end() { return m_segments.end(); }
|
|
const_iterator end() const { return m_segments.end(); }
|
|
|
|
/**
|
|
* Return true if the clipboard only contains a single segment.
|
|
* Single-segment and multi-segment are conceptually rather
|
|
* separate -- for example, you can only paste into a segment
|
|
* from a single-segment clipboard.
|
|
*/
|
|
bool isSingleSegment() const;
|
|
|
|
/**
|
|
* Return true if the clipboard contains at least one segment
|
|
* that originated as only part of another segment. If a
|
|
* paste is made from a clipboard with isPartial true, the
|
|
* paste command will generally want to be sure to normalize
|
|
* rests etc on the pasted region afterwards.
|
|
*/
|
|
bool isPartial() const;
|
|
|
|
/**
|
|
* Return the single segment contained by the clipboard.
|
|
* If the clipboard is empty or contains more than one segment,
|
|
* returns null. (Use the iterator accessors begin()/end() to
|
|
* read from a clipboard for which isSingleSegment is false.)
|
|
*/
|
|
Segment *getSingleSegment() const;
|
|
|
|
/**
|
|
* Add a new empty segment to the clipboard, and return a
|
|
* pointer to it. (The clipboard retains ownership.)
|
|
*/
|
|
Segment *newSegment();
|
|
|
|
/**
|
|
* Add a new segment to the clipboard, containing copies of
|
|
* the events in copyFrom. (The clipboard retains ownership
|
|
* of the new segment.)
|
|
*/
|
|
Segment *newSegment(const Segment *copyFrom);
|
|
|
|
/**
|
|
* Add one or more new segments to the clipboard, containing
|
|
* copies of the events in copyFrom found between from and to. If
|
|
* expandRepeats is true, include any events found in the
|
|
* repeating trail of the segment within this time. (The
|
|
* clipboard retains ownership of the new segment(s).)
|
|
*
|
|
* This may insert more than one new segment, if it is required to
|
|
* insert a repeating section of an audio segment. For this
|
|
* reason it does not return the inserted segment (even though in
|
|
* most situations it will only insert one).
|
|
*/
|
|
void newSegment(const Segment *copyFrom, timeT from, timeT to,
|
|
bool expandRepeats);
|
|
|
|
/**
|
|
* Add a new segment to the clipboard, containing copied of
|
|
* the events in the given selection.
|
|
*/
|
|
Segment *newSegment(const EventSelection *copyFrom);
|
|
|
|
/**
|
|
* Add a time signature selection to this clipboard, replacing any
|
|
* that already exists.
|
|
*/
|
|
void setTimeSignatureSelection(const TimeSignatureSelection &);
|
|
|
|
bool hasTimeSignatureSelection() const { return m_haveTimeSigSelection; }
|
|
|
|
/**
|
|
* Remove any time signature selection from the clipboard.
|
|
*/
|
|
void clearTimeSignatureSelection();
|
|
|
|
/**
|
|
* Retrieve any time signature selection found in the clipboard.
|
|
*/
|
|
const TimeSignatureSelection &getTimeSignatureSelection() const;
|
|
|
|
/**
|
|
* Add a tempo selection to this clipboard, replacing any
|
|
* that already exists.
|
|
*/
|
|
void setTempoSelection(const TempoSelection &);
|
|
|
|
bool hasTempoSelection() const { return m_haveTempoSelection; }
|
|
|
|
/**
|
|
* Remove any tempo selection from the clipboard.
|
|
*/
|
|
void clearTempoSelection();
|
|
|
|
/**
|
|
* Retrieve any tempo selection found in the clipboard.
|
|
*/
|
|
const TempoSelection &getTempoSelection() const;
|
|
|
|
/**
|
|
* Clear the current clipboard and re-fill it by copying from c.
|
|
*/
|
|
void copyFrom(const Clipboard *c);
|
|
|
|
/**
|
|
* Get the earliest start time for anything in this clipboard,
|
|
* or the start of the nominal range if there is one.
|
|
*/
|
|
timeT getBaseTime() const;
|
|
|
|
/**
|
|
* Set nominal start and end times for the range in the clipboard,
|
|
* if it is intended to cover a particular time range regardless
|
|
* of whether the data in it covers the full range or not.
|
|
*/
|
|
void setNominalRange(timeT start, timeT end);
|
|
|
|
void clearNominalRange() { setNominalRange(0, 0); }
|
|
|
|
bool hasNominalRange() const { return m_nominalStart != m_nominalEnd; }
|
|
|
|
void getNominalRange(timeT &start, timeT &end);
|
|
|
|
private:
|
|
segmentcontainer m_segments;
|
|
bool m_partial;
|
|
|
|
TimeSignatureSelection m_timeSigSelection;
|
|
bool m_haveTimeSigSelection;
|
|
|
|
TempoSelection m_tempoSelection;
|
|
bool m_haveTempoSelection;
|
|
|
|
timeT m_nominalStart;
|
|
timeT m_nominalEnd;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|