/* * timeline.h - class timeLine, representing a time-line with position marker * * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * 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 COPYING); if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. * */ #ifndef _TIMELINE_H #define _TIMELINE_H #include #include "song.h" class QPixmap; class nStateButton; class textFloat; class timeLine : public QWidget, public journallingObject { Q_OBJECT public: enum AutoScrollStates { AutoScrollEnabled, AutoScrollDisabled } ; enum LoopPointStates { LoopPointsDisabled, LoopPointsEnabled } ; enum BehaviourAtStopStates { BackToZero, BackToStart, KeepStopPosition } ; timeLine( int _xoff, int _yoff, float _ppt, song::playPos & _pos, const midiTime & _begin, QWidget * _parent ); virtual ~timeLine(); inline song::playPos & pos( void ) { return( m_pos ); } BehaviourAtStopStates behaviourAtStop( void ) const { return( m_behaviourAtStop ); } bool loopPointsEnabled( void ) const { return( m_loopPoints == LoopPointsEnabled ); } inline const midiTime & loopBegin( void ) const { return( ( m_loopPos[0] < m_loopPos[1] ) ? m_loopPos[0] : m_loopPos[1] ); } inline const midiTime & loopEnd( void ) const { return( ( m_loopPos[0] > m_loopPos[1] ) ? m_loopPos[0] : m_loopPos[1] ); } inline void savePos( const midiTime & _pos ) { m_savedPos = _pos; } inline const midiTime & savedPos( void ) const { return( m_savedPos ); } inline void setPixelsPerTact( float _ppt ) { m_ppt = _ppt; update(); } void addToolButtons( QWidget * _tool_bar ); virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName( void ) const { return( "timeline" ); } public slots: void updatePosition( const midiTime & ); void updatePosition( void ) { updatePosition( midiTime() ); } void toggleAutoScroll( int _n ); void toggleLoopPoints( int _n ); void toggleBehaviourAtStop( int _n ); protected: virtual void paintEvent( QPaintEvent * _pe ); virtual void mousePressEvent( QMouseEvent * _me ); virtual void mouseMoveEvent( QMouseEvent * _me ); virtual void mouseReleaseEvent( QMouseEvent * _me ); private: inline int markerX( const midiTime & _t ) const { return( m_xOffset + static_cast( ( _t - m_begin ) * m_ppt / midiTime::ticksPerTact() ) ); } static QPixmap * s_timeLinePixmap; static QPixmap * s_posMarkerPixmap; static QPixmap * s_loopPointPixmap; static QPixmap * s_loopPointDisabledPixmap; AutoScrollStates m_autoScroll; LoopPointStates m_loopPoints; BehaviourAtStopStates m_behaviourAtStop; bool m_changedPosition; int m_xOffset; int m_posMarkerX; float m_ppt; song::playPos & m_pos; const midiTime & m_begin; midiTime m_loopPos[2]; midiTime m_savedPos; textFloat * m_hint; enum actions { NoAction, MovePositionMarker, MoveLoopBegin, MoveLoopEnd } m_action; int m_moveXOff; signals: void positionChanged( const midiTime & _t ); void loopPointStateLoaded( int _n ); } ; #endif