* use Backend term in place of Package as it suits better
[plasma-media-center:mainline.git] / applets / mediabrowser / abstractmediaitemview.h
1 /***************************************************************************
2  *   Copyright 2009 by Alessandro Diaferia <alediaferia@gmail.com>         *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
18  ***************************************************************************/
19 #ifndef ABSTRACTMEDIAITEMVIEW_H
20 #define ABSTRACTMEDIAITEMVIEW_H
21
22 #include <QGraphicsWidget>
23 #include <QStyleOptionViewItemV4>
24 #include <KUrl>
25 #include <mediacenter/mediacenter.h>
26 #include <mediabrowserlibs/abstractbrowsingbackend.h>
27
28 class QAbstractItemModel;
29
30 namespace Plasma {
31     class ScrollBar;
32 }
33 class ViewItem;
34 class QScrollBar;
35
36 class AbstractMediaItemView : public QGraphicsWidget
37 {
38     Q_OBJECT
39 public:
40     enum ScrollMode { PerItem, PerPixel };
41
42     AbstractMediaItemView(QGraphicsItem *parent = 0);
43     virtual ~AbstractMediaItemView();
44
45     void setIconSize(int size);
46     int iconSize() const;
47
48     /**
49      * Always set model through this method, even if m_model is available
50      * as protected.
51      */
52     virtual void setModel(QAbstractItemModel *model);
53     QAbstractItemModel *model();
54
55     void setRootIndex(const QModelIndex &);
56     QModelIndex rootIndex() const;
57
58     QScrollBar *verticalScrollBar();
59
60     void hideVerticalScrollBar();
61     bool isVerticalScrollBarHidden();
62
63     QRect contentsArea() const;
64
65     void setScrollMode(ScrollMode);
66     ScrollMode scrollMode();
67
68     void setDrawBlurredText(bool set);
69     bool drawBlurredText();
70
71     void setBrowsingType(const AbstractBrowsingBackend::BrowsingType &);
72     AbstractBrowsingBackend::BrowsingType browsingType() const;
73
74     /**
75      * Call this method whenever events like model resetting occur.
76      * This method destroys all the existing items so only call it whenever
77      * you are sure the current view has to be invalidated.
78      */
79     void invalidate();
80
81     QModelIndex indexFromPos(const QPointF &);
82
83 protected:
84     virtual void resizeEvent(QGraphicsSceneResizeEvent *event);
85     /**
86      * Reimplement this method in order to fill in m_option. Remember
87      * to always call the base implementation since it already initializes
88      * m_option with the basic stuff. All you need to do is specify things
89      * specific for the kind of view you are going to implement (icon view or list view).
90      */
91     virtual void setupOptions();
92
93     virtual void updateHoveredItem(ViewItem *item);
94
95     void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
96     void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
97     void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
98
99     void mousePressEvent(QGraphicsSceneMouseEvent *event);
100     void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
101     void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
102     void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
103
104     ViewItem* itemFromPos(const QPointF &);
105
106 protected slots:
107     /**
108      * You must reimplement this method in order to always
109      * keep up to date your items' position and size. Set size and
110      * position in this method. It'll be called as needed.
111      */
112     virtual void layoutItems() = 0;
113
114     void removeItems(const QModelIndex &parent, int start, int end);
115
116     void reset();
117
118 public slots:
119     /**
120      * Reimplement this slot in order to put here
121      * the code for items generations. Items must be collected
122      * in the m_items list. You just need to call this once for
123      * each rootIndex change in the model.
124      * A ViewItem with this view as parent has to be created for each QModelIndex
125      * that has to be shown. Each ViewItem must be updated with the QModelIndex it is
126      * in charge of and the current model in use.
127      */
128     virtual void generateItems(const QModelIndex &parent, int start, int end) = 0;
129
130     /**
131      * Reimplement this function in order to update
132      * ranges and steps of the vertical scroll bar. Call
133      * it whenever the row count changes in order to update
134      * the scrollbar.
135      */
136     virtual void updateScrollBar() = 0;
137
138     void goPrevious();
139     void listMediaInDirectory();
140
141 private slots:
142     void setRating(int);
143     void slotItemSelected();
144
145 signals:
146     void scrollOffsetChanged(int);
147     void mediasActivated(const QList<MediaCenter::Media> &);
148     void mediasListInDirectory(const QList<MediaCenter::Media> &);
149     void mediaActivated(const MediaCenter::Media &);
150     void indexActivated(const QModelIndex &);
151     void mediaSelected(const MediaCenter::Media);
152     void mediaUnselected(const MediaCenter::Media);
153     void directoryChanged();
154
155 private:
156     void tryDrag(QGraphicsSceneMouseEvent *);
157     void itemClickEvent(QGraphicsSceneMouseEvent *);
158     KUrl::List m_history;
159     AbstractBrowsingBackend::BrowsingType m_browsingType;
160
161 protected:
162     int m_iconSize;
163     QAbstractItemModel *m_model;
164     Plasma::ScrollBar *m_scrollBar;
165     QStyleOptionViewItemV4 m_option;
166     QModelIndex m_rootIndex;
167     ScrollMode m_scrollMode;
168     bool m_blurred;
169
170     QList<ViewItem*> m_items;
171
172     ViewItem *m_hoveredItem;
173     ViewItem *m_hoverIndicator;
174 };
175
176 #endif