Ejemplo n.º 1
0
 public void PropertyButtonClicked(ObsProperty property)
 {
     if (property.ButtonClicked(context.GetPointer()))
     {
         RefreshProperties(property);
     }
 }
Ejemplo n.º 2
0
        private void AddFont(ObsProperty property, ObsData setting, List <Control> controls)
        {
            string name = property.Name;

            Label label = new Label
            {
                Width       = 300,
                Height      = 60,
                AutoSize    = false,
                BorderStyle = BorderStyle.Fixed3D,
                TextAlign   = ContentAlignment.MiddleCenter
            };

            Button button = new Button {
                Text = "Select..."
            };

            using (ObsData fontData = new ObsData(setting.GetObject(name)))
            {
                string family = fontData.GetString("face");
                //string style = fontData.GetString("style");	//not supported in Windows
                ObsFontFlags flags = (ObsFontFlags)fontData.GetInt("flags");

                label.Font = new Font(family, 25F, (FontStyle)flags);;
                label.Text = family;
            }

            button.Click += (sender, args) =>
            {
                var fontDialog = new FontDialog();

                using (ObsData fontData = new ObsData(setting.GetObject(name)))
                {
                    float size = fontData.GetInt("size");
                    fontDialog.Font = new Font(label.Font.FontFamily, size, label.Font.Style);
                }

                if (fontDialog.ShowDialog() == DialogResult.OK)
                {
                    var font = fontDialog.Font;

                    using (ObsData fontData = new ObsData(setting.GetObject(name)))
                    {
                        fontData.SetString("face", font.Name.ToString());
                        fontData.SetString("style", "");                                //not supported in Windows
                        fontData.SetInt("size", (int)font.SizeInPoints);
                        fontData.SetInt("flags", (int)font.Style);
                    }

                    view.PropertyChanged(property);

                    font       = new Font(font.Name, 25f, font.Style);
                    label.Font = font;
                    label.Text = font.Name;
                }
            };

            controls.Add(label);
            controls.Add(button);
        }
Ejemplo n.º 3
0
        private void AddText(ObsProperty property, ObsData setting, List <Control> controls)
        {
            string name = property.Name;

            TextBox textbox = new TextBox
            {
                Width = 300,
                Text  = setting.GetString(name)
            };

            if (property.TextType == ObsTextType.Password)
            {
                textbox.PasswordChar = '*';
            }
            else if (property.TextType == ObsTextType.Multiline)
            {
                textbox.Multiline = true;
                textbox.Height   *= 3;
            }

            textbox.TextChanged += (sender, args) =>
            {
                setting.SetString(name, textbox.Text);
                view.PropertyChanged(property);
            };

            controls.Add(textbox);
        }
Ejemplo n.º 4
0
        private void AddPath(ObsProperty property, ObsData setting, List <Control> controls)
        {
            string name = property.Name;

            TextBox textbox = new TextBox
            {
                Width = 300,
                Text  = setting.GetString(name)
            };
            Button button = new Button {
                Text = "Browse..."
            };

            if (property.PathType == ObsPathType.File)
            {
                OpenFileDialog dialog = new OpenFileDialog
                {
                    AutoUpgradeEnabled = true,
                    Filter             = property.PathFilter.ToString(),
                    InitialDirectory   = property.PathDefault,
                    FilterIndex        = 1
                };

                button.Click += (sender, args) =>
                {
                    if (dialog.ShowDialog(this) == DialogResult.OK)
                    {
                        textbox.Text = dialog.FileName;
                    }
                };
            }
            else if (property.PathType == ObsPathType.Directory)
            {
                FolderBrowserDialog dialog = new FolderBrowserDialog
                {
                    SelectedPath = property.PathDefault
                };

                button.Click += (sender, args) =>
                {
                    if (dialog.ShowDialog(this) == DialogResult.OK)
                    {
                        textbox.Text = dialog.SelectedPath;
                    }
                };
            }

            textbox.TextChanged += (sender, args) =>
            {
                setting.SetString(name, textbox.Text);
                view.PropertyChanged(property);
            };

            controls.Add(textbox);
            controls.Add(button);
        }
Ejemplo n.º 5
0
        private void AddButton(ObsProperty property, ObsData setting, List <Control> controls)
        {
            Button button = new Button {
                Text = property.Description
            };

            button.Click += (sender, args) => view.PropertyButtonClicked(property);

            controls.Add(button);
        }
Ejemplo n.º 6
0
        public void PropertyButtonClicked(ObsProperty property, libobs.obs_property_clicked_t clicked)
        {
            if (clicked == null)
            {
                return;
            }

            if (property.ButtonClicked(clicked, properties, context.GetPointer()))
            {
                RefreshProperties(property);
            }
        }
Ejemplo n.º 7
0
        public void PropertyChanged(ObsProperty property)
        {
            if (!deferUpdate)
            {
                UpdateSettings();
            }

            if (property.Modified(settings))
            {
                RefreshProperties(property);
            }
        }
Ejemplo n.º 8
0
        private void AddColor(ObsProperty property, ObsData setting, List <Control> controls)
        {
            string name = property.Name;

            // note: libobs stores color in ABGR instead of ARGB

            Color   color   = ColorHelper.FromAbgr((int)setting.GetInt(name));
            TextBox textbox = new TextBox
            {
                Width     = 300,
                ForeColor = color.GetBrightness() > 0.93 ? Color.Black : color,
                Text      = color.ToHtml(),
                TextAlign = HorizontalAlignment.Center
            };

            Button button = new Button {
                Text = "Select..."
            };

            textbox.TextChanged += (sender, args) =>
            {
                Color newColor = ColorHelper.FromAbgr((int)setting.GetInt(name));
                newColor = newColor.FromHtml(textbox.Text);

                textbox.ForeColor = newColor.GetBrightness() > 0.93 ? Color.Black : newColor;
                setting.SetInt(name, newColor.ToAbgr());
                view.PropertyChanged(property);
            };

            button.Click += (sender, args) =>
            {
                ColorDialog colorDialog = new ColorDialog
                {
                    AllowFullOpen = true,
                    AnyColor      = true,
                    Color         = ColorHelper.TryColorFromHtml(textbox.Text),
                    FullOpen      = true
                };
                colorDialog.Color = colorDialog.Color.FromHtml(textbox.Text);

                if (colorDialog.ShowDialog(this) == DialogResult.OK)
                {
                    textbox.Text = colorDialog.Color.ToHtml();
                }
            };

            controls.Add(textbox);
            controls.Add(button);
        }
Ejemplo n.º 9
0
        private void EditableListChanged(ListBox listBox, ObsProperty property, ObsData setting)
        {
            string       propertyName = property.Name;
            ObsDataArray array        = new ObsDataArray();

            foreach (string item in listBox.Items)
            {
                ObsData itemArray = new ObsData();
                itemArray.SetString("value", item);

                array.Add(itemArray);
                itemArray.Dispose();
            }

            setting.SetArray(propertyName, array);
            array.Dispose();
        }
Ejemplo n.º 10
0
        private void AddBool(ObsProperty property, ObsData setting, List <Control> controls)
        {
            string name = property.Name;

            CheckBox checkbox = new CheckBox
            {
                Width     = 300,
                Height    = 18,
                Checked   = setting.GetBool(name),
                Text      = property.Description,
                TextAlign = ContentAlignment.MiddleLeft
            };

            checkbox.CheckedChanged += (sender, args) =>
            {
                setting.SetBool(name, checkbox.Checked);
                view.PropertyChanged(property);
            };

            controls.Add(checkbox);
        }
Ejemplo n.º 11
0
        private void AddEditableList(ObsProperty property, ObsData setting, List <Control> controls)
        {
            string name = property.Name;
            ObsEditableListType type = property.EditableListType;

            FlowLayoutPanel layoutPanel = new FlowLayoutPanel()
            {
                FlowDirection = FlowDirection.TopDown,
                AutoSize      = true,
                AutoSizeMode  = AutoSizeMode.GrowAndShrink
            };

            ListBox listBox = new ListBox()
            {
                Width          = 300,
                Height         = 180,
                IntegralHeight = false,
                SelectionMode  = SelectionMode.MultiExtended,
            };

            //TODO: use icons for list buttons
            Button buttonAdd = new Button {
                Text = "+", Width = 25, Tag = listBox
            };
            Button buttonAddMulti = new Button {
                Text = "B", Width = 25, Tag = listBox
            };
            Button buttonRemove = new Button {
                Text = "-", Width = 25, Tag = listBox
            };
            Button buttonConfig = new Button {
                Text = "C", Width = 25, Tag = listBox
            };
            Button buttonUp = new Button {
                Text = "^", Width = 25, Tag = listBox
            };
            Button buttonDown = new Button {
                Text = "v", Width = 25, Tag = listBox
            };

            using (ObsDataArray array = setting.GetArray(name))
            {
                listBox.BeginUpdate();

                if (array != null)
                {
                    foreach (ObsData item in array)
                    {
                        listBox.Items.Add(item.GetString("value"));
                    }
                }

                listBox.EndUpdate();
            }

            buttonAdd.Click += (sender, args) =>
            {
                //TODO: open dialog with ok/cancel options, text field and browse button (with allowFiles)
            };

            buttonAddMulti.Click += (sender, args) =>
            {
                OpenFileDialog dialog = new OpenFileDialog
                {
                    AutoUpgradeEnabled = true,
                    Filter             = property.EditableListFilter.ToString(),
                    FilterIndex        = 1,
                    InitialDirectory   = property.EditableListPathDefault,
                    Multiselect        = true
                };

                if (dialog.ShowDialog(this) == DialogResult.OK)
                {
                    listBox.BeginUpdate();
                    listBox.Items.AddRange(dialog.FileNames);
                    listBox.EndUpdate();

                    EditableListChanged(listBox, property, setting);
                }
            };

            buttonRemove.Click += (sender, args) =>
            {
                if (listBox.SelectedItems.Count == 0)
                {
                    return;
                }

                listBox.BeginUpdate();

                for (int i = listBox.SelectedItems.Count - 1; i >= 0; i--)
                {
                    listBox.Items.RemoveAt(listBox.SelectedIndices[i]);
                }

                listBox.EndUpdate();

                EditableListChanged(listBox, property, setting);
            };

            buttonConfig.Click += (sender, args) =>
            {
                // To avoid confusion, only allow to edit one item at the time
                if (listBox.SelectedItems.Count != 1)
                {
                    return;
                }


                //TODO: open dialog with ok/cancel options, text field and browse button (with allowFiles), same as in add

                /*OpenFileDialog dialog = new OpenFileDialog
                 * {
                 *      FileName = listBox.SelectedItem.ToString(),
                 *      AutoUpgradeEnabled = true,
                 *      Filter = property.EditableListFilter.ToString(),
                 *      FilterIndex = 1,
                 *      InitialDirectory = property.EditableListPathDefault,
                 *      Multiselect = true
                 * };
                 *
                 * if (dialog.ShowDialog(this) == DialogResult.OK)
                 * {
                 *      listBox.Items[listBox.SelectedIndex] = dialog.FileName;
                 *      EditableListChanged(listBox, property, setting);
                 * }*/
            };

            buttonUp.Click += (sender, args) =>
            {
                if (listBox.SelectedItems.Count == 0)
                {
                    return;
                }

                listBox.BeginUpdate();

                int lastIndex = -1;
                for (int i = 0; i < listBox.SelectedItems.Count; i++)
                {
                    int    index    = listBox.SelectedIndices[i];
                    int    newIndex = Math.Max(index - 1, 0);
                    object item     = listBox.Items[index];

                    if (index != newIndex && newIndex != lastIndex)
                    {
                        listBox.Items.RemoveAt(index);
                        listBox.Items.Insert(newIndex, item);
                        listBox.SetSelected(newIndex, true);
                    }
                    lastIndex = newIndex;
                }

                listBox.EndUpdate();

                EditableListChanged(listBox, property, setting);
            };

            buttonDown.Click += (sender, args) =>
            {
                if (listBox.SelectedItems.Count == 0)
                {
                    return;
                }

                listBox.BeginUpdate();

                int lastIndex = -1;
                for (int i = listBox.SelectedItems.Count - 1; i >= 0; i--)
                {
                    int    index    = listBox.SelectedIndices[i];
                    int    newIndex = Math.Min(index + 1, listBox.Items.Count - 1);
                    object item     = listBox.Items[index];

                    if (index != newIndex && newIndex != lastIndex)
                    {
                        listBox.Items.RemoveAt(index);
                        listBox.Items.Insert(newIndex, item);
                        listBox.SetSelected(newIndex, true);
                    }
                    lastIndex = newIndex;
                }

                listBox.EndUpdate();

                EditableListChanged(listBox, property, setting);
            };

            layoutPanel.Controls.Add(buttonAdd);

            if (type == ObsEditableListType.Strings)
            {
                layoutPanel.Controls.Add(buttonAddMulti);
            }
            else
            {
                throw new NotImplementedException(type.ToString());
            }

            layoutPanel.Controls.Add(buttonRemove);
            layoutPanel.Controls.Add(buttonConfig);
            layoutPanel.Controls.Add(buttonUp);
            layoutPanel.Controls.Add(buttonDown);

            controls.Add(listBox);
            controls.Add(layoutPanel);
        }
