diff options
author | elektrahesse | 2010-10-10 15:55:33 +0200 |
---|---|---|
committer | elektrahesse | 2010-10-10 15:55:33 +0200 |
commit | 5416c3f1d417eea9a24cba00a91cc6aca8dc30ad (patch) | |
tree | 0c499d86204412c362d08bc15618591ed455f521 /linden/indra | |
parent | Added missing rlva_strings.xml file (diff) | |
download | meta-impy-5416c3f1d417eea9a24cba00a91cc6aca8dc30ad.zip meta-impy-5416c3f1d417eea9a24cba00a91cc6aca8dc30ad.tar.gz meta-impy-5416c3f1d417eea9a24cba00a91cc6aca8dc30ad.tar.bz2 meta-impy-5416c3f1d417eea9a24cba00a91cc6aca8dc30ad.tar.xz |
RED-628: Tab completion isn't setting the cursor in the right position.
Now the cursor goes to the end of the selected part. It's impossible to deselect on the fly upon keystroke unless we go hacking in LLLineEditor, which takes the key down before even reaching the chatbar...
Diffstat (limited to '')
-rw-r--r-- | linden/indra/newview/llchatbar.cpp | 42 | ||||
-rw-r--r-- | linden/indra/newview/llchatbar.h | 2 |
2 files changed, 20 insertions, 24 deletions
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp index 19ac2ab..e393342 100644 --- a/linden/indra/newview/llchatbar.cpp +++ b/linden/indra/newview/llchatbar.cpp | |||
@@ -122,6 +122,8 @@ LLChatBar::LLChatBar() | |||
122 | mCompletionHolder.current_index = 0; | 122 | mCompletionHolder.current_index = 0; |
123 | mCompletionHolder.last_match = ""; | 123 | mCompletionHolder.last_match = ""; |
124 | mCompletionHolder.last_txt = ""; | 124 | mCompletionHolder.last_txt = ""; |
125 | mCompletionHolder.cursorPos = -1; | ||
126 | mCompletionHolder.selected = false; | ||
125 | 127 | ||
126 | #if !LL_RELEASE_FOR_DOWNLOAD | 128 | #if !LL_RELEASE_FOR_DOWNLOAD |
127 | childDisplayNotFound(); | 129 | childDisplayNotFound(); |
@@ -227,16 +229,17 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask ) | |||
227 | 229 | ||
228 | if (!avatar_ids.empty() && !txt.empty()) | 230 | if (!avatar_ids.empty() && !txt.empty()) |
229 | { | 231 | { |
230 | S32 cursorPos = mInputEditor->getCursor(); | 232 | if (mCompletionHolder.cursorPos == -1) // Ele: cache cursor position |
233 | mCompletionHolder.cursorPos = mInputEditor->getCursor(); | ||
231 | 234 | ||
232 | if (mCompletionHolder.last_txt != mInputEditor->getText()) | 235 | if (mCompletionHolder.last_txt != mInputEditor->getText()) |
233 | { | 236 | { |
234 | mCompletionHolder.last_txt = std::string(mInputEditor->getText()); | 237 | mCompletionHolder.last_txt = std::string(mInputEditor->getText()); |
235 | 238 | ||
236 | if (cursorPos < (S32)txt.length()) | 239 | if (mCompletionHolder.cursorPos < (S32)txt.length()) |
237 | { | 240 | { |
238 | mCompletionHolder.right = txt.substr(cursorPos); | 241 | mCompletionHolder.right = txt.substr(mCompletionHolder.cursorPos); |
239 | mCompletionHolder.left = txt.substr(0, cursorPos); | 242 | mCompletionHolder.left = txt.substr(0, mCompletionHolder.cursorPos); |
240 | mCompletionHolder.match = std::string(mCompletionHolder.left); | 243 | mCompletionHolder.match = std::string(mCompletionHolder.left); |
241 | } | 244 | } |
242 | else | 245 | else |
@@ -265,24 +268,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask ) | |||
265 | { | 268 | { |
266 | if (avatar_ids[i] == gAgent.getID() || avatar_ids[i].isNull()) | 269 | if (avatar_ids[i] == gAgent.getID() || avatar_ids[i].isNull()) |
267 | continue; | 270 | continue; |
268 | /* | ||
269 | // Grab the pos again from the objects-in-view cache... LLWorld doesn't work above 1024 meters as usual :( | ||
270 | LLVector3d real_pos = positions[i]; | ||
271 | if (real_pos[2] == 0.0f) | ||
272 | { | ||
273 | LLViewerObject *av_obj = gObjectList.findObject(avatar_ids[i]); | ||
274 | if (av_obj != NULL && av_obj->isAvatar()) | ||
275 | { | ||
276 | LLVOAvatar* avatarp = (LLVOAvatar*)av_obj; | ||
277 | if (avatarp != NULL) | ||
278 | real_pos = avatarp->getPositionGlobal(); | ||
279 | } | ||
280 | } | ||
281 | 271 | ||
282 | F32 dist = F32(dist_vec(positions[i], gAgent.getPositionGlobal())); | ||
283 | if (dist > CHAT_SHOUT_RADIUS) | ||
284 | continue; | ||
285 | */ | ||
286 | std::string agent_name = " "; | 272 | std::string agent_name = " "; |
287 | std::string agent_surname = " "; | 273 | std::string agent_surname = " "; |
288 | 274 | ||
@@ -308,15 +294,22 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask ) | |||
308 | std::string current_name = mCompletionHolder.names[mCompletionHolder.current_index]; | 294 | std::string current_name = mCompletionHolder.names[mCompletionHolder.current_index]; |
309 | 295 | ||
310 | mInputEditor->setText(mCompletionHolder.left.substr(0, mCompletionHolder.left.length() - mCompletionHolder.match.length()) + current_name + mCompletionHolder.right); | 296 | mInputEditor->setText(mCompletionHolder.left.substr(0, mCompletionHolder.left.length() - mCompletionHolder.match.length()) + current_name + mCompletionHolder.right); |
311 | mInputEditor->setSelection(cursorPos, cursorPos + (current_name.length() - mCompletionHolder.match.length())); | 297 | mInputEditor->setCursor(mCompletionHolder.cursorPos + (current_name.length() - mCompletionHolder.match.length())); |
298 | mInputEditor->setSelection(mCompletionHolder.cursorPos, mCompletionHolder.cursorPos + (current_name.length() - mCompletionHolder.match.length())); | ||
312 | 299 | ||
313 | mCompletionHolder.current_index++; | 300 | mCompletionHolder.current_index++; |
301 | mCompletionHolder.selected = TRUE; | ||
314 | 302 | ||
315 | return TRUE; | 303 | return TRUE; |
316 | } | 304 | } |
317 | } | 305 | } |
318 | } | 306 | } |
319 | } | 307 | } |
308 | else | ||
309 | { | ||
310 | mCompletionHolder.cursorPos = -1; | ||
311 | mInputEditor->deselect(); | ||
312 | } | ||
320 | 313 | ||
321 | return handled; | 314 | return handled; |
322 | } | 315 | } |
@@ -663,6 +656,9 @@ void LLChatBar::stopChat() | |||
663 | void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) | 656 | void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) |
664 | { | 657 | { |
665 | LLChatBar* self = (LLChatBar *)userdata; | 658 | LLChatBar* self = (LLChatBar *)userdata; |
659 | KEY key = gKeyboard->currentKey(); | ||
660 | |||
661 | self->mCompletionHolder.cursorPos = -1; // Ele: reset cached cursor pos for autocompletion | ||
666 | 662 | ||
667 | LLWString raw_text; | 663 | LLWString raw_text; |
668 | if (self->mInputEditor) raw_text = self->mInputEditor->getWText(); | 664 | if (self->mInputEditor) raw_text = self->mInputEditor->getWText(); |
@@ -707,8 +703,6 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) | |||
707 | } | 703 | } |
708 | */ | 704 | */ |
709 | 705 | ||
710 | KEY key = gKeyboard->currentKey(); | ||
711 | |||
712 | // Ignore "special" keys, like backspace, arrows, etc. | 706 | // Ignore "special" keys, like backspace, arrows, etc. |
713 | if (length > 1 && raw_text[0] == '/' && key < KEY_SPECIAL) | 707 | if (length > 1 && raw_text[0] == '/' && key < KEY_SPECIAL) |
714 | { | 708 | { |
diff --git a/linden/indra/newview/llchatbar.h b/linden/indra/newview/llchatbar.h index 5542d8a..3e7ee03 100644 --- a/linden/indra/newview/llchatbar.h +++ b/linden/indra/newview/llchatbar.h | |||
@@ -54,6 +54,8 @@ struct CompletionHolder { | |||
54 | std::string last_txt; | 54 | std::string last_txt; |
55 | std::string last_match; | 55 | std::string last_match; |
56 | int current_index; | 56 | int current_index; |
57 | S32 cursorPos; | ||
58 | BOOL selected; | ||
57 | }; | 59 | }; |
58 | 60 | ||
59 | class LLChatBar | 61 | class LLChatBar |