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

Unified Diff: ui/views/controls/textfield/textfield_model.cc

Issue 1989893005: Undo selection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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: ui/views/controls/textfield/textfield_model.cc
diff --git a/ui/views/controls/textfield/textfield_model.cc b/ui/views/controls/textfield/textfield_model.cc
index d5bec8b33248d549600280d137186bbcf8557850..5fbe713e00743f0a586951537a0dff9c0026b542 100644
--- a/ui/views/controls/textfield/textfield_model.cc
+++ b/ui/views/controls/textfield/textfield_model.cc
@@ -35,16 +35,19 @@ class Edit {
// Revert the change made by this edit in |model|.
void Undo(TextfieldModel* model) {
+
+ size_t selection_end = old_text_start_ + old_text_.length();
+ gfx::Range selection_range = delete_backward_ ? gfx::Range(selection_end, old_text_start_) : gfx::Range(old_text_start_, selection_end);
model->ModifyText(new_text_start_, new_text_end(),
old_text_, old_text_start_,
- old_cursor_pos_);
+ selection_range);
}
// Apply the change of this edit to the |model|.
void Redo(TextfieldModel* model) {
model->ModifyText(old_text_start_, old_text_end(),
new_text_, new_text_start_,
- new_cursor_pos_);
+ gfx::Range(new_cursor_pos_));
}
// Try to merge the |edit| into this edit and returns true on success. The
@@ -489,13 +492,6 @@ bool TextfieldModel::Cut() {
if (!HasCompositionText() && HasSelection() && !render_text_->obscured()) {
ui::ScopedClipboardWriter(
ui::CLIPBOARD_TYPE_COPY_PASTE).WriteText(GetSelectedText());
- // A trick to let undo/redo handle cursor correctly.
- // Undoing CUT moves the cursor to the end of the change rather
- // than beginning, unlike Delete/Backspace.
- // TODO(oshima): Change Delete/Backspace to use DeleteSelection,
- // update DeleteEdit and remove this trick.
- const gfx::Range& selection = render_text_->selection();
- render_text_->SelectRange(gfx::Range(selection.end(), selection.start()));
DeleteSelection();
return true;
}
@@ -768,7 +764,7 @@ void TextfieldModel::ModifyText(size_t delete_from,
size_t delete_to,
const base::string16& new_text,
size_t new_text_insert_at,
- size_t new_cursor_pos) {
+ gfx::Range selection_range) {
DCHECK_LE(delete_from, delete_to);
base::string16 old_text = text();
ClearComposition();
@@ -776,8 +772,13 @@ void TextfieldModel::ModifyText(size_t delete_from,
render_text_->SetText(old_text.erase(delete_from, delete_to - delete_from));
if (!new_text.empty())
render_text_->SetText(old_text.insert(new_text_insert_at, new_text));
- render_text_->SetCursorPosition(new_cursor_pos);
- // TODO(oshima): Select text that was just undone, like Mac (but not GTK).
+
+ // Both result in different caret affinities for an empty range with non 0
+ // position.
+ if(selection_range.is_empty())
+ render_text_->SetCursorPosition(selection_range.start());
+ else
+ render_text_->SelectRange(selection_range);
}
} // namespace views
« no previous file with comments | « ui/views/controls/textfield/textfield_model.h ('k') | ui/views/controls/textfield/textfield_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698