Cleaning out old login code ongoing
[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         Jussi Laitinen - jussi.laitinen@ixonos.com
8         Sami Rämö - sami.ramo@ixonos.com
9         Ville Tiensuu - ville.tiensuu@ixonos.com
10         Katri Kaikkonen - katri.kaikkonen@ixonos.com
11
12     Situare is free software; you can redistribute it and/or
13     modify it under the terms of the GNU General Public License
14     version 2 as published by the Free Software Foundation.
15
16     Situare is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     GNU General Public License for more details.
20
21     You should have received a copy of the GNU General Public License
22     along with Situare; if not, write to the Free Software
23     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
24     USA.
25 */
26
27 #ifndef MAINWINDOW_H
28 #define MAINWINDOW_H
29
30 #include <QtGui/QMainWindow>
31 #include <QUrl>
32
33 #include "network/networkcookiejar.h"
34
35 class QGraphicsScene;
36 class QLabel;
37 class QMessageBox;
38 class QNetworkReply;
39 class QToolButton;
40 class QWebView;
41
42 class FacebookAuthentication;
43 class FacebookLoginBrowser;
44 class FriendListPanel;
45 class FullScreenButton;
46 class GeoCoordinate;
47 class IndicatorButtonPanel;
48 class Location;
49 class LocationSearchPanel;
50 class MapScale;
51 class MapScene;
52 class MapView;
53 class Route;
54 class RoutingPanel;
55 class SceneCoordinate;
56 class SettingsDialog;
57 class SituareService;
58 class TabbedPanel;
59 class User;
60 class UserInfoPanel;
61 class ZoomButtonPanel;
62
63 /**
64  * @brief Main Window Class
65  */
66 class MainWindow : public QMainWindow
67 {
68     Q_OBJECT
69
70 public:
71     /**
72      * @brief Constructor
73      *
74      * @param parent Parent
75      */
76     MainWindow(QWidget *parent = 0);
77
78     /**
79      * @brief Destructor
80      */
81     ~MainWindow();
82
83 /*******************************************************************************
84  * BASE CLASS INHERITED AND REIMPLEMENTED MEMBER FUNCTIONS
85  ******************************************************************************/
86 private:
87     /**
88      * @brief HW increase and decrease key presses are grabbed and used for zooming the map.
89      */
90     void keyPressEvent(QKeyEvent* event);
91
92 /*******************************************************************************
93  * MEMBER FUNCTIONS AND SLOTS
94  ******************************************************************************/
95 public:
96     FacebookLoginBrowser* buildFacebookLoginBrowser();
97
98     /**
99      * @brief Clears cookie jar
100      *
101      */
102     void clearCookieJar();
103
104     void destroyFacebookLoginBrowser();
105
106     /**
107      * @brief
108      *
109      * @param logged
110      */
111     void loggedIn(bool logged);
112
113     /**
114      * @brief Gets the login state (logged in/logged out)
115      *
116      * @return bool Login state
117      */
118     bool loginState();
119
120     /**
121      * @brief Reads automatic location update settings.
122      */
123     void readAutomaticLocationUpdateSettings();
124
125     /**
126      * @brief Enable / disable GPS button.
127      *
128      * Does set visibilities for manual location cursor and auto centering menu button.
129      *
130      * @param enabled true if enabled, false otherwise
131      */
132     void setGPSButtonEnabled(bool enabled);
133
134     /**
135      * @brief Enable / disable direction indicator button.
136      *
137      * @param enabled true if shoud be enabled, false otherwise
138      */
139     void setIndicatorButtonEnabled(bool enabled);
140
141     /**
142      * @brief Set scene for MapView
143      *
144      * @param scene Scene to be set
145      */
146     void setMapViewScene(QGraphicsScene *scene);
147
148     /**
149      * Shows dialog with enable automatic location update question.
150      *
151      * @param text text to show in dialog
152      */
153     void showEnableAutomaticUpdateLocationDialog(const QString &text);
154
155     /**
156      * @brief Gets the username from member variable for saving purposes
157      *
158      * @return QString Username
159      */
160     const QString username();
161
162 public slots:
163     /**
164      * @brief Builds information box with message.
165      *
166      * @param message Information message
167      * @param modal Modal = true, non-modal false
168      */
169     void buildInformationBox(const QString &message, bool modal=false);
170
171     /**
172      * @brief Slot for failed login
173      */
174     void loginFailed();
175
176     /**
177      * @brief Slot to intercept signal when login with cookies is requested
178      */
179     void loginUsingCookies();
180
181     /**
182      * @brief Public slot, which open settings dialog
183      */
184     void openSettingsDialog();
185
186     /**
187      * @brief Set own location crosshair visibility
188      *
189      * @param visible
190      */
191     void setCrosshairVisibility(bool visible);
192
193     /**
194     * @brief Shows contact dialog.
195     *
196     * Shows contact dialog with contact's information.
197     * @param guid globally unique ID of a contact
198     */
199     void showContactDialog(const QString &guid);
200
201     /**
202      * @brief Public slot to intercept signal when old cerdentials are invalid or credentials
203      *        doesn't exist yet
204      */
205     void startLoginProcess();
206
207     /**
208      * @brief Toggle progress indicator.
209      *
210      * @param state true if progress indicator should be shown, false otherwise
211      */
212     void toggleProgressIndicator(bool state);
213
214     /**
215      * @brief Shows / hides Situare related UI items
216      *
217      */
218     void updateItemVisibility();
219
220 private:
221     /**
222      * @brief Build manual location setting cross hair and connect slots
223      */
224     void buildCrosshair();
225
226     /**
227      * @brief Build friend list panel and connect slots
228      */
229     void buildFriendListPanel();
230
231     /**
232      * @brief Build fullscreen toggle button and connect slots
233      */
234     void buildFullScreenButton();
235
236     /**
237      * @brief Build direction indicator button panel and connect signals
238      */
239     void buildIndicatorButtonPanel();
240
241
242     /**
243      * @brief Build location search panel and connect signals
244      */
245     void buildLocationSearchPanel();
246
247     /**
248      * @brief Build map and connect slots
249      */
250     void buildMap();
251
252     /**
253      * @brief Build map scale and connect slots
254      */
255     void buildMapScale();
256
257     /**
258      * @brief Build OSM license and connect slots
259      */
260     void buildOsmLicense();
261
262     /**
263      * @brief Build application panels
264      */
265     void buildPanels();
266
267     /**
268      * @brief Build routing panel and connect slots
269      */
270     void buildRoutingPanel();
271
272     /**
273      * @brief Build user info panel and connect slots
274      */
275     void buildUserInfoPanel();
276
277     /**
278      * @brief Build webview and connect slots
279      */
280     void buildWebView();
281
282     /**
283      * @brief Build zoom button panel and connect slots
284      */
285     void buildZoomButtonPanel();
286
287     /**
288      * @brief Private method to create the Menu items
289      */
290     void createMenus();
291
292     /**
293      * @brief Grab or release HW increase and decrease buttons.
294      *
295      * @param grab Use true for grabbing and false for releasing the keys
296      */
297     void grabZoomKeys(bool grab);
298
299     /**
300      * @brief Queues dialog/information box
301      *
302      * @param dialog Dialog to be added into queue
303      */
304     void queueDialog(QDialog *dialog);
305
306     /**
307      * @brief Shows queued error information box
308      *
309      */
310     void showErrorInformationBox();
311
312     /**
313      * @brief Shows queued information box
314      *
315      * @fn showInformationBox
316      */
317     void showInformationBox();
318
319 private slots:
320     /**
321      * @brief Slot for automatic update dialog finished.
322      *
323      * @result result code
324      */
325     void automaticUpdateDialogFinished(int result);
326
327     /**
328      * @brief Slot to intercept signal when dialog/information note is processed
329      *
330      * @param status Status of the dialog
331      */
332     void dialogFinished(int status);
333
334     /**
335      * @brief Slot for drawing the fullscreen toggle button
336      *
337      * @param size Size of the screen
338      */
339     void drawFullScreenButton(const QSize &size);
340
341     /**
342      * @brief Slot for drawing the map distance scale
343      *
344      * @param size Size of the screen
345      */
346     void drawMapScale(const QSize &size);
347
348     /**
349      * @brief Slot for drawing the Open Street Map license text
350      *
351      * @param size Size of the screen
352      */
353     void drawOsmLicense(const QSize &size);
354
355     /**
356      * @brief Slot to intercept signal when error dialog/information note is processed
357      *
358      * @param status Status of the dialog
359      */
360     void errorDialogFinished(int status);
361
362     /**
363      * @brief Slot for gps timeout.
364      *
365      * Called when request timeout occurs.
366      */
367     void gpsTimeout();
368
369     /**
370      * @brief Slot to load cookies from settings
371      */
372     void loadCookies();
373
374     /**
375      * @brief Slot to intercept signal when webview has finished loading webpage
376      *
377      * @param done Status of the loading
378      */
379     void loadDone(bool done);
380
381     /**
382     * @brief Called when map center point horizontal shifting is changed
383     *
384     * @param shifting New shifting value
385     */
386     void mapCenterHorizontalShiftingChanged(int shifting);
387
388     /**
389      * @brief Move the crosshair
390      */
391     void moveCrosshair();
392
393     /**
394      * @brief Slot to save cookies to settings
395      */
396     void saveCookies();
397
398     /**
399      * @brief Slot for settings dialog accepted.
400      */
401     void settingsDialogAccepted();
402
403     /**
404      * @brief Start location search (open search dialog)
405      */
406     void startLocationSearch();
407
408     /**
409      * @brief Toggle between fullscreen and normal window mode
410      */
411     void toggleFullScreen();
412
413     /**
414      * @brief Slot to intercept signal from webview's networkaccessmanager
415      *
416      * @param reply Network reply (contains errors)
417      */
418     void webViewRequestFinished(QNetworkReply* reply);
419
420 /*******************************************************************************
421  * SIGNALS
422  ******************************************************************************/
423 signals:
424     /**
425      * @brief Automatic centering setting changed by user
426      *
427      * @param enabled True if automatic centering is enabled, otherwise false
428      */
429     void autoCenteringTriggered(bool enabled);
430
431     /**
432      * @brief Signal that indicates when user has cancelled login process
433      *
434      */
435     void cancelLoginProcess();
436
437     /**
438      * @brief Signal for centering to coordinates.
439      *
440      * @param coordinates geo coordinates to center to.
441      */
442     void centerToCoordinates(const GeoCoordinate &coordinates);
443
444     /**
445      * @brief View should be centered to new location
446      *
447      * @param coordinate Scene coordinates of the new center point
448      */
449     void centerToSceneCoordinates(const SceneCoordinate &coordinate);
450
451     /**
452     * @brief Emitted when route is cleared
453     */
454     void clearRoute();
455
456     /**
457     * @brief Signal when direction and distance from current map center point to current GPS
458     *        location is changed
459     *
460     * @param direction Direction in degrees
461     * @param distance Distance in meters
462     * @param draw Should the indicator triangle be drawn or not
463     */
464     void directionIndicatorValuesUpdate(qreal direction, qreal distance, bool draw);
465
466     /**
467      * @brief Signal for enabling automatic location update.
468      *
469      * @param enabled true if enabled, false otherwise
470      * @param updateIntervalMsecs update interval in milliseconds
471      */
472     void enableAutomaticLocationUpdate(bool enabled, int updateIntervalMsecs = 0);
473
474     /**
475      * @brief Signals error
476      *
477      * @param context error context
478      * @param error error code
479      */
480     void error(const int context, const int error);
481
482     /**
483      * @brief Signal for requesting username from settings
484      *
485      */
486     void fetchUsernameFromSettings();
487
488     /**
489      * @brief Signals when friend's profile image is ready
490      *
491      * @param user Friend
492      */
493     void friendImageReady(User *user);
494
495     /**
496      * @brief GPS setting changed
497      *
498      * @param enabled True if GPS is enabled, otherwise false
499      */
500     void gpsTriggered(bool enabled);
501
502     /**
503      * @brief Signal for friend location ready.
504      *
505      * @param friendsList
506      */
507     void friendsLocationsReady(QList<User *> &friendsList);
508
509     /**
510     * @brief Emited when location request is parsed and is ready for further processing
511     *
512     * @param result List of Location items
513     */
514     void locationDataParsed(const QList<Location> &result);
515
516     /**
517      * @brief Signal is emitted when location item is clicked on map.
518      *
519      * @param userIDs list of friends user IDs in the group
520      */
521     void locationItemClicked(const QList<QString> &userIDs);
522
523     /**
524      * @brief Signal is emitted when location item is clicked in list.
525      *
526      * @param swBound south-west bound in GeoCoorinate
527      * @param neBound north-east bound in GeoCoordinate
528      */
529     void locationItemClicked(const GeoCoordinate &swBound, const GeoCoordinate &neBound);
530
531     /**
532      * @brief Signals when Login/Logout action is pressed
533      *
534      */
535     void loginActionPressed();
536
537     /**
538      * @brief MapView has been resized
539      *
540      * @param size view size
541      */
542     void mapViewResized(const QSize &size);
543
544     /**
545      * @brief Forwarding signal from MapView to MapEngine
546      *
547      * @param coordinate New center point coordinate
548      */
549     void mapViewScrolled(const SceneCoordinate &coordinate);
550
551     /**
552      * @brief Forwarding signal from MapEngine to MapView
553      */
554     void maxZoomLevelReached();
555
556     /**
557      * @brief Forwarding signal from MapEngine to MapView
558      */
559     void minZoomLevelReached();
560
561     /**
562      * @brief Forwarding signal from MapEngine to MapScale
563      */
564     void newMapResolution(qreal scale);
565
566     /**
567      * @brief Signal for refreshing user data.
568      *
569      */
570     void refreshUserData();
571
572     /**
573     * @brief Requests contact dialog.
574     *
575     * @param facebookId contact's facebookId
576     */
577     void requestContactDialog(const QString &facebookId);
578
579     /**
580      * @brief Signal for requesting reverseGeo from SituareEngine
581      *
582      */
583     void requestReverseGeo();
584
585     /**
586      * @brief Signals, when address data is ready
587      *
588      * @param address Street address
589      */
590     void reverseGeoReady(const QString &address);
591
592     /**
593     * @brief Emited when route is parsed and is ready for further processing
594     *
595     * @param route Route item containing parsed route details
596     */
597     void routeParsed(Route &route);
598
599     /**
600     * @brief Signal for routing to geo coordinates.
601     *
602     * @param coordinates destination geo coordinates
603     */
604     void routeTo(const GeoCoordinate &coordinates);
605
606     /**
607     * @brief Request routing to current cursor position
608     */
609     void routeToCursor();
610
611     /**
612      * @brief Signal to save username to settings
613      *
614      * @param username Username
615      */
616     void saveUsername(const QString &username);
617
618     /**
619      * @brief Signal for location search
620      *
621      * @param location QString location
622      */
623     void searchForLocation(QString location);
624
625     /**
626     * @brief Signal is emitted when search history item is clicked.
627     *
628     * @param searchString search string used
629     */
630     void searchHistoryItemClicked(const QString &searchString);
631
632     /**
633      * @brief Signal for requestLocationUpdate from SituareEngine
634      *
635      * @param status Status message
636      * @param publish Publish on Facebook
637      */
638     void statusUpdate(const QString &status, const bool &publish);
639
640     /**
641      * @brief Signals when webview's urlChanged signal is emitted
642      *
643      * @param url New url
644      */
645     void updateCredentials(const QUrl &url);
646
647     /**
648      * @brief Signals when updateLocationDialog's data must be cleared
649      *
650      */
651     void clearUpdateLocationDialogData();
652
653     /**
654     * @brief Dragging mode triggered.
655     */
656     void draggingModeTriggered();
657
658     /**
659      * @brief MapView has finished zooming
660      */
661     void viewZoomFinished();
662
663     /**
664      * @brief Signal for use location ready.
665      *
666      * @param user User object
667      */
668     void userLocationReady(User *user);
669
670     /**
671      * @brief Map zoom in request
672      */
673     void zoomIn();
674
675     /**
676      * @brief Forwarding signal from MapEngine to MapView
677      */
678     void zoomLevelChanged(int zoomLevel);
679
680     /**
681      * @brief Map zoom out request
682      */
683     void zoomOut();
684
685 /*******************************************************************************
686  * DATA MEMBERS
687  ******************************************************************************/
688 private:
689     bool m_errorShown;                      ///< Indicates if error dialog/note is shown
690     bool m_loggedIn;                        ///< Indicates login state
691     bool m_refresh;                         ///< Indicates when webpage is refreshed
692
693     int m_mapCenterHorizontalShifting;      ///< Amount of map center point horizontal shifting
694     int m_progressIndicatorCount;           ///< Indicates the number of progress indicator calls
695
696     QAction *m_gpsToggleAct;                ///< Action to trigger gps toggle
697     QAction *m_loginAct;                    ///< Action to Login/Logout
698     QAction *m_toSettingsAct;               ///< Action to trigger switch to settings dialog
699
700     QLabel *m_crosshair;                    ///< Label for center point crosshair
701     QLabel *m_osmLicense;                   ///< Label for Open Street Map license
702
703     QList<int> m_situareTabsIndexes;        ///< List of Situare tab indexes
704     QList<QDialog *> m_error_queue;         ///< QList type error dialog queue
705     QList<QDialog *> m_queue;               ///< QList type dialog queue
706
707     QMenu *m_viewMenu;                      ///< Object that hold the view menu items
708
709     QMessageBox *m_automaticUpdateLocationDialog;   ///< Automatic update location dialog
710
711     QString m_email;                        ///< Placeholder for email
712     QString m_password;                     ///< Placeholder for password
713
714     QWebView *m_webView;                    ///< Shows facebook login page
715
716     FacebookLoginBrowser *m_facebookLoginBrowser;
717     FriendListPanel *m_friendsListPanel;    ///< Instance of friends list panel
718     FullScreenButton *m_fullScreenButton;   ///< Instance of the fullscreen toggle button
719     IndicatorButtonPanel *m_indicatorButtonPanel;   ///< Instance of direction indicator button
720     LocationSearchPanel *m_locationSearchPanel;     ///< Location search panel
721     MapScale *m_mapScale;                   ///< Instance of the map scale
722     MapView *m_mapView;                     ///< Instance of the map view
723     NetworkCookieJar *m_cookieJar;          ///< Placeholder for QNetworkCookies
724     RoutingPanel *m_routingPanel;           ///< Instance of routing panel
725     TabbedPanel *m_tabbedPanel;             ///< Widget for tabbed panels
726     UserInfoPanel *m_userInfoPanel;         ///< Instance of the user information panel
727     ZoomButtonPanel *m_zoomButtonPanel;     ///< Instance of zoom button panel
728 };
729
730 #endif // MAINWINDOW_H