1 #ifndef DALI_TOOLKIT_TEXT_CURSOR_HELPER_FUNCTIONS_H
2 #define DALI_TOOLKIT_TEXT_CURSOR_HELPER_FUNCTIONS_H
5 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali-toolkit/internal/text/logical-model-impl.h>
23 #include <dali-toolkit/internal/text/metrics.h>
24 #include <dali-toolkit/internal/text/visual-model-impl.h>
35 struct CharacterHitTest
38 * @brief Enumeration of the types of hit test.
42 TAP, ///< Retrieves the first or last character of the line if the touch point is outside of the boundaries of the text.
43 SCROLL ///< Retrieves the character above or below to the touch point if it's outside of the boundaries of the text.
55 primaryCursorHeight( 0.f ),
56 secondaryCursorHeight( 0.f ),
57 isSecondaryCursor( false )
63 Vector2 primaryPosition; ///< The primary cursor's position (in text's coords).
64 Vector2 secondaryPosition; ///< The secondary cursor's position (in text's coords).
65 float lineOffset; ///< The vertical offset where the line containing the cursor starts.
66 float glyphOffset; ///< The difference of line ascender and glyph ascender.
67 float lineHeight; ///< The height of the line where the cursor is placed.
68 float primaryCursorHeight; ///< The primary cursor's height.
69 float secondaryCursorHeight; ///< The secondary cursor's height.
70 bool isSecondaryCursor; ///< Whether the secondary cursor is valid.
74 * @brief Parameters passed to the GetCursorPosition() function.
76 struct GetCursorPositionParameters
78 VisualModelPtr visualModel; ///< The visual model.
79 LogicalModelPtr logicalModel; ///< The logical model.
80 MetricsPtr metrics; ///< A wrapper around FontClient used to get metrics.
81 CharacterIndex logical; ///< The logical cursor position (in characters). 0 is just before the first character, a value equal to the number of characters is just after the last character.
82 bool isMultiline; ///< Whether the text control is multi-line.
86 * @brief Retrieves the closest line for a given touch point.
88 * It returns the first line if the touch point is above the text and the last line if the touch point is below.
90 * @param[in] visualModel The visual model.
91 * @param[in] visualY The touch point 'y' in text's coords.
92 * @param[out] matchedLine Whether the touch point actually hits a line.
94 * @return A line index.
96 LineIndex GetClosestLine( VisualModelPtr visualModel,
101 * @brief Calculates the vertical line's offset for a given line.
103 * @pre @p lineIndex must be between 0 and the number of lines (both inclusive).
105 * @param[in] lines The laid-out lines.
106 * @param[in] lineIndex Index to the line.
108 * @return The vertical offset of the given line.
110 float CalculateLineOffset( const Vector<LineRun>& lines,
111 LineIndex lineIndex );
114 * @brief Retrieves the cursor's logical position for a given touch point x,y
116 * There are two types of hit test: CharacterHitTest::TAP retrieves the first or
117 * last character of a line if the touch point is outside the boundaries of the
118 * text, CharacterHitTest::SCROLL retrieves the character above or below to the
119 * touch point if it's outside the boundaries of the text.
121 * @param[in] visualModel The visual model.
122 * @param[in] logicalModel The logical model.
123 * @param[in] metrics A wrapper around FontClient used to get metrics.
124 * @param[in] visualX The touch point 'x' in text's coords.
125 * @param[in] visualY The touch point 'y' in text's coords.
126 * @param[in] mode The type of hit test.
127 * @param[out] matchedCharacter Whether the touch point actually hits a character.
129 * @return The logical cursor position (in characters). 0 is just before the first character, a value equal to the number of characters is just after the last character.
131 CharacterIndex GetClosestCursorIndex( VisualModelPtr visualModel,
132 LogicalModelPtr logicalModel,
136 CharacterHitTest::Mode mode,
137 bool& matchedCharacter );
140 * @brief Calculates the cursor's position for a given character index in the logical order.
142 * It retrieves as well the line's height and the cursor's height and
143 * if there is a valid alternative cursor, its position and height.
145 * @param[in] parameters Parameters used to calculate the cursor's position.
146 * @param[out] cursorInfo The line's height, the cursor's height, the cursor's position and whether there is an alternative cursor.
148 void GetCursorPosition( GetCursorPositionParameters& parameters,
149 CursorInfo& cursorInfo );
152 * @brief Find the indices to the first and last characters of a word for the given touch point.
154 * @param[in] visualModel The visual model.
155 * @param[in] logicalModel The logical model.
156 * @param[in] metrics A wrapper around FontClient used to get metrics.
157 * @param[in] visualX The touch point 'x' in text's coords.
158 * @param[in] visualY The touch point 'y' in text's coords.
159 * @param[out] startIndex Index to the first character of the selected word.
160 * @param[out] endIndex Index to the last character of the selected word.
161 * @param[out] noTextHitIndex Index to the nearest character when there is no hit.
163 * @return @e true if the touch point hits a character.
165 bool FindSelectionIndices( VisualModelPtr visualModel,
166 LogicalModelPtr logicalModel,
170 CharacterIndex& startIndex,
171 CharacterIndex& endIndex,
172 CharacterIndex& noTextHitIndex );
176 } // namespace Toolkit
180 #endif // DALI_TOOLKIT_TEXT_CURSOR_HELPER_FUNCTIONS_H