Several bias bugfixes
[amarok:rengelss-amarok.git] / src / browsers / playlistbrowser / DynamicBiasWidgets.h
1 /****************************************************************************************
2  * Copyright (c) 2008 Daniel Caleb Jones <danielcjones@gmail.com>                       *
3  * Copyright (c) 2009 Mark Kretschmann <kretschmann@kde.org>                            *
4  * Copyright (c) 2010,2011 Ralf Engels <ralf-engels@gmx.de>                                  *
5  *                                                                                      *
6  * This program is free software; you can redistribute it and/or modify it under        *
7  * the terms of the GNU General Public License as published by the Free Software        *
8  * Foundation; either version 2 of the License, or (at your option) version 3 or        *
9  * any later version accepted by the membership of KDE e.V. (or its successor approved  *
10  * by the membership of KDE e.V.), which shall act as a proxy defined in Section 14 of  *
11  * version 3 of the license.                                                            *
12  *                                                                                      *
13  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
14  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
15  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
16  *                                                                                      *
17  * You should have received a copy of the GNU General Public License along with         *
18  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
19  ****************************************************************************************/
20
21 #ifndef AMAROK_DYNAMICBIASWIDGETS_H
22 #define AMAROK_DYNAMICBIASWIDGETS_H
23
24 #include "shared/amarok_export.h"
25 #include "Bias.h"
26 #include "widgets/MetaQueryWidget.h"
27
28 #include <QWidget>
29
30 class QFormLayout;
31 class QLabel;
32 class QSlider;
33 class QToolButton;
34 class KComboBox;
35 class QEvent;
36
37 namespace Amarok
38 {
39     class Slider;
40 }
41
42 namespace Dynamic
43 {
44     class TagMatchBias;
45 }
46
47 namespace PlaylistBrowserNS
48 {
49     class BiasWidget;
50
51     /** This widget encapsulates the real bias widgets and exchanges them if needed.
52         Also this widget will display a "list like" background.
53     */
54     class BiasBoxWidget : public QWidget
55     {
56         Q_OBJECT
57
58         public:
59             BiasBoxWidget( Dynamic::BiasPtr bias, QWidget* parent = 0 );
60             virtual ~BiasBoxWidget() {}
61
62             void setRemovable( bool );
63
64             BiasWidget* biasWidget()
65             {
66                 return qobject_cast<BiasWidget*>(m_biasWidget);
67             }
68
69         protected slots:
70             void biasRemoved();
71             void biasReplaced( Dynamic::BiasPtr oldBias, Dynamic::BiasPtr newBias );
72
73         protected:
74             /** Returns a row number for this bias.
75                 Used to display the alternate background for the widgets and
76                 it's not really the row number but instead something that looks
77                 good. */
78             int rowNumber() const;
79
80             // void resizeEvent( QResizeEvent* );
81             void paintEvent( QPaintEvent *event );
82             void enterEvent ( QEvent *event );
83             void leaveEvent ( QEvent *event );
84
85             QHBoxLayout* m_mainLayout;
86             Dynamic::BiasPtr m_bias;
87             QWidget *m_biasWidget;
88
89         private:
90             QToolButton* m_removeButton;
91             bool m_hover;
92     };
93
94     class AMAROK_EXPORT BiasWidget : public QWidget
95     {
96         Q_OBJECT
97
98         public:
99             BiasWidget( Dynamic::BiasPtr bias, QWidget* parent = 0 );
100
101             /** Set's a widget that is handled as part of the bias widget.
102                 Example: The weight slider in case the bias is inside a
103                 PartBias.
104                 The widget will belong to this object afterwards.
105             */
106             void setCustomWidget( const QString &label, QWidget* widget );
107
108             /** Direct access to the form layout for easy customization */
109             QFormLayout* formLayout()
110             { return m_layout; }
111
112         protected slots:
113             void factoriesChanged();
114             void selectionChanged( int index );
115
116         protected:
117             Dynamic::BiasPtr m_bias;
118             QWidget* m_customWidget;
119             KComboBox* m_biasSelection;
120
121             /** This is where sub-classes are added */
122             QFormLayout* m_layout;
123     };
124
125     /** A bias that has sub biases like the AndBias or PartBias */
126     class LevelBiasWidget : public BiasWidget
127     {
128         Q_OBJECT
129
130         public:
131             LevelBiasWidget( Dynamic::AndBias* bias, bool haveWeights,
132                              QWidget* parent = 0 );
133
134             QList<BiasBoxWidget*> widgets() const
135             { return m_widgets; }
136
137         signals:
138             void biasWeightChanged( int biasNum, qreal value );
139
140         protected slots:
141             void appendBias();
142             void biasAppended( Dynamic::BiasPtr bias );
143             void biasRemoved( int pos );
144             void biasMoved( int from, int to );
145
146             void sliderValueChanged( int val );
147             void biasWeightsChanged();
148
149         protected:
150             /** calls setRemovable() for all sub-widgets */
151             void correctRemovability();
152
153             bool m_haveWeights;
154
155             /** True if we just handle a signal. Used to protect agains recursion */
156             bool m_inSignal;
157
158             Dynamic::AndBias* m_abias;
159
160             QSlider *m_weightSelection;
161             QList<BiasBoxWidget*> m_widgets;
162             QList<QSlider*> m_sliders;
163
164             QToolButton* m_addButton;
165     };
166
167
168     class TagMatchBiasWidget : public BiasWidget
169     {
170         Q_OBJECT
171
172         public:
173             TagMatchBiasWidget( Dynamic::TagMatchBias* bias, QWidget* parent = 0 );
174
175         private slots:
176             void syncControlsToBias();
177             void syncBiasToControls();
178
179         private:
180             Amarok::Slider*  m_scaleSelection;
181             QLabel*          m_scaleLabel;
182             MetaQueryWidget* m_queryWidget;
183
184             Dynamic::TagMatchBias* m_tbias;
185     };
186
187 }
188
189 #endif