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 |