132 lines
3.9 KiB
C#
132 lines
3.9 KiB
C#
|
|
using System.Globalization;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Media;
|
|
|
|
using Forms = System.Windows.Forms;
|
|
|
|
using MpvNet.Windows.UI;
|
|
|
|
namespace MpvNet.Windows.WPF;
|
|
|
|
public partial class StringSettingControl : UserControl, ISettingControl
|
|
{
|
|
StringSetting StringSetting;
|
|
|
|
public StringSettingControl(StringSetting stringSetting)
|
|
{
|
|
StringSetting = stringSetting;
|
|
InitializeComponent();
|
|
DataContext = this;
|
|
TitleTextBox.Text = stringSetting.Name;
|
|
HelpTextBox.Text = stringSetting.Help;
|
|
ValueTextBox.Text = StringSetting.Value;
|
|
|
|
if (StringSetting.Width > 0)
|
|
ValueTextBox.Width = StringSetting.Width;
|
|
|
|
if (StringSetting.Type != "folder" && StringSetting.Type != "color")
|
|
Button.Visibility = Visibility.Hidden;
|
|
|
|
Link.SetURL(StringSetting.URL);
|
|
|
|
if (string.IsNullOrEmpty(stringSetting.URL))
|
|
LinkTextBlock.Visibility = Visibility.Collapsed;
|
|
|
|
if (string.IsNullOrEmpty(stringSetting.Help))
|
|
HelpTextBox.Visibility = Visibility.Collapsed;
|
|
}
|
|
|
|
public Theme? Theme => Theme.Current;
|
|
|
|
public bool Contains(string search)
|
|
{
|
|
if (TitleTextBox.Text.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) > -1)
|
|
return true;
|
|
|
|
if (HelpTextBox.Text.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) > -1)
|
|
return true;
|
|
|
|
if (ValueTextBox.Text.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) > -1)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
public Setting Setting => StringSetting;
|
|
|
|
public string? Text
|
|
{
|
|
get => StringSetting.Value;
|
|
set => StringSetting.Value = value;
|
|
}
|
|
|
|
void Button_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
switch (StringSetting.Type)
|
|
{
|
|
case "folder":
|
|
{
|
|
var dialog = new Forms.FolderBrowserDialog { InitialDirectory = ValueTextBox.Text };
|
|
|
|
if (dialog.ShowDialog() == Forms.DialogResult.OK)
|
|
ValueTextBox.Text = dialog.SelectedPath;
|
|
}
|
|
break;
|
|
case "color":
|
|
using (var dialog = new Forms.ColorDialog())
|
|
{
|
|
dialog.FullOpen = true;
|
|
|
|
try
|
|
{
|
|
if (!string.IsNullOrEmpty(ValueTextBox.Text))
|
|
{
|
|
Color col = GetColor(ValueTextBox.Text);
|
|
dialog.Color = System.Drawing.Color.FromArgb(col.A, col.R, col.G, col.B);
|
|
}
|
|
} catch {}
|
|
|
|
if (dialog.ShowDialog() == Forms.DialogResult.OK)
|
|
ValueTextBox.Text = "#" + dialog.Color.ToArgb().ToString("X8");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ValueTextBox_TextChanged(object sender, TextChangedEventArgs e) => Update();
|
|
|
|
Color GetColor(string value)
|
|
{
|
|
if (value.Contains('/'))
|
|
{
|
|
string[] a = value.Split('/');
|
|
|
|
if (a.Length == 3)
|
|
return Color.FromRgb(ToByte(a[0]), ToByte(a[1]), ToByte(a[2]));
|
|
else if (a.Length == 4)
|
|
return Color.FromArgb(ToByte(a[3]), ToByte(a[0]), ToByte(a[1]), ToByte(a[2]));
|
|
}
|
|
|
|
return (Color)ColorConverter.ConvertFromString(value);
|
|
|
|
byte ToByte(string val) => Convert.ToByte(Convert.ToSingle(val, CultureInfo.InvariantCulture) * 255);
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (StringSetting.Type == "color")
|
|
{
|
|
Color color = Colors.Transparent;
|
|
|
|
if (ValueTextBox.Text != "")
|
|
try {
|
|
color = GetColor(ValueTextBox.Text);
|
|
} catch {}
|
|
|
|
ValueTextBox.Background = new SolidColorBrush(color);
|
|
}
|
|
}
|
|
}
|