18bf80f4bSopenharmony_ci
28bf80f4bSopenharmony_ci/*
38bf80f4bSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
48bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
58bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License.
68bf80f4bSopenharmony_ci * You may obtain a copy of the License at
78bf80f4bSopenharmony_ci *
88bf80f4bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
98bf80f4bSopenharmony_ci *
108bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
118bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
128bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and
148bf80f4bSopenharmony_ci * limitations under the License.
158bf80f4bSopenharmony_ci */
168bf80f4bSopenharmony_ci
178bf80f4bSopenharmony_ci#include "Vec2Proxy.h"
188bf80f4bSopenharmony_ci
198bf80f4bSopenharmony_ciVec2Proxy::Vec2Proxy(napi_env env, META_NS::Property<BASE_NS::Math::Vec2> prop) : PropertyProxy(prop)
208bf80f4bSopenharmony_ci{
218bf80f4bSopenharmony_ci    // Construct a "Lume::Vec2" instance
228bf80f4bSopenharmony_ci    Create(env, "Vec2");
238bf80f4bSopenharmony_ci    // hook to the objects members (set custom get/set)
248bf80f4bSopenharmony_ci    Hook("x");
258bf80f4bSopenharmony_ci    Hook("y");
268bf80f4bSopenharmony_ci    SyncGet();
278bf80f4bSopenharmony_ci}
288bf80f4bSopenharmony_ciVec2Proxy::~Vec2Proxy() {}
298bf80f4bSopenharmony_civoid Vec2Proxy::UpdateLocalValues()
308bf80f4bSopenharmony_ci{
318bf80f4bSopenharmony_ci    // executed in javascript thread (locks handled outside)
328bf80f4bSopenharmony_ci    value = META_NS::Property<BASE_NS::Math::Vec2>(prop_)->GetValue();
338bf80f4bSopenharmony_ci}
348bf80f4bSopenharmony_civoid Vec2Proxy::UpdateRemoteValues()
358bf80f4bSopenharmony_ci{
368bf80f4bSopenharmony_ci    // executed in engine thread (locks handled outside)
378bf80f4bSopenharmony_ci    META_NS::Property<BASE_NS::Math::Vec2>(prop_)->SetValue(value);
388bf80f4bSopenharmony_ci}
398bf80f4bSopenharmony_civoid Vec2Proxy::SetValue(const BASE_NS::Math::Vec2& v)
408bf80f4bSopenharmony_ci{
418bf80f4bSopenharmony_ci    // currently executed in engine thread, hence the locks.
428bf80f4bSopenharmony_ci    duh.Lock();
438bf80f4bSopenharmony_ci    if (value != v) {
448bf80f4bSopenharmony_ci        value = v;
458bf80f4bSopenharmony_ci        ScheduleUpdate();
468bf80f4bSopenharmony_ci    }
478bf80f4bSopenharmony_ci    duh.Unlock();
488bf80f4bSopenharmony_ci}
498bf80f4bSopenharmony_civoid Vec2Proxy::SetValue(NapiApi::FunctionContext<>& cb, BASE_NS::string_view memb)
508bf80f4bSopenharmony_ci{
518bf80f4bSopenharmony_ci    // should be executed in the javascript thread.
528bf80f4bSopenharmony_ci    NapiApi::FunctionContext<float> info(cb.GetEnv(), cb.GetInfo());
538bf80f4bSopenharmony_ci    float val = info.Arg<0>();
548bf80f4bSopenharmony_ci    duh.Lock();
558bf80f4bSopenharmony_ci    if ((memb == "x") && (val != value.x)) {
568bf80f4bSopenharmony_ci        value.x = val;
578bf80f4bSopenharmony_ci        ScheduleUpdate();
588bf80f4bSopenharmony_ci    } else if ((memb == "y") && (val != value.y)) {
598bf80f4bSopenharmony_ci        value.y = val;
608bf80f4bSopenharmony_ci        ScheduleUpdate();
618bf80f4bSopenharmony_ci    }
628bf80f4bSopenharmony_ci    duh.Unlock();
638bf80f4bSopenharmony_ci}
648bf80f4bSopenharmony_cinapi_value Vec2Proxy::GetValue(NapiApi::FunctionContext<>& cb, BASE_NS::string_view memb)
658bf80f4bSopenharmony_ci{
668bf80f4bSopenharmony_ci    // should be executed in the javascript thread.
678bf80f4bSopenharmony_ci    float res;
688bf80f4bSopenharmony_ci    duh.Lock();
698bf80f4bSopenharmony_ci    if (memb == "x") {
708bf80f4bSopenharmony_ci        res = value.x;
718bf80f4bSopenharmony_ci    } else if (memb == "y") {
728bf80f4bSopenharmony_ci        res = value.y;
738bf80f4bSopenharmony_ci    } else {
748bf80f4bSopenharmony_ci        // invalid member?
758bf80f4bSopenharmony_ci        duh.Unlock();
768bf80f4bSopenharmony_ci        return {};
778bf80f4bSopenharmony_ci    }
788bf80f4bSopenharmony_ci    duh.Unlock();
798bf80f4bSopenharmony_ci    napi_value value;
808bf80f4bSopenharmony_ci    napi_status status = napi_create_double(cb.GetEnv(), res, &value);
818bf80f4bSopenharmony_ci    return value;
828bf80f4bSopenharmony_ci}
838bf80f4bSopenharmony_ci
848bf80f4bSopenharmony_cibool Vec2Proxy::SetValue(NapiApi::Object obj)
858bf80f4bSopenharmony_ci{
868bf80f4bSopenharmony_ci    auto x = obj.Get<float>("x");
878bf80f4bSopenharmony_ci    auto y = obj.Get<float>("y");
888bf80f4bSopenharmony_ci    if (x.IsValid() && y.IsValid()) {
898bf80f4bSopenharmony_ci        BASE_NS::Math::Vec2 v(x, y);
908bf80f4bSopenharmony_ci        SetValue(v);
918bf80f4bSopenharmony_ci        return true;
928bf80f4bSopenharmony_ci    }
938bf80f4bSopenharmony_ci    return false;
948bf80f4bSopenharmony_ci}