/*******************************************************************************/ /* Copyright (C) 2008 Jonathan Moore Liles */ /* */ /* 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. */ /* */ /* This program is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ /* more details. */ /* */ /* You should have received a copy of the GNU General Public License along */ /* with This program; see the file COPYING. If not,write to the Free Software */ /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*******************************************************************************/ #include "Sequence_Region.H" #include "Track.H" void Sequence_Region::get ( Log_Entry &e ) const { e.add( ":color", (int)_box_color ); e.add( ":length", _r->length ); Sequence_Widget::get( e ); } void Sequence_Region::set ( Log_Entry &e ) { for ( int i = 0; i < e.size(); ++i ) { const char *s, *v; e.get( i, &s, &v ); if ( ! strcmp( s, ":color" ) ) _box_color = (Fl_Color)atoll( v ); else if ( ! strcmp( s, ":length" ) ) _r->length = atoll( v ); } Sequence_Widget::set( e ); } void Sequence_Region::draw_box ( void ) { fl_draw_box( box(), x(), y(), w(), h(), box_color() ); } void Sequence_Region::draw ( void ) { } void Sequence_Region::trim ( enum trim_e t, int X ) { X -= sequence()->x(); redraw(); switch ( t ) { case LEFT: { /* if ( d < 0 ) */ /* // _track->damage( FL_DAMAGE_EXPOSE, x() + d, y(), 1 - d, h() ); */ /* _track->damage( FL_DAMAGE_EXPOSE, x(), y(), w(), h() ); */ /* else */ /* _track->damage( FL_DAMAGE_EXPOSE, x(), y(), d, h() ); */ int d = X - ( abs_x() - scroll_x() ); long td = timeline->x_to_ts( d ); if ( td < 0 && _r->offset < (nframes_t)( 0 - td ) ) td = 0 - _r->offset; if ( td > 0 && (nframes_t)td >= _r->length ) td = _r->length - timeline->x_to_ts( 1 ); // td = _r->length - timeline->x_to_ts( 1 ); _r->trim_left( 0 - td ); nframes_t f; /* snap to beat/bar lines */ if ( timeline->nearest_line( _r->start, &f ) ) _r->set_left( f ); break; } case RIGHT: { int d = (( abs_x() - scroll_x() ) + abs_w() ) - X; /* _track->damage( FL_DAMAGE_EXPOSE, x() + w(), y(), d, h() ); */ long td = timeline->x_to_ts( d ); // printf( "%li %li\n", td, _r->length - _r->offset ); if ( td >= 0 && _r->length < (nframes_t)td ) td = _r->length - timeline->x_to_ts( 1 ); _r->trim_right( 0 - td ); nframes_t f; /* snap to beat/bar lines */ if ( timeline->nearest_line( _r->start + _r->length, &f ) ) _r->set_right( f ); break; } default: return; } } int Sequence_Region::handle ( int m ) { static enum trim_e trimming; static bool copied = false; /* if ( ! active_r() ) */ /* return 0; */ // int X = Fl::event_x() - _track->x(); int X = Fl::event_x(); int Y = Fl::event_y(); int ret; Logger _log( this ); //log_r->offset(); switch ( m ) { case FL_PUSH: { /* trimming */ if ( Fl::event_shift() && ! Fl::event_ctrl() ) { switch ( Fl::event_button() ) { case 1: trim( trimming = LEFT, X ); begin_drag( Drag( x() - X, y() - Y ) ); _log.hold(); break; case 3: trim( trimming = RIGHT, X ); begin_drag( Drag( x() - X, y() - Y ) ); _log.hold(); break; default: return 0; break; } fl_cursor( FL_CURSOR_WE ); return 1; } else if ( Fl::test_shortcut( FL_BUTTON2 ) && ! Fl::event_shift() ) { if ( Sequence_Widget::current() == this ) { if ( selected() ) deselect(); else select(); } redraw(); return 1; } else if ( Fl::test_shortcut( FL_CTRL + FL_BUTTON1 ) ) { /* duplication */ return 1; } else return Sequence_Widget::handle( m ); break; } case FL_RELEASE: { Sequence_Widget::handle( m ); copied = false; if ( trimming != NO ) trimming = NO; return 1; } case FL_DRAG: { if ( ! _drag ) { begin_drag( Drag( x() - X, y() - Y, x_to_offset( X ) ) ); _log.hold(); } /* trimming */ if ( Fl::event_state() & FL_SHIFT ) if ( trimming ) { trim( trimming, X ); return 1; } else return 0; else if ( Fl::event_button1() ) { if ( Fl::event_state() & FL_CTRL ) { /* duplication */ if ( _drag->state == 0 ) { // sequence()->add( new Audio_Region( *this ) ); sequence()->add( this->clone() ); _drag->state = 1; return 1; } } else if ( ! selected() ) { /* track jumping */ if ( Y > y() + h() || Y < y() ) { Track *t = timeline->track_under( Y ); fl_cursor( (Fl_Cursor)1 ); if ( t ) t->handle( FL_ENTER ); return 0; } } } ret = Sequence_Widget::handle( m ); return ret | 1; } default: return Sequence_Widget::handle( m ); break; } return 0; }