Fcitx
inputmethodgroup.cpp
1 /*
2  * SPDX-FileCopyrightText: 2016-2016 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 
8 #include "inputmethodgroup.h"
9 #include <algorithm>
10 
11 namespace fcitx {
12 
13 namespace {
14 const std::string emptyString;
15 }
16 
18 public:
19  InputMethodGroupItemPrivate(const std::string &name) : name_(name) {}
20  FCITX_INLINE_DEFINE_DEFAULT_DTOR_COPY_AND_MOVE_WITHOUT_SPEC(
22 
23  std::string name_;
24  std::string layout_;
25 };
26 
28 public:
29  InputMethodGroupPrivate(const std::string &name) : name_(name) {}
30 
31  std::string name_;
32  std::vector<InputMethodGroupItem> inputMethodList_;
33  std::string defaultInputMethod_;
34  std::string defaultLayout_;
35 };
36 
37 InputMethodGroupItem::InputMethodGroupItem(const std::string &name)
38  : d_ptr(std::make_unique<InputMethodGroupItemPrivate>(name)) {}
39 
40 FCITX_DEFINE_DPTR_COPY_AND_DEFAULT_DTOR_AND_MOVE(InputMethodGroupItem);
41 
42 const std::string &InputMethodGroupItem::name() const {
43  FCITX_D();
44  return d->name_;
45 }
46 
47 const std::string &InputMethodGroupItem::layout() const {
48  FCITX_D();
49  return d->layout_;
50 }
51 
52 LogMessageBuilder &operator<<(LogMessageBuilder &builder,
53  const InputMethodGroupItem &groupItem) {
54  builder << "InputMethodGroupItem(" << groupItem.name()
55  << ",layout=" << groupItem.layout() << ")";
56  return builder;
57 }
58 
60 InputMethodGroupItem::setLayout(const std::string &layout) {
61  FCITX_D();
62  d->layout_ = layout;
63  return *this;
64 }
65 
66 InputMethodGroup::InputMethodGroup(const std::string &name)
67  : d_ptr(std::make_unique<InputMethodGroupPrivate>(name)) {}
68 
69 FCITX_DEFINE_DPTR_COPY_AND_DEFAULT_DTOR_AND_MOVE(InputMethodGroup);
70 
71 const std::string &InputMethodGroup::name() const {
72  FCITX_D();
73  return d->name_;
74 }
75 
76 std::vector<InputMethodGroupItem> &InputMethodGroup::inputMethodList() {
77  FCITX_D();
78  return d->inputMethodList_;
79 }
80 
81 const std::vector<InputMethodGroupItem> &
82 InputMethodGroup::inputMethodList() const {
83  FCITX_D();
84  return d->inputMethodList_;
85 }
86 
87 void InputMethodGroup::setDefaultInputMethod(const std::string &im) {
88  FCITX_D();
89  if (std::any_of(d->inputMethodList_.begin(), d->inputMethodList_.end(),
90  [&im](const InputMethodGroupItem &item) {
91  return item.name() == im;
92  })) {
93  if (d->inputMethodList_.size() > 1 &&
94  d->inputMethodList_[0].name() == im) {
95  d->defaultInputMethod_ = d->inputMethodList_[1].name();
96  } else {
97  d->defaultInputMethod_ = im;
98  }
99  } else {
100  if (d->inputMethodList_.size() > 1) {
101  d->defaultInputMethod_ = d->inputMethodList_[1].name();
102  } else {
103  d->defaultInputMethod_ = d->inputMethodList_.empty()
104  ? ""
105  : d->inputMethodList_[0].name();
106  }
107  }
108 }
109 
110 const std::string &InputMethodGroup::layoutFor(const std::string &im) const {
111  FCITX_D();
112  auto iter = std::find_if(
113  d->inputMethodList_.begin(), d->inputMethodList_.end(),
114  [&im](const InputMethodGroupItem &item) { return item.name() == im; });
115  if (iter != d->inputMethodList_.end()) {
116  return iter->layout();
117  }
118  return emptyString;
119 }
120 
121 const std::string &InputMethodGroup::defaultInputMethod() const {
122  FCITX_D();
123  return d->defaultInputMethod_;
124 }
125 
126 void InputMethodGroup::setDefaultLayout(const std::string &layout) {
127  FCITX_D();
128  d->defaultLayout_ = layout;
129 }
130 
131 const std::string &InputMethodGroup::defaultLayout() const {
132  FCITX_D();
133  return d->defaultLayout_;
134 }
135 } // namespace fcitx
Definition: action.cpp:17