Skip to content

Commit e15034b

Browse files
committed
feat(rime_levers_api): stdbool flavor
1 parent 5d1b8f1 commit e15034b

File tree

4 files changed

+294
-281
lines changed

4 files changed

+294
-281
lines changed

src/rime/lever/levers_api_impl.h

+278
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
1+
// implementation of levers api
2+
3+
#include <rime/service.h>
4+
#include <rime/lever/custom_settings.h>
5+
#include <rime/lever/switcher_settings.h>
6+
#include <rime/lever/user_dict_manager.h>
7+
8+
using namespace rime;
9+
10+
static RimeCustomSettings* rime_levers_custom_settings_init(
11+
const char* config_id,
12+
const char* generator_id) {
13+
return reinterpret_cast<RimeCustomSettings*>(new CustomSettings(
14+
&Service::instance().deployer(), config_id, generator_id));
15+
}
16+
17+
static void rime_levers_custom_settings_destroy(RimeCustomSettings* settings) {
18+
delete reinterpret_cast<CustomSettings*>(settings);
19+
}
20+
21+
static Bool rime_levers_load_settings(RimeCustomSettings* settings) {
22+
return Bool(reinterpret_cast<CustomSettings*>(settings)->Load());
23+
}
24+
25+
static Bool rime_levers_save_settings(RimeCustomSettings* settings) {
26+
return Bool(reinterpret_cast<CustomSettings*>(settings)->Save());
27+
}
28+
29+
static Bool rime_levers_customize_bool(RimeCustomSettings* settings,
30+
const char* key,
31+
Bool value) {
32+
an<ConfigItem> item = New<ConfigValue>(bool(value));
33+
auto custom_settings = reinterpret_cast<CustomSettings*>(settings);
34+
return custom_settings->Customize(key, item);
35+
}
36+
37+
static Bool rime_levers_customize_int(RimeCustomSettings* settings,
38+
const char* key,
39+
int value) {
40+
an<ConfigItem> item = New<ConfigValue>(value);
41+
auto custom_settings = reinterpret_cast<CustomSettings*>(settings);
42+
return custom_settings->Customize(key, item);
43+
}
44+
45+
static Bool rime_levers_customize_double(RimeCustomSettings* settings,
46+
const char* key,
47+
double value) {
48+
an<ConfigItem> item = New<ConfigValue>(value);
49+
auto custom_settings = reinterpret_cast<CustomSettings*>(settings);
50+
return custom_settings->Customize(key, item);
51+
}
52+
53+
static Bool rime_levers_customize_string(RimeCustomSettings* settings,
54+
const char* key,
55+
const char* value) {
56+
an<ConfigItem> item = New<ConfigValue>(value);
57+
auto custom_settings = reinterpret_cast<CustomSettings*>(settings);
58+
return custom_settings->Customize(key, item);
59+
}
60+
61+
static Bool rime_levers_customize_item(RimeCustomSettings* settings,
62+
const char* key,
63+
RimeConfig* value) {
64+
an<ConfigItem> item;
65+
if (value) {
66+
if (Config* v = reinterpret_cast<Config*>(value->ptr)) {
67+
item = v->GetItem("");
68+
}
69+
}
70+
auto custom_settings = reinterpret_cast<CustomSettings*>(settings);
71+
return custom_settings->Customize(key, item);
72+
}
73+
74+
static Bool rime_levers_is_first_run(RimeCustomSettings* settings) {
75+
return reinterpret_cast<CustomSettings*>(settings)->IsFirstRun();
76+
}
77+
78+
static Bool rime_levers_settings_is_modified(RimeCustomSettings* settings) {
79+
return reinterpret_cast<CustomSettings*>(settings)->modified();
80+
}
81+
82+
static Bool rime_levers_settings_get_config(RimeCustomSettings* settings,
83+
RimeConfig* config) {
84+
if (!config)
85+
return False;
86+
config->ptr = reinterpret_cast<CustomSettings*>(settings)->config();
87+
return Bool(!!config->ptr);
88+
}
89+
90+
static RimeSwitcherSettings* rime_levers_switcher_settings_init() {
91+
return reinterpret_cast<RimeSwitcherSettings*>(
92+
new SwitcherSettings(&Service::instance().deployer()));
93+
}
94+
95+
static Bool rime_levers_get_available_schema_list(
96+
RimeSwitcherSettings* settings,
97+
RimeSchemaList* list) {
98+
auto ss = reinterpret_cast<SwitcherSettings*>(settings);
99+
list->size = 0;
100+
list->list = NULL;
101+
if (ss->available().empty()) {
102+
return False;
103+
}
104+
list->list = new RimeSchemaListItem[ss->available().size()];
105+
for (const auto& info : ss->available()) {
106+
auto& item(list->list[list->size]);
107+
item.schema_id = const_cast<char*>(info.schema_id.c_str());
108+
item.name = const_cast<char*>(info.name.c_str());
109+
item.reserved = const_cast<SchemaInfo*>(&info);
110+
++list->size;
111+
}
112+
return True;
113+
}
114+
115+
static Bool rime_levers_get_selected_schema_list(RimeSwitcherSettings* settings,
116+
RimeSchemaList* list) {
117+
auto ss = reinterpret_cast<SwitcherSettings*>(settings);
118+
list->size = 0;
119+
list->list = NULL;
120+
if (ss->selection().empty()) {
121+
return False;
122+
}
123+
list->list = new RimeSchemaListItem[ss->selection().size()];
124+
for (const string& schema_id : ss->selection()) {
125+
auto& item(list->list[list->size]);
126+
item.schema_id = const_cast<char*>(schema_id.c_str());
127+
item.name = NULL;
128+
item.reserved = NULL;
129+
++list->size;
130+
}
131+
return True;
132+
}
133+
134+
static void rime_levers_schema_list_destroy(RimeSchemaList* list) {
135+
delete[] list->list;
136+
list->size = 0;
137+
list->list = NULL;
138+
}
139+
140+
static const char* rime_levers_get_schema_id(RimeSchemaInfo* info) {
141+
auto si = reinterpret_cast<SchemaInfo*>(info);
142+
return si && !si->schema_id.empty() ? si->schema_id.c_str() : NULL;
143+
}
144+
145+
static const char* rime_levers_get_schema_name(RimeSchemaInfo* info) {
146+
auto si = reinterpret_cast<SchemaInfo*>(info);
147+
return si && !si->name.empty() ? si->name.c_str() : NULL;
148+
}
149+
150+
static const char* rime_levers_get_schema_version(RimeSchemaInfo* info) {
151+
auto si = reinterpret_cast<SchemaInfo*>(info);
152+
return si && !si->version.empty() ? si->version.c_str() : NULL;
153+
}
154+
static const char* rime_levers_get_schema_author(RimeSchemaInfo* info) {
155+
auto si = reinterpret_cast<SchemaInfo*>(info);
156+
return si && !si->author.empty() ? si->author.c_str() : NULL;
157+
}
158+
159+
static const char* rime_levers_get_schema_description(RimeSchemaInfo* info) {
160+
auto si = reinterpret_cast<SchemaInfo*>(info);
161+
return si && !si->description.empty() ? si->description.c_str() : NULL;
162+
}
163+
164+
static const char* rime_levers_get_schema_file_path(RimeSchemaInfo* info) {
165+
auto si = reinterpret_cast<SchemaInfo*>(info);
166+
return si && !si->file_path.empty() ? si->file_path.c_str() : NULL;
167+
}
168+
169+
static Bool rime_levers_select_schemas(RimeSwitcherSettings* settings,
170+
const char* schema_id_list[],
171+
int count) {
172+
auto ss = reinterpret_cast<SwitcherSettings*>(settings);
173+
SwitcherSettings::Selection selection;
174+
for (int i = 0; i < count; ++i) {
175+
selection.push_back(schema_id_list[i]);
176+
}
177+
return ss->Select(selection);
178+
}
179+
180+
static const char* rime_levers_get_hotkeys(RimeSwitcherSettings* settings) {
181+
auto ss = reinterpret_cast<SwitcherSettings*>(settings);
182+
return !ss->hotkeys().empty() ? ss->hotkeys().c_str() : NULL;
183+
}
184+
185+
static Bool rime_levers_set_hotkeys(RimeSwitcherSettings* settings,
186+
const char* hotkeys) {
187+
auto ss = reinterpret_cast<SwitcherSettings*>(settings);
188+
return Bool(ss->SetHotkeys(hotkeys));
189+
}
190+
191+
static Bool rime_levers_user_dict_iterator_init(RimeUserDictIterator* iter) {
192+
UserDictManager mgr(&Service::instance().deployer());
193+
UserDictList* list = new UserDictList;
194+
mgr.GetUserDictList(list);
195+
if (list->empty()) {
196+
delete list;
197+
return False;
198+
}
199+
iter->ptr = list;
200+
iter->i = 0;
201+
return True;
202+
}
203+
204+
static void rime_levers_user_dict_iterator_destroy(RimeUserDictIterator* iter) {
205+
delete (UserDictList*)iter->ptr;
206+
iter->ptr = NULL;
207+
iter->i = 0;
208+
}
209+
210+
static const char* rime_levers_next_user_dict(RimeUserDictIterator* iter) {
211+
auto list = reinterpret_cast<UserDictList*>(iter->ptr);
212+
if (!list || iter->i >= list->size()) {
213+
return NULL;
214+
}
215+
return (*list)[iter->i++].c_str();
216+
}
217+
218+
static Bool rime_levers_backup_user_dict(const char* dict_name) {
219+
UserDictManager mgr(&Service::instance().deployer());
220+
return Bool(mgr.Backup(dict_name));
221+
}
222+
223+
static Bool rime_levers_restore_user_dict(const char* snapshot_file) {
224+
UserDictManager mgr(&Service::instance().deployer());
225+
return Bool(mgr.Restore(path(snapshot_file)));
226+
}
227+
228+
static int rime_levers_export_user_dict(const char* dict_name,
229+
const char* text_file) {
230+
UserDictManager mgr(&Service::instance().deployer());
231+
return mgr.Export(dict_name, path(text_file));
232+
}
233+
234+
static int rime_levers_import_user_dict(const char* dict_name,
235+
const char* text_file) {
236+
UserDictManager mgr(&Service::instance().deployer());
237+
return mgr.Import(dict_name, path(text_file));
238+
}
239+
240+
static RimeCustomApi* RIME_FLAVORED(rime_levers_get_api)() {
241+
static RIME_FLAVORED(RimeLeversApi) s_api = {0};
242+
if (!s_api.data_size) {
243+
RIME_STRUCT_INIT(RIME_FLAVORED(RimeLeversApi), s_api);
244+
s_api.custom_settings_init = rime_levers_custom_settings_init;
245+
s_api.custom_settings_destroy = rime_levers_custom_settings_destroy;
246+
s_api.load_settings = rime_levers_load_settings;
247+
s_api.save_settings = rime_levers_save_settings;
248+
s_api.customize_bool = rime_levers_customize_bool;
249+
s_api.customize_int = rime_levers_customize_int;
250+
s_api.customize_double = rime_levers_customize_double;
251+
s_api.customize_string = rime_levers_customize_string;
252+
s_api.is_first_run = rime_levers_is_first_run;
253+
s_api.settings_is_modified = rime_levers_settings_is_modified;
254+
s_api.settings_get_config = rime_levers_settings_get_config;
255+
s_api.switcher_settings_init = rime_levers_switcher_settings_init;
256+
s_api.get_available_schema_list = rime_levers_get_available_schema_list;
257+
s_api.get_selected_schema_list = rime_levers_get_selected_schema_list;
258+
s_api.schema_list_destroy = rime_levers_schema_list_destroy;
259+
s_api.get_schema_id = rime_levers_get_schema_id;
260+
s_api.get_schema_name = rime_levers_get_schema_name;
261+
s_api.get_schema_version = rime_levers_get_schema_version;
262+
s_api.get_schema_author = rime_levers_get_schema_author;
263+
s_api.get_schema_description = rime_levers_get_schema_description;
264+
s_api.get_schema_file_path = rime_levers_get_schema_file_path;
265+
s_api.select_schemas = rime_levers_select_schemas;
266+
s_api.get_hotkeys = rime_levers_get_hotkeys;
267+
s_api.set_hotkeys = rime_levers_set_hotkeys;
268+
s_api.user_dict_iterator_init = rime_levers_user_dict_iterator_init;
269+
s_api.user_dict_iterator_destroy = rime_levers_user_dict_iterator_destroy;
270+
s_api.next_user_dict = rime_levers_next_user_dict;
271+
s_api.backup_user_dict = rime_levers_backup_user_dict;
272+
s_api.restore_user_dict = rime_levers_restore_user_dict;
273+
s_api.export_user_dict = rime_levers_export_user_dict;
274+
s_api.import_user_dict = rime_levers_import_user_dict;
275+
s_api.customize_item = rime_levers_customize_item;
276+
}
277+
return (RimeCustomApi*)&s_api;
278+
}

0 commit comments

Comments
 (0)