public CurveEditDialog(PlayCanvas_Curve_PropertyEditor propertyEditor)
            {
                if (propertyEditor == null)
                    throw new ArgumentNullException("`propertyEditor` argument cannot be null!");

                m_activeCurve = -1;
                m_activeKey = -1.0f;
                m_zoomOut = 1.0f;
                m_propertyEditor = propertyEditor;
                m_info = m_propertyEditor.Info == null ? new PlayCanvas_Curve_PropertyEditor.CurveInfo() : m_propertyEditor.Info;
                if (m_info.Curves != null && m_info.Curves.Length > 0)
                {
                    m_curveSet = m_propertyEditor.PropertyModel.Data<PlayCanvas.CurveSet>();
                    if (m_curveSet == null)
                        m_curveSet = new PlayCanvas.CurveSet();
                    if (m_curveSet.CurvesList.Count < m_info.Curves.Length)
                        for (int i = m_curveSet.CurvesList.Count; i < m_info.Curves.Length; ++i)
                            m_curveSet.CurvesList.Add(new PlayCanvas.Curve(new float[] { 0.0f, 0.0f }));
                }
                else
                {
                    m_curve = m_propertyEditor.PropertyModel.Data<PlayCanvas.Curve>();
                    if (m_curve == null)
                        m_curve = new PlayCanvas.Curve();
                    if (m_curve.KeyFrames.Count == 0)
                        m_curve.KeyFrames.Add(0.0f, 0.0f);
                    float diff = Math.Max(Math.Abs(m_info.Max), Math.Abs(m_info.Min));
                    while (m_zoomOut < diff)
                        m_zoomOut *= 2.0f;
                }
                ValidateCurve();

                MetroSkinManager.ApplyMetroStyle(this);
                Size = new Size(640, 480);
                MinimumSize = new Size(480, 320);
                Text = (m_curve == null ? "Edit curve set: " : "Edit curve: ") + propertyEditor.PropertyModel.Name;
                FormClosed += CurveEditDialog_FormClosed;

                m_editPictureBox = new PictureBox();
                m_editPictureBox.Dock = DockStyle.Fill;
                m_editPictureBox.BackColor = Color.FromArgb(255, 64, 64, 64);
                m_editPictureBox.Resize += m_editPictureBox_Resize;
                m_editPictureBox.Paint += m_editPictureBox_Paint;
                m_editPictureBox.MouseEnter += m_editPictureBox_MouseEnter;
                m_editPictureBox.MouseDown += m_editPictureBox_MouseDown;
                m_editPictureBox.MouseUp += m_editPictureBox_MouseUp;
                m_editPictureBox.MouseMove += m_editPictureBox_MouseMove;
                m_editPictureBox.MouseWheel += m_editPictureBox_MouseWheel;
                Controls.Add(m_editPictureBox);
                m_editPictureBox.Refresh();

                MetroPanel topToolbar = new MetroPanel();
                MetroSkinManager.ApplyMetroStyle(topToolbar);
                topToolbar.Width = 0;
                topToolbar.Height = 30;
                topToolbar.Dock = DockStyle.Top;
                Controls.Add(topToolbar);

                MetroLabel typeLabel = new MetroLabel();
                MetroSkinManager.ApplyMetroStyle(typeLabel);
                typeLabel.Width = 0;
                typeLabel.Height = 0;
                typeLabel.AutoSize = true;
                typeLabel.Dock = DockStyle.Left;
                typeLabel.Text = "Type:";

                if (m_curveSet != null)
                {
                    m_curvesCheckBoxes = new List<MetroCheckBox>();
                    foreach (var name in m_info.Curves)
                    {
                        MetroCheckBox checkBox = new MetroCheckBox();
                        MetroSkinManager.ApplyMetroStyle(checkBox);
                        checkBox.Width = 0;
                        checkBox.AutoSize = true;
                        checkBox.Checked = true;
                        checkBox.Text = name;
                        checkBox.Dock = DockStyle.Right;
                        checkBox.CheckedChanged += checkBox_CheckedChanged;
                        topToolbar.Controls.Add(checkBox);
                        m_curvesCheckBoxes.Add(checkBox);
                    }
                }

                m_typeComboBox = new MetroComboBox();
                MetroSkinManager.ApplyMetroStyle(m_typeComboBox);
                m_typeComboBox.Dock = DockStyle.Left;
                m_typeComboBox.BindingContext = new BindingContext();
                m_typeComboBox.DataSource = Enum.GetNames(typeof(PlayCanvas.Curve.CurveType));
                if (m_curve != null)
                    m_typeComboBox.SelectedItem = Enum.GetName(typeof(PlayCanvas.Curve.CurveType), m_curve.Type);
                else if (m_curveSet != null)
                    m_typeComboBox.SelectedItem = Enum.GetName(typeof(PlayCanvas.Curve.CurveType), m_curveSet.Type);
                m_typeComboBox.SelectedValueChanged += m_typeComboBox_SelectedValueChanged;

                topToolbar.Controls.Add(m_typeComboBox);
                topToolbar.Controls.Add(typeLabel);

                MetroPanel bottomToolbar = new MetroPanel();
                MetroSkinManager.ApplyMetroStyle(bottomToolbar);
                bottomToolbar.Width = 0;
                bottomToolbar.Height = 24;
                bottomToolbar.Dock = DockStyle.Bottom;
                Controls.Add(bottomToolbar);

                MetroLabel keyLabel = new MetroLabel();
                MetroSkinManager.ApplyMetroStyle(keyLabel);
                keyLabel.Width = 0;
                keyLabel.Height = 0;
                keyLabel.AutoSize = true;
                keyLabel.Dock = DockStyle.Left;
                keyLabel.Text = "Key frame:";

                m_keyTextBox = new MetroTextBox();
                MetroSkinManager.ApplyMetroStyle(m_keyTextBox);
                m_keyTextBox.Width = 100;
                m_keyTextBox.Dock = DockStyle.Left;
                m_keyTextBox.TextChanged += m_keyTextBox_TextChanged;
                m_keyTextBox.CustomPaintForeground += m_keyTextBox_CustomPaintForeground;
                m_keyTextBox.Leave += m_keyTextBox_Leave;

                MetroLabel valueLabel = new MetroLabel();
                MetroSkinManager.ApplyMetroStyle(valueLabel);
                valueLabel.Width = 0;
                valueLabel.Height = 0;
                valueLabel.AutoSize = true;
                valueLabel.Dock = DockStyle.Left;
                valueLabel.Text = "Value:";

                m_valueTextBox = new MetroTextBox();
                MetroSkinManager.ApplyMetroStyle(m_valueTextBox);
                m_valueTextBox.Width = 100;
                m_valueTextBox.Dock = DockStyle.Left;
                m_valueTextBox.TextChanged += m_valueTextBox_TextChanged;
                m_valueTextBox.CustomPaintForeground += m_valueTextBox_CustomPaintForeground;
                m_valueTextBox.Leave += m_valueTextBox_Leave;

                MetroButton resetButton = new MetroButton();
                MetroSkinManager.ApplyMetroStyle(resetButton);
                resetButton.Width = 0;
                resetButton.AutoSize = true;
                resetButton.Dock = DockStyle.Right;
                resetButton.Text = m_curve == null ? "Reset visible curves" : "Reset curve";
                resetButton.Click += resetButton_Click;

                bottomToolbar.Controls.Add(resetButton);
                bottomToolbar.Controls.Add(m_valueTextBox);
                bottomToolbar.Controls.Add(valueLabel);
                bottomToolbar.Controls.Add(m_keyTextBox);
                bottomToolbar.Controls.Add(keyLabel);
            }
