private bool drawValueSlider(string label, EditValue edit, float sliderMin, float sliderMax)
        {
            bool changed     = false;
            bool fontChanged = false;

            GUILayout.BeginHorizontal(optItemHeight);
            try {
                drawLabel(ref label);

                if (!edit.isSync)
                {
                    SetTextColor(uiParams.textStyleSC, ref txtColorRed);
                    fontChanged = true;
                }

                var editedVal = GUILayout.TextField(edit.editVal, uiParams.textStyleSC, optInputWidth);
                if (edit.editVal != editedVal)   // 直接書き換えられたケース
                {
                    edit.Set(editedVal);
                    changed |= edit.isSync; // テキスト値書き換え、かつ値が同期⇒変更とみなす
                }

                float sliderVal = edit.val;
                if (drawSlider(ref sliderVal, sliderMin, sliderMax))
                {
                    edit.Set(sliderVal);
                    changed = true;
                }
                GUILayout.Space(buttonMargin);
            } finally {
                GUILayout.EndHorizontal();
                if (fontChanged)
                {
                    SetTextColor(uiParams.textStyleSC, ref txtColor);
                }
            }
            return(changed);
        }
        private bool drawValueSlider(string label, EditValue edit, float sliderMin, float sliderMax) {
            bool changed = false;
            bool fontChanged = false;
            GUILayout.BeginHorizontal(optItemHeight);
            try {
                drawLabel(ref label);

                if (!edit.isSync) {
                    SetTextColor(uiParams.textStyleSC, ref txtColorRed);
                    fontChanged = true;
                }

                var editedVal = GUILayout.TextField(edit.editVal, uiParams.textStyleSC, optInputWidth);
                if (edit.editVal != editedVal) { // 直接書き換えられたケース
                    edit.Set(editedVal);
                    changed |= edit.isSync; // テキスト値書き換え、かつ値が同期⇒変更とみなす
                }

                float sliderVal = edit.val;
                if (drawSlider(ref sliderVal, sliderMin, sliderMax)) {
                    edit.Set(sliderVal);
                    changed = true;
                }
                GUILayout.Space(buttonMargin);

            } finally {
                GUILayout.EndHorizontal();
                if (fontChanged) {
                    SetTextColor(uiParams.textStyleSC, ref txtColor);
                }
            }
            return changed;
        }
        private void SetupFloatSlider(string label, EditValue edit, float sliderMin, float sliderMax,
                                      Action<float> func, bool[] mulVals, params float[] vals) {
            GUILayout.BeginHorizontal();
            GUILayout.Label(label, uiParams.lStyle, optItemHeight);
            GUILayout.Space(uiParams.marginL);

            bool changed = false;
            for (int i=0; i< vals.Length; i++) {
                string blabel = vals[i].ToString();
                GUILayoutOption opt;
                if (blabel.Length <= 1) opt = bWidthOpt;
                else if (blabel.Length <= 3) opt = bWidthWOpt;
                else opt = GUILayout.Width(baseWidth*0.5f*(blabel.Length+1));
                if (GUILayout.Button(blabel, bStyleSS, opt)) {
                    edit.Set( vals[i] );
                    changed = true;
                }
            }
            if (mulVals != null && mulVals.Length >= 3) {
                if (mulVals[0]) {
                    if (GUILayout.Button("<", bStyleSS, bWidthOpt)) {
                        edit.SetWithCheck(edit.val * 0.9f);
                        changed = true;
                    }
                }
                if (mulVals[1]) {
                    if (GUILayout.Button(">", bStyleSS, bWidthOpt)) {
                        edit.SetWithCheck(edit.val * 1.1f);
                        changed = true;
                    }
                }
                if (mulVals[2]) {
                    if (GUILayout.Button("x-1", bStyleSS, bWidthWOpt)) {
                        edit.Set(edit.val * -1f);
                        changed = true;
                    }
                }
            }
            GUILayout.EndHorizontal();

            if (changed || drawValueSlider(null, edit, sliderMin, sliderMax)) {
                func(edit.val);
            }
        }
        private void SetupFloatSlider(string label, EditValue edit, float sliderMin, float sliderMax,
                                      Action <float> func, PresetOperation[] presetOprs, float[] vals1, float[] vals2)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label(label, uiParams.lStyle, optItemHeight);
            GUILayout.Space(uiParams.marginL);

            bool           changed = false;
            Action <float> preset  = (val) => {
                string          blabel = val.ToString();
                GUILayoutOption opt;
                if (blabel.Length <= 1)
                {
                    opt = bWidthOpt;
                }
                else if (blabel.Length <= 3)
                {
                    opt = bWidthWOpt;
                }
                else
                {
                    opt = GUILayout.Width(baseWidth * 0.5f * (blabel.Length + 1));
                }
                if (GUILayout.Button(blabel, bStyleSS, opt))
                {
                    edit.Set(val);
                    changed = true;
                }
            };

            if (vals1 != null)
            {
                foreach (float val in vals1)
                {
                    preset(val);
                }
            }
            if (vals2 != null)
            {
                foreach (float val in vals2)
                {
                    preset(val);
                }
            }

            if (presetOprs != null)
            {
                foreach (var pset in presetOprs)
                {
                    var widthOpt = (pset.label.Length == 1) ? bWidthOpt : bWidthWOpt;
                    if (GUILayout.Button(pset.label, bStyleSS, widthOpt))
                    {
                        edit.SetWithCheck(pset.func(edit.val));
                        changed = true;
                    }
                }
            }
            GUILayout.EndHorizontal();

            if (changed || drawValueSlider(null, edit, sliderMin, sliderMax))
            {
                func(edit.val);
            }
        }