Files
lmms/src/gui/widgets/TimeDisplayWidget.cpp

145 lines
3.1 KiB
C++

/*
* TimeDisplayWidget.cpp - widget for displaying current playback time
*
* Copyright (c) 2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of LMMS - http://lmms.io
*
* 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.
*
*/
#include <QMouseEvent>
#include "TimeDisplayWidget.h"
#include "GuiApplication.h"
#include "MainWindow.h"
#include "Engine.h"
#include "ToolTip.h"
#include "Song.h"
TimeDisplayWidget::TimeDisplayWidget() :
QWidget(),
m_displayMode( MinutesSeconds ),
m_spinBoxesLayout( this ),
m_majorLCD( 3, this ),
m_minorLCD( 3, this ),
m_milliSecondsLCD( 3, this )
{
m_spinBoxesLayout.setSpacing( 0 );
m_spinBoxesLayout.setMargin( 0 );
m_spinBoxesLayout.addWidget( &m_majorLCD );
m_spinBoxesLayout.addWidget( &m_minorLCD );
m_spinBoxesLayout.addWidget( &m_milliSecondsLCD );
setMaximumHeight( 32 );
ToolTip::add( this, tr( "click to change time units" ) );
// update labels of LCD spinboxes
setDisplayMode( m_displayMode );
connect( gui->mainWindow(), SIGNAL( periodicUpdate() ),
this, SLOT( updateTime() ) );
}
TimeDisplayWidget::~TimeDisplayWidget()
{
}
void TimeDisplayWidget::setDisplayMode( DisplayMode displayMode )
{
m_displayMode = displayMode;
switch( m_displayMode )
{
case MinutesSeconds:
m_majorLCD.setLabel( "MIN" );
m_minorLCD.setLabel( "SEC" );
m_milliSecondsLCD.setLabel( "MSEC" );
break;
case BarsTicks:
m_majorLCD.setLabel( "BAR" );
m_minorLCD.setLabel( "BEAT" );
m_milliSecondsLCD.setLabel( "TICK" );
break;
default: break;
}
}
void TimeDisplayWidget::updateTime()
{
Song* s = Engine::getSong();
switch( m_displayMode )
{
case MinutesSeconds:
m_majorLCD.setValue( s->getMilliseconds() / 60000 );
m_minorLCD.setValue( ( s->getMilliseconds() / 1000 ) % 60 );
m_milliSecondsLCD.setValue( s->getMilliseconds() % 1000 );
break;
case BarsTicks:
m_majorLCD.setValue( s->getTacts() + 1 );
m_minorLCD.setValue( ( s->getTicks() % s->ticksPerTact() ) /
( s->ticksPerTact() / s->getTimeSigModel().getNumerator() ) +1 );
;
m_milliSecondsLCD.setValue( ( s->getTicks() % s->ticksPerTact() ) %
( s->ticksPerTact() / s->getTimeSigModel().getNumerator() ) );
break;
default: break;
}
}
void TimeDisplayWidget::mousePressEvent( QMouseEvent* mouseEvent )
{
if( mouseEvent->button() == Qt::LeftButton )
{
if( m_displayMode == MinutesSeconds )
{
setDisplayMode( BarsTicks );
}
else
{
setDisplayMode( MinutesSeconds );
}
}
}