diff --git a/Timeline/Sequence_Widget.C b/Timeline/Sequence_Widget.C index 0f11fa5..7d2d4d3 100644 --- a/Timeline/Sequence_Widget.C +++ b/Timeline/Sequence_Widget.C @@ -48,6 +48,35 @@ Sequence_Widget::Sequence_Widget ( ) _color = FL_FOREGROUND_COLOR; } +/* careful with this, it doesn't journal */ +Sequence_Widget::Sequence_Widget ( const Sequence_Widget &rhs ) : Loggable( rhs ) +{ + _drag = NULL; + + _sequence = rhs._sequence; + + _range = rhs._range; + _r = &_range; + + _color = rhs._color; + _box_color = rhs._box_color; +}; + +const Sequence_Widget & +Sequence_Widget::operator= ( const Sequence_Widget &rhs ) +{ + if ( this == &rhs ) + return *this; + + _r = &_range; + _range = rhs._range; + _sequence = rhs._sequence; + _box_color = rhs._box_color; + _color = rhs._color; + + return *this; +} + Sequence_Widget::~Sequence_Widget ( ) { redraw(); @@ -336,8 +365,7 @@ Sequence_Widget::handle ( int m ) /* deletion */ if ( test_press( FL_BUTTON3 + FL_CTRL ) ) { - redraw(); - sequence()->queue_delete( this ); + remove(); return 1; } else if ( test_press( FL_BUTTON1 ) || test_press( FL_BUTTON1 + FL_CTRL ) ) @@ -450,3 +478,68 @@ Sequence_Widget::handle ( int m ) return 0; } } + + +/**********/ +/* Public */ +/**********/ + +/** add this widget to the selection */ +void +Sequence_Widget::select ( void ) +{ + if ( selected() ) + return; + + _selection.push_back( this ); + _selection.sort( sort_func ); + + redraw(); +} + +/** remove this widget from the selection */ +void +Sequence_Widget::deselect ( void ) +{ + _selection.remove( this ); + redraw(); +} + +bool +Sequence_Widget::selected ( void ) const +{ + return std::find( _selection.begin(), _selection.end(), this ) != _selection.end(); +} + +/** remove this widget from its sequence */ +void +Sequence_Widget::remove ( void ) +{ + redraw(); + sequence()->queue_delete( this ); +} + +void +Sequence_Widget::delete_selected ( void ) +{ + Loggable::block_start(); + + while ( _selection.size() ) + delete _selection.front(); + + Loggable::block_end(); +} + +void +Sequence_Widget::select_none ( void ) +{ + Loggable::block_start(); + + while ( _selection.size() ) + { + _selection.front()->redraw(); + _selection.pop_front(); + } + + Loggable::block_end(); +} diff --git a/Timeline/Sequence_Widget.H b/Timeline/Sequence_Widget.H index 9331978..654f3e3 100644 --- a/Timeline/Sequence_Widget.H +++ b/Timeline/Sequence_Widget.H @@ -43,7 +43,7 @@ struct Drag }; /* most common position description. /offset/ is only used by Regions, -but it's more convenient to have it here */ + but it's more convenient to have it here */ struct Range { nframes_t start; /* where on the timeline */ @@ -84,8 +84,8 @@ struct Range }; /* Used by time/tempo points or any other child of Sequence_Widget - which must be locked to a point in musical time rather than wallclock - time. Bar and beat start at 1. */ + which must be locked to a point in musical time rather than wallclock + time. Bar and beat start at 1. */ struct BBT { unsigned short bar; @@ -110,6 +110,12 @@ struct position_info BBT bbt; }; +#define SEQUENCE_WIDGET_CLONE_FUNC(class) \ + virtual Sequence_Widget *clone ( void ) const \ + { \ + return new class ( *this ); \ + } + /* Base class for virtual widget on a track */ class Sequence_Widget : public Loggable @@ -144,114 +150,33 @@ protected: virtual void get ( Log_Entry &e ) const; virtual void set ( Log_Entry &e ); - /* careful with this, it doesn't journal */ - Sequence_Widget ( const Sequence_Widget &rhs ) : Loggable( rhs ) - { - _drag = NULL; - - _sequence = rhs._sequence; - - _range = rhs._range; - _r = &_range; - - _color = rhs._color; - _box_color = rhs._box_color; - }; - + Sequence_Widget ( const Sequence_Widget &rhs ); Sequence_Widget ( ); + const Sequence_Widget & + operator= ( const Sequence_Widget &rhs ); + public: virtual ~Sequence_Widget ( ); - const Sequence_Widget & - operator= ( const Sequence_Widget &rhs ) - { - if ( this == &rhs ) - return *this; - - _r = &_range; - _range = rhs._range; - _sequence = rhs._sequence; - _box_color = rhs._box_color; - _color = rhs._color; - - return *this; - } - - -/* Sequence_Widget ( const Sequence_Widget &rhs ) */ -/* { */ -/* *this = rhs; */ -/* } */ - -#define SEQUENCE_WIDGET_CLONE_FUNC(class) \ - virtual Sequence_Widget *clone ( void ) const \ - { \ - return new class ( *this ); \ - } \ - \ -// virtual Sequence_Widget *clone ( const Sequence_Widget *r ) = 0; virtual Sequence_Widget *clone ( void ) const = 0; - bool selected ( void ) const - { - return std::find( _selection.begin(), _selection.end(), this ) != _selection.end(); - } + bool selected ( void ) const; + void select ( void ); + void deselect ( void ); + void remove ( void ); - void select ( void ) - { - if ( selected() ) - return; - - _selection.push_back( this ); - _selection.sort( sort_func ); - - redraw(); - } - - void deselect ( void ) - { - _selection.remove( this ); - redraw(); - } - - - static void - delete_selected ( void ) - { - Loggable::block_start(); - - while ( _selection.size() ) - delete _selection.front(); - - Loggable::block_end(); - } - - static void - select_none ( void ) - { - Loggable::block_start(); - - while ( _selection.size() ) - { - _selection.front()->redraw(); - _selection.pop_front(); - } - - Loggable::block_end(); - } + static void delete_selected ( void ); + static void select_none ( void ); static Sequence_Widget *current ( void ) { return Sequence_Widget::_current; } - static Sequence_Widget *pushed ( void ) { return Sequence_Widget::_pushed; } static Sequence_Widget *belowmouse ( void ) { return Sequence_Widget::_belowmouse; } static void pushed ( Sequence_Widget *w ) { Sequence_Widget::_pushed = w; } static void belowmouse ( Sequence_Widget *w ) { Sequence_Widget::_belowmouse = w; } -// static void pushed ( Sequence_Widget *w ) { Sequence_Widget::_pushed = w; } - void begin_drag ( const Drag &d ); void end_drag ( void ); @@ -322,9 +247,6 @@ public: int active_r ( void ) const { return _sequence->active_r(); } - - - /** returns true if widget /w/ begins and ends completely within the range of this widget */ bool contains ( const Sequence_Widget *w ) const {