Ticket #791: mythstroke.h

File mythstroke.h, 4.4 KB (added by mfgalizi@…, 20 years ago)

Gesture stuff

Line 
1/**
2 * @file mythstroke.h
3 * @author Micah F. Galizia <mfgalizi@csd.uwo.ca>
4 * @brief A C++ ripoff of the stroke library for MythTV.
5 *
6 * Copyright (C) 2005 Micah Galizia
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2, or (at
11 * your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21 * 02111-1307, USA
22 */
23#ifndef MYTHSTROKE_H
24#define MYTHSTROKE_H
25
26#include <sys/types.h>
27
28#include <qpoint.h>
29#include <qvaluelist.h>
30#include <qevent.h>
31
32const int MythGestureEventType = 24427;
33
34class MythGestureEvent : public QCustomEvent
35{
36
37 public:
38
39 /**
40 * @brief The types of gestures supported by myth
41 */
42 enum Gesture {
43
44 /* Couldn't figure out that one */
45 Unknown,
46
47 /* A click */
48 Click,
49
50 /* Horizontal and vertical lines */
51 Up,
52 Down,
53 Left,
54 Right,
55
56 /* Diagonal lines */
57 UpLeft,
58 UpRight,
59 DownLeft,
60 DownRight,
61
62 /* Two Lines */
63 UpThenLeft,
64 UpThenRight,
65 DownThenLeft,
66 DownThenRight,
67 LeftThenUp,
68 LeftThenDown,
69 RightThenUp,
70 RightThenDown,
71
72 /* This isn't real */
73 MaxGesture
74 };
75
76 /**
77 * @brief Create a myth gesture.
78 * @param type The gesture type, as per the Type enumeration.
79 * @sa Type
80 */
81 inline MythGestureEvent(size_t gesture):QCustomEvent(MythGestureEventType)
82 {
83 (gesture >= MaxGesture) ? _gesture = Unknown : _gesture = gesture;
84 }
85
86 /**
87 * @brief Get the gesture type.
88 * @return The gesture value corresponding to the Gesture
89 * enumeration.
90 */
91 inline int gesture(void) const { return this->_gesture; }
92
93 /**
94 * @brief Get the symbolic name of the gesture.
95 * @return A string containing the symbolic name of the gesture.
96 */
97 operator QString() const;
98
99 private:
100 size_t _gesture;
101};
102
103
104
105/**
106 * @class MythStroke
107 * @brief Contains the points in a stroke, and translates them into
108 * gestures.
109 */
110class MythStroke
111{
112 public:
113
114 /**
115 * @brief Create a new stroke, specifying tuning values
116 *
117 * @param max_points The maximum number of points to record.
118 * @param min_points The minimum number of points to record.
119 * @param max_sequence The maximum producible sequence size.
120 * @param scale_ratio The stroke scale ratio
121 * @param bin_percent The bin count percentage required
122 * to add to the sequence.
123 */
124 MythStroke(size_t max_points = 10000, size_t min_points = 50,
125 size_t max_sequence = 20, size_t scale_ratio = 4,
126 float bin_percent = 0.07);
127
128 /**
129 * @brief Start recording.
130 */
131 inline void start(void) { this->recording = true; }
132
133
134 /**
135 * @brief Complete the stroke.
136 * @return A new gesture event, or NULL on error.
137 *
138 * After a stroke is completed, it will no longer record.
139 */
140 MythGestureEvent *complete();
141
142 /**
143 * @brief Record a point.
144 * @param p The point to record.
145 * @return True if the point was recorded, otherwise, false.
146 */
147 bool record(const QPoint &p);
148
149 /**
150 * @brief Determine if the stroke has the minimum required points.
151 * @return true if the gesture can be translated, otherwise, false.
152 */
153 bool hasMinimumPoints(void) const { return points.size() >= min_points; }
154
155 protected:
156
157 /**
158 * @brief Translate the stroke into a sequence.
159 * @return The sequence string made by the mouse.
160 *
161 * @note The points will be removed during this method.
162 */
163 QString translate(void);
164
165 /**
166 * @brief Adjust horizontal and vertical extremes.
167 * @param x The new horizontal extreme.
168 * @param y The new vertical extreme
169 */
170 void adjustExtremes(int x, int y);
171
172 private:
173
174 bool recording;
175 int min_x;
176 int max_x;
177 int min_y;
178 int max_y;
179 size_t max_points;
180 size_t min_points;
181 size_t max_sequence;
182 int scale_ratio;
183 float bin_percent;
184 QValueList <QPoint> points;
185 QMap <QString, MythGestureEvent::Gesture> sequences;
186};
187
188#endif /* MYTHSTROKE_H */