/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2010 Robert Bieber * * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include "skintimer.h" #include "ui_skintimer.h" const int SkinTimer::millisPerTick = 250; SkinTimer::SkinTimer(DeviceState* device, QWidget *parent) : QWidget(parent), ui(new Ui::SkinTimer), device(device) { ui->setupUi(this); setupUI(); } SkinTimer::~SkinTimer() { delete ui; } void SkinTimer::setupUI() { playStateButtons.append(ui->playButton); playStateButtons.append(ui->pauseButton); playStateButtons.append(ui->rwndButton); playStateButtons.append(ui->ffwdButton); QObject::connect(ui->startButton, SIGNAL(clicked()), this, SLOT(start())); QObject::connect(ui->stopButton, SIGNAL(clicked()), this, SLOT(stop())); QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(tick())); for(int i = 0; i < playStateButtons.count(); i++) QObject::connect(playStateButtons[i], SIGNAL(toggled(bool)), this, SLOT(stateChange())); QObject::connect(device, SIGNAL(settingsChanged()), this, SLOT(deviceChange())); int playState = device->data("?mp").toInt(); switch(playState) { default: case 1: ui->playButton->setChecked(true); break; case 2: ui->pauseButton->setChecked(true); break; case 3: ui->ffwdButton->setChecked(true); break; case 4: ui->rwndButton->setChecked(true); break; } } void SkinTimer::start() { ui->startButton->setEnabled(false); ui->stopButton->setEnabled(true); ui->speedBox->setEnabled(false); ui->durationBox->setEnabled(false); totalTime = ui->durationBox->value() * 1000; elapsedTime = 0; timer.setInterval(millisPerTick); ui->statusBar->setValue(0); timer.start(); } void SkinTimer::stop() { ui->startButton->setEnabled(true); ui->stopButton->setEnabled(false); ui->speedBox->setEnabled(true); ui->durationBox->setEnabled(true); timer.stop(); } void SkinTimer::tick() { elapsedTime += millisPerTick * ui->speedBox->value(); if(elapsedTime >= totalTime) { ui->statusBar->setValue(100); stop(); } /* Calculating the simulated time elapsed */ double dTime = millisPerTick * ui->speedBox->value() / 1000; /* Adding to the device's simtime */ device->setData("simtime", device->data("simtime").toDouble() + dTime); /* Adding to the song time depending on mode*/ double songTime = device->data("?pc").toDouble(); double trackTime = device->data("?pt").toDouble(); if(ui->playButton->isChecked()) songTime += dTime; else if(ui->rwndButton->isChecked()) songTime -= 2 * dTime; else if(ui->ffwdButton->isChecked()) songTime += 2 * dTime; if(songTime > trackTime) { songTime = trackTime; ui->pauseButton->setChecked(true); } if(songTime < 0) { songTime = 0; ui->pauseButton->setChecked(true); } device->setData("?pc", songTime); /* Updating the status bar */ ui->statusBar->setValue(elapsedTime * 100 / totalTime); } void SkinTimer::stateChange() { if(ui->playButton->isChecked()) device->setData("mp", "Play"); else if(ui->pauseButton->isChecked()) device->setData("mp", "Pause"); else if(ui->rwndButton->isChecked()) device->setData("mp", "Rewind"); else if(ui->ffwdButton->isChecked()) device->setData("mp", "Fast Forward"); } void SkinTimer::deviceChange() { int playState = device->data("?mp").toInt(); switch(playState) { case 1: ui->playButton->setChecked(true); break; case 2: ui->pauseButton->setChecked(true); break; case 3: ui->ffwdButton->setChecked(true); break; case 4: ui->rwndButton->setChecked(true); break; default: break; } }