aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Ui/skinned/display.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Ui/skinned/display.cpp')
-rw-r--r--src/plugins/Ui/skinned/display.cpp357
1 files changed, 357 insertions, 0 deletions
diff --git a/src/plugins/Ui/skinned/display.cpp b/src/plugins/Ui/skinned/display.cpp
new file mode 100644
index 000000000..9b54306d2
--- /dev/null
+++ b/src/plugins/Ui/skinned/display.cpp
@@ -0,0 +1,357 @@
+/***************************************************************************
+ * Copyright (C) 2006-2011 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 <QApplication>
+#include <QSettings>
+#include <QMenu>
+#include <qmmp/soundcore.h>
+#include <qmmpui/mediaplayer.h>
+#include <qmmpui/playlistmanager.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 "actionmanager.h"
+#include "display.h"
+
+MainDisplay::MainDisplay (QWidget *parent)
+ : PixmapWidget (parent)
+{
+ m_shaded = false;
+ m_skin = Skin::instance();
+ setPixmap (m_skin->getMain());
+ setCursor(m_skin->getCursor(Skin::CUR_NORMAL));
+ m_mw = qobject_cast<MainWindow*>(parent);
+ m_titlebar = new TitleBar(this);
+ m_titlebar->move(0,0);
+ m_titlebar->setActive(true);
+ m_previous = new Button (this, Skin::BT_PREVIOUS_N, Skin::BT_PREVIOUS_P, Skin::CUR_NORMAL);
+ m_previous->setToolTip(tr("Previous"));
+ connect (m_previous, SIGNAL (clicked()), parent, SLOT (previous()));
+
+ m_play = new Button (this, Skin::BT_PLAY_N, Skin::BT_PLAY_P, Skin::CUR_NORMAL);
+ m_play->setToolTip(tr("Play"));
+ connect (m_play, SIGNAL (clicked()),parent,SLOT (play()));
+ m_pause = new Button (this, Skin::BT_PAUSE_N,Skin::BT_PAUSE_P, Skin::CUR_NORMAL);
+ m_pause->setToolTip(tr("Pause"));
+ connect (m_pause,SIGNAL (clicked()),parent,SLOT (pause()));
+ m_stop = new Button (this, Skin::BT_STOP_N,Skin::BT_STOP_P, Skin::CUR_NORMAL);
+ m_stop->setToolTip(tr("Stop"));
+ connect (m_stop,SIGNAL (clicked()),parent,SLOT (stop()));
+ m_next = new Button (this, Skin::BT_NEXT_N,Skin::BT_NEXT_P, Skin::CUR_NORMAL);
+ m_next->setToolTip(tr("Next"));
+ connect (m_next,SIGNAL (clicked()),parent,SLOT (next()));
+ m_eject = new Button (this, Skin::BT_EJECT_N,Skin::BT_EJECT_P, Skin::CUR_NORMAL);
+ m_eject->setToolTip(tr("Add file"));
+ connect (m_eject,SIGNAL (clicked()),parent,SLOT (addFile()));
+ connect (m_skin, SIGNAL (skinChanged()), this, SLOT (updateSkin()));
+ m_vis = new MainVisual (this);
+
+ 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->setToolTip(tr("Equalizer"));
+ 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->setToolTip(tr("Playlist"));
+
+ 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->setToolTip(tr("Repeat playlist"));
+ m_shuffleButton = new ToggleButton (this,Skin::SHUFFLE_ON_N,Skin::SHUFFLE_ON_P,
+ Skin::SHUFFLE_OFF_N,Skin::SHUFFLE_OFF_P);
+ m_shuffleButton->setToolTip(tr("Shuffle"));
+ connect(m_shuffleButton,SIGNAL(clicked(bool)),this,SIGNAL(shuffleToggled(bool)));
+
+ m_kbps = new SymbolDisplay(this,3);
+ m_freq = new SymbolDisplay(this,2);
+ m_text = new TextScroller (this);
+ m_monoster = new MonoStereo (this);
+ m_playstatus = new PlayStatus(this);
+
+ m_volumeBar = new VolumeBar(this);
+ m_volumeBar->setToolTip(tr("Volume"));
+ connect(m_volumeBar, SIGNAL(sliderMoved(int)),SLOT(updateVolume()));
+ connect(m_volumeBar, SIGNAL(sliderPressed()),SLOT(updateVolume()));
+ connect(m_volumeBar, SIGNAL(sliderReleased()),m_text,SLOT(clear()));
+
+ m_balanceBar = new BalanceBar(this);
+ m_balanceBar->setToolTip(tr("Balance"));
+ connect(m_balanceBar, SIGNAL(sliderMoved(int)),SLOT(updateVolume()));
+ connect(m_balanceBar, SIGNAL(sliderPressed()),SLOT(updateVolume()));
+ connect(m_balanceBar, SIGNAL(sliderReleased()),m_text,SLOT(clear()));
+
+ m_posbar = new PositionBar(this);
+ connect(m_posbar, SIGNAL(sliderPressed()),SLOT(showPosition()));
+ connect(m_posbar, SIGNAL(sliderMoved(qint64)),SLOT(showPosition()));
+ connect(m_posbar, SIGNAL(sliderReleased()),SLOT(updatePosition()));
+
+ m_timeIndicator = new TimeIndicator(this);
+ m_aboutWidget = new QWidget(this);
+ m_core = SoundCore::instance();
+ connect(m_core, SIGNAL(elapsedChanged(qint64)), SLOT(setTime(qint64)));
+ connect(m_core, SIGNAL(bitrateChanged(int)), m_kbps, SLOT(display(int)));
+ connect(m_core, SIGNAL(frequencyChanged(quint32)), SLOT(setSampleRate(quint32)));
+ connect(m_core, SIGNAL(channelsChanged(int)), m_monoster, SLOT(setChannels(int)));
+ connect(m_core, SIGNAL(stateChanged(Qmmp::State)), SLOT(setState(Qmmp::State)));
+ connect(m_core, SIGNAL(volumeChanged(int,int)), SLOT(setVolume(int, int)));
+ connect(m_core, SIGNAL(elapsedChanged(qint64)),m_titlebar, SLOT(setTime(qint64)));
+ PlayListManager *pl_manager = MediaPlayer::instance()->playListManager();
+ connect(pl_manager, SIGNAL(repeatableListChanged(bool)), m_repeatButton, SLOT(setON(bool)));
+ connect(pl_manager, SIGNAL(shuffleChanged(bool)), m_shuffleButton, SLOT(setON(bool)));
+ updatePositions();
+ updateMask();
+}
+
+MainDisplay::~MainDisplay()
+{
+ QSettings settings (Qmmp::configFile(), QSettings::IniFormat);
+ settings.setValue ("Playlist/visible",m_plButton->isChecked());
+ settings.setValue ("Equalizer/visible",m_eqButton->isChecked());
+}
+
+void MainDisplay::updatePositions()
+{
+ int r = m_skin->ratio();
+ m_previous->move (r*16, r*88);
+ m_play->move (r*39, r*88);
+ m_pause->move (r*62, r*88);
+ m_vis->move(r*24, r*43);
+ m_stop->move (r*85, r*88);
+ m_next->move (r*108, r*88);
+ m_eject->move (r*136, r*89);
+ m_posbar->move (r*16, r*72);
+ m_eqButton->move (r*219, r*58);
+ m_plButton->move (r*241, r*58);
+ m_repeatButton->move (r*210, r*89);
+ m_shuffleButton->move (r*164, r*89);
+ m_kbps->move (r*111, r*43);
+ m_freq->move (r*156, r*43);
+ m_text->resize (r*154, r*15);
+ m_text->move (r*109, r*23);
+ m_monoster->move (r*212, r*41);
+ m_playstatus->move(r*24, r*28);
+ m_volumeBar->move(r*107, r*57);
+ m_balanceBar->move(r*177, r*57);
+ m_timeIndicator->move(r*34, r*26);
+ m_aboutWidget->setGeometry(r*247,r*83,r*20,r*25);
+}
+
+void MainDisplay::setTime (qint64 t)
+{
+ m_posbar->setValue (t);
+ m_timeIndicator->setTime(t/1000);
+}
+void MainDisplay::setDuration(qint64 t)
+{
+ m_posbar->setMaximum (t);
+ m_timeIndicator->setSongDuration(t/1000);
+}
+
+void MainDisplay::setState(Qmmp::State state)
+{
+ switch ((int) state)
+ {
+ case Qmmp::Playing:
+ m_playstatus->setStatus(PlayStatus::PLAY);
+ m_timeIndicator->setNeedToShowTime(true);
+ setDuration(m_core->totalTime());
+ break;
+ case Qmmp::Paused:
+ m_playstatus->setStatus(PlayStatus::PAUSE);
+ break;
+ case Qmmp::Stopped:
+ m_playstatus->setStatus(PlayStatus::STOP);
+ m_monoster->setChannels (0);
+ m_timeIndicator->setNeedToShowTime(false);
+ m_posbar->setValue (0);
+ m_posbar->setMaximum (0);
+ m_titlebar->setTime(-1);
+ }
+}
+
+void MainDisplay::setVolume(int left, int right)
+{
+ int maxVol = qMax(left, right);
+ m_volumeBar->setValue(maxVol);
+ if (maxVol && !m_volumeBar->isPressed())
+ m_balanceBar->setValue((right - left) * 100/maxVol);
+}
+
+void MainDisplay::updateSkin()
+{
+ setPixmap (m_skin->getMain());
+ m_mw->resize(size());
+ setCursor(m_skin->getCursor(Skin::CUR_NORMAL));
+ setMinimalMode(m_shaded);
+ updatePositions();
+}
+
+void MainDisplay::updateMask()
+{
+ m_mw->clearMask();
+ m_mw->setMask(QRegion(0,0,m_mw->width(),m_mw->height()));
+ QRegion region = m_skin->getRegion(m_shaded? Skin::WINDOW_SHADE : Skin::NORMAL);
+ if (!region.isEmpty())
+ m_mw->setMask(region);
+}
+
+void MainDisplay::setMinimalMode(bool b)
+{
+ m_shaded = b;
+ int r = m_skin->ratio();
+
+ if(m_shaded)
+ m_mw->resize(r*275,r*14);
+ else
+ m_mw->resize(r*275,r*116);
+ updateMask();
+}
+
+void MainDisplay::setActive(bool b)
+{
+ m_titlebar->setActive(b);
+}
+
+void MainDisplay::setSampleRate(quint32 rate)
+{
+ m_freq->display((int) rate/1000);
+}
+//TODO optimize this connections
+void MainDisplay::setEQ (QWidget* w)
+{
+ m_equlizer = w;
+ m_eqButton->setON (m_equlizer->isVisible());
+ ACTION(ActionManager::SHOW_EQUALIZER)->setChecked(m_equlizer->isVisible());
+
+ connect (ACTION(ActionManager::SHOW_EQUALIZER), SIGNAL(triggered(bool)),
+ m_equlizer, SLOT (setVisible (bool)));
+ connect (ACTION(ActionManager::SHOW_EQUALIZER), SIGNAL(triggered(bool)),
+ m_eqButton, SLOT (setON (bool)));
+
+ connect (m_eqButton, SIGNAL(clicked(bool)),
+ ACTION(ActionManager::SHOW_EQUALIZER), SLOT(setChecked (bool)));
+ connect (m_eqButton, SIGNAL(clicked(bool)), m_equlizer, SLOT (setVisible (bool)));
+ connect (m_equlizer, SIGNAL(closed ()), m_eqButton, SLOT (click()));
+}
+
+void MainDisplay::setPL (QWidget* w)
+{
+ m_playlist = w;
+ m_plButton->setON (m_playlist->isVisible());
+ ACTION(ActionManager::SHOW_PLAYLIST)->setChecked(m_playlist->isVisible());
+
+ connect (ACTION(ActionManager::SHOW_PLAYLIST), SIGNAL(triggered(bool)),
+ m_playlist, SLOT (setVisible (bool)));
+ connect (ACTION(ActionManager::SHOW_PLAYLIST), SIGNAL(triggered(bool)),
+ m_plButton, SLOT (setON (bool)));
+
+ connect (m_plButton, SIGNAL(clicked(bool)),
+ ACTION(ActionManager::SHOW_PLAYLIST), SLOT(setChecked (bool)));
+ connect (m_plButton, SIGNAL (clicked (bool)), m_playlist, SLOT (setVisible (bool)));
+ connect (m_playlist, SIGNAL (closed ()), m_plButton, SLOT (click()));
+}
+
+bool MainDisplay::isPlaylistVisible() const
+{
+ return m_plButton->isChecked();
+}
+
+bool MainDisplay::isEqualizerVisible() const
+{
+ return m_eqButton->isChecked();
+}
+
+void MainDisplay::updateVolume()
+{
+ if(sender() == m_volumeBar)
+ m_text->setText(tr("Volume: %1%").arg(m_volumeBar->value()));
+ if(sender() == m_balanceBar)
+ {
+ if(m_balanceBar->value() > 0)
+ m_text->setText(tr("Balance: %1% right").arg(m_balanceBar->value()));
+ else if(m_balanceBar->value() < 0)
+ m_text->setText(tr("Balance: %1% left").arg(-m_balanceBar->value()));
+ else
+ m_text->setText(tr("Balance: center"));
+ }
+ m_mw->setVolume(m_volumeBar->value(), m_balanceBar->value());
+}
+
+void MainDisplay::showPosition()
+{
+ int sec = m_posbar->value() / 1000;
+ if(sec > 3600)
+ sec /= 60;
+ QString time = QString("%1:%2").arg(sec/60, 2, 10, QChar('0')).arg(sec%60, 2, 10, QChar('0'));
+ m_text->setText(tr("Seek to: %1").arg(time));
+}
+
+void MainDisplay::updatePosition()
+{
+ m_text->clear();
+ m_core->seek(m_posbar->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::mousePressEvent(QMouseEvent *e)
+{
+ if (e->button() == Qt::RightButton)
+ m_mw->menu()->exec(e->globalPos());
+ else if(e->button() == Qt::LeftButton && m_aboutWidget->underMouse())
+ m_mw->about();
+ PixmapWidget::mousePressEvent(e);
+}
+