Removed disabled button states, don't open panel without buttons
[situare] / src / ui / friendlistpanel.h
1 /*
2     Situare - A location system for Facebook
3     Copyright (C) 2010  Ixonos Plc. Authors:
4
5         Kaj Wallin - kaj.wallin@ixonos.com
6         Henri Lampela - henri.lampela@ixonos.com
7         Pekka Nissinen - pekka.nissinen@ixonos.com
8         Jussi Laitinen - jussi.laitinen@ixonos.com
9         Sami Rämö - sami.ramo@ixonos.com
10
11     Situare is free software; you can redistribute it and/or
12     modify it under the terms of the GNU General Public License
13     version 2 as published by the Free Software Foundation.
14
15     Situare is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18     GNU General Public License for more details.
19
20     You should have received a copy of the GNU General Public License
21     along with Situare; if not, write to the Free Software
22     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
23     USA.
24 */
25
26 #ifndef FRIENDLISTPANEL_H
27 #define FRIENDLISTPANEL_H
28
29 #include "panelbase.h"
30
31 class QLabel;
32 class QLineEdit;
33 class QPushButton;
34
35 class FriendListItemDelegate;
36 class FriendListView;
37 class GeoCoordinate;
38 class ImageButton;
39 class User;
40
41 /**
42  * @brief Class for sliding friends list panel
43  *
44  * @author Kaj Wallin - kaj.wallin (at) ixonos.com
45  * @author Henri Lampela - henri.lampela (at) ixonos.com
46  * @author Pekka Nissinen - pekka.nissinen (at) ixonos.com
47  * @author Jussi Laitinen - jussi.laitinen (at) ixonos.com
48  * @author Sami Rämö - sami.ramo (at) ixonos.com
49  */
50 class FriendListPanel : public PanelBase
51 {
52     Q_OBJECT
53
54 public:
55     /**
56      * @brief Default constructor
57      *
58      * @param parent
59      */
60     FriendListPanel(QWidget *parent = 0);
61
62 /*******************************************************************************
63  * BASE CLASS INHERITED AND REIMPLEMENTED MEMBER FUNCTIONS
64  ******************************************************************************/
65 protected:
66     /**
67     * @brief Re-implemented from QWidget::hideEvent()
68     *
69     * Calls updateKeyboardGrabbing() and clearFriendGroupFiltering().
70     *
71     * @param event
72     */
73     void hideEvent(QHideEvent *event);
74
75     /**
76     * @brief Re-implemented from QWidget::showEvent()
77     *
78     * Calls updateKeyboardGrabbing().
79     *
80     * @param event
81     */
82     void showEvent(QShowEvent *event);
83
84 /*******************************************************************************
85  * MEMBER FUNCTIONS AND SLOTS
86  ******************************************************************************/
87 public slots:
88     /**
89      * @brief Slot to update friend item's image
90      *
91      * @param user Friend
92      */
93     void friendImageReady(User *user);
94
95     /**
96      * @brief Slot to refresh friends list
97      *
98      * @param friendList
99      */
100     void friendInfoReceived(QList<User *> &friendList);
101
102 private:
103     /**
104     * @brief Set visibility for filtering text field and clearing button
105     *
106     * @param visible True if items should be visible, false if not
107     */
108     void setFilteringLayoutVisibility(bool visible);
109
110     /**
111     * @brief Takes care of grabbing and releasing the keyboard when required
112     *
113     * Keyboard is grabbed when MainWindow it the topmost window, panel tab is open and
114     * FriendListPanel is visible. Releasing is done if the MainWindow is not the topmost window
115     * or panel tab is not open or FriendListPanel is invisible.
116     */
117     void updateKeyboardGrabbing();
118
119 private slots:
120     /**
121     * @brief Called when any of the panel tabs is closed
122     *
123     * Does call clearFriendGroupFiltering().
124     *
125     * Calls updateKeyboardGrabbing() for releasing the grabbing when FriendListPanel is closed, not
126     * changed to other panel. In this case the hideEvent() is not triggered.
127     */
128     void anyPanelClosed();
129
130     /**
131     * @brief Called when any of the panel tabs is opened
132     *
133     * Calls updateKeyboardGrabbing() for grabbing the keyboard when FriendListPanel is closed and
134     * is the last selected tab. In this case the showEvent() is not triggered.
135     */
136     void anyPanelOpened();
137
138     /**
139     * @brief Slot for clearing the filtering
140     *
141     * Clears friend group (or single friend) filtering and calls clearTextFiltering().
142     */
143     void clearFiltering();
144
145     /**
146     * @brief Slot for clearing the text based filtering.
147     *
148     * Does clear only the text based filtering. Friend group based filtering is not affected.
149     */
150     void clearTextFiltering();
151
152     /**
153     * @brief Updates the filtering when filtering text value is changed
154     *
155     * Filtering UI elements are invoked when the text becomes not empty and hidden when text
156     * becomes empty.
157     *
158     * Sets the new filtering text.
159     *
160     * @param text New text value
161     */
162     void filterTextChanged(const QString &text);
163
164     /**
165     * @brief Routes to selected friend.
166     *
167     * Emits routeToFriend if friend is selected from list.
168     */
169     void routeToSelectedFriend();
170
171     /**
172      * @brief Slot to show friends in list.
173      *
174      * Shows only friends that are on userIDs list
175      * @param userIDs list of user ID's
176      */
177     void showFriendsInList(const QList<QString> &userIDs);
178
179     /**
180     * @brief Called when topmost window is changed
181     *
182     * Does set m_mainWindowIsTopmost and calls updateKeyboardGrabbing()
183     *
184     * @param mainWindowIsTopmost True if MainWindow is the topmost one
185     */
186     void topmostWindowChanged(bool mainWindowIsTopmost);
187
188 /*******************************************************************************
189  * SIGNALS
190  ******************************************************************************/
191 signals:
192     /**
193      * @brief Signal for friend finding
194      *
195      * @param coordinates Target coordinate
196      */
197     void findFriend(const GeoCoordinate &coordinates);
198
199     /**
200     * @brief Signal for routing to friend.
201     *
202     * @param coordinates friend's geo coordinates
203     */
204     void routeToFriend(const GeoCoordinate &coordinates);
205
206 /*******************************************************************************
207  * DATA MEMBERS
208  ******************************************************************************/
209 private:
210     bool m_mainWindowIsTopmost;                 ///< Is the MainWindow the topmost one
211     bool m_somePanelIsOpen;                     ///< Is any panel tab open
212
213     QLabel *m_headerLabel;                      ///< Show how many friends are selected
214
215     QLineEdit *m_filterField;                   ///< Text field for the filter text
216
217     QPushButton *m_clearTextFilteringButton;    ///< Button for clearing the text filtering
218
219     QWidget *m_headerWidget;                    ///< Friend list header widget
220
221     FriendListView *m_friendListView;           ///< Friend list view
222     ImageButton *m_clearGroupFilteringButton;   ///< Button for clearing friend group filtering
223     ImageButton *m_routeButton;                 ///< Button for routing to selected friend
224 };
225
226 #endif // FRIENDLISTPANEL_H