File indexing completed on 2023-05-30 11:30:52

0001 /**
0002  * Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
0003  * Copyright (C) 2002-2004 Scott Wheeler <wheeler@kde.org>
0004  * Copyright (C) 2007, 2008, 2009 Michael Pyne <mpyne@kde.org>
0005  *
0006  * This program is free software; you can redistribute it and/or modify it under
0007  * the terms of the GNU General Public License as published by the Free Software
0008  * Foundation; either version 2 of the License, or (at your option) any later
0009  * version.
0010  *
0011  * This program is distributed in the hope that it will be useful, but WITHOUT ANY
0012  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
0013  * PARTICULAR PURPOSE. See the GNU General Public License for more details.
0014  *
0015  * You should have received a copy of the GNU General Public License along with
0016  * this program.  If not, see <http://www.gnu.org/licenses/>.
0017  */
0018 
0019 #ifndef JUK_SYSTEMTRAY_H
0020 #define JUK_SYSTEMTRAY_H
0021 
0022 #include <KStatusNotifierItem>
0023 
0024 #include <QVector>
0025 #include <QColor>
0026 #include <QPixmap>
0027 #include <QIcon>
0028 #include <QFrame>
0029 #include <QVBoxLayout>
0030 
0031 class SystemTray;
0032 class PlayerManager;
0033 class QLabel;
0034 class QTimer;
0035 class FileHandle;
0036 
0037 /**
0038  * Workalike of KPassivePopup intended to more easily support JuK's particular
0039  * usage pattern, including things like staying open while under the mouse.
0040  *
0041  * @author Michael Pyne <mpyne@kde.org>
0042  */
0043 class PassiveInfo final : public QFrame
0044 {
0045     Q_OBJECT
0046 public:
0047     PassiveInfo();
0048 
0049     // Sets view as a child widget to show in the popup window.
0050     // This widget does not take ownership of the widget.  If you want it auto-deleted,
0051     // either re-parent it or create it using this widget as its parent.
0052     void setView(QWidget *view);
0053 
0054     QWidget *view() const;
0055 
0056 public slots:
0057     virtual void show();
0058 
0059 signals:
0060     void mouseEntered();
0061     void timeExpired();
0062     void previousSong();
0063     void nextSong();
0064 
0065 protected:
0066 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
0067     void enterEvent (QEnterEvent *e) override;
0068 #else
0069     void enterEvent (QEvent *e) override;
0070 #endif
0071     void leaveEvent(QEvent *) override;
0072     void wheelEvent(QWheelEvent *) override;
0073 
0074 private:
0075     // Move us near the required position.
0076     void positionSelf();
0077 
0078 private slots:
0079     void timerExpired();
0080 
0081 private:
0082     QTimer *m_startFadeTimer;
0083     QVBoxLayout *m_layout;
0084     bool m_justDie;
0085 };
0086 
0087 class SystemTray final : public KStatusNotifierItem
0088 {
0089     Q_OBJECT
0090 
0091 public:
0092     explicit SystemTray(PlayerManager *player, QWidget *parent = nullptr);
0093 
0094 signals:
0095     // Emitted when the fade process is complete.
0096     void fadeDone();
0097 
0098 private:
0099     static const int STEPS = 40; ///< Number of intermediate steps for fading.
0100 
0101     void createPopup();
0102     void setToolTip(const QString &tip = QString(), const QPixmap &cover = QPixmap());
0103 
0104     // Creates the widget layout for the popup, returning the QWidget that
0105     // holds the text labels.
0106 
0107     QWidget *createInfoBox(QBoxLayout *parentLayout, const FileHandle &file);
0108     void addSeparatorLine(QBoxLayout *parentLayout);
0109     void addCoverButton(QBoxLayout *parentLayout, const QPixmap &cover);
0110     void createButtonBox(QBoxLayout *parentLayout);
0111 
0112     // Interpolates from start color to end color.  If @p step == 0, then
0113     // m_startColor is returned, while @p step == @steps returns
0114     // m_endColor.
0115 
0116     QColor interpolateColor(int step, int steps = STEPS);
0117 
0118 private slots:
0119     void slotPlay();
0120     void slotPause();
0121     void slotStop();
0122     void slotPopupDestroyed();
0123     void slotNextStep(); ///< This is the fading routine.
0124     void slotPopupLargeCover();
0125     void slotForward();
0126     void slotBack();
0127     void slotFadeOut(); ///< Fades out the text
0128     void slotMouseInPopup(); ///< Forces the text back to its normal color.
0129     void scrollEvent(int delta, Qt::Orientation orientation);
0130 
0131 private:
0132     PassiveInfo *m_popup = nullptr;
0133     PlayerManager *m_player;
0134 
0135     QIcon m_backPix;
0136     QIcon m_forwardPix;
0137 
0138     QVector<QLabel *> m_labels;
0139 
0140     QTimer *m_fadeStepTimer = nullptr;
0141     QColor m_startColor, m_endColor;
0142     int m_step = 0;
0143     bool m_fade = true;
0144 
0145     /// Used to choose between manual fade and windowOpacity
0146     bool m_hasCompositionManager = false;
0147 };
0148 
0149 #endif // JUK_SYSTEMTRAY_H
0150 
0151 // vim: set et sw=4 tw=0 sta: