| 39 | // ### TextObjectPartInfo ### |
| 40 | |
| 41 | int TextObjectPartInfo::getIndex(double pos_x) const |
| 42 | { |
| 43 | int left = 0; |
| 44 | int right = part_text.length(); |
| 45 | while (right != left) |
| 46 | { |
| 47 | int middle = (left + right) / 2; |
| 48 | double x = part_x + metrics.width(part_text.left(middle)); |
| 49 | if (pos_x >= x) |
| 50 | { |
| 51 | if (middle >= right) |
| 52 | return right; |
| 53 | double next = part_x + metrics.width(part_text.left(middle + 1)); |
| 54 | if (pos_x < next) |
| 55 | if (pos_x < (x + next) / 2) |
| 56 | return middle; |
| 57 | else |
| 58 | return middle + 1; |
| 59 | else |
| 60 | left = middle + 1; |
| 61 | } |
| 62 | else // if (point.x() < x) |
| 63 | { |
| 64 | if (middle <= 0) |
| 65 | return 0; |
| 66 | double prev = part_x + metrics.width(part_text.left(middle - 1)); |
| 67 | if (pos_x > prev) |
| 68 | if (pos_x > (x + prev) / 2) |
| 69 | return middle; |
| 70 | else |
| 71 | return middle - 1; |
| 72 | else |
| 73 | right = middle - 1; |
| 74 | } |
| 75 | } |
| 76 | return right; |
| 77 | } |
| 78 | |
| 79 | |
| 80 | |