/// <summary>
        /// グローバル変数をセットする
        /// </summary>
        /// <param name="name">グローバル変数名</param>
        /// <param name="value">値</param>
        /// <param name="zone"ゾーン名</param>
        /// <returns>is changed</returns>
        public static bool SetVariable(
            string name,
            object value,
            string zone = null)
        {
            var result   = false;
            var variable = default(TimelineVariable);

            lock (ExpressionLocker)
            {
                if (Variables.ContainsKey(name))
                {
                    variable = Variables[name];
                }
                else
                {
                    variable        = new TimelineVariable(name);
                    Variables[name] = variable;
                    result          = true;
                }

                switch (value)
                {
                case bool b:
                    if (!(variable.Value is bool current1) ||
                        current1 != b)
                    {
                        variable.Value      = b;
                        variable.Expiration = DateTime.MaxValue;
                        result = true;
                    }
                    break;

                case string s:
                    if (s.TryParse0xString2Int(out int i2))
                    {
                        if (!(variable.Value is int current2) ||
                            current2 != i2)
                        {
                            variable.Value      = i2;
                            variable.Expiration = DateTime.MaxValue;
                            result = true;
                        }
                    }
                    else
                    {
                        goto default;
                    }
                    break;

                default:
                    if (!ObjectComparer.Equals(value, variable.Value))
                    {
                        variable.Value      = value;
                        variable.Expiration = DateTime.MaxValue;
                        result = true;
                    }
                    break;
                }

                variable.Zone = zone ?? string.Empty;
            }

            if (result)
            {
                OnVariableChanged?.Invoke(new EventArgs());

                if (ReferedTriggerRecompileDelegates.ContainsKey(variable.Name))
                {
                    lock (variable)
                    {
                        ReferedTriggerRecompileDelegates[variable.Name]?.Invoke();
                    }
                }
            }

            return(result);
        }
Beispiel #2
0
        /// <summary>
        /// グローバル変数をセットする
        /// </summary>
        /// <param name="name">グローバル変数名</param>
        /// <param name="value">値</param>
        /// <param name="zone"ゾーン名</param>
        /// <returns>is changed</returns>
        public static bool SetVariable(
            string name,
            object value,
            string zone = null)
        {
            var result = false;

            lock (ExpressionLocker)
            {
                var variable = default(TimelineVariable);
                if (Variables.ContainsKey(name))
                {
                    variable = Variables[name];
                }
                else
                {
                    variable        = new TimelineVariable(name);
                    Variables[name] = variable;
                    result          = true;
                }

                switch (value)
                {
                case bool b:
                    if (!(variable.Value is bool current) ||
                        current != b)
                    {
                        variable.Value      = b;
                        variable.Expiration = DateTime.MaxValue;
                        result = true;
                    }
                    break;

                case int i:
                    if (variable.Counter != i)
                    {
                        variable.Counter    = i;
                        variable.Expiration = DateTime.MaxValue;
                        result = true;
                    }
                    break;

                default:
                    if (!ObjectComparer.Equals(value, variable.Value))
                    {
                        variable.Value      = value;
                        variable.Expiration = DateTime.MaxValue;
                        result = true;
                    }
                    break;
                }

                variable.Zone = zone ?? string.Empty;
            }

            if (result)
            {
                OnVariableChanged?.Invoke(new EventArgs());
            }

            return(result);
        }