diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-10-16 15:59:23 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-10-16 15:59:23 +0000 |
| commit | 1837bc49ff6645be319decdafb4a896aab79f51f (patch) | |
| tree | 612ca3ad874d88a8e813cbaf103326ef7b7f4edc /src/plugins/General | |
| parent | edcf1ca68a32c85e18ac500990bd28e93e4be2e5 (diff) | |
| download | qmmp-1837bc49ff6645be319decdafb4a896aab79f51f.tar.gz qmmp-1837bc49ff6645be319decdafb4a896aab79f51f.tar.bz2 qmmp-1837bc49ff6645be319decdafb4a896aab79f51f.zip | |
added status icon popup message (patch by Artur Guzik)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1316 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/General')
| -rw-r--r-- | src/plugins/General/statusicon/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/images/empty_cover.png | bin | 0 -> 8926 bytes | |||
| -rw-r--r-- | src/plugins/General/statusicon/images/tray_images.qrc | 14 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/qmmptrayicon.cpp | 43 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/qmmptrayicon.h | 17 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/settingsdialog.cpp | 17 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/settingsdialog.h | 1 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/settingsdialog.ui | 167 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/statusicon.cpp | 11 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/statusicon.h | 6 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/statusicon.pro | 77 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/statusiconfactory.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/statusiconpopupwidget.cpp | 207 | ||||
| -rw-r--r-- | src/plugins/General/statusicon/statusiconpopupwidget.h | 52 |
14 files changed, 513 insertions, 103 deletions
diff --git a/src/plugins/General/statusicon/CMakeLists.txt b/src/plugins/General/statusicon/CMakeLists.txt index e518a01be..0e28749ab 100644 --- a/src/plugins/General/statusicon/CMakeLists.txt +++ b/src/plugins/General/statusicon/CMakeLists.txt @@ -32,6 +32,7 @@ SET(libstatusicon_SRCS statusicon.cpp statusiconfactory.cpp qmmptrayicon.cpp + statusiconpopupwidget.cpp ) SET(libstatusicon_MOC_HDRS @@ -39,6 +40,7 @@ SET(libstatusicon_MOC_HDRS statusiconfactory.h statusicon.h qmmptrayicon.h + statusiconpopupwidget.h ) SET(libstatusicon_RCCS diff --git a/src/plugins/General/statusicon/images/empty_cover.png b/src/plugins/General/statusicon/images/empty_cover.png Binary files differnew file mode 100644 index 000000000..cbc0d1ddc --- /dev/null +++ b/src/plugins/General/statusicon/images/empty_cover.png diff --git a/src/plugins/General/statusicon/images/tray_images.qrc b/src/plugins/General/statusicon/images/tray_images.qrc index b072b1d73..2e02b356c 100644 --- a/src/plugins/General/statusicon/images/tray_images.qrc +++ b/src/plugins/General/statusicon/images/tray_images.qrc @@ -1,8 +1,8 @@ -<!DOCTYPE RCC> -<RCC version="1.0"> - <qresource> - <file>tray_play.png</file> - <file>tray_pause.png</file> - <file>tray_stop.png</file> - </qresource> +<RCC> + <qresource prefix="/" > + <file>tray_play.png</file> + <file>tray_pause.png</file> + <file>tray_stop.png</file> + <file>empty_cover.png</file> + </qresource> </RCC> diff --git a/src/plugins/General/statusicon/qmmptrayicon.cpp b/src/plugins/General/statusicon/qmmptrayicon.cpp index 21038749e..ad6f03906 100644 --- a/src/plugins/General/statusicon/qmmptrayicon.cpp +++ b/src/plugins/General/statusicon/qmmptrayicon.cpp @@ -20,10 +20,13 @@ #include <QEvent> #include <QWheelEvent> +#include <QMouseEvent> #include <qmmp/soundcore.h> #include "qmmptrayicon.h" +#include <statusiconpopupwidget.h> + QmmpTrayIcon::QmmpTrayIcon(QObject *parent) : QSystemTrayIcon(parent) @@ -35,6 +38,26 @@ QmmpTrayIcon::~QmmpTrayIcon() { } +void QmmpTrayIcon::showNiceToolTip(bool value) +{ + m_showNiceToolTip = value; +} + +void QmmpTrayIcon::setNiceToolTipDelay(int value) +{ + m_niceToolTipDelay = value; +} + +void QmmpTrayIcon::setNiceToolTipOpacity(qreal value) +{ + m_niceToolTipOpacity = value; +} + +void QmmpTrayIcon::setSplitFileName(bool value) +{ + m_splitFileName = value; +} + bool QmmpTrayIcon::event(QEvent *e) { if (e->type() == QEvent::Wheel ) @@ -43,6 +66,12 @@ bool QmmpTrayIcon::event(QEvent *e) e->accept(); return TRUE; } + if (e->type() == QEvent::ToolTip) + { + showToolTip(); + e->accept(); + return TRUE; + } return QSystemTrayIcon::event(e); } @@ -56,4 +85,18 @@ void QmmpTrayIcon::wheelEvent(QWheelEvent *e) volume = qMin(volume,100); core->setVolume(volume - qMax(balance,0)*volume/100, volume + qMin(balance,0)*volume/100); + +} + +void QmmpTrayIcon::showToolTip() +{ + if(m_showNiceToolTip) + { + if(m_PopupWidget.isNull()) + { + m_PopupWidget = new StatusIconPopupWidget(); + } + m_PopupWidget->setWindowOpacity(m_niceToolTipOpacity); + m_PopupWidget->showInfo(geometry().x(),geometry().y(),m_niceToolTipDelay,m_splitFileName); + } } diff --git a/src/plugins/General/statusicon/qmmptrayicon.h b/src/plugins/General/statusicon/qmmptrayicon.h index 345d6af61..468e424fd 100644 --- a/src/plugins/General/statusicon/qmmptrayicon.h +++ b/src/plugins/General/statusicon/qmmptrayicon.h @@ -21,9 +21,13 @@ #define QMMPTRAYICON_H #include <QSystemTrayIcon> +#include <QPointer> + +//#include "statusiconpopupwidget.h" class QEvent; class QWheelEvent; +class StatusIconPopupWidget; /** @author Ilya Kotov <forkotov02@hotmail.ru> @@ -33,14 +37,25 @@ class QmmpTrayIcon : public QSystemTrayIcon Q_OBJECT public: QmmpTrayIcon(QObject *parent = 0); - ~QmmpTrayIcon(); + void showNiceToolTip(bool value); + void setNiceToolTipDelay(int value); + void setNiceToolTipOpacity(qreal value); + void setSplitFileName(bool value); + protected: bool event(QEvent *e); private: void wheelEvent(QWheelEvent *e); + void showToolTip(); + + bool m_showNiceToolTip; + bool m_splitFileName; + qint32 m_niceToolTipDelay; + qreal m_niceToolTipOpacity; + QPointer<StatusIconPopupWidget> m_PopupWidget; }; diff --git a/src/plugins/General/statusicon/settingsdialog.cpp b/src/plugins/General/statusicon/settingsdialog.cpp index 98b76f4a2..51d23442c 100644 --- a/src/plugins/General/statusicon/settingsdialog.cpp +++ b/src/plugins/General/statusicon/settingsdialog.cpp @@ -30,9 +30,13 @@ SettingsDialog::SettingsDialog(QWidget *parent) ui.setupUi(this); QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("Tray"); - ui.messageCheckBox->setChecked(settings.value("show_message",TRUE).toBool()); + ui.messageGroupBox->setChecked(settings.value("show_message",TRUE).toBool()); ui.messageDelaySpinBox->setValue(settings.value("message_delay", 2000).toInt()); ui.toolTipCheckBox->setChecked(settings.value("show_tooltip",FALSE).toBool()); + ui.niceTooltipGroupBox->setChecked(settings.value("show_nicetooltip", TRUE).toBool()); + ui.niceTooltipDelaySpinBox->setValue(settings.value("nicetooltip_delay",2000).toInt()); + ui.niceTooltipOpacitySlider->setValue(settings.value("nicetooltip_opacity",0).toInt()); + ui.niceTooltipSplitCheckBox->setChecked(settings.value("split_file_name",TRUE).toBool()); #if QT_VERSION >= 0x040400 ui.standardIconsCheckBox->setChecked(settings.value("use_standard_icons",FALSE).toBool()); #else @@ -49,12 +53,21 @@ void SettingsDialog::accept() { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("Tray"); - settings.setValue ("show_message", ui.messageCheckBox->isChecked()); + settings.setValue ("show_message", ui.messageGroupBox->isChecked()); settings.setValue ("message_delay", ui.messageDelaySpinBox->value()); settings.setValue ("show_tooltip", ui.toolTipCheckBox->isChecked()); + settings.setValue ("show_nicetooltip", ui.niceTooltipGroupBox->isChecked()); + settings.setValue ("nicetooltip_delay", ui.niceTooltipDelaySpinBox->value()); + settings.setValue("nicetooltip_opacity", ui.niceTooltipOpacitySlider->value()); + settings.setValue("split_file_name", ui.niceTooltipSplitCheckBox->isChecked()); #if QT_VERSION >= 0x040400 settings.setValue ("use_standard_icons",ui.standardIconsCheckBox->isChecked()); #endif settings.endGroup(); QDialog::accept(); } + +void SettingsDialog::on_niceTooltipOpacitySlider_valueChanged(int value) +{ + ui.niceTooltipOpacityValueLabel->setText(QString::number(value)); +} diff --git a/src/plugins/General/statusicon/settingsdialog.h b/src/plugins/General/statusicon/settingsdialog.h index 81494dfb5..21d61a868 100644 --- a/src/plugins/General/statusicon/settingsdialog.h +++ b/src/plugins/General/statusicon/settingsdialog.h @@ -39,6 +39,7 @@ public: public slots: virtual void accept(); + void on_niceTooltipOpacitySlider_valueChanged (int value); private: Ui::SettingsDialog ui; diff --git a/src/plugins/General/statusicon/settingsdialog.ui b/src/plugins/General/statusicon/settingsdialog.ui index cbfd98db9..4f1040258 100644 --- a/src/plugins/General/statusicon/settingsdialog.ui +++ b/src/plugins/General/statusicon/settingsdialog.ui @@ -6,55 +6,15 @@ <rect> <x>0</x> <y>0</y> - <width>278</width> - <height>146</height> + <width>340</width> + <height>348</height> </rect> </property> <property name="windowTitle"> <string>Status Icon Plugin Settings</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0" colspan="2"> - <widget class="QCheckBox" name="messageCheckBox"> - <property name="text"> - <string>Show message</string> - </property> - </widget> - </item> - <item row="1" column="0" rowspan="2" colspan="2"> - <widget class="QCheckBox" name="toolTipCheckBox"> - <property name="text"> - <string>Show tooltip</string> - </property> - </widget> - </item> - <item row="4" column="0" colspan="2"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Message delay (ms):</string> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="4" column="2" colspan="2"> - <widget class="QSpinBox" name="messageDelaySpinBox"> - <property name="minimum"> - <number>100</number> - </property> - <property name="maximum"> - <number>10000</number> - </property> - <property name="singleStep"> - <number>100</number> - </property> - <property name="value"> - <number>1000</number> - </property> - </widget> - </item> - <item row="5" column="0" colspan="3"> + <item row="14" column="0" colspan="3"> <spacer> <property name="orientation"> <enum>Qt::Horizontal</enum> @@ -67,7 +27,7 @@ </property> </spacer> </item> - <item row="5" column="3"> + <item row="14" column="3"> <widget class="QDialogButtonBox" name="buttonBox"> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> @@ -80,7 +40,124 @@ </property> </widget> </item> - <item row="3" column="0"> + <item row="9" column="0" colspan="4"> + <widget class="QGroupBox" name="niceTooltipGroupBox"> + <property name="title"> + <string>Show nice tooltip</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="1" column="0"> + <widget class="QLabel" name="niceTooltipDelayLabel"> + <property name="text"> + <string>Tooltip delay, ms</string> + </property> + </widget> + </item> + <item row="1" column="1" colspan="2"> + <widget class="QSpinBox" name="niceTooltipDelaySpinBox"> + <property name="maximum"> + <number>10000</number> + </property> + <property name="singleStep"> + <number>500</number> + </property> + <property name="value"> + <number>2000</number> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="niceTooltipOpacityLabel"> + <property name="text"> + <string>Tooltip opacity</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QSlider" name="niceTooltipOpacitySlider"> + <property name="maximum"> + <number>100</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="tickPosition"> + <enum>QSlider::NoTicks</enum> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="niceTooltipOpacityValueLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <horstretch>3</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>0</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QCheckBox" name="niceTooltipSplitCheckBox"> + <property name="text"> + <string>Try to split file name when no tag</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="7" column="0" colspan="4"> + <widget class="QGroupBox" name="messageGroupBox"> + <property name="title"> + <string>Show message</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Message delay, ms:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="messageDelaySpinBox"> + <property name="minimum"> + <number>100</number> + </property> + <property name="maximum"> + <number>10000</number> + </property> + <property name="singleStep"> + <number>100</number> + </property> + <property name="value"> + <number>1000</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="13" column="0"> + <widget class="QCheckBox" name="toolTipCheckBox"> + <property name="text"> + <string>Show tooltip</string> + </property> + </widget> + </item> + <item row="12" column="0"> <widget class="QCheckBox" name="standardIconsCheckBox"> <property name="text"> <string>Use standard icons</string> diff --git a/src/plugins/General/statusicon/statusicon.cpp b/src/plugins/General/statusicon/statusicon.cpp index ced6a1108..0d3b86efa 100644 --- a/src/plugins/General/statusicon/statusicon.cpp +++ b/src/plugins/General/statusicon/statusicon.cpp @@ -43,9 +43,10 @@ StatusIcon::StatusIcon(QObject *parent) m_core = SoundCore::instance(); m_player = MediaPlayer::instance(); QMenu *menu = new QMenu(qobject_cast<QWidget *>(parent)); - menu->addAction(tr("Play"), m_player, SLOT(play())); - menu->addAction(tr("Pause"), m_core, SLOT(pause())); - menu->addAction(tr("Stop"), m_core, SLOT(stop())); + menu->addAction(QIcon(":/tray_play.png"),tr("Play"), m_player, SLOT(play())); + menu->addAction(QIcon(":/tray_pause.png"),tr("Pause"), m_core, SLOT(pause())); + menu->addAction(QIcon(":/tray_stop.png"),tr("Stop"), m_core, SLOT(stop())); + menu->addSeparator(); menu->addAction(tr("Next"), m_player, SLOT(next())); menu->addAction(tr("Previous"), m_player, SLOT(previous())); menu->addSeparator(); @@ -59,6 +60,10 @@ StatusIcon::StatusIcon(QObject *parent) m_showTooltip = settings.value("show_tooltip",FALSE).toBool(); m_hideToTray = settings.value("hide_on_close", FALSE).toBool(); m_useStandardIcons = settings.value("use_standard_icons",FALSE).toBool(); + m_tray->showNiceToolTip(settings.value("show_nicetooltip",TRUE).toBool()); + m_tray->setNiceToolTipDelay(settings.value("nicetooltip_delay",2000).toInt()); + m_tray->setNiceToolTipOpacity(1 - (settings.value("nicetooltip_opacity",0).toDouble()/100)); + m_tray->setSplitFileName(settings.value("split_file_name",TRUE).toBool()); #if QT_VERSION >= 0x040400 if(m_useStandardIcons) m_tray->setIcon(QApplication::style ()->standardIcon(QStyle::SP_MediaStop)); diff --git a/src/plugins/General/statusicon/statusicon.h b/src/plugins/General/statusicon/statusicon.h index b49b172ce..9aa0937f1 100644 --- a/src/plugins/General/statusicon/statusicon.h +++ b/src/plugins/General/statusicon/statusicon.h @@ -20,16 +20,18 @@ #ifndef STATUSICON_H #define STATUSICON_H -#include <QSystemTrayIcon> +//#include <QSystemTrayIcon> #include <QMap> #include <qmmpui/general.h> #include <qmmp/qmmp.h> +#include <qmmptrayicon.h> class SoundCore; class MediaPlayer; class QEvent; + /** @author Ilya Kotov <forkotov02@hotmail.ru> */ @@ -48,7 +50,7 @@ private slots: void trayActivated(QSystemTrayIcon::ActivationReason); private: - QSystemTrayIcon *m_tray; + QmmpTrayIcon *m_tray; bool m_showMessage; bool m_showTooltip; bool m_hideToTray; diff --git a/src/plugins/General/statusicon/statusicon.pro b/src/plugins/General/statusicon/statusicon.pro index b4b7c2667..3ebf6b25a 100644 --- a/src/plugins/General/statusicon/statusicon.pro +++ b/src/plugins/General/statusicon/statusicon.pro @@ -1,57 +1,50 @@ include(../../plugins.pri) - INCLUDEPATH += ../../../../src CONFIG += release \ -warn_on \ -plugin - -unix:TARGET =$$PLUGINS_PREFIX/General/statusicon -unix:QMAKE_CLEAN =$$PLUGINS_PREFIX/General/libstatusicon.so + warn_on \ + plugin +unix:TARGET = $$PLUGINS_PREFIX/General/statusicon +unix:QMAKE_CLEAN = $$PLUGINS_PREFIX/General/libstatusicon.so win32:TARGET = $$PLUGINS_PREFIX/General/statusicon - - TEMPLATE = lib - -unix{ -QMAKE_LIBDIR += ../../../../lib -LIBS += -lqmmpui -lqmmp +unix { + QMAKE_LIBDIR += ../../../../lib + LIBS += -lqmmpui \ + -lqmmp } -win32{ -QMAKE_LIBDIR += ../../../../bin -LIBS += -lqmmpui0 -lqmmp0 +win32 { + QMAKE_LIBDIR += ../../../../bin + LIBS += -lqmmpui0 \ + -lqmmp0 } - TRANSLATIONS = translations/statusicon_plugin_cs.ts \ - translations/statusicon_plugin_de.ts \ - translations/statusicon_plugin_zh_CN.ts \ - translations/statusicon_plugin_zh_TW.ts \ - translations/statusicon_plugin_ru.ts \ - translations/statusicon_plugin_pl.ts \ - translations/statusicon_plugin_uk_UA.ts \ - translations/statusicon_plugin_it.ts \ - translations/statusicon_plugin_tr.ts \ - translations/statusicon_plugin_lt.ts + translations/statusicon_plugin_de.ts \ + translations/statusicon_plugin_zh_CN.ts \ + translations/statusicon_plugin_zh_TW.ts \ + translations/statusicon_plugin_ru.ts \ + translations/statusicon_plugin_pl.ts \ + translations/statusicon_plugin_uk_UA.ts \ + translations/statusicon_plugin_it.ts \ + translations/statusicon_plugin_tr.ts \ + translations/statusicon_plugin_lt.ts RESOURCES = translations/translations.qrc - -unix{ -isEmpty(LIB_DIR){ - LIB_DIR = /lib -} -target.path = $$LIB_DIR/qmmp/General -INSTALLS += target +unix { + isEmpty(LIB_DIR):LIB_DIR = /lib + target.path = $$LIB_DIR/qmmp/General + INSTALLS += target } RESOURCES += images/tray_images.qrc - - HEADERS += statusiconfactory.h \ - statusicon.h \ - settingsdialog.h \ - qmmptrayicon.h + statusicon.h \ + settingsdialog.h \ + qmmptrayicon.h \ + statusiconpopupwidget.h \ + ../covermanager/coverwidget.h SOURCES += statusiconfactory.cpp \ - statusicon.cpp \ - settingsdialog.cpp \ - qmmptrayicon.cpp + statusicon.cpp \ + settingsdialog.cpp \ + qmmptrayicon.cpp \ + statusiconpopupwidget.cpp \ + ../covermanager/coverwidget.cpp FORMS += settingsdialog.ui - win32:HEADERS += ../../../../src/qmmpui/general.h - diff --git a/src/plugins/General/statusicon/statusiconfactory.cpp b/src/plugins/General/statusicon/statusiconfactory.cpp index 74adae06f..129414cc6 100644 --- a/src/plugins/General/statusicon/statusiconfactory.cpp +++ b/src/plugins/General/statusicon/statusiconfactory.cpp @@ -60,4 +60,4 @@ QTranslator *StatusIconFactory::createTranslator(QObject *parent) return translator; } -Q_EXPORT_PLUGIN2(statusicon,StatusIconFactory) +Q_EXPORT_PLUGIN(StatusIconFactory) diff --git a/src/plugins/General/statusicon/statusiconpopupwidget.cpp b/src/plugins/General/statusicon/statusiconpopupwidget.cpp new file mode 100644 index 000000000..ab1530bd4 --- /dev/null +++ b/src/plugins/General/statusicon/statusiconpopupwidget.cpp @@ -0,0 +1,207 @@ +#include "statusiconpopupwidget.h" +#include "qmmp/soundcore.h" + +#include <QLabel> +#include <QTimer> +#include <QPixmap> +#include <QFileInfo> +#include <QApplication> +#include <QDesktopWidget> +#include <QSpacerItem> + +StatusIconPopupWidget::StatusIconPopupWidget(QWidget * parent) + : QFrame(parent) +{ + setWindowFlags(Qt::X11BypassWindowManagerHint | + Qt::WindowStaysOnTopHint | Qt::Dialog | Qt::FramelessWindowHint); + setFrameStyle(QFrame::StyledPanel | QFrame::Plain); + setLineWidth(0); + + setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); + gLayout = new QGridLayout(this); + m_lblTitle = new QLabel(); + m_lblArtist = new QLabel(); + m_lblAlbum = new QLabel(); + m_lblTime = new QLabel(); + m_spacer = new QSpacerItem(20,0,QSizePolicy::Expanding,QSizePolicy::Expanding); + m_cover = new CoverWidget(); + + m_cover->setMinimumSize(100,100); + m_cover->setMaximumSize(100,100); + + gLayout->addWidget(m_cover,0,0,5,1); + gLayout->addWidget(m_lblTitle,0,1); + gLayout->addWidget(m_lblArtist,1,1); + gLayout->addWidget(m_lblAlbum,2,1); + gLayout->addWidget(m_lblTime,3,1); + setLayout(gLayout); + + m_timer = new QTimer(this); + m_timer->setSingleShot(TRUE); + m_timer->stop(); + + gLayout->addItem(m_spacer,4,1,1,1); + gLayout->setHorizontalSpacing(15); + + connect(m_timer,SIGNAL(timeout()),SLOT(deleteLater())); + connect(SoundCore::instance(),SIGNAL(metaDataChanged()),this,SLOT(updateMetaData())); + connect(SoundCore::instance(),SIGNAL(elapsedChanged(qint64)),this,SLOT(updateTime(qint64))); + connect(SoundCore::instance(),SIGNAL(stateChanged(Qmmp::State)),this,SLOT(updateMetaData())); + + setVisible(FALSE); +} + +StatusIconPopupWidget::~StatusIconPopupWidget() +{ +} + +void StatusIconPopupWidget::mousePressEvent(QMouseEvent *) +{ + deleteLater(); +} + +void StatusIconPopupWidget::updateMetaData() +{ + SoundCore *core = SoundCore::instance(); + if(core->state() == Qmmp::Playing) + { + QString title = core->metaData(Qmmp::TITLE); + QString artist = core->metaData(Qmmp::ARTIST); + QString album = core->metaData(Qmmp::ALBUM); + + if(title.isEmpty()) + { + title = QFileInfo(core->metaData(Qmmp::URL)).completeBaseName(); + if(m_splitFileName && title.contains("-")) + { + artist = title.section('-',0,0).trimmed(); + title = title.section('-',1,1).trimmed(); + } + } + + m_lblTitle->setText("<b>" + title + "</b>"); + + if(!artist.isEmpty()) + { + m_lblArtist->setText(artist); + m_lblArtist->setVisible(TRUE); + } + else + { + m_lblArtist->setVisible(FALSE); + } + + if(!album.isEmpty()) + { + m_lblAlbum->setText(album); + m_lblAlbum->setVisible(TRUE); + } + else + { + m_lblAlbum->setVisible(FALSE); + } + + QPixmap cover = Decoder::findCover(core->metaData(Qmmp::URL)); + if(cover.isNull()) + { + m_cover->setPixmap(QPixmap(":/empty_cover.png")); + m_cover->setVisible(TRUE); + } + else + { + m_cover->setPixmap(cover); + m_cover->setVisible(TRUE); + } + m_lblTime->setVisible(TRUE); + m_totalTime = totalTimeString(); + setVisible(TRUE); + } + else + { + m_cover->setVisible(FALSE); + m_lblAlbum->setVisible(FALSE); + m_lblArtist->setVisible(FALSE); + m_lblTime->setVisible(FALSE); + m_lblTitle->setText("<b>Nothing is playing</b>"); + setVisible(FALSE); // + } + qApp->processEvents(); + resize(sizeHint()); + qApp->processEvents(); + if(isVisible()) + updatePosition(m_lastTrayX,m_lastTrayY); +} + +void StatusIconPopupWidget::updateTime(qint64 elapsed) +{ + int second = elapsed / 1000; + int minute = second / 60; + int hour = minute / 60; + + SoundCore * core = SoundCore::instance(); + + if(core->totalTime() > 3600000) + { + m_lblTime->setText(QString("%1:%2:%3").arg(hour,2,10,QChar('0')).arg(minute%60,2,10,QChar('0')) + .arg(second%60,2,10,QChar('0')) + "/" + m_totalTime); + return; + } + m_lblTime->setText(QString("%1:%2").arg(minute%60,2,10,QChar('0')).arg(second%60,2,10,QChar('0')) + + "/" + m_totalTime); +} + +QString StatusIconPopupWidget::totalTimeString() +{ + SoundCore * core = SoundCore::instance(); + + int second = core->totalTime() / 1000; + int minute = second / 60; + int hour = minute / 60; + + if(core->totalTime() > 3600000) + { + return QString("%1:%2:%3").arg(hour,2,10,QChar('0')).arg(minute%60,2,10,QChar('0')) + .arg(second%60,2,10,QChar('0')); + } + return QString("%1:%2").arg(minute%60,2,10,QChar('0')).arg(second%60,2,10,QChar('0')); +} + +void StatusIconPopupWidget::updatePosition(int trayx, int trayy) +{ + QRect screenGeometry = QApplication::desktop()->availableGeometry(); + int xpos = 0; + int ypos = 0; + + xpos = screenGeometry.x() + trayx -5; + if(xpos + width() > screenGeometry.width()) + xpos = screenGeometry.width() - width() -5; + + if(trayy < screenGeometry.y()) //tray on top of screen + { + ypos = screenGeometry.y() + 5; + } + + if(trayy > screenGeometry.y()) //tray on bottom + { + ypos = screenGeometry.y() + screenGeometry.height() - height() -5; + } + move(xpos,ypos); + return; +} + +void StatusIconPopupWidget::showInfo(int x, int y, int delay, bool splitFileName) +{ + m_timer->stop(); + m_timer->setInterval(delay); + m_lastTrayX = x; + m_lastTrayY = y; + m_splitFileName = splitFileName; + updateMetaData(); + qApp->processEvents(); + updatePosition(x,y); + qApp->processEvents(); + show(); + m_timer->start(); +} + + diff --git a/src/plugins/General/statusicon/statusiconpopupwidget.h b/src/plugins/General/statusicon/statusiconpopupwidget.h new file mode 100644 index 000000000..183074155 --- /dev/null +++ b/src/plugins/General/statusicon/statusiconpopupwidget.h @@ -0,0 +1,52 @@ +#ifndef STATUSICONPOPUPWIDGET_H +#define STATUSICONPOPUPWIDGET_H + +#include <QFrame> +#include <QWidget> +#include <QGridLayout> +#include "plugins/General/covermanager/coverwidget.h" + +class QLabel; +class QTimer; + + +class StatusIconPopupWidget : public QFrame +{ + Q_OBJECT +public: + + StatusIconPopupWidget(QWidget * parent = 0); + ~StatusIconPopupWidget(); + + void showInfo(int x, int y, int delay, bool splitFileName); //x,y are tray icon position + +protected: + + virtual void mousePressEvent(QMouseEvent *); + +private: + + QString totalTimeString(); + QLabel *m_lblTitle; + QLabel *m_lblArtist; + QLabel *m_lblAlbum; + QLabel *m_lblTime; + QGridLayout * gLayout; + QTimer *m_timer; + CoverWidget * m_cover; + QString m_totalTime; + QSpacerItem *m_spacer; + + int m_lastTrayX; + int m_lastTrayY; + int m_splitFileName; + +private slots: + + void updatePosition(int trayx, int trayy); + void updateMetaData(); + void updateTime(qint64 elapsed); + +}; + +#endif // STATUSICONPOPUPWIDGET_H |
