diff --git a/Timeline/Control_Point.C b/Timeline/Control_Point.C new file mode 100644 index 0000000..ee8ea90 --- /dev/null +++ b/Timeline/Control_Point.C @@ -0,0 +1,113 @@ + +/*******************************************************************************/ +/* 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 "Control_Point.H" + +Control_Point::Control_Point ( Sequence *t, nframes_t when, float y ) +{ + _track = t; + _y = y; + _r->offset = when; + _box_color = FL_WHITE; + + log_create(); +} + +Control_Point::Control_Point ( const Control_Point &rhs ) +{ + _r->offset = rhs._r->offset; + _y = rhs._y; +} + +void +Control_Point::get ( Log_Entry &e ) const +{ + Sequence_Point::get( e ); + + e.add( ":y", _y ); +} + +void +Control_Point::set ( Log_Entry &e ) +{ + for ( int i = 0; i < e.size(); ++i ) + { + const char *s, *v; + + e.get( i, &s, &v ); + + if ( ! strcmp( s, ":y" ) ) + _y = atof( v ); + + timeline->redraw(); + + // _make_label(); + } + + Sequence_Point::set( e ); +} + +void +Control_Point::draw_box ( void ) +{ + if ( selected() ) + { + fl_color( selection_color() ); + fl_pie( x(), y(), w(), h(), 0, 360 ); + } + + fl_color( box_color() ); + + fl_arc( x(), y(), w(), h(), 0, 360 ); +} + + +int +Control_Point::handle ( int m ) +{ + int r = Sequence_Widget::handle( m ); + + switch ( m ) + { + + case FL_RELEASE: + _track->sort(); + redraw(); + break; + case FL_DRAG: + { + track()->sort(); + + if ( selected() ) + break; + + int Y = Fl::event_y() - parent()->y(); + + if ( Y >= 0 && Y < parent()->h() ) + { + _y = (float)Y / parent()->h(); + redraw(); + } + + break; + } + } + + return r; +} diff --git a/Timeline/Control_Point.H b/Timeline/Control_Point.H index eddba2e..a516d01 100644 --- a/Timeline/Control_Point.H +++ b/Timeline/Control_Point.H @@ -17,6 +17,7 @@ /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*******************************************************************************/ + #pragma once #include "Sequence_Point.H" @@ -25,86 +26,33 @@ class Control_Point : public Sequence_Point { float _y; -/* void */ -/* _make_label ( void ) */ -/* { */ -/* if ( ! _label ) */ -/* _label = new char[40]; */ - -/* snprintf( _label, 40, "%.1f", _y ); */ -/* } */ - protected: -// const char *class_name ( void ) { return "Control_Point"; } - - virtual void get ( Log_Entry &e ) const - { - Sequence_Point::get( e ); - - e.add( ":y", _y ); - } - - void - set ( Log_Entry &e ) - { - for ( int i = 0; i < e.size(); ++i ) - { - const char *s, *v; - - e.get( i, &s, &v ); - - if ( ! strcmp( s, ":y" ) ) - _y = atof( v ); - - timeline->redraw(); - - // _make_label(); - } - - Sequence_Point::set( e ); - } - Control_Point ( ) { _box_color = FL_WHITE; } + virtual void get ( Log_Entry &e ) const; + virtual void set ( Log_Entry &e ); + public: -/* Sequence_Widget * */ -/* clone ( const Sequence_Widget *r ) */ -/* { */ -/* return new Control_Point( *(Control_Point*)r ); */ -/* } */ /* for loggable */ LOG_CREATE_FUNC( Control_Point ); - Control_Point ( Sequence *t, nframes_t when, float y ) - { - _track = t; - _y = y; - _r->offset = when; - _box_color = FL_WHITE; - - log_create(); - } - - Control_Point ( const Control_Point &rhs ) - { - _r->offset = rhs._r->offset; - _y = rhs._y; - } Sequence_Widget *clone ( const Sequence_Widget *r ) { return new Control_Point( *(Control_Point*)r ); } + Control_Point ( Sequence *t, nframes_t when, float y ); + Control_Point ( const Control_Point &rhs ); + ~Control_Point ( ) { -// if ( _label ) delete[] _label; log_destroy(); } @@ -113,48 +61,12 @@ public: /* only for playback thread */ nframes_t when ( void ) const { return _range.offset; } - - int - handle ( int m ) - { - int r = Sequence_Widget::handle( m ); - - switch ( m ) - { - - case FL_RELEASE: - _track->sort(); - redraw(); - break; - case FL_DRAG: - { - track()->sort(); - - if ( selected() ) - break; - - int Y = Fl::event_y() - parent()->y(); - - if ( Y >= 0 && Y < parent()->h() ) - { - _y = (float)Y / parent()->h(); - redraw(); - } - - break; - } - } - - return r; - } - -/* int x ( void ) const { return line_x(); } */ - int abs_w ( void ) const { return 6; } -// int w ( void ) const { return 6; } - int y ( void ) const { return parent()->y() + ((float)parent()->h() * _y); } int h ( void ) const { return 6; } + virtual void draw_box ( void ); + virtual int handle ( int m ); + }; diff --git a/Timeline/Makefile b/Timeline/Makefile index 9269f37..05bd44d 100644 --- a/Timeline/Makefile +++ b/Timeline/Makefile @@ -12,6 +12,7 @@ SRCS= \ Track.C \ Sequence_Widget.C \ Sequence_Point.C \ + Control_Point.C \ Tempo_Point.C \ Time_Point.C \ Peaks.C \ diff --git a/Timeline/Region.H b/Timeline/Region.H index f1dde50..616291d 100644 --- a/Timeline/Region.H +++ b/Timeline/Region.H @@ -155,8 +155,8 @@ public: static Fl_Boxtype _box; static Fl_Color _selection_color; - static Fl_Color selection_color ( void ) { return _selection_color; } - static void selection_color ( Fl_Color v ) { _selection_color = v; } + Fl_Color selection_color ( void ) const { return _selection_color; } + void selection_color ( Fl_Color v ) { _selection_color = v; } enum trim_e { NO, LEFT, RIGHT }; void trim ( enum trim_e t, int X ); diff --git a/Timeline/Sequence_Widget.C b/Timeline/Sequence_Widget.C index 7a1a51f..47813ba 100644 --- a/Timeline/Sequence_Widget.C +++ b/Timeline/Sequence_Widget.C @@ -31,6 +31,7 @@ list Sequence_Widget::_selection; Sequence_Widget * Sequence_Widget::_current = NULL; Sequence_Widget * Sequence_Widget::_pushed = NULL; Sequence_Widget * Sequence_Widget::_belowmouse = NULL; +Fl_Color Sequence_Widget::_selection_color = FL_MAGENTA; void Sequence_Widget::draw_label ( const char *label, Fl_Align align, Fl_Color color ) diff --git a/Timeline/Sequence_Widget.H b/Timeline/Sequence_Widget.H index d8e1857..d574a88 100644 --- a/Timeline/Sequence_Widget.H +++ b/Timeline/Sequence_Widget.H @@ -61,6 +61,9 @@ class Sequence_Widget : public Loggable static Sequence_Widget * _original; /* the original of the /pushed/ widget */ static Sequence_Widget * _belowmouse; /* the widget below the mouse cursor */ + + static Fl_Color _selection_color; + /* can't have this */ Sequence_Widget ( const Sequence_Widget &rhs ); @@ -306,9 +309,11 @@ public: int abs_x ( void ) const { return timeline->ts_to_x( _r->offset ); } virtual int abs_w ( void ) const { return timeline->ts_to_x( _r->end - _r->start ); } - Fl_Color color ( void ) { return _color; } + Fl_Color color ( void ) const { return _color; } void color ( Fl_Color v ) { _color = v; } - Fl_Color box_color ( void ) { return _box_color; } + Fl_Color box_color ( void ) const { return _box_color; } + virtual Fl_Color selection_color ( void ) const { return _selection_color; } + virtual void selection_color ( Fl_Color v ) { _selection_color = v; } Sequence * track ( void ) const { return _track; } void track ( Sequence *t ) { _track = t; }