Chromium Code Reviews| Index: services/keyboard_native/key_layout.cc |
| diff --git a/services/keyboard_native/key_layout.cc b/services/keyboard_native/key_layout.cc |
| index a41eb6e492552f9899bf3bfeebef0c9a8a47c8e9..708c93c704bf2eedacae267cf6ccef3be94d06e7 100644 |
| --- a/services/keyboard_native/key_layout.cc |
| +++ b/services/keyboard_native/key_layout.cc |
| @@ -11,6 +11,8 @@ |
| #include "services/keyboard_native/kLowerCaseIcon.h" |
| #include "services/keyboard_native/kUpperCaseIcon.h" |
| #include "services/keyboard_native/key_layout.h" |
| +#include "services/keyboard_native/predictor.h" |
| +#include "services/keyboard_native/text_update_key.h" |
| #include "skia/ext/refptr.h" |
| #include "third_party/skia/include/core/SkCanvas.h" |
| #include "third_party/skia/include/core/SkImageDecoder.h" |
| @@ -33,9 +35,7 @@ class KeyLayout::TextKey : public Key { |
| ~TextKey() override {} |
| - void Draw(SkCanvas* canvas, |
| - const SkPaint& paint, |
| - const gfx::RectF& rect) override { |
| + void Draw(SkCanvas* canvas, SkPaint& paint, const gfx::RectF& rect) override { |
| float text_baseline_offset = rect.height() / 5.0f; |
| canvas->drawText(text_, strlen(text_), rect.x() + (rect.width() / 2.0f), |
| rect.y() + rect.height() - text_baseline_offset, paint); |
| @@ -67,9 +67,7 @@ class ImageKey : public KeyLayout::Key { |
| ~ImageKey() override {} |
| // Key implementation. |
| - void Draw(SkCanvas* canvas, |
| - const SkPaint& paint, |
| - const gfx::RectF& rect) override { |
| + void Draw(SkCanvas* canvas, SkPaint& paint, const gfx::RectF& rect) override { |
| // If our bitmap is somehow invalid, default to drawing the text of the key. |
| if (!bitmap_valid_) { |
| text_key_.Draw(canvas, paint, rect); |
| @@ -103,25 +101,30 @@ class ImageKey : public KeyLayout::Key { |
| KeyLayout::KeyLayout() |
| : on_text_callback_(), |
| + on_suggest_text_callback_(), |
| layout_(&letters_layout_), |
| key_map_(&lower_case_key_map_), |
| + predictor_(nullptr), |
| weak_factory_(this) { |
| InitLayouts(); |
| InitKeyMaps(); |
| } |
| KeyLayout::~KeyLayout() { |
| - for (auto& row : lower_case_key_map_) { |
| + for (size_t i = 0; i < lower_case_key_map_.size(); i++) { |
| + auto& row = lower_case_key_map_[i]; |
| for (auto& key : row) { |
| delete key; |
| } |
| } |
| - for (auto& row : upper_case_key_map_) { |
| + for (size_t i = 0; i < upper_case_key_map_.size(); i++) { |
| + auto& row = upper_case_key_map_[i]; |
| for (auto& key : row) { |
| delete key; |
| } |
| } |
| - for (auto& row : symbols_key_map_) { |
| + for (size_t i = 0; i < symbols_key_map_.size(); i++) { |
|
APW
2015/07/31 22:36:43
UNDO!
riajiang
2015/08/01 01:23:09
Done.
|
| + auto& row = symbols_key_map_[i]; |
| for (auto& key : row) { |
| delete key; |
| } |
| @@ -137,6 +140,11 @@ void KeyLayout::SetDeleteCallback(base::Callback<void()> on_delete_callback) { |
| on_delete_callback_ = on_delete_callback; |
| } |
| +void KeyLayout::SetSuggestTextCallback( |
| + base::Callback<void(const std::string&)> on_suggest_text_callback) { |
| + on_suggest_text_callback_ = on_suggest_text_callback; |
| +} |
| + |
| void KeyLayout::SetKeyArea(const gfx::RectF& key_area) { |
| key_area_ = key_area; |
| } |
| @@ -174,7 +182,6 @@ void KeyLayout::Draw(SkCanvas* canvas) { |
| key_index++) { |
| float key_width = static_cast<float>(key_area_.width()) * |
| (*layout_)[row_index][key_index]; |
| - |
| (*key_map_)[row_index][key_index]->Draw( |
| canvas, text_paint, |
| gfx::RectF(current_left, current_top, key_width, row_height)); |
| @@ -208,6 +215,11 @@ void KeyLayout::OnTouchUp(const gfx::PointF& touch_up) { |
| } |
| } |
| +void KeyLayout::SetPredictor(Predictor* predictor) { |
| + predictor_ = predictor; |
| + predictor_->SetSuggestionKeys(lower_case_key_map_[0]); |
| +} |
| + |
| void KeyLayout::InitLayouts() { |
| // Row layouts are specified by a vector of floats which indicate the percent |
| // width a given key takes up in that row. The floats of a given row *MUST* |
| @@ -219,12 +231,15 @@ void KeyLayout::InitLayouts() { |
| std::vector<float> seven_key_row_layout = { |
| 0.15f, 0.1f, 0.1f, 0.3f, 0.1f, 0.1f, 0.15f}; |
| std::vector<float> five_key_row_layout = {0.15f, 0.1f, 0.5f, 0.1f, 0.15f}; |
| + std::vector<float> three_key_row_layout = {0.33f, 0.33f, 0.33f}; |
| + letters_layout_.push_back(three_key_row_layout); |
| letters_layout_.push_back(ten_key_row_layout); |
| letters_layout_.push_back(nine_key_row_layout); |
| letters_layout_.push_back(nine_key_row_layout); |
| letters_layout_.push_back(five_key_row_layout); |
| + symbols_layout_.push_back(three_key_row_layout); |
| symbols_layout_.push_back(ten_key_row_layout); |
| symbols_layout_.push_back(nine_key_row_layout); |
| symbols_layout_.push_back(nine_key_row_layout); |
| @@ -236,13 +251,24 @@ void KeyLayout::OnKeyDoNothing(const TextKey& key) { |
| } |
| void KeyLayout::OnKeyEmitText(const TextKey& key) { |
| + predictor_->StoreCurWord(std::string(key.ToText())); |
| on_text_callback_.Run(std::string(key.ToText())); |
| } |
| void KeyLayout::OnKeyDelete(const TextKey& key) { |
| + predictor_->DeleteCharInCurWord(); |
| on_delete_callback_.Run(); |
| } |
| +void KeyLayout::OnSuggestKeyEmitText(const TextUpdateKey& key) { |
| + std::string update_string = std::string(key.ToText()); |
| + int delete_size = predictor_->ChoseSuggestWord(std::string(key.ToText())); |
|
APW
2015/07/31 22:36:43
ChooseSuggestedWord
riajiang
2015/08/01 01:23:09
Done.
|
| + for (int i = 0; i < delete_size; i++) { |
| + on_delete_callback_.Run(); |
| + } |
| + on_suggest_text_callback_.Run(update_string); |
| +} |
| + |
| void KeyLayout::OnKeySwitchToUpperCase(const TextKey& key) { |
| layout_ = &letters_layout_; |
| key_map_ = &upper_case_key_map_; |
| @@ -265,6 +291,8 @@ void KeyLayout::InitKeyMaps() { |
| base::Bind(&KeyLayout::OnKeyEmitText, weak_factory_.GetWeakPtr()); |
| base::Callback<void(const TextKey&)> delete_callback = |
| base::Bind(&KeyLayout::OnKeyDelete, weak_factory_.GetWeakPtr()); |
| + base::Callback<void(const TextUpdateKey&)> suggest_emit_text_callback = |
| + base::Bind(&KeyLayout::OnSuggestKeyEmitText, weak_factory_.GetWeakPtr()); |
| base::Callback<void(const TextKey&)> switch_to_upper_case_callback = |
| base::Bind(&KeyLayout::OnKeySwitchToUpperCase, |
| weak_factory_.GetWeakPtr()); |
| @@ -283,7 +311,12 @@ void KeyLayout::InitKeyMaps() { |
| ImageKey* action_image_key = |
| new ImageKey(":)", do_nothing_callback, keyboard_native::kActionIcon); |
| - std::vector<Key*> lower_case_key_map_row_one = { |
| + std::vector<KeyLayout::Key*> suggestion_strip_key_map_row = { |
|
APW
2015/07/31 22:36:43
lets make copies of these for each layout and then
riajiang
2015/08/01 01:23:09
Done.
|
| + new TextUpdateKey("", suggest_emit_text_callback), |
| + new TextUpdateKey("", suggest_emit_text_callback), |
| + new TextUpdateKey("", suggest_emit_text_callback)}; |
| + |
| + std::vector<KeyLayout::Key*> lower_case_key_map_row_one = { |
| new TextKey("q", emit_text_callback), |
| new TextKey("w", emit_text_callback), |
| new TextKey("e", emit_text_callback), |
| @@ -295,7 +328,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("i", emit_text_callback), |
| new TextKey("p", emit_text_callback)}; |
| - std::vector<Key*> lower_case_key_map_row_two = { |
| + std::vector<KeyLayout::Key*> lower_case_key_map_row_two = { |
|
APW
2015/07/31 22:36:43
why are these all now KeyLayout::?
riajiang
2015/08/01 01:23:09
Deleted
|
| new TextKey("a", emit_text_callback), |
| new TextKey("s", emit_text_callback), |
| new TextKey("d", emit_text_callback), |
| @@ -306,7 +339,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("k", emit_text_callback), |
| new TextKey("l", emit_text_callback)}; |
| - std::vector<Key*> lower_case_key_map_row_three = { |
| + std::vector<KeyLayout::Key*> lower_case_key_map_row_three = { |
| switch_to_upper_case_image_key, |
| new TextKey("z", emit_text_callback), |
| new TextKey("x", emit_text_callback), |
| @@ -317,19 +350,20 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("m", emit_text_callback), |
| delete_image_key}; |
| - std::vector<Key*> lower_case_key_map_row_four = { |
| + std::vector<KeyLayout::Key*> lower_case_key_map_row_four = { |
| new TextKey("sym", switch_to_symbols_callback), |
| new TextKey(",", emit_text_callback), |
| new TextKey(" ", emit_text_callback), |
| new TextKey(".", emit_text_callback), |
| action_image_key}; |
| - lower_case_key_map_ = {lower_case_key_map_row_one, |
| + lower_case_key_map_ = {suggestion_strip_key_map_row, |
| + lower_case_key_map_row_one, |
| lower_case_key_map_row_two, |
| lower_case_key_map_row_three, |
| lower_case_key_map_row_four}; |
| - std::vector<Key*> upper_case_key_map_row_one = { |
| + std::vector<KeyLayout::Key*> upper_case_key_map_row_one = { |
| new TextKey("Q", emit_text_callback), |
| new TextKey("W", emit_text_callback), |
| new TextKey("E", emit_text_callback), |
| @@ -341,7 +375,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("I", emit_text_callback), |
| new TextKey("P", emit_text_callback)}; |
| - std::vector<Key*> upper_case_key_map_row_two = { |
| + std::vector<KeyLayout::Key*> upper_case_key_map_row_two = { |
| new TextKey("A", emit_text_callback), |
| new TextKey("S", emit_text_callback), |
| new TextKey("D", emit_text_callback), |
| @@ -352,7 +386,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("K", emit_text_callback), |
| new TextKey("L", emit_text_callback)}; |
| - std::vector<Key*> upper_case_key_map_row_three = { |
| + std::vector<KeyLayout::Key*> upper_case_key_map_row_three = { |
| switch_to_lower_case_image_key, |
| new TextKey("Z", emit_text_callback), |
| new TextKey("X", emit_text_callback), |
| @@ -363,19 +397,20 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("M", emit_text_callback), |
| delete_image_key}; |
| - std::vector<Key*> upper_case_key_map_row_four = { |
| + std::vector<KeyLayout::Key*> upper_case_key_map_row_four = { |
| new TextKey("SYM", switch_to_symbols_callback), |
| new TextKey(",", emit_text_callback), |
| new TextKey(" ", emit_text_callback), |
| new TextKey(".", emit_text_callback), |
| action_image_key}; |
| - upper_case_key_map_ = {upper_case_key_map_row_one, |
| + upper_case_key_map_ = {suggestion_strip_key_map_row, |
| + upper_case_key_map_row_one, |
| upper_case_key_map_row_two, |
| upper_case_key_map_row_three, |
| upper_case_key_map_row_four}; |
| - std::vector<Key*> symbols_key_map_row_one = { |
| + std::vector<KeyLayout::Key*> symbols_key_map_row_one = { |
| new TextKey("1", emit_text_callback), |
| new TextKey("2", emit_text_callback), |
| new TextKey("3", emit_text_callback), |
| @@ -387,7 +422,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("9", emit_text_callback), |
| new TextKey("0", emit_text_callback)}; |
| - std::vector<Key*> symbols_key_map_row_two = { |
| + std::vector<KeyLayout::Key*> symbols_key_map_row_two = { |
| new TextKey("@", emit_text_callback), |
| new TextKey("#", emit_text_callback), |
| new TextKey("$", emit_text_callback), |
| @@ -398,7 +433,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("(", emit_text_callback), |
| new TextKey(")", emit_text_callback)}; |
| - std::vector<Key*> symbols_key_map_row_three = { |
| + std::vector<KeyLayout::Key*> symbols_key_map_row_three = { |
| new TextKey("=\\<", switch_to_symbols_callback), |
| new TextKey("*", emit_text_callback), |
| new TextKey("\"", emit_text_callback), |
| @@ -409,7 +444,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("?", emit_text_callback), |
| delete_image_key}; |
| - std::vector<Key*> symbols_key_map_row_four = { |
| + std::vector<KeyLayout::Key*> symbols_key_map_row_four = { |
| new TextKey("ABC", switch_to_lower_case_callback), |
| new TextKey(",", emit_text_callback), |
| new TextKey("_", emit_text_callback), |
| @@ -418,10 +453,11 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey(".", emit_text_callback), |
| action_image_key}; |
| - symbols_key_map_ = {symbols_key_map_row_one, |
| + symbols_key_map_ = {suggestion_strip_key_map_row, |
| + symbols_key_map_row_one, |
| symbols_key_map_row_two, |
| symbols_key_map_row_three, |
| symbols_key_map_row_four}; |
| } |
| -} |
| -// namespace keyboard |
| + |
| +} // namespace keyboard |