From 457f4c2a259078ef246d3cf3d93d3625264ce0e8 Mon Sep 17 00:00:00 2001 From: Yuan Liu Date: Thu, 18 May 2017 05:16:40 -0700 Subject: [PATCH 1/2] Let undo can restore multiple pharses at one time If we removed multiple pharses at one time, and we want to undo that. We only can restore single pharse many times in the past. Now we can restore them in one time. --- src/model/UserphraseModel.cpp | 23 ++++++++++++++--------- src/model/UserphraseModel.h | 1 + 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/model/UserphraseModel.cpp b/src/model/UserphraseModel.cpp index 995abeb..59f80c2 100644 --- a/src/model/UserphraseModel.cpp +++ b/src/model/UserphraseModel.cpp @@ -94,7 +94,8 @@ void UserphraseModel::remove(QModelIndexList indexList) auto last = indexList.first().row(); emit beginRemoveRows(indexList.first().parent(), first, last); - + + int remove_cnt = 0; foreach(auto item, indexList) { auto index = item.row(); @@ -106,14 +107,15 @@ void UserphraseModel::remove(QModelIndexList indexList) userphrase_[index].bopomofo_.toUtf8().constData()); if (ret > 0) { removerecord_.push_back(Userphrase{userphrase_[index]}); - // FIXME: std::vector::erase is an inefficient operation. + remove_cnt++; + // FIXME: std::vector::erase is an inefficient operation. userphrase_.erase(userphrase_.begin() + index); } else { qWarning() << "chewing_userphrase_remove() returns" << ret; } // FIXME: Handle chewing_userphrase_remove fails. } - + maxundocnt = remove_cnt; emit endRemoveRows(); emit removePhraseCompleted(indexList.size()); @@ -232,11 +234,14 @@ const Userphrase *UserphraseModel::getUserphrase(const QModelIndex& idx) void UserphraseModel::undo() { - if (!removerecord_.empty()) { - auto last = removerecord_.end() - 1; - const QString phrase = last->display_; - add(last->phrase_, last->bopomofo_); - removerecord_.erase(last); - emit undoCompleted(phrase); + if (!removerecord_.empty() && maxundocnt>0) { + while(maxundocnt--){ + auto last = removerecord_.end() - 1; + const QString phrase = last->display_; + add(last->phrase_, last->bopomofo_); + removerecord_.erase(last); + emit undoCompleted(phrase); + } + maxundocnt = 1; } } diff --git a/src/model/UserphraseModel.h b/src/model/UserphraseModel.h index 92140bf..0236ea7 100644 --- a/src/model/UserphraseModel.h +++ b/src/model/UserphraseModel.h @@ -77,4 +77,5 @@ public slots: UserphraseSet userphrase_; std::vector removerecord_; int addresult_; + int maxundocnt; }; From 98f60c216e61464be87d5574f57bdb12a1b2f69d Mon Sep 17 00:00:00 2001 From: Yuan Liu Date: Fri, 19 May 2017 04:00:40 -0700 Subject: [PATCH 2/2] Let undo more complete After modifying, it can restore multiple phrases after restore single phrase. --- src/model/UserphraseModel.cpp | 24 ++++++++++++------------ src/model/UserphraseModel.h | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/model/UserphraseModel.cpp b/src/model/UserphraseModel.cpp index 59f80c2..5768f63 100644 --- a/src/model/UserphraseModel.cpp +++ b/src/model/UserphraseModel.cpp @@ -94,8 +94,7 @@ void UserphraseModel::remove(QModelIndexList indexList) auto last = indexList.first().row(); emit beginRemoveRows(indexList.first().parent(), first, last); - - int remove_cnt = 0; + int remove_cnt = 0; foreach(auto item, indexList) { auto index = item.row(); @@ -115,7 +114,7 @@ void UserphraseModel::remove(QModelIndexList indexList) } // FIXME: Handle chewing_userphrase_remove fails. } - maxundocnt = remove_cnt; + maxundocnt.push_back(remove_cnt); emit endRemoveRows(); emit removePhraseCompleted(indexList.size()); @@ -234,14 +233,15 @@ const Userphrase *UserphraseModel::getUserphrase(const QModelIndex& idx) void UserphraseModel::undo() { - if (!removerecord_.empty() && maxundocnt>0) { - while(maxundocnt--){ - auto last = removerecord_.end() - 1; - const QString phrase = last->display_; - add(last->phrase_, last->bopomofo_); - removerecord_.erase(last); - emit undoCompleted(phrase); - } - maxundocnt = 1; + int cnt = *(maxundocnt.end() -1); + if (!removerecord_.empty() && cnt>0) { + while (cnt--) { + auto last = removerecord_.end() -1; + const QString phrase = last->display_; + add(last->phrase_, last->bopomofo_); + removerecord_.erase(last); + emit undoCompleted(phrase); + } + maxundocnt.pop_back(); } } diff --git a/src/model/UserphraseModel.h b/src/model/UserphraseModel.h index 0236ea7..3ab94ad 100644 --- a/src/model/UserphraseModel.h +++ b/src/model/UserphraseModel.h @@ -76,6 +76,6 @@ public slots: std::unique_ptr ctx_; UserphraseSet userphrase_; std::vector removerecord_; + std::vector maxundocnt; int addresult_; - int maxundocnt; };