summaryrefslogtreecommitdiffstats
path: root/amarok/src/osd.h
blob: 612734886263049f65ff47c3864877a5ae21d531 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/*
  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.
*/

/*
  osd.h   -  Provides an interface to a plain TQWidget, which is independent of KDE (bypassed to X11)
  begin:     Fre Sep 26 2003
  copyright: (C) 2003 by Christian Muehlhaeuser
  email:     chris@chris.de
*/

#ifndef AMAROK_OSD_H
#define AMAROK_OSD_H

#include "metabundle.h"
		
#include <kpixmap.h>
#include <tqimage.h>
#include <tqvaluelist.h>
#include <tqwidget.h> //baseclass


class OSDWidget : public TQWidget
{
    Q_OBJECT
    

    public:
        enum Alignment { Left, Middle, Center, Right };

        OSDWidget( TQWidget *parent, const char *name = "osd" );

        /** resets the colours to defaults */
        void unsetColors();

      public slots:
        /** calls setText() then show(), after setting image if needed */
        void show( const TQString &text, TQImage newImage = TQImage() );
        void ratingChanged( const short rating );
        void ratingChanged( const TQString& path, int rating );
        void volChanged( unsigned char volume );

        /** reimplemented, shows the OSD */
        virtual void show();

        /**
         * For the sake of simplicity, when these settings are
         * changed they do not take effect until the next time
         * the OSD is shown!
         *
         * To force an update call show();
         */
        void setDuration( int ms ) { m_duration = ms; }
        void setTextColor( const TQColor &color ) { setPaletteForegroundColor( color ); }
        void setBackgroundColor(const TQColor &color ) { setPaletteBackgroundColor( color ); }
        void setOffset( int y ) { m_y = y; }
        void setAlignment( Alignment alignment ) { m_alignment = alignment; }
        void setImage( const TQImage &image ) { m_cover = image; }
        void setScreen( int screen );
        void setText( const TQString &text ) { m_text = text; }
        void setDrawShadow( const bool b ) { m_drawShadow = b; }
        void setTranslucency( const bool b ) { m_translucency = b; }
        void setRating( const short rating ) { if ( isEnabled() ) m_rating = rating; }
        void setMoodbar( void ) { m_moodbarBundle = MetaBundle(); }
        void setMoodbar( const MetaBundle &bundle )
          { m_moodbarBundle = bundle;  m_moodbarBundle.moodbar().load(); }

    protected:
        /** determine new size and position */
        TQRect determineMetrics( const uint marginMetric );

        /** render OSD */
        void render( const uint marginMetric, const TQSize &size );

        /** reimplemented */
        virtual void mousePressEvent( TQMouseEvent* );
        virtual bool event( TQEvent* );

        bool useMoodbar( void );

        void paintMe();

        /** distance from screen edge */
        static const int MARGIN = 15;

        int         m_duration;
        TQTimer     *m_timer;
        Alignment   m_alignment;
        int         m_screen;
        uint        m_y;
        bool        m_drawShadow;
        bool        m_translucency;
        short       m_rating;
        unsigned char m_newvolume;
        bool        m_volume;
        TQString     m_text;
        TQImage      m_cover;
        // need a whole MetaBundle to draw the moodbar on the fly
        MetaBundle  m_moodbarBundle;
        TQPixmap     m_scaledCover;
        KPixmap     m_screenshot;
        TQPixmap     m_buffer;
};



class OSDPreviewWidget : public OSDWidget
{
    Q_OBJECT
  

public:
    OSDPreviewWidget( TQWidget *parent );

    int screen()    { return m_screen; }
    int alignment() { return m_alignment; }
    int y()         { return m_y; }

public slots:
    void setTextColor( const TQColor &color ) { OSDWidget::setTextColor( color ); doUpdate(); }
    void setBackgroundColor(const TQColor &color ) { OSDWidget::setBackgroundColor( color ); doUpdate(); }
    void setDrawShadow( bool b ) { OSDWidget::setDrawShadow( b ); doUpdate(); }
    void setFont( const TQFont &font ) { OSDWidget::setFont( font ); doUpdate(); }
    void setScreen( int screen ) { OSDWidget::setScreen( screen ); doUpdate(); }
    void setUseCustomColors( const bool use, const TQColor &fg, const TQColor &bg )
    {
        if( use ) {
            OSDWidget::setTextColor( fg );
            OSDWidget::setBackgroundColor( bg );
        } else
            unsetColors();
        doUpdate();
    }

private:
    inline void doUpdate() { if( isShown() ) show(); }

signals:
    void positionChanged();

protected:
    void mousePressEvent( TQMouseEvent * );
    void mouseReleaseEvent( TQMouseEvent * );
    void mouseMoveEvent( TQMouseEvent * );

private:
    bool   m_dragging;
    TQPoint m_dragOffset;
};



namespace Amarok
{
    class OSD : public OSDWidget
    {
        Q_OBJECT
  

    public:
        static OSD *instance()
        {
            static OSD *s_instance = new OSD;
            return s_instance;
        }

        void applySettings();
        void show( const MetaBundle &bundle );

    public slots:
        /**
         * When user pushs global shortcut or uses DCOP OSD is toggle
         * even if it is disabled()
         */
        void forceToggleOSD();

    private:
        OSD();

    private slots:
        void slotCoverChanged( const TQString &artist, const TQString &album );
        void slotImageChanged( const TQString &remoteURL );
    };
}

#endif /*AMAROK_OSD_H*/