aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-10-16 15:59:23 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-10-16 15:59:23 +0000
commit1837bc49ff6645be319decdafb4a896aab79f51f (patch)
tree612ca3ad874d88a8e813cbaf103326ef7b7f4edc /src
parentedcf1ca68a32c85e18ac500990bd28e93e4be2e5 (diff)
downloadqmmp-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')
-rw-r--r--src/plugins/General/statusicon/CMakeLists.txt2
-rw-r--r--src/plugins/General/statusicon/images/empty_cover.pngbin0 -> 8926 bytes
-rw-r--r--src/plugins/General/statusicon/images/tray_images.qrc14
-rw-r--r--src/plugins/General/statusicon/qmmptrayicon.cpp43
-rw-r--r--src/plugins/General/statusicon/qmmptrayicon.h17
-rw-r--r--src/plugins/General/statusicon/settingsdialog.cpp17
-rw-r--r--src/plugins/General/statusicon/settingsdialog.h1
-rw-r--r--src/plugins/General/statusicon/settingsdialog.ui167
-rw-r--r--src/plugins/General/statusicon/statusicon.cpp11
-rw-r--r--src/plugins/General/statusicon/statusicon.h6
-rw-r--r--src/plugins/General/statusicon/statusicon.pro77
-rw-r--r--src/plugins/General/statusicon/statusiconfactory.cpp2
-rw-r--r--src/plugins/General/statusicon/statusiconpopupwidget.cpp207
-rw-r--r--src/plugins/General/statusicon/statusiconpopupwidget.h52
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
new file mode 100644
index 000000000..cbc0d1ddc
--- /dev/null
+++ b/src/plugins/General/statusicon/images/empty_cover.png
Binary files differ
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