Merge branch 'master' into settings_auto_update
[situare] / src / ui / mainwindow.h
1 /*
2    Situare - A location system for Facebook
3    Copyright (C) 2010  Ixonos Plc. Authors:
4
5       Henri Lampela - henri.lampela@ixonos.com
6       Kaj Wallin - kaj.wallin@ixonos.com
7       Sami Rämö - sami.ramo@ixonos.com
8
9    Situare is free software; you can redistribute it and/or
10    modify it under the terms of the GNU General Public License
11    version 2 as published by the Free Software Foundation.
12
13    Situare is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with Situare; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
21    USA.
22 */
23
24 #ifndef MAINWINDOW_H
25 #define MAINWINDOW_H
26
27 #include <QtGui/QMainWindow>
28 #include <QUrl>
29
30 #include "network/networkcookiejar.h"
31 #include "panelsidebar.h"
32
33 class QGraphicsScene;
34 class QLabel;
35 class QWebView;
36
37 class FacebookAuthentication;
38 class FriendListPanel;
39 class MapScene;
40 class MapView;
41 class SituareService;
42 class User;
43 class UserInfoPanel;
44 class ZoomButtonPanel;
45 class SettingsDialog;
46
47 /**
48 * @brief Main Window Class
49 */
50 class MainWindow : public QMainWindow
51 {
52     Q_OBJECT
53
54 public:
55     /**
56     * @brief Constructor
57     *
58     * @param parent Parent
59     */
60     MainWindow(QWidget *parent = 0);
61
62     /**
63     * @brief Destructor
64     *
65     */
66     ~MainWindow();
67
68 /*******************************************************************************
69  * BASE CLASS INHERITED AND REIMPLEMENTED MEMBER FUNCTIONS
70  ******************************************************************************/
71 private:
72     /**
73       * @brief HW increase and decrease key presses are grabbed and used for zooming the map.
74       */
75     void keyPressEvent(QKeyEvent* event);
76
77 /*******************************************************************************
78  * MEMBER FUNCTIONS AND SLOTS
79  ******************************************************************************/
80 public:
81     /**
82     * @brief Clears cookie jar
83     *
84     */
85     void clearCookieJar();
86
87     /**
88     * @brief
89     *
90     * @param logged
91     */
92     void loggedIn(bool logged);
93
94     /**
95     * @brief Enable / disable auto centering button.
96     *
97     * @param enabled true if shoud be enabled, false otherwise
98     */
99     void setAutoCenteringButtonEnabled(bool enabled);
100
101     /**
102     * @brief Enable / disable GPS button.
103     *
104     * Does set visibilities for manual location cursor and auto centering menu button.
105     *
106     * @param enabled true if enabled, false otherwise
107     */
108     void setGPSButtonEnabled(bool enabled);
109
110     /**
111       * @brief Set scene for MapView
112       *
113       * @param scene Scene to be set
114       */
115     void setMapViewScene(QGraphicsScene *scene);
116
117     /**
118     * @brief Show Maemo information box with message.
119     *
120     * @param message Information message
121     * @param modal Modal = true, non-modal false
122     */
123     void showMaemoInformationBox(const QString &message, bool modal=false);
124
125     /**
126     * @brief Gets the username from member variable for saving purposes
127     *
128     * @return QString Username
129     */
130     const QString username();
131
132 public slots:
133     /**
134     * @brief Slot to intercept signal when login has failed (loginFailure signal)
135     *
136     */
137     void loginFailed();
138
139     /**
140     * @brief Slot to intercept signal when login with cookies is requested
141     *
142     */
143     void loginUsingCookies();
144
145     /**
146     * @brief Public slot, which open settings dialog
147     */
148     void openSettingsDialog();
149
150     /**
151     * @brief Sets username to member variable for login dialog
152     *
153     * @param username Username to be set
154     */
155     void setUsername(const QString &username);
156
157     /**
158     * @brief Public slot to intercept signal when old cerdentials are invalid or credentials
159     *        doesn't exist yet
160     *
161     * @param url Login page url
162     */
163     void startLoginProcess(const QUrl &url);
164
165     /**
166     * @brief Toggle progress indicator.
167     *
168     * @param state true if progress indicator should be shown, false otherwise
169     */
170     void toggleProgressIndicator(bool state);
171
172     /**
173     * @brief Shows / hides Situare related UI items
174     *
175     * @param show
176     */
177     void updateItemVisibility(bool show);
178
179 private:
180     /**
181       * @brief Build friend list panel and connect slots
182       */
183     void buildFriendListPanel();
184
185     /**
186       * @brief Build manual location setting cross hair and connect slots
187       */
188     void buildManualLocationCrosshair();
189
190     /**
191       * @brief Build map and connect slots
192       */
193     void buildMap();
194
195     /**
196       * @brief Build OSM license and connect slots
197       */
198     void buildOsmLicense();
199
200     /**
201       * @brief Build user info panel and connect slots
202       */
203     void buildUserInfoPanel();
204
205     /**
206     * @brief Build webview and connect slots
207     *
208     */
209     void buildWebView();
210
211     /**
212       * @brief Build zoom button panel and connect slots
213       */
214     void buildZoomButtonPanel();
215
216     /**
217     * @brief Private method to create the Menu items
218     */
219     void createMenus();
220
221     /**
222       * @brief Grab or release HW increase and decrease buttons.
223       *
224       * @param grab Use true for grabbing and false for releasing the keys
225       */
226     void grabZoomKeys(bool grab);
227
228     /**
229       * @brief Set own location crosshair visibility
230       *
231       * @param visible
232       */
233     void setOwnLocationCrosshairVisibility(bool visible);
234
235 private slots:
236     /**
237     * @brief Slot for drawing the Open Street Map license text
238     *
239     * @param size Size of the screen
240     */
241     void drawOsmLicense(const QSize &size);
242
243     /**
244     * @brief Slot for drawing the own location crosshair
245     *
246     * @param width Width of the viewport
247     * @param height Height of the viewport
248     */
249     void drawOwnLocationCrosshair(int width, int height);
250
251     /**
252     * @brief Slot for gps error.
253     *
254     * @param message error message
255     */
256     void gpsError(const QString &message);
257
258     /**
259     * @brief Slot for gps timeout.
260     *
261     * Called when request timeout occurs.
262     */
263     void gpsTimeout();
264
265     /**
266     * @brief Slot to load cookies from settings
267     *
268     */
269     void loadCookies();
270
271     /**
272     * @brief Slot to intercept signal when webview has finished loading webpage
273     *
274     * @param done Status of the loading
275     */
276     void loadDone(bool done);
277
278     /**
279     * @brief Slot to save cookies to settings
280     *
281     */
282     void saveCookies();
283
284     /**
285     * @brief Set correnct view port size to datamembers
286     *
287     * @param width Width of the viewport
288     * @param height Height of the viewport
289     */
290     void setViewPortSize(const int width, const int height);
291
292 /*******************************************************************************
293  * SIGNALS
294  ******************************************************************************/
295 signals:
296     /**
297     * @brief Automatic centering setting changed by user
298     *
299     * @param enabled True if automatic centering is enabled, otherwise false
300     */
301     void autoCenteringTriggered(bool enabled);
302
303     /**
304     * @brief Signal that indicates when user has cancelled login process
305     *
306     */
307     void cancelLoginProcess();
308
309     /**
310     * @brief View should be centered to new location
311     *
312     * @param sceneCoordinate Scene coordinates of the new center point
313     */
314     void centerToSceneCoordinates(QPoint sceneCoordinate);
315
316     /**
317     * @brief Signal for enabling automatic location update.
318     *
319     * @param enabled true if enabled, false otherwise
320     * @param updateIntervalMsecs update interval in milliseconds
321     */
322     void enableAutomaticLocationUpdate(bool enabled, int updateIntervalMsecs);
323
324     /**
325     * @brief Signal for requesting username from settings
326     *
327     */
328     void fetchUsernameFromSettings();
329
330     /**
331     * @brief Signal for finding user.
332     *
333     * @param coordinates user geo coordinates
334     */
335     void findUser(const QPointF &coordinates);
336
337     /**
338     * @brief GPS setting changed
339     *
340     * @param enabled True if GPS is enabled, otherwise false
341     */
342     void gpsTriggered(bool enabled);
343
344     /**
345     * @brief Signal for finding friend.
346     *
347     * @param coordinates friend's geo coordinates
348     */
349     void findFriend(const QPointF &coordinates);
350
351     /**
352     * @brief Signal for friend location ready.
353     *
354     * @param friendsList
355     */
356     void friendsLocationsReady(QList<User *> &friendsList);
357
358     /**
359     * @brief Signal is emitted when location item is clicked.
360     *
361     * @param userIDs list of friends user IDs in the group
362     */
363     void locationItemClicked(const QList<QString> &userIDs);
364
365     /**
366     * @brief Signals when Login/Logout action is pressed
367     *
368     */
369     void loginActionPressed();
370
371     /**
372     * @brief MapView has been resized
373     *
374     * @param size view size
375     */
376     void mapViewResized(const QSize &size);
377
378     /**
379       * @brief Forwarding signal from MapView to MapEngine
380       *
381       * @param sceneCoordinate
382       */
383     void mapViewScrolled(QPoint sceneCoordinate);
384
385     /**
386       * @brief Forwarding signal from MapEngine to MapView
387       */
388     void maxZoomLevelReached();
389
390     /**
391       * @brief Forwarding signal from MapEngine to MapView
392       */
393     void minZoomLevelReached();
394
395     /**
396     * @brief Signal for refreshing user data.
397     *
398     */
399     void refreshUserData();
400
401     /**
402     * @brief Signal for requesting reverseGeo from SituareEngine
403     *
404     */
405     void requestReverseGeo();
406
407     /**
408     * @brief Signals, when address data is ready
409     *
410     * @param address Street address
411     */
412     void reverseGeoReady(const QString &address);
413
414     /**
415     * @brief Signal for requestLocationUpdate from SituareEngine
416     *
417     * @param status Status message
418     * @param publish Publish on Facebook
419     */
420     void statusUpdate(const QString &status, const bool &publish);
421
422     /**
423     * @brief Signals when webview's urlChanged signal is emitted
424     *
425     * @param url New url
426     */
427     void updateCredentials(const QUrl &url);
428
429     /**
430     * @brief MapView has finished zooming
431     */
432     void viewZoomFinished();
433
434     /**
435     * @brief Signal for use location ready.
436     *
437     * @param user User object
438     */
439     void userLocationReady(User *user);
440
441     /**
442     * @brief Map zoom in request
443     */
444     void zoomIn();
445
446     /**
447       * @brief Forwarding signal from MapEngine to MapView
448       */
449     void zoomLevelChanged(int zoomLevel);
450
451     /**
452     * @brief Map zoom out request
453     */
454     void zoomOut();
455
456 /*******************************************************************************
457  * DATA MEMBERS
458  ******************************************************************************/
459 private:
460     bool m_drawOwnLocationCrosshair;        ///< Flag for making ownLocationCrosshair visible or not
461     bool m_loggedIn;                        ///< Indicates login state
462     bool m_refresh;                         ///< Indicates when webpage is refreshed
463
464     int m_viewPortHeight;                   ///< Height of view port
465     int m_viewPortWidth;                    ///< Width of view port
466
467     QAction *m_autoCenteringAct;            ///< Action to auto center map using gps position
468     QAction *m_gpsToggleAct;                ///< Action to trigger gps toggle
469     QAction *m_loginAct;                    ///< Action to Login/Logout
470     QAction *m_toSettingsAct;               ///< Action to trigger switch to settings dialog
471
472     QLabel *m_osmLicense;                   ///< Label for Open Street Map license
473     QLabel *m_ownLocationCrosshair;         ///< Label that show ownLocationCrosshair
474
475     QMenu *m_viewMenu;                      ///< Object that hold the view menu items
476
477     QString m_email;                        ///< Placeholder for email
478     QString m_password;                     ///< Placeholder for password
479
480     QWebView *m_webView;                    ///< Shows facebook login page
481
482     FriendListPanel *m_friendsListPanel;    ///< Instance of friends list panel
483     MapView *m_mapView;                     ///< Instance of the map view
484     NetworkCookieJar *m_cookieJar;          ///< Placeholder for QNetworkCookies
485     PanelSideBar *m_userPanelSidebar;       ///< User panel side bar
486     PanelSideBar *m_friendsListPanelSidebar;///< Friends panel side bar
487     UserInfoPanel *m_userPanel;             ///< Instance of the user information panel
488     ZoomButtonPanel *m_zoomButtonPanel;     ///< Instance of zoom button panel
489
490     SettingsDialog *m_settingsDialog;       ///< Settings dialog
491 };
492
493 #endif // MAINWINDOW_H