Пример #2
0
        public void RegisterPropertyEditors()
        {
            MainForm mainForm = FindForm() as MainForm;
            if (mainForm == null || mainForm.ProjectModel == null)
                return;

            m_editorsRegistry.UnregisterAllControls();
            m_editorsRegistry.RegisterControl<PropertyEditors.Number_PropertyEditor>("number");
            m_editorsRegistry.RegisterControl<PropertyEditors.String_PropertyEditor>("string");
            m_editorsRegistry.RegisterControl<PropertyEditors.Boolean_PropertyEditor>("boolean");
            //m_controlsRegistry.RegisterControl<PropertyEditors.Asset_PropertyEditor>("asset");
            //m_controlsRegistry.RegisterControl<PropertyEditors.Entity_PropertyEditor>("entity");
            m_editorsRegistry.RegisterControl<PropertyEditors.PlayCanvas_Rgb_PropertyEditor>("rgb");
            m_editorsRegistry.RegisterControl<PropertyEditors.PlayCanvas_Rgba_PropertyEditor>("rgba");
            m_editorsRegistry.RegisterControl<PropertyEditors.PlayCanvas_Vector_PropertyEditor>("vector");
            m_editorsRegistry.RegisterControl<PropertyEditors.PlayCanvas_Enumeration_PropertyEditor>("enumeration");
            m_editorsRegistry.RegisterControl<PropertyEditors.PlayCanvas_Curve_PropertyEditor>("curve");
            m_editorsRegistry.RegisterControl<PropertyEditors.PlayCanvas_ColorCurve_PropertyEditor>("colorcurve");

            string assetsPath = Path.Combine(mainForm.ProjectModel.WorkingDirectory, "assets");
            DirectoryInfo info = new DirectoryInfo(assetsPath);
            if (info.Exists)
            {
                FileInfo[] files = info.GetFiles("*.editor.json", SearchOption.AllDirectories);
                if (files != null && files.Length > 0)
                {
                    foreach (var file in files)
                    {
                        try
                        {
                            string name = file.Name.Remove(file.Name.Length - ".editor.json".Length);
                            string content = File.ReadAllText(file.FullName);
                            if (!String.IsNullOrEmpty(content))
                            {
                                PropertiesControl.TypeDescriptor typeDesc = JsonConvert.DeserializeObject<PropertiesControl.TypeDescriptor>(content);
                                if (typeDesc == null || !m_editorsRegistry.RegisterControl(name, typeDesc))
                                    throw new Exception("Cannot register custom editor: " + name);
                            }
                            else
                                throw new Exception("Cannot load custom editor: " + file.FullName);
                        }
                        catch (Exception ex)
                        {
                            MetroMessageBox.Show(mainForm, ex.Message, "Registering custom editor error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                files = info.GetFiles("*.editor.html", SearchOption.AllDirectories);
                if (files != null && files.Length > 0)
                {
                    foreach (var file in files)
                    {
                        try
                        {
                            string name = file.Name.Remove(file.Name.Length - ".editor.html".Length);
                            if (!m_editorsRegistry.RegisterControl(name, file.FullName))
                                throw new Exception("Cannot register custom editor: " + name);
                        }
                        catch (Exception ex)
                        {
                            MetroMessageBox.Show(mainForm, ex.Message, "Registering custom editor error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
            }

            PropertiesModel model = new PropertiesModel();
            var numberInfo = new PropertyEditors.Number_PropertyEditor.NumberInfo() { Min = 0.5f, Max = 1.5f };
            model.Properties.Add(PropertiesModel.Property.Create<float, PropertyEditors.Number_PropertyEditor.NumberInfo>("number", "number", 1.0f, numberInfo));
            model.Properties.Add(PropertiesModel.Property.Create<string>("string", "string", "text"));
            model.Properties.Add(PropertiesModel.Property.Create<bool>("boolean", "boolean", true));
            //model.Properties.Add(PropertiesModel.Property.Create<PlayCanvas.Assets>("asset", "asset", null));
            //model.Properties.Add(PropertiesModel.Property.Create<PlayCanvas.Entity>("entity", "entity", null));
            model.Properties.Add(PropertiesModel.Property.Create<PlayCanvas.Color>("rgb", "rgb", new PlayCanvas.Color(1.0f, 0.5f, 0.0f)));
            model.Properties.Add(PropertiesModel.Property.Create<PlayCanvas.Color>("rgba", "rgba", new PlayCanvas.Color(0.0f, 0.5f, 1.0f, 0.5f)));
            model.Properties.Add(PropertiesModel.Property.Create<PlayCanvas.Vector>("vector", "vector", new PlayCanvas.Vector(0.0f, 1.0f, 0.0f)));
            var enumsInfo = new PropertyEditors.PlayCanvas_Enumeration_PropertyEditor.EnumerationInfo();
            enumsInfo["Cat"] = 0;
            enumsInfo["Dog"] = 1;
            model.Properties.Add(PropertiesModel.Property.Create<int, PropertyEditors.PlayCanvas_Enumeration_PropertyEditor.EnumerationInfo>("enumeration", "enumeration", 0, enumsInfo));
            var curveData = new float[] {
                0.0f, 1.0f,
                1.0f, 0.0f
            };
            model.Properties.Add(PropertiesModel.Property.Create<PlayCanvas.Curve>("curve", "curve", new PlayCanvas.Curve(curveData)));
            var curveSetInfo = new PropertyEditors.PlayCanvas_Curve_PropertyEditor.CurveInfo() { Curves = new string[] { "x", "y", "z" } };
            var curveSetData = new float[][] {
                new float[]{
                    0.0f, 1.0f,
                    1.0f, 0.0f
                },
                new float[]{
                    0.0f, 0.5f,
                    1.0f, 0.5f
                }
            };
            model.Properties.Add(PropertiesModel.Property.Create<PlayCanvas.CurveSet, PropertyEditors.PlayCanvas_Curve_PropertyEditor.CurveInfo>("curveSet", "curve", new PlayCanvas.CurveSet(curveSetData), curveSetInfo));
            var colorCurveSetInfo = new PropertyEditors.PlayCanvas_ColorCurve_PropertyEditor.ColorCurveInfo() { Type = PropertyEditors.PlayCanvas_ColorCurve_PropertyEditor.ColorCurveType.RGB };
            model.Properties.Add(PropertiesModel.Property.Create<PlayCanvas.CurveSet, PropertyEditors.PlayCanvas_ColorCurve_PropertyEditor.ColorCurveInfo>("colorCurve", "colorcurve", new PlayCanvas.CurveSet(), colorCurveSetInfo));
            model.Properties.Add(PropertiesModel.Property.Create<CustomType>("CustomType", "CustomType"));
            model.Properties.Add(PropertiesModel.Property.Create<CustomType>("Date", "Date"));
            model.Properties.Add(new PropertiesModel.Property("Array", "[string]"));
            model.Properties.Add(new PropertiesModel.Property("Object", "{CustomType}"));

            PropertiesControl properties = new PropertiesControl(model, m_editorsRegistry);
            properties.Dock = DockStyle.Fill;
            m_inspectPanel.Content.Controls.Clear();
            m_inspectPanel.Content.Controls.Add(properties);
        }