diff options
author | Jared Adams <jaxad0127@gmail.com> | 2010-08-29 09:01:27 -0600 |
---|---|---|
committer | Jared Adams <jaxad0127@gmail.com> | 2010-08-29 22:19:24 -0600 |
commit | d55c1345449a34adb3192c23fe3760bd0aae645b (patch) | |
tree | 0dfe78eba2571b2f156c14deafe375d3f3241164 /src/gui/widgets/textfield.cpp | |
parent | b61faa43db7a48c6a6871fb94dce2de2abd79dfe (diff) | |
download | mana-d55c1345449a34adb3192c23fe3760bd0aae645b.tar.gz mana-d55c1345449a34adb3192c23fe3760bd0aae645b.tar.bz2 mana-d55c1345449a34adb3192c23fe3760bd0aae645b.tar.xz mana-d55c1345449a34adb3192c23fe3760bd0aae645b.zip |
Move handling of autocomplete and input history into TextField
Reviewed-by: Freeyorp
Diffstat (limited to 'src/gui/widgets/textfield.cpp')
-rw-r--r-- | src/gui/widgets/textfield.cpp | 137 |
1 files changed, 124 insertions, 13 deletions
diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index 60a1f57f..3e02be98 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -25,7 +25,6 @@ #include "configuration.h" #include "graphics.h" -#include "gui/chat.h" #include "gui/palette.h" #include "gui/sdlinput.h" #include "gui/theme.h" @@ -34,6 +33,7 @@ #include "utils/copynpaste.h" #include "utils/dtor.h" +#include "utils/stringutils.h" #include <guichan/font.hpp> @@ -46,7 +46,8 @@ ImageRect TextField::skin; TextField::TextField(const std::string &text, bool loseFocusOnTab): gcn::TextField(text), mNumeric(false), - mAutoComplete(false) + mAutoComplete(NULL), + mHistory(NULL) { setFrameSize(2); @@ -212,6 +213,42 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent) } } break; + case Key::UP: + { + if (mHistory && !mHistory->atBegining() && !mHistory->empty()) + { + // Move backward through the history + mHistory->current--; + setText(*mHistory->current); + setCaretPosition(getText().length()); + } + } break; + + case Key::DOWN: + { + if (mHistory && !mHistory->atEnd()) + { + // Move forward through the history + TextHistoryIterator prevHist = mHistory->current++; + + if (!mHistory->atEnd()) + { + setText(*mHistory->current); + setCaretPosition(getText().length()); + } + else + { + setText(""); + mHistory->current = prevHist; + } + } + else if (getText() != "") + { + // Always clear (easy access to useful function) + setText(""); + } + } break; + case Key::DELETE: { unsigned sz = mText.size(); @@ -237,6 +274,19 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent) } break; case Key::ENTER: + if (mHistory) + { + mHistory->toEnd(); + + // If the input is different from previous, put it in the history + if (mHistory->empty() || !mHistory->matchesEntry(getText())) + { + mHistory->addEntry(getText()); + } + + mHistory->toEnd(); + } + distributeActionEvent(); break; @@ -249,17 +299,7 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent) break; case Key::TAB: - if (mAutoComplete && mText.size() > 0) - { - std::vector<std::string> names; - beingManager->getPlayerNames(names, false); - std::string newName = chatWindow->autoComplete(names, mText); - if (newName != "") - { - setText(newName); - setCaretPosition(mText.size()); - } - } + autoComplete(); if (mLoseFocusOnTab) return; break; @@ -273,6 +313,77 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent) fixScroll(); } +void TextField::autoComplete() +{ + if (mAutoComplete && mText.size() > 0) + { + int caretPos = getCaretPosition(); + int startName = 0; + const std::string inputText = getText(); + std::string name = inputText.substr(0, caretPos); + std::string newName(""); + + for (int f = caretPos - 1; f > -1; f --) + { + if (isWordSeparator(inputText[f])) + { + startName = f + 1; + name = inputText.substr(f + 1, caretPos - f); + break; + } + } + + if (caretPos - 1 + 1 != startName) + return; + + + std::vector<std::string> nameList; + mAutoComplete->getAutoCompleteList(nameList); + newName = autocomplete(nameList, name); + + if (newName == "" && mHistory) + { + + TextHistoryIterator i = mHistory->history.begin(); + std::vector<std::string> nameList; + + while (i != mHistory->history.end()) + { + std::string line = *i; + unsigned int f = 0; + while (f < line.length() && !isWordSeparator(line.at(f))) + { + f++; + } + line = line.substr(0, f); + if (line != "") + { + nameList.push_back(line); + } + ++i; + } + + newName = autocomplete(nameList, name); + } + + if (newName != "") + { + if(inputText[0] == '@' || inputText[0] == '/') + newName = "\"" + newName + "\""; + + setText(inputText.substr(0, startName) + newName + + inputText.substr(caretPos, inputText.length() + - caretPos)); + + if (startName > 0) + setCaretPosition(caretPos - name.length() + newName.length() + + 1); + else + setCaretPosition(caretPos - name.length() + newName.length()); + } + } +} + void TextField::handlePaste() { std::string text = getText(); |