Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(705)

Unified Diff: services/keyboard_native/key_layout.cc

Issue 1247903003: Add spellcheck and word suggestion to the prediction service (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698