Added fibration feedback feature.
[situare] / src / ui / indicatorbutton.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         Katri Kaikkonen - katri.kaikkonen@ixonos.com
7
8     Situare is free software; you can redistribute it and/or
9     modify it under the terms of the GNU General Public License
10     version 2 as published by the Free Software Foundation.
11
12     Situare is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with Situare; if not, write to the Free Software
19     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
20     USA.
21 */
22
23 #ifndef INDICATORBUTTON_H
24 #define INDICATORBUTTON_H
25
26 #include <QMouseEvent>
27 #include <QTimer>
28 #include <QToolButton>
29 #include <QWidget>
30
31 /**
32  * @brief Indicator button class
33  *
34  * @author Katri Kaikkonen - katri.kaikkonen (at) ixonos.com
35  *
36  * @class IndicatorButton indicatorbutton.h "ui/indicatorbutton.h"
37  */
38 class IndicatorButton : public  QToolButton
39 {
40     Q_OBJECT
41
42 public:
43     /**
44      * @brief Constructor
45      *
46      * @param parent Parent widget
47      */
48     IndicatorButton(QWidget *parent = 0);
49
50     /**
51      * @brief Desctructor
52      */
53     ~IndicatorButton();
54
55 /*******************************************************************************
56  * BASE CLASS INHERITED AND REIMPLEMENTED MEMBER FUNCTIONS
57  ******************************************************************************/
58 protected:
59     /**
60      * @brief Move event for the distance indicator button
61      *
62      * @param event Mouse event
63      */
64     void mouseMoveEvent(QMouseEvent *event);
65
66     /**
67      * @brief Press event for the distance indicator button
68      *
69      * @param event Mouse event
70      */
71     void mousePressEvent(QMouseEvent *event);
72
73     /**
74      * @brief Event handler for mouse release events
75      *
76      * @param event Mouse event
77      */
78     void mouseReleaseEvent(QMouseEvent *event);
79
80     /**
81      * @brief Event handler for paint events
82      *
83      * Paints the button and its icon
84      * @param event Paint event
85      */
86     void paintEvent(QPaintEvent *event);
87
88 /*******************************************************************************
89  * MEMBER FUNCTIONS AND SLOTS
90  ******************************************************************************/
91 public slots:
92     /**
93      * @brief Relative position of the event inside the widget
94      */
95     const QPoint& eventPosition();
96
97     /**
98      * @brief Slot to redraw the panel after window resize event
99      *
100      * @param size Size of the new screen
101      */
102     void screenResized(const QSize &size);
103
104     /**
105      * @brief Toggle distance indicator button draggability
106      */
107     void setDraggable(bool mode, QPoint eventPosition = QPoint(0,0));
108
109 private slots:
110     /**
111      * @brief Safeguard slot to release mouse grab if something goes horribly wrong
112      */
113     void forceMouseRelease();
114
115     /**
116      * @brief Slot that handles drag initialization once timer has timed out
117      */
118     void timerExpired();
119
120 /*******************************************************************************
121  * SIGNALS
122  ******************************************************************************/
123 signals:
124     /**
125      * @brief Automatic centering setting changed by user
126      *
127      * @param enabled True if automatic centering is enabled, otherwise false
128      */
129     void autoCenteringTriggered(bool enabled);
130
131     /**
132     * @brief Dragging mode triggered.
133     */
134     void draggingModeTriggered();
135
136 /*******************************************************************************
137  * DATA MEMBERS
138  ******************************************************************************/
139 private:
140     bool m_isDraggable;             ///< Boolean for tracking the draggability state
141
142     QColor *m_normalColor;                  ///< Normal background color
143
144     QLinearGradient *m_selectedGradient;    ///< Selected background
145
146     QPixmap m_indicatorLeds[2];             ///< Placeholder for images
147
148     QPoint m_dragPosition;          ///< Location from where the widget is grabbed
149     QPoint m_eventPosition;         ///< Position of mousePressEvent
150
151     QSize m_screenSize;             ///< Store for the screen size
152
153     QTimer *m_dragStartTimer;       ///< Timer to init draggability of the distance indicator button
154     QTimer *m_forceReleaseTimer;    ///< Timer to run forceMouseRelease
155 };
156
157 #endif // INDICATORBUTTON_H