/*************************************************************************** begin : Fri Oct 18 2002 copyright : (C) 2002 - 2004 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include "statuslabel.h" #include "filehandle.h" #include "playlistinterface.h" #include "actioncollection.h" #include "tag.h" using namespace ActionCollection; //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// StatusLabel::StatusLabel(PlaylistInterface *playlist, TQWidget *parent, const char *name) : TQHBox(parent, name), PlaylistObserver(playlist), m_showTimeRemaining(false) { TQFrame *trackAndPlaylist = new TQFrame(this); trackAndPlaylist->setFrameStyle(Box | Sunken); trackAndPlaylist->tqsetSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Expanding); // Make sure that we have enough of a margin to suffice for the borders, // hence the "lineWidth() * 2" TQHBoxLayout *trackAndPlaylistLayout = new TQHBoxLayout(trackAndPlaylist, trackAndPlaylist->lineWidth() * 2, 5, "trackAndPlaylistLayout"); trackAndPlaylistLayout->addSpacing(5); m_playlistLabel = new KSqueezedTextLabel(trackAndPlaylist, "playlistLabel"); trackAndPlaylistLayout->addWidget(m_playlistLabel); m_playlistLabel->tqsetSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Expanding); m_playlistLabel->setTextFormat(PlainText); m_playlistLabel->tqsetAlignment(AlignLeft | AlignVCenter); m_trackLabel = new KSqueezedTextLabel(trackAndPlaylist, "trackLabel"); trackAndPlaylistLayout->addWidget(m_trackLabel); m_trackLabel->tqsetAlignment(AlignRight | AlignVCenter); m_trackLabel->tqsetSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Expanding); m_trackLabel->setTextFormat(PlainText); trackAndPlaylistLayout->addSpacing(5); m_itemTimeLabel = new TQLabel(this); TQFontMetrics fontMetrics(font()); m_itemTimeLabel->tqsetAlignment(AlignCenter); m_itemTimeLabel->setMinimumWidth(fontMetrics.boundingRect("000:00 / 000:00").width()); m_itemTimeLabel->tqsetSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::Expanding); m_itemTimeLabel->setFrameStyle(Box | Sunken); m_itemTimeLabel->installEventFilter(this); setItemTotalTime(0); setItemCurrentTime(0); TQHBox *jumpBox = new TQHBox(this); jumpBox->setFrameStyle(Box | Sunken); jumpBox->tqsetSizePolicy(TQSizePolicy::Maximum, TQSizePolicy::Minimum); TQPushButton *jumpButton = new TQPushButton(jumpBox); jumpButton->setPixmap(SmallIcon("up")); jumpButton->setFlat(true); TQToolTip::add(jumpButton, i18n("Jump to the currently playing item")); connect(jumpButton, TQT_SIGNAL(clicked()), action("showPlaying"), TQT_SLOT(activate())); installEventFilter(this); updateData(); } StatusLabel::~StatusLabel() { } void StatusLabel::updateCurrent() { if(playlist()->playing()) { FileHandle file = playlist()->currentFile(); TQString mid = file.tag()->artist().isEmpty() || file.tag()->title().isEmpty() ? TQString() : TQString(" - "); TQString text = file.tag()->artist() + mid + file.tag()->title(); m_trackLabel->setText(text); m_playlistLabel->setText(playlist()->name().simplifyWhiteSpace()); } } void StatusLabel::updateData() { updateCurrent(); if(!playlist()->playing()) { setItemTotalTime(0); setItemCurrentTime(0); int time = playlist()->time(); int days = time / (60 * 60 * 24); int hours = time / (60 * 60) % 24; int minutes = time / 60 % 60; int seconds = time % 60; TQString timeString; if(days > 0) { timeString = i18n("1 day", "%n days", days); timeString.append(" "); } if(days > 0 || hours > 0) timeString.append(TQString().sprintf("%1d:%02d:%02d", hours, minutes, seconds)); else timeString.append(TQString().sprintf("%1d:%02d", minutes, seconds)); m_playlistLabel->setText(playlist()->name()); m_trackLabel->setText(i18n("1 item", "%n items", playlist()->count()) + " - " + timeString); } } //////////////////////////////////////////////////////////////////////////////// // private methods //////////////////////////////////////////////////////////////////////////////// void StatusLabel::updateTime() { int minutes; int seconds; if(m_showTimeRemaining) { minutes = int((m_itemTotalTime - m_itemCurrentTime) / 60); seconds = (m_itemTotalTime - m_itemCurrentTime) % 60; } else { minutes = int(m_itemCurrentTime / 60); seconds = m_itemCurrentTime % 60; } int totalMinutes = int(m_itemTotalTime / 60); int totalSeconds = m_itemTotalTime % 60; TQString timeString = formatTime(minutes, seconds) + " / " + formatTime(totalMinutes, totalSeconds); m_itemTimeLabel->setText(timeString); } bool StatusLabel::eventFilter(TQObject *o, TQEvent *e) { if(!o || !e) return false; TQMouseEvent *mouseEvent = TQT_TQMOUSEEVENT(e); if(e->type() == TQEvent::MouseButtonRelease && mouseEvent->button() == Qt::LeftButton) { if(TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(m_itemTimeLabel)) { m_showTimeRemaining = !m_showTimeRemaining; updateTime(); } else action("showPlaying")->activate(); return true; } return false; } TQString StatusLabel::formatTime(int minutes, int seconds) // static { TQString m = TQString::number(minutes); if(m.length() == 1) m = "0" + m; TQString s = TQString::number(seconds); if(s.length() == 1) s = "0" + s; return m + ":" + s; } #include "statuslabel.moc"