Пример #1
0
        internal static void SendMauVariable(MauComponent holder, string mauVarName)
        {
            PropertyInfo pInfo = holder.GetType().GetProperty(mauVarName);

            if (pInfo == null)
            {
                throw new ArgumentException("Variable not found", nameof(mauVarName));
            }
            if (!HasAttribute(pInfo))
            {
                throw new ArgumentException("Variable not 'MauVariable'", nameof(mauVarName));
            }

            // Ui not register yet (RegisterComponent function not called)
            if (string.IsNullOrWhiteSpace(holder.MauId))
            {
                return;
            }

            // Get Data
            var data = new JObject
            {
                { "varName", mauVarName },
                { "varValue", MyAngularUi.ParseMauDataToFrontEnd(pInfo.PropertyType, pInfo.GetValue(holder)) }
            };

            MyAngularUi.SendRequestAsync(holder.MauId, MyAngularUi.RequestType.SetVarValue, data);
        }
Пример #2
0
        public void AddClass(string className)
        {
            var data = new JObject
            {
                { "className", className }
            };

            MyAngularUi.SendRequestAsync(MauId, MyAngularUi.RequestType.AddClass, data);
        }
Пример #3
0
        public void RemoveStyle(string styleName)
        {
            var data = new JObject
            {
                { "styleName", styleName }
            };

            MyAngularUi.SendRequestAsync(MauId, MyAngularUi.RequestType.RemoveStyle, data);
        }
Пример #4
0
        internal static Task <MyAngularUi.RequestState> SendMauEventsAsync(MauComponent holder)
        {
            var ret = new JObject
            {
                { "events", new JArray(holder.MauEvents) }
            };

            // Send response
            return(MyAngularUi.SendRequestAsync(holder.MauId, MyAngularUi.RequestType.SetEvents, ret));
        }
Пример #5
0
        public void SetStyle(string styleName, string styleValue, string childQuerySelector = "")
        {
            var data = new JObject
            {
                { "styleName", styleName },
                { "styleValue", styleValue },
                { "childQuerySelector", childQuerySelector },
            };

            MyAngularUi.SendRequestAsync(MauId, MyAngularUi.RequestType.SetStyle, data);
        }
Пример #6
0
        public override void OnExit(MethodExecutionArgs args)
        {
            Type retType = ((MethodInfo)args.Method).ReturnType;

            if (MethodCallType == MauMethodCallType.ExecuteFromAngular || !MyAngularUi.IsConnected)
            {
                base.OnExit(args);
                return;
            }

            // Prepare Args
            List <object> argsToSend = args.Arguments.ToList();

            for (int i = 0; i < argsToSend.Count; i++)
            {
                object param = argsToSend[i];
                if (!param.GetType().IsEnum || !MauEnumMemberAttribute.HasAttribute((Enum)param))
                {
                    continue;
                }

                argsToSend[i] = MauEnumMemberAttribute.GetValue((Enum)param);
            }

            // Send
            var holder = (MauComponent)args.Instance;
            var data   = new JObject
            {
                { "methodType", (int)MethodType },
                { "methodName", MethodName },
                { "methodArgs", JArray.FromObject(argsToSend) }
            };

            MyAngularUi.RequestState request = MyAngularUi.SendRequestAsync(holder.MauId, MyAngularUi.RequestType.CallMethod, data).GetAwaiter().GetResult();

            // Wait return
            // If its void function then just wait until execution finish
            if (retType == typeof(void))
            {
                // Wait function
                holder.GetMethodRetValue(request.RequestId);
                return;
            }

            // Wait and set return value of function
            object ret = holder.GetMethodRetValue(request.RequestId);

            if (ret is not null)
            {
                args.ReturnValue = ret /*?? Activator.CreateInstance(retType)*/;
            }
        }
Пример #7
0
        /// <summary>
        /// Send request to angular side to send property value via <see cref="MyAngularUi.OnMessage"/>
        /// </summary>
        /// <param name="propName">Property name</param>
        internal void RequestPropValue(string propName)
        {
            if (!HandledProps.ContainsKey(propName))
            {
                return;
            }

            MauPropertyHolder mauProperty = GetMauPropHolder(propName);
            var data = new JObject
            {
                { "propName", propName },
                { "propType", (int)mauProperty.PropAttr.PropType },
                { "propStatus", (int)mauProperty.PropAttr.PropStatus }, // Needed by `SetPropHandler`
                { "propForce", mauProperty.PropAttr.ForceSet } // Needed by `SetPropHandler`
            };

            MyAngularUi.SendRequestAsync(MauId, MyAngularUi.RequestType.GetPropValue, data);
        }
Пример #8
0
        internal static void SendMauProp(MauComponent holder, string mauPropName)
        {
            MauPropertyHolder mauPropHolder = holder.GetMauPropHolder(mauPropName);
            Type   propType  = holder.HandledProps[mauPropName].Holder.PropertyType;
            object propValue = holder.HandledProps[mauPropName].Holder.GetValue(holder);

            // bypass is for props not yet changed from .Net side
            // so it's just to not override angular prop value
            bool bypass = false;

            if (!mauPropHolder.Touched)
            {
                bypass = true;
            }
            else if (mauPropHolder.PropAttr.PropStatus == MauPropertyStatus.ReadOnly)
            {
                bypass = true;
            }
            else if (propType.IsEnum)
            {
                if (!MauEnumMemberAttribute.HasNotSetValue(propValue.GetType()))
                {
                    throw new Exception($"NotSet must to be in any MauProperty value is 'Enum', {propValue.GetType().FullName}");
                }

                if (MauEnumMemberAttribute.HasAttribute((Enum)propValue))
                {
                    propValue = MauEnumMemberAttribute.GetValue((Enum)propValue);
                }

                // If it's NotSet just ignore so the angular value will be set,
                // Angular value will be in .Net side, so the value will be correct here.
                // E.g: Color prop if it's NotSet in .Net then use and don't change
                // Angular value.
                switch (propValue)
                {
                case int:
                case long and 0:
                case string propValStr when string.IsNullOrWhiteSpace(propValStr):
                    bypass = true;

                    break;
                }
            }
            else if (propValue == null && propType == typeof(string))
            {
                // null not same as empty string
                bypass = true;
            }

            // Don't send .Net value and ask angular for it's value
            if (bypass)
            {
                holder.RequestPropValue(mauPropName);
                return;
            }

            var data = new JObject
            {
                { "propType", (int)mauPropHolder.PropAttr.PropType },
                { "propStatus", (int)mauPropHolder.PropAttr.PropStatus },
                { "propForce", mauPropHolder.PropAttr.ForceSet },
                { "propName", mauPropName },
                { "propVal", MyAngularUi.ParseMauDataToFrontEnd(propType, propValue) }
            };

            MyAngularUi.SendRequestAsync(holder.MauId, MyAngularUi.RequestType.SetPropValue, data);
        }