cemu-DS4Windows/DS4Windows/DS4Forms/ViewModels/SpecialActions/LaunchProgramViewModel.cs
2019-12-18 15:33:23 -06:00

131 lines
3.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using DS4Windows;
using DS4WinWPF.DS4Forms.ViewModels.Util;
namespace DS4WinWPF.DS4Forms.ViewModels.SpecialActions
{
public class LaunchProgramViewModel : NotifyDataErrorBase
{
private string filepath;
private int delay;
private string arguments;
public string Filepath
{
get => filepath;
set
{
if (filepath == value) return;
filepath = value;
FilepathChanged?.Invoke(this, EventArgs.Empty);
}
}
public event EventHandler FilepathChanged;
public int Delay { get => delay; set => delay = value; }
public string Arguments { get => arguments; set => arguments = value; }
public ImageSource ProgramIcon
{
get
{
ImageSource exeicon = null;
string path = filepath;
if (File.Exists(path) && Path.GetExtension(path) == ".exe")
{
using (Icon ico = Icon.ExtractAssociatedIcon(path))
{
exeicon = Imaging.CreateBitmapSourceFromHIcon(ico.Handle, Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
exeicon.Freeze();
}
}
return exeicon;
}
}
public event EventHandler ProgramIconChanged;
public string ProgramName
{
get
{
string temp = "";
if (!string.IsNullOrEmpty(filepath))
{
temp = Path.GetFileNameWithoutExtension(filepath);
}
return temp;
}
}
public event EventHandler ProgramNameChanged;
public LaunchProgramViewModel()
{
FilepathChanged += LaunchProgramViewModel_FilepathChanged;
}
private void LaunchProgramViewModel_FilepathChanged(object sender, EventArgs e)
{
ProgramIconChanged?.Invoke(this, EventArgs.Empty);
ProgramNameChanged?.Invoke(this, EventArgs.Empty);
}
public void LoadAction(SpecialAction action)
{
filepath = action.details;
delay = (int)action.delayTime;
arguments = action.extra;
}
public void SaveAction(SpecialAction action, bool edit = false)
{
Global.SaveAction(action.name, action.controls, 2, $"{filepath}?{delay}", edit, arguments);
}
public override bool IsValid(SpecialAction action)
{
ClearOldErrors();
bool valid = true;
List<string> filepathErrors = new List<string>();
if (filepath.Length == 0)
{
filepathErrors.Add("Filepath empty");
}
else if (!File.Exists(filepath))
{
filepathErrors.Add("File at path does not exist");
}
if (filepathErrors.Count > 0)
{
errors["Filepath"] = filepathErrors;
RaiseErrorsChanged("Filepath");
}
return valid;
}
public override void ClearOldErrors()
{
if (errors.Count > 0)
{
errors.Clear();
RaiseErrorsChanged("Filepath");
}
}
}
}