69 lines
1.8 KiB
C++
69 lines
1.8 KiB
C++
#include "app/app.h"
|
|
#include "bindings/definitions.h"
|
|
|
|
namespace {
|
|
void Params_free(mrb_state *mrb, void *ptr) {
|
|
UNUSED(mrb);
|
|
uint64_t id = ((Wrapper *)ptr)->id;
|
|
app::element_pool.release(id);
|
|
delete (Wrapper *)ptr;
|
|
}
|
|
|
|
const struct mrb_data_type Params_type = {"Params", Params_free};
|
|
|
|
mrb_value Params_init(mrb_state *mrb, mrb_value self) {
|
|
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
|
if (old)
|
|
mrb_free(mrb, old);
|
|
mrb_data_init(self, nullptr, &Params_type);
|
|
Wrapper *s = new Wrapper();
|
|
|
|
mrb_int id;
|
|
mrb_get_args(mrb, "z", &id);
|
|
|
|
app::element_pool.use(id);
|
|
s->id = id;
|
|
|
|
mrb_data_init(self, s, &Params_type);
|
|
return self;
|
|
}
|
|
|
|
mrb_value params_get(mrb_state *mrb, mrb_value self) {
|
|
mrb_sym key;
|
|
mrb_get_args(mrb, "n", &key);
|
|
|
|
uint64_t id = ((Wrapper *)DATA_PTR(self))->id;
|
|
app::element_pool.use(id);
|
|
app::EText *element = (app::EText *)app::element_pool[id];
|
|
|
|
auto it = element->params.find(mrb_sym2name(mrb, key));
|
|
if (it == element->params.end())
|
|
return mrb_nil_value();
|
|
return mrb_str_new_cstr(mrb, it->second.c_str());
|
|
}
|
|
|
|
mrb_value params_set(mrb_state *mrb, mrb_value self) {
|
|
mrb_sym key;
|
|
mrb_value value;
|
|
mrb_get_args(mrb, "no", &key, &value);
|
|
|
|
uint64_t id = ((Wrapper *)DATA_PTR(self))->id;
|
|
app::element_pool.use(id);
|
|
app::EText *element = (app::EText *)app::element_pool[id];
|
|
|
|
element->params[mrb_sym2name(mrb, key)] = mrb_str_to_cstr(mrb, mrb_obj_as_string(mrb, value));
|
|
element->reload_text();
|
|
|
|
return mrb_nil_value();
|
|
}
|
|
} // namespace
|
|
|
|
namespace definitions {
|
|
void register_params() {
|
|
DEF_CLASS(Params, MRB_ARGS_REQ(1));
|
|
ADD_METHOD(Params, "[]", params_get, MRB_ARGS_REQ(1));
|
|
ADD_METHOD(Params, "[]=", params_set, MRB_ARGS_REQ(2));
|
|
bindings.Params = {Params_class, &Params_type};
|
|
}
|
|
} // namespace definitions
|