Ejemplo n.º 12
0
        public PropertyControl(PropertiesView view, ObsProperty property, ObsData setting)
        {
            SuspendLayout();
            AutoSize = true;
            Margin   = new Padding(0, 1, 0, 1);
            Size     = new Size(600, 25);
            ResumeLayout(false);

            this.view = view;

            DoubleBuffered = true;
            Padding        = new Padding(2);

            ObsPropertyType type     = property.Type;
            bool            addLabel = true;
            List <Control>  controls = new List <Control>();

            switch (type)
            {
            case ObsPropertyType.Bool:
            {
                addLabel = false;
                AddBool(property, setting, controls);
                break;
            }

            case ObsPropertyType.Int:
            case ObsPropertyType.Float:
            {
                AddNumeric(property, setting, controls);
                break;
            }

            case ObsPropertyType.Text:
            {
                AddText(property, setting, controls);
                break;
            }

            case ObsPropertyType.Path:
            {
                AddPath(property, setting, controls);
                break;
            }

            case ObsPropertyType.List:
            {
                AddList(property, setting, controls);
                break;
            }

            case ObsPropertyType.Color:
            {
                AddColor(property, setting, controls);
                break;
            }

            case ObsPropertyType.Button:
            {
                addLabel = false;
                AddButton(property, setting, controls);
                break;
            }

            case ObsPropertyType.Font:
            {
                AddFont(property, setting, controls);
                break;
            }

            case ObsPropertyType.EditableList:
            {
                addLabel = false;
                AddEditableList(property, setting, controls);
                break;
            }

            default:
            {
                throw new Exception(String.Format("Error, unimplemented property type {0} for property {1}", type, property.Description));
            }
            }

            Label nameLabel = new Label
            {
                Text        = addLabel ? property.Description : "",
                TextAlign   = ContentAlignment.MiddleRight,
                MinimumSize = new Size(170, 0),
                AutoSize    = true,
                Dock        = DockStyle.Left
            };

            controls.Insert(0, nameLabel);

            foreach (Control control in controls)
            {
                WinFormsHelper.DoubleBufferControl(control);

                int     margin    = 0;
                Padding oldmargin = control.Margin;
                oldmargin.Top    = margin;
                oldmargin.Bottom = margin;
                control.Margin   = oldmargin;
            }

            SuspendLayout();
            Controls.AddRange(controls.ToArray());
            ResumeLayout();
        }
Ejemplo n.º 13
0
        private void AddList(ObsProperty property, ObsData setting, List <Control> controls)
        {
            string name = property.Name;

            int index = 0;

            string[]     names  = property.GetListItemNames();
            object[]     values = property.GetListItemValues();
            EventHandler selectedIndexChanged = null;
            ComboBox     combobox             = new ComboBox {
                Width = 300
            };

            combobox.Items.AddRange(names.ToArray());

            //if (namelist.Length > 0)
            //	combobox.SelectedIndex = 0;

            if (property.ListType == ObsComboType.List)
            {
                combobox.DropDownStyle = ComboBoxStyle.DropDownList;
            }

            switch (property.ListFormat)
            {
            case ObsComboFormat.Float:
            {
                index = Array.IndexOf(values, setting.GetDouble(name));

                selectedIndexChanged = (sender, args) =>
                {
                    double value = (double)values.GetValue(combobox.SelectedIndex);
                    setting.SetDouble(name, value);
                    view.PropertyChanged(property);
                };
                break;
            }

            case ObsComboFormat.Int:
            {
                var val = setting.GetInt(name);
                index = Array.IndexOf(values, setting.GetInt(name));

                selectedIndexChanged = (sender, args) =>
                {
                    long value = (long)values[combobox.SelectedIndex];
                    setting.SetInt(name, (int)value);
                    view.PropertyChanged(property);
                };
                break;
            }

            case ObsComboFormat.String:
            {
                index = Array.IndexOf(values, setting.GetString(name));

                selectedIndexChanged = (sender, args) =>
                {
                    string value = (string)values[combobox.SelectedIndex];
                    setting.SetString(name, value);
                    view.PropertyChanged(property);
                };
                break;
            }
            }

            if (index != -1)
            {
                combobox.SelectedIndex = index;
            }

            combobox.SelectedIndexChanged += selectedIndexChanged;

            if (index == -1 && names.Length > 0)
            {
                combobox.SelectedIndex = 0;
            }

            controls.Add(combobox);
        }
Ejemplo n.º 14
0
        private void AddNumeric(ObsProperty property, ObsData setting, List <Control> controls)
        {
            ObsPropertyType type = property.Type;
            string          name = property.Name;

            NumericUpDown numeric = new NumericUpDown
            {
                Width         = 300,
                DecimalPlaces = 0
            };

            if (type == ObsPropertyType.Int)
            {
                int  intMin   = property.IntMin;
                int  intMax   = property.IntMax;
                long intValue = setting.GetInt(name);
                intValue = Math.Max(Math.Min(intValue, intMax), intMin);

                numeric.Minimum   = intMin;
                numeric.Maximum   = intMax;
                numeric.Increment = property.IntStep;
                numeric.Value     = intValue;

                numeric.ValueChanged += (sender, args) =>
                {
                    setting.SetInt(name, (int)numeric.Value);
                    view.PropertyChanged(property);
                };
            }
            else if (type == ObsPropertyType.Float)
            {
                double floatMin   = property.FloatMin;
                double floatMax   = property.FloatMax;
                double floatValue = setting.GetDouble(name);
                floatValue = Math.Max(Math.Min(floatValue, floatMax), floatMin);

                numeric.DecimalPlaces = 2;
                numeric.Minimum       = (decimal)floatMin;
                numeric.Maximum       = (decimal)floatMax;
                numeric.Increment     = (decimal)property.FloatStep;
                numeric.Value         = (decimal)floatValue;

                numeric.ValueChanged += (sender, args) =>
                {
                    setting.SetDouble(name, (double)numeric.Value);
                    view.PropertyChanged(property);
                };
            }

            if (property.IntType == ObsNumberType.Slider || property.FloatType == ObsNumberType.Slider)
            {
                numeric.Width  = 75;
                numeric.Height = 23;

                const int multiplier = 1000;
                var       trackbar   = new TrackBar
                {
                    AutoSize    = false,
                    Width       = 300,
                    Height      = 23,
                    TickStyle   = TickStyle.None,
                    Minimum     = (int)(numeric.Minimum * multiplier),
                    Maximum     = (int)(numeric.Maximum * multiplier),
                    SmallChange = (int)(numeric.Increment * multiplier),
                    LargeChange = (int)(numeric.Increment * multiplier),
                    Value       = (int)(numeric.Value * multiplier)
                };
                trackbar.ValueChanged += (sender, args) => numeric.Value = (decimal)trackbar.Value / multiplier;
                numeric.ValueChanged  += (sender, args) => trackbar.Value = (int)(numeric.Value * multiplier);
                controls.Add(trackbar);
            }
            controls.Add(numeric);
        }
Ejemplo n.º 15
0
        /// <param name="focusProperty"> Optional: Sets focus to control of this property.</param>
        private void RefreshProperties(ObsProperty focusProperty = null)
        {
            // prevent properties triggering another refresh when previous refresh is still ongoing
            if (++refreshCount > 0)
            {
                return;
            }

            ScrollableControl parent = (Parent as ScrollableControl);
            var oldScrollPos         = parent != null ? parent.VerticalScroll.Value : 0;

            List <Control> controls     = new List <Control>();
            Control        focusControl = null;

            do
            {
                refreshCount = 0;
                controls.Clear();
                ObsProperty[] propertyList = properties.GetPropertyList();

                foreach (ObsProperty property in propertyList)
                {
                    PropertyControl control = new PropertyControl(this, property, settings)
                    {
                        Enabled = property.Enabled,
                        Visible = property.Visible
                    };

                    if (focusProperty != null && property.GetPointer() == focusProperty.GetPointer())
                    {
                        focusControl = control.Controls[1];
                    }

                    controls.Add(control);
                }
            }while (refreshCount > 0);

            panel.SuspendLayout();

            panel.Controls.Clear();
            panel.Controls.AddRange(controls.ToArray());

            panel.Select();
            panel.Focus();

            // restore last focused control and scroll state
            if (focusControl != null)
            {
                focusControl.Focus();
                focusControl.Select();
            }

            if (parent != null)
            {
                parent.VerticalScroll.Value = oldScrollPos;
            }

            panel.ResumeLayout();
            PerformLayout();

            refreshCount = -1;
        }