Skip to content

Commit

Permalink
refactor: add helpers to transform candidate list
Browse files Browse the repository at this point in the history
  • Loading branch information
WhiredPlanck committed Feb 1, 2025
1 parent 92ea834 commit dbd5ed0
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 28 deletions.
2 changes: 1 addition & 1 deletion app/src/main/java/com/osfans/trime/core/Structs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ data class SchemaItem(
)

data class CandidateItem(
val comment: String,
val text: String,
val comment: String = "",
)
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class CompactCandidateModule(
}

override fun onInputContextUpdate(ctx: RimeProto.Context) {
val candidates = ctx.menu.candidates.map { CandidateItem(it.comment ?: "", it.text) }
val candidates = ctx.menu.candidates.map { CandidateItem(it.text, it.comment ?: "") }
val isLastPage = ctx.menu.isLastPage
val previous = ctx.menu.run { pageSize * pageNumber }
val highlightedIdx = ctx.menu.highlightedCandidateIndex
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/jni/librime_jni/helper-types.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,13 @@ class SchemaItem {
return std::move(result);
}
};

class CandidateItem {
public:
std::string text;
std::string comment;

explicit CandidateItem(const RimeCandidate &candidate)
: text(candidate.text),
comment(candidate.comment ? candidate.comment : "") {}
};
18 changes: 18 additions & 0 deletions app/src/main/jni/librime_jni/objconv.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,22 @@ inline std::vector<std::string> stringArrayToStringVector(JNIEnv *env,
return std::move(result);
}

inline jobject rimeCandidateItemToJObject(JNIEnv *env,
const CandidateItem &item) {
return env->NewObject(GlobalRef->CandidateItem, GlobalRef->CandidateItemInit,
*JString(env, item.text), *JString(env, item.comment));
}

inline jobjectArray rimeCandidateListToJObjectArray(
JNIEnv *env, const std::vector<CandidateItem> &list) {
jobjectArray array = env->NewObjectArray(static_cast<int>(list.size()),
GlobalRef->CandidateItem, nullptr);
int i = 0;
for (const auto &item : list) {
auto jItem = JRef(env, rimeCandidateItemToJObject(env, item));
env->SetObjectArrayElement(array, i++, jItem);
}
return array;
}

#endif // TRIME_OBJCONV_H
33 changes: 7 additions & 26 deletions app/src/main/jni/librime_jni/rime_jni.cc
Original file line number Diff line number Diff line change
Expand Up @@ -132,24 +132,16 @@ class Rime {
return rime->change_page(session, backward);
}

using CandidateItem = std::pair<std::string, std::string>;
using CandidateList = std::vector<CandidateItem>;

CandidateList getCandidates(int startIndex, int limit) {
CandidateList result;
std::vector<CandidateItem> getCandidates(int startIndex, int limit) {
std::vector<CandidateItem> result;
result.reserve(limit);
RimeCandidateListIterator iter{nullptr};
RimeCandidateListIterator iter{};
if (rime->candidate_list_from_index(session, &iter, startIndex)) {
int count = 0;
while (rime->candidate_list_next(&iter)) {
if (count >= limit) break;
std::string text(iter.candidate.text);
std::string comment;
if (iter.candidate.comment) {
comment = iter.candidate.comment;
}
auto item = std::make_pair(text, comment);
result.emplace_back(std::move(item));
const CandidateItem item(iter.candidate);
result.emplace_back(item);
++count;
}
rime->candidate_list_end(&iter);
Expand Down Expand Up @@ -435,17 +427,6 @@ extern "C" JNIEXPORT jobjectArray JNICALL
Java_com_osfans_trime_core_Rime_getRimeCandidates(JNIEnv *env, jclass clazz,
jint start_index,
jint limit) {
auto candidates = Rime::Instance().getCandidates(start_index, limit);
int size = static_cast<int>(candidates.size());
jobjectArray array =
env->NewObjectArray(size, GlobalRef->CandidateItem, nullptr);
for (int i = 0; i < size; i++) {
auto &candidate = candidates[i];
auto item = JRef<>(env, env->NewObject(GlobalRef->CandidateItem,
GlobalRef->CandidateItemInit,
*JString(env, candidate.second),
*JString(env, candidate.first)));
env->SetObjectArrayElement(array, i, item);
}
return array;
return rimeCandidateListToJObjectArray(
env, Rime::Instance().getCandidates(start_index, limit));
}

0 comments on commit dbd5ed0

Please sign in to comment.