a781517320857b930c3ccbbfa030085ab74588ed
[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 Sets route button disabled.
173     *
174     * Disabled if there isn't any list item selected.
175     */
176     void setRouteButtonDisabled();
177
178     /**
179      * @brief Slot to show friends in list.
180      *
181      * Shows only friends that are on userIDs list
182      * @param userIDs list of user ID's
183      */
184     void showFriendsInList(const QList<QString> &userIDs);
185
186     /**
187     * @brief Called when topmost window is changed
188     *
189     * Does set m_mainWindowIsTopmost and calls updateKeyboardGrabbing()
190     *
191     * @param mainWindowIsTopmost True if MainWindow is the topmost one
192     */
193     void topmostWindowChanged(bool mainWindowIsTopmost);
194
195 /*******************************************************************************
196  * SIGNALS
197  ******************************************************************************/
198 signals:
199     /**
200      * @brief Signal for friend finding
201      *
202      * @param coordinates Target coordinate
203      */
204     void findFriend(const GeoCoordinate &coordinates);
205
206     /**
207     * @brief Signal for routing to friend.
208     *
209     * @param coordinates friend's geo coordinates
210     */
211     void routeToFriend(const GeoCoordinate &coordinates);
212
213 /*******************************************************************************
214  * DATA MEMBERS
215  ******************************************************************************/
216 private:
217     bool m_mainWindowIsTopmost;                 ///< Is the MainWindow the topmost one
218     bool m_somePanelIsOpen;                     ///< Is any panel tab open
219
220     QLabel *m_headerLabel;                      ///< Show how many friends are selected
221
222     QLineEdit *m_filterField;                   ///< Text field for the filter text
223
224     QPushButton *m_clearTextFilteringButton;    ///< Button for clearing the text filtering
225
226     QWidget *m_headerWidget;                    ///< Friend list header widget
227
228     FriendListView *m_friendListView;           ///< Friend list view
229     ImageButton *m_clearGroupFilteringButton;   ///< Button for clearing friend group filtering
230     ImageButton *m_routeButton;                 ///< Button for routing to selected friend
231 };
232
233 #endif // FRIENDLISTPANEL_H