summaryrefslogtreecommitdiffstats
path: root/noatun-plugins/charlatan/userinterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'noatun-plugins/charlatan/userinterface.cpp')
-rw-r--r--noatun-plugins/charlatan/userinterface.cpp408
1 files changed, 408 insertions, 0 deletions
diff --git a/noatun-plugins/charlatan/userinterface.cpp b/noatun-plugins/charlatan/userinterface.cpp
new file mode 100644
index 0000000..e15a686
--- /dev/null
+++ b/noatun-plugins/charlatan/userinterface.cpp
@@ -0,0 +1,408 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include <noatun/scrollinglabel.h>
+#include "userinterface.h"
+#include <noatun/app.h>
+#include <noatun/player.h>
+#include <noatun/controls.h>
+#include <noatun/effects.h>
+
+#include <qaccel.h>
+#include <qtoolbutton.h>
+#include <qdragobject.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qframe.h>
+#include <kurldrag.h>
+#include <kstatusbar.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kurldrag.h>
+#include <kiconloader.h>
+#include <noatun/playlist.h>
+#include <noatun/stdaction.h>
+
+#include "configmodule.h"
+#include "pixmaps.h"
+#include "seeker.h"
+
+Charlatan::Charlatan()
+ : QWidget (0, "Charlatan"),
+ UserInterface (),
+ previousButton_ (0L),
+ stopButton_ (0L),
+ playButton_ (0L),
+ nextButton_ (0L),
+ playListToggleButton_ (0L),
+ restartButton_ (0L),
+ seekSlider_ (0L),
+ titleLabel_ (0L),
+ positionLabel_ (0L),
+ showingVolumeTimer_ (0L),
+ title_ ("c.h.a.r.l.a.t.a.n")
+{
+ setAcceptDrops(true);
+
+ showingVolumeTimer_ = new QTimer(this);
+
+ connect
+ (
+ showingVolumeTimer_,
+ SIGNAL(timeout()),
+ SLOT(slotStopShowingVolume())
+ );
+
+ playListToggleButton_ = new QToolButton(this);
+ previousButton_ = new QToolButton(this);
+ nextButton_ = new QToolButton(this);
+ stopButton_ = new QToolButton(this);
+ restartButton_ = new QToolButton(this);
+ playButton_ = new QToolButton(this);
+
+ seekSlider_ = new Seeker(this);
+ positionLabel_ = new QLabel(this);
+
+ titleLabel_ = new ScrollingLabel(i18n("No File Loaded"), this);
+
+ playListToggleButton_ ->setPixmap(QPixmap((const char **)px_playlist));
+ previousButton_ ->setPixmap(QPixmap((const char **)px_previous));
+ nextButton_ ->setPixmap(QPixmap((const char **)px_next));
+ stopButton_ ->setPixmap(QPixmap((const char **)px_stop));
+ restartButton_ ->setPixmap(QPixmap((const char **)px_restart));
+ playButton_ ->setPixmap(QPixmap((const char **)px_play1));
+
+ playListToggleButton_ ->setToggleButton(true);
+
+ QVBoxLayout * mainLayout = new QVBoxLayout(this);
+
+ mainLayout->addWidget(titleLabel_);
+
+ mainLayout->addSpacing(2);
+
+ QHBoxLayout * positionLayout = new QHBoxLayout(mainLayout);
+
+ positionLayout->addWidget(seekSlider_);
+ positionLayout->addSpacing(2);
+ positionLayout->addWidget(positionLabel_);
+
+ mainLayout->addSpacing(2);
+
+ QHBoxLayout * buttonLayout = new QHBoxLayout(mainLayout);
+
+ buttonLayout->addWidget(playListToggleButton_);
+ buttonLayout->addWidget(previousButton_);
+ buttonLayout->addWidget(nextButton_);
+ buttonLayout->addWidget(stopButton_);
+ buttonLayout->addWidget(restartButton_);
+ buttonLayout->addWidget(playButton_);
+
+ playListToggleButton_ ->installEventFilter(this);
+ previousButton_ ->installEventFilter(this);
+ nextButton_ ->installEventFilter(this);
+ stopButton_ ->installEventFilter(this);
+ restartButton_ ->installEventFilter(this);
+ playButton_ ->installEventFilter(this);
+ seekSlider_ ->installEventFilter(this);
+ positionLabel_ ->installEventFilter(this);
+ titleLabel_ ->installEventFilter(this);
+
+ connect
+ (
+ playListToggleButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(toggleListView())
+ );
+
+ connect
+ (
+ previousButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(back())
+ );
+
+ connect
+ (
+ nextButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(forward())
+ );
+
+ connect
+ (
+ stopButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(stop())
+ );
+
+ connect(restartButton_, SIGNAL(clicked()), SLOT(slotRestart()));
+
+ connect
+ (
+ playButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(playpause())
+ );
+
+ connect(napp, SIGNAL(hideYourself()), SLOT(hide()));
+ connect(napp, SIGNAL(showYourself()), SLOT(show()));
+
+ connect(napp->player(), SIGNAL(playlistShown()), SLOT(slotPlayListShown()));
+ connect(napp->player(), SIGNAL(playlistHidden()), SLOT(slotPlayListHidden()));
+ connect(napp->player(), SIGNAL(playing()), SLOT(slotPlaying()));
+ connect(napp->player(), SIGNAL(stopped()), SLOT(slotStopped()));
+ connect(napp->player(), SIGNAL(paused()), SLOT(slotPaused()));
+
+ connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout()));
+
+ connect
+ (
+ napp->player(),
+ SIGNAL(volumeChanged(int)),
+ SLOT(slotVolumeChanged(int))
+ );
+
+ connect
+ (
+ new CharlatanConfigModule(this),
+ SIGNAL(saved()),
+ SLOT(slotConfigChanged())
+ );
+
+ setCaption(i18n("Noatun"));
+ setIcon(BarIcon("noatun"));
+
+ napp->player()->handleButtons();
+
+ loadConfig();
+
+ // Using QAccel, because I don't want any strings associated or
+ // configurability.
+
+ QAccel * a = new QAccel(this, "Accelerators");
+
+ int accelPlay = a->insertItem(Key_Space);
+ int accelNext = a->insertItem(Key_H);
+ int accelPrev = a->insertItem(Key_L);
+ int accelStop = a->insertItem(Key_Escape);
+ int accelRstt = a->insertItem(Key_Return);
+ int accelQuit = a->insertItem(Key_Q);
+
+ a->connectItem(accelPlay, napp->player(), SLOT(playpause()));
+ a->connectItem(accelNext, napp->player(), SLOT(forward()));
+ a->connectItem(accelPrev, napp->player(), SLOT(back()));
+ a->connectItem(accelStop, napp->player(), SLOT(stop()));
+ a->connectItem(accelRstt, this, SLOT(slotRestart()));
+ a->connectItem(accelQuit, napp, SLOT(quit()));
+
+ show();
+
+ setTitleText();
+}
+
+Charlatan::~Charlatan()
+{
+ // Empty.
+}
+
+void Charlatan::closeEvent(QCloseEvent *)
+{
+ unload();
+}
+
+void Charlatan::dragEnterEvent(QDragEnterEvent *event)
+{
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void Charlatan::dropEvent(QDropEvent *event)
+{
+ KURL::List uri;
+ if (KURLDrag::decode(event, uri))
+ {
+ for (KURL::List::Iterator i = uri.begin(); i != uri.end(); ++i)
+ napp->player()->openFile(*i, false);
+ }
+
+}
+
+void Charlatan::setTitleText(const QString & s)
+{
+ QString titleText;
+
+ if (!s.isNull())
+ {
+ titleText = s;
+ }
+ else
+ {
+ Player * player = napp->player();
+
+ if (0 == player)
+ {
+ qWarning("Noatun's player is null. WTF ?");
+ return;
+ }
+ else
+ {
+ PlaylistItem currentItem = player->current();
+
+ if (!!currentItem)
+ {
+ titleText = currentItem.title();
+ }
+ }
+ }
+
+ if (title_ != titleText)
+ {
+ showingVolumeTimer_->stop();
+ title_ = titleText;
+
+ if (!showingVolumeTimer_->isActive())
+ titleLabel_->setText(title_);
+ }
+}
+
+void Charlatan::slotPlaying()
+{
+ setTitleText();
+
+ playButton_->setOn(true);
+ stopButton_->setEnabled(true);
+ playButton_->setPixmap(QPixmap((const char **)px_pause));
+}
+
+void Charlatan::slotStopped()
+{
+ setTitleText(i18n("No File Loaded"));
+
+ stopButton_->setEnabled(false);
+ playButton_->setOn(false);
+ playButton_->setPixmap(QPixmap((const char **)px_play1));
+}
+
+void Charlatan::slotPaused()
+{
+ setTitleText();
+
+ stopButton_->setEnabled(true);
+ playButton_->setOn(false);
+ playButton_->setPixmap(QPixmap((const char **)px_play1));
+}
+
+bool Charlatan::eventFilter(QObject *o, QEvent *e)
+{
+ switch (e->type())
+ {
+ case QEvent::Wheel:
+ wheelEvent(static_cast<QWheelEvent*>(e));
+ return true;
+ break;
+
+ default:
+ break;
+ }
+
+ return QWidget::eventFilter(o, e);
+}
+
+void Charlatan::slotPlayListShown()
+{
+ playListToggleButton_->setOn(true);
+}
+
+void Charlatan::slotPlayListHidden()
+{
+ playListToggleButton_->setOn(false);
+}
+
+void Charlatan::mousePressEvent(QMouseEvent * e)
+{
+ if (e->button() == RightButton)
+ {
+ NoatunStdAction::ContextMenu::showContextMenu();
+ return;
+ }
+
+ return QWidget::mousePressEvent(e);
+}
+
+void Charlatan::wheelEvent(QWheelEvent * e)
+{
+ int newVolume = napp->player()->volume() + (e->delta() / 120) * 4;
+ napp->player()->setVolume(newVolume);
+}
+
+void Charlatan::slotConfigChanged()
+{
+ loadConfig();
+}
+
+void Charlatan::slotVolumeChanged(int i)
+{
+ QString message(i18n("Volume: %1").arg(i));
+
+ showingVolumeTimer_->start(2000, true);
+ titleLabel_->setText(message);
+}
+
+void Charlatan::slotStopShowingVolume()
+{
+ titleLabel_->setText(title_);
+}
+
+void Charlatan::slotTimeout()
+{
+ // noatun bug: napp->player()->lengthString() will crash if there's
+ // no 'current track'.
+ if (!napp->player()->current())
+ return;
+
+ setTitleText();
+
+ QString lengthText(napp->player()->lengthString());
+
+ if (positionLabel_->text() != lengthText)
+ positionLabel_->setText(lengthText);
+}
+
+void Charlatan::loadConfig()
+{
+ KConfig * c(KGlobal::config());
+ c->setGroup("CharlatanInterface");
+ titleLabel_->setScroll(c->readBoolEntry("ScrollTitle", true));
+}
+
+void Charlatan::slotRestart()
+{
+ napp->player()->skipTo(0);
+}
+
+#include "userinterface.moc"
+// vim:ts=2:sw=2:tw=78:noet