/***************************************************************************
* Copyright (C) 2006 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* 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; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <QCoreApplication>
#include <QPainter>
#include <QPushButton>
#include <QLabel>
#include <QSettings>
#include <QMenu>
#include <output.h>
#include "skin.h"
#include "mainvisual.h"
#include "button.h"
#include "titlebar.h"
#include "positionbar.h"
#include "number.h"
#include "togglebutton.h"
#include "symboldisplay.h"
#include "textscroller.h"
#include "monostereo.h"
#include "playstatus.h"
#include "volumebar.h"
#include "balancebar.h"
#include "mainwindow.h"
#include "timeindicator.h"
#include "display.h"
MainDisplay::MainDisplay ( QWidget *parent )
: PixmapWidget ( parent )
{
m_skin = Skin::getPointer();
setPixmap ( m_skin->getMain() );
setMaximumSize ( QSize ( 275,116 ) );
setMinimumSize ( QSize ( 275,116 ) );
m_mw = qobject_cast<MainWindow*>(parent);
Button *previous = new Button ( this,
Skin::BT_PREVIOUS_N, Skin::BT_PREVIOUS_P );
previous->move ( 16, 88 );
connect ( previous,SIGNAL ( clicked() ),parent,SLOT ( previous() ) );
Button *play = new Button ( this,
Skin::BT_PLAY_N, Skin::BT_PLAY_P );
play->move ( 39, 88 );
connect ( play,SIGNAL ( clicked() ),parent,SLOT ( play() ) );
Button *pause = new Button ( this, Skin::BT_PAUSE_N,Skin::BT_PAUSE_P );
pause->move ( 62, 88 );
connect ( pause,SIGNAL ( clicked() ),parent,SLOT ( pause() ) );
Button *stop = new Button ( this, Skin::BT_STOP_N,Skin::BT_STOP_P );
stop->move ( 85, 88 );
connect ( stop,SIGNAL ( clicked() ),parent,SLOT ( stop() ) );
connect ( stop,SIGNAL ( clicked() ),this,SLOT ( hideTimeDisplay() ) );
Button *next = new Button ( this, Skin::BT_NEXT_N,Skin::BT_NEXT_P );
next->move ( 108, 88 );
connect ( next,SIGNAL ( clicked() ),parent,SLOT ( next() ) );
Button *eject = new Button ( this, Skin::BT_EJECT_N,Skin::BT_EJECT_P );
eject->move ( 136, 89 );
connect ( eject,SIGNAL ( clicked() ),parent,SLOT ( addFile() ) );
connect ( m_skin, SIGNAL ( skinChanged() ), this, SLOT ( updateSkin() ) );
posbar = new PositionBar ( this );
posbar->move ( 16,72 );
//connect(posbar, SIGNAL(sliderMoved(int)), SLOT(setTime(int)));
MainVisual* vis = new MainVisual ( this,"" );
vis->setGeometry ( 24,39,75,20 );
vis->show();
m_eqButton = new ToggleButton ( this,Skin::BT_EQ_ON_N,Skin::BT_EQ_ON_P,
Skin::BT_EQ_OFF_N,Skin::BT_EQ_OFF_P );
m_eqButton->move ( 219,58 );
m_eqButton->show();
m_plButton = new ToggleButton ( this,Skin::BT_PL_ON_N,Skin::BT_PL_ON_P,
Skin::BT_PL_OFF_N,Skin::BT_PL_OFF_P );
m_plButton->move ( 241,58 );
m_plButton->show();
m_repeatButton = new ToggleButton ( this,Skin::REPEAT_ON_N,Skin::REPEAT_ON_P,
Skin::REPEAT_OFF_N,Skin::REPEAT_OFF_P );
connect(m_repeatButton,SIGNAL(clicked(bool)),this,SIGNAL(repeatableToggled(bool)));
m_repeatButton->move ( 210,89 );
m_repeatButton->show();
m_shuffleButton = new ToggleButton ( this,Skin::SHUFFLE_ON_N,Skin::SHUFFLE_ON_P,
Skin::SHUFFLE_OFF_N,Skin::SHUFFLE_OFF_P );
connect(m_shuffleButton,SIGNAL(clicked(bool)),this,SIGNAL(shuffleToggled(bool)));
m_shuffleButton->move ( 164,89 );
m_shuffleButton->show();
m_kbps = new SymbolDisplay( this,3 );
m_kbps -> move ( 111,43 );
m_kbps -> show();
m_freq = new SymbolDisplay( this,2 );
m_freq -> move ( 156,43 );
m_freq -> show();
TextScroller *m_text = new TextScroller ( this );
m_text->resize ( 154,15 );
m_text->move ( 109,23 );
m_text->show();
m_monoster = new MonoStereo ( this );
m_monoster->move ( 212,41 );
m_monoster->show();
m_playstatus = new PlayStatus(this);
m_playstatus->move(24,28);
m_playstatus->show();
m_volumeBar = new VolumeBar(this);
connect(m_volumeBar, SIGNAL(sliderMoved(int)),SLOT(updateVolume()));
m_volumeBar->move(107,57);
m_volumeBar->show();
m_balanceBar = new BalanceBar(this);
connect(m_balanceBar, SIGNAL(sliderMoved(int)),SLOT(updateVolume()));
m_balanceBar->move(177,57);
m_balanceBar->show();
m_timeIndicator = new TimeIndicator(this);
m_timeIndicator->move(34,26);
m_timeIndicator->show();
}
MainDisplay::~MainDisplay()
{
QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat );
settings.setValue ( "Playlist/visible",m_plButton->isChecked() );
settings.setValue ( "Equalizer/visible",m_eqButton->isChecked() );
}
void MainDisplay::setTime ( int t )
{
posbar->setValue ( t );
m_timeIndicator->setTime(t);
}
void MainDisplay::setMaxTime ( long mt ) // TODO: should be removed
{
posbar->setMax ( mt );
m_timeIndicator->setSongDuration(mt);
}
void MainDisplay::updateSkin()
{
setPixmap ( m_skin->getMain() );
}
void MainDisplay::setEQ ( QWidget* w )
{
m_equlizer = w;
m_eqButton->setON ( m_equlizer->isVisible() );
connect ( m_eqButton, SIGNAL ( clicked ( bool ) ), m_equlizer, SLOT ( setVisible ( bool ) ) );
}
void MainDisplay::setPL ( QWidget* w )
{
m_playlist = w;
m_plButton->setON ( m_playlist->isVisible() );
connect ( m_plButton, SIGNAL ( clicked ( bool ) ), m_playlist, SLOT ( setVisible ( bool ) ) );
}
void MainDisplay::setInfo(const OutputState &st)
{
switch ( ( int ) st.type() )
{
case OutputState::Info:
{
//if ( seeking )
// break;
setTime ( st.elapsedSeconds() );
m_kbps->display ( st.bitrate() );
m_freq->display ( st.frequency() /1000 );
m_monoster->setChannels ( st.channels() );
update();
break;
}
case OutputState::Playing:
{
m_playstatus->setStatus(PlayStatus::PLAY);
m_timeIndicator->setNeedToShowTime(true);
break;
}
case OutputState::Buffering:
{
//ui.label->setText("Buffering");
break;
}
case OutputState::Paused:
{
m_playstatus->setStatus(PlayStatus::PAUSE);
break;
}
case OutputState::Stopped:
{
m_playstatus->setStatus(PlayStatus::STOP);
m_monoster->setChannels (0);
//m_timeIndicator->setNeedToShowTime(false);
break;
}
case OutputState::Volume:
//qDebug("volume %d, %d", st.rightVolume(), st.leftVolume());
int maxVol = qMax(st.leftVolume(),st.rightVolume());
m_volumeBar->setValue(maxVol);
if (maxVol && !m_volumeBar->isPressed())
m_balanceBar->setValue((st.rightVolume()-st.leftVolume())*100/maxVol);
break;
}
}
bool MainDisplay::isPlaylistVisible() const
{
return m_plButton->isChecked();
}
bool MainDisplay::isEqualizerVisible() const
{
return m_eqButton->isChecked();
}
void MainDisplay::updateVolume()
{
m_mw->setVolume(m_volumeBar->value(), m_balanceBar->value());
}
void MainDisplay::wheelEvent (QWheelEvent *e)
{
m_mw->setVolume(m_volumeBar->value()+e->delta()/10, m_balanceBar->value());
}
bool MainDisplay::isRepeatable() const
{
return m_repeatButton->isChecked();
}
bool MainDisplay::isShuffle() const
{
return m_shuffleButton->isChecked();
}
void MainDisplay::setIsRepeatable(bool yes)
{
m_repeatButton->setON(yes);
}
void MainDisplay::setIsShuffle(bool yes)
{
m_shuffleButton->setON(yes);
}
void MainDisplay::hideTimeDisplay()
{
m_timeIndicator->setNeedToShowTime(false);
}
void MainDisplay::mousePressEvent(QMouseEvent *e)
{
if( e->button() == Qt::RightButton)
{
m_mw->menu()->exec(e->globalPos());
}
PixmapWidget::mousePressEvent(e);
}