cemu-DS4Windows/DS4Windows/DS4Forms/SpecActions.cs
2019-03-07 13:35:13 -06:00

550 lines
25 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Xml;
namespace DS4Windows
{
public partial class SpecActions : Form
{
Options opt;
RecordBox rb;
int device;
public List<string> macros = new List<string>();
public List<string> controls = new List<string>();
public List<string> ucontrols = new List<string>();
public List<int> macrostag = new List<int>();
public List<int>[] multiMacrostag = { new List<int>(), new List<int>(), new List<int>() };
public bool macrorepeat, newaction;
public string program;
int editIndex;
protected String m_Actions = Global.appdatapath + "\\Actions.xml";
string oldprofilename;
bool loadingAction = true;
public SpecActions(Options opt, string edit = "", int editindex = -1)
{
InitializeComponent();
this.opt = opt;
lbHoldForBatt.Text = lbHoldForProg.Text = lbHoldFor.Text;
lbSecsBatt.Text = lbSecsBatt.Text = lbSecsBatt.Text;
device = opt.device;
cBProfiles.Items.Add(Properties.Resources.noneProfile);
cBProfiles.SelectedIndex = 0;
cBActions.SelectedIndex = 0;
cBPressRelease.SelectedIndex = 0;
/*if (Environment.OSVersion.Version.Major >= 10)
{
cBActions.Items.Add("Xbox Game DVR");
cBTapDVR.SelectedIndex = 0;
cBHoldDVR.SelectedIndex = 2;
cBDTapDVR.SelectedIndex = 1;
}*/
cBActions.Items[7] = Properties.Resources.MultiAction;
foreach (object s in opt.root.lBProfiles.Items)
cBProfiles.Items.Add(s.ToString());
editIndex = editindex;
if (edit != string.Empty)
{
oldprofilename = edit;
tBName.Text = edit;
LoadAction();
loadingAction = false;
}
advColorDialog = new AdvancedColorDialog();
advColorDialog.FullOpen = true;
advColorDialog.OnUpdateColor += new AdvancedColorDialog.ColorUpdateHandler(this.advColorDialog_OnUpdateColor);
}
void LoadAction()
{
SpecialAction act = Global.GetAction(oldprofilename);
string[] dets;
foreach (string s in act.controls.Split('/'))
foreach (ListViewItem lvi in lVTrigger.Items)
if (lvi.Text == s)
{
lvi.Checked = true;
break;
}
switch (act.type)
{
case "Macro":
cBActions.SelectedIndex = 1;
macrostag = act.macro;
lbMacroRecorded.Text = "Macro Recored";
cBMacroScanCode.Checked = act.keyType.HasFlag(DS4KeyType.ScanCode);
break;
case "Program":
cBActions.SelectedIndex = 2;
LoadProgram(act.details);
nUDProg.Value = (decimal)act.delayTime;
tBArg.Text = act.extra;
break;
case "Profile":
cBActions.SelectedIndex = 3;
cBProfiles.Text = act.details;
foreach (string s in act.ucontrols.Split('/'))
foreach (ListViewItem lvi in lVUnloadTrigger.Items)
if (lvi.Text == s)
{
lvi.Checked = true;
break;
}
break;
case "Key":
cBActions.SelectedIndex = 4;
int key = int.Parse(act.details);
btnSelectKey.Text = ((Keys)key).ToString() +
(act.keyType.HasFlag(DS4KeyType.ScanCode) ? " (SC)" : "") +
(!string.IsNullOrEmpty(act.ucontrols) ? " (Toggle)" : "");
btnSelectKey.Tag = key;
if (act.pressRelease)
cBPressRelease.SelectedIndex = 1;
if (!string.IsNullOrEmpty(act.ucontrols))
{
//cBPressToggleKeys.SelectedIndex = 1;
foreach (string s in act.ucontrols.Split('/'))
foreach (ListViewItem lvi in lVUnloadTrigger.Items)
if (lvi.Text == s)
{
lvi.Checked = true;
break;
}
}
break;
case "DisconnectBT":
cBActions.SelectedIndex = 5;
nUDDCBT.Value = (decimal)act.delayTime;
break;
case "BatteryCheck":
cBActions.SelectedIndex = 6;
dets = act.details.Split(',');
nUDDCBatt.Value = (decimal)act.delayTime;
cBNotificationBatt.Checked = bool.Parse(dets[1]);
cbLightbarBatt.Checked = bool.Parse(dets[2]);
bnEmptyColor.BackColor = Color.FromArgb(byte.Parse(dets[3]), byte.Parse(dets[4]), byte.Parse(dets[5]));
bnFullColor.BackColor = Color.FromArgb(byte.Parse(dets[6]), byte.Parse(dets[7]), byte.Parse(dets[8]));
break;
case "XboxGameDVR":
/* if (cBActions.Items.Count < 8)
{
cBActions.Items.Add("Xbox Game DVR");
cBTapDVR.SelectedIndex = 0;
cBHoldDVR.SelectedIndex = 2;
cBDTapDVR.SelectedIndex = 1;
}
cBActions.SelectedIndex = 7;
dets = act.details.Split(',');
if (int.Parse(dets[3]) == 0)
btnCustomDVRKey.Text = "Custom Key";
else
btnCustomDVRKey.Text = ((Keys)(int.Parse(dets[3]))).ToString();
btnCustomDVRKey.Tag = int.Parse(dets[3]);
cBTapDVR.SelectedIndex = int.Parse(dets[0]);
cBHoldDVR.SelectedIndex = int.Parse(dets[1]);
cBDTapDVR.SelectedIndex = int.Parse(dets[2]);*/
break;
case "MultiAction":
cBActions.SelectedIndex = 7;
dets = act.details.Split(',');
for (int i = 0; i < 3; i++)
{
string[] macs = dets[i].Split('/');
foreach (string s in macs)
{
int v;
if (int.TryParse(s, out v))
multiMacrostag[i].Add(v);
}
switch (i)
{
case 0: btnSTapT.Text = macs.Length > 1 ? Properties.Resources.MacroRecorded : Properties.Resources.SelectMacro; break;
case 1: btnHoldT.Text = macs.Length > 1 ? Properties.Resources.MacroRecorded : Properties.Resources.SelectMacro; break;
case 2: btnDTapT.Text = macs.Length > 1 ? Properties.Resources.MacroRecorded : Properties.Resources.SelectMacro; break;
}
}
/*if (int.Parse(dets[3]) == 0)
btnCustomDVRKey.Text = "Custom Key";
else
btnCustomDVRKey.Text = ((Keys)(int.Parse(dets[3]))).ToString();
btnCustomDVRKey.Tag = int.Parse(dets[3]);
cBTapDVR.SelectedIndex = int.Parse(dets[0]);
cBHoldDVR.SelectedIndex = int.Parse(dets[1]);
cBDTapDVR.SelectedIndex = int.Parse(dets[2]);*/
break;
case "SASteeringWheelEmulationCalibrate":
cBActions.SelectedIndex = 8;
nUDDCBT.Value = (decimal)act.delayTime;
break;
}
}
private void btnRecordMacro_Click(object sender, EventArgs e)
{
rb = new RecordBox(this);
rb.TopLevel = true;
rb.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
rb.ShowDialog();
}
private void lVUnloadTrigger_SelectedIndexChanged(object sender, EventArgs e)
{
if (cBProfiles.SelectedIndex > 0)
{
btnSetUTriggerProfile.Enabled = true;
}
else
{
btnSetUTriggerProfile.Enabled = false;
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
Close();
}
private void btnSave_Click(object sender, EventArgs e)
{
foreach (SpecialAction sA in Global.GetActions())
{
if ((sA.name == tBName.Text && editIndex > -1 && tBName.Text != oldprofilename) ||
(sA.name == tBName.Text && editIndex == -1))
{
MessageBox.Show(Properties.Resources.ActionExists);
return;
}
}
controls.Clear();
ucontrols.Clear();
foreach (ListViewItem lvi in lVTrigger.Items)
if (lvi.Checked)
controls.Add(lvi.Text);
foreach (ListViewItem lvi in lVUnloadTrigger.Items)
if (lvi.Checked)
ucontrols.Add(lvi.Text);
if (!string.IsNullOrEmpty(tBName.Text) && controls.Count > 0 && cBActions.SelectedIndex > 0)
{
bool actRe = false;
string action = "null";
string dets;
bool edit = (!string.IsNullOrEmpty(oldprofilename) && tBName.Text == oldprofilename);
switch (cBActions.SelectedIndex)
{
case 1:
if (macrostag.Count > 0)
{
action = Properties.Resources.Macro + (cBMacroScanCode.Checked ? " (" + Properties.Resources.ScanCode + ")" : "");
actRe = true;
if (!string.IsNullOrEmpty(oldprofilename) && oldprofilename != tBName.Text)
Global.RemoveAction(oldprofilename);
Global.SaveAction(tBName.Text, String.Join("/", controls), cBActions.SelectedIndex, String.Join("/", macrostag), edit, (cBMacroScanCode.Checked ? "Scan Code" : ""));
}
break;
case 2:
if (!string.IsNullOrEmpty(program))
{
action = Properties.Resources.LaunchProgram.Replace("*program*", lbProgram.Text);
actRe = true;
if (!string.IsNullOrEmpty(oldprofilename) && oldprofilename != tBName.Text)
Global.RemoveAction(oldprofilename);
Global.SaveAction(tBName.Text, String.Join("/", controls), cBActions.SelectedIndex, program + "?" + nUDProg.Value, edit, tBArg.Text);
}
break;
case 3:
if (cBProfiles.SelectedIndex > 0 && ucontrols.Count > 0)
{
action = Properties.Resources.LoadProfile.Replace("*profile*", cBProfiles.Text);
actRe = true;
if (!string.IsNullOrEmpty(oldprofilename) && oldprofilename != tBName.Text)
Global.RemoveAction(oldprofilename);
Global.SaveAction(tBName.Text, String.Join("/", controls), cBActions.SelectedIndex, cBProfiles.Text, edit, String.Join("/", ucontrols));
}
else
btnSetUTriggerProfile.ForeColor = Color.Red;
break;
case 4:
if (btnSelectKey.Tag != null &&
(!btnSelectKey.Text.Contains("(Toggle)") || (btnSelectKey.Text.Contains("(Toggle)") && ucontrols.Count > 0)))
{
action = ((Keys)int.Parse(btnSelectKey.Tag.ToString())).ToString() + ((btnSelectKey.Text.Contains("(Toggle)") ? " (Toggle)" : ""));
actRe = true;
if (!string.IsNullOrEmpty(oldprofilename) && oldprofilename != tBName.Text)
Global.RemoveAction(oldprofilename);
if (btnSelectKey.Text.Contains("(Toggle)") && ucontrols.Count > 0)
{
string uaction;
if (cBPressRelease.SelectedIndex == 1)
uaction = "Release";
else
uaction = "Press";
Global.SaveAction(tBName.Text, String.Join("/", controls), cBActions.SelectedIndex, btnSelectKey.Tag.ToString() + (btnSelectKey.Text.Contains("(SC)") ? " Scan Code" : ""),
edit, uaction + '\n' + String.Join("/", ucontrols));
}
else
Global.SaveAction(tBName.Text, String.Join("/", controls), cBActions.SelectedIndex, btnSelectKey.Tag.ToString() + (btnSelectKey.Text.Contains("(SC)") ? " Scan Code" : ""), edit);
}
else if (btnSelectKey.Tag == null)
btnSelectKey.ForeColor = Color.Red;
else if (ucontrols.Count == 0)
btnSetUTriggerKeys.ForeColor = Color.Red;
break;
case 5:
action = Properties.Resources.DisconnectBT;
actRe = true;
if (!string.IsNullOrEmpty(oldprofilename) && oldprofilename != tBName.Text)
Global.RemoveAction(oldprofilename);
Global.SaveAction(tBName.Text, String.Join("/", controls), cBActions.SelectedIndex, Math.Round(nUDDCBT.Value, 1).ToString(), edit);
break;
case 6:
if (cbLightbarBatt.Checked || cBNotificationBatt.Checked)
{
action = Properties.Resources.CheckBattery;
actRe = true;
if (!string.IsNullOrEmpty(oldprofilename) && oldprofilename != tBName.Text)
Global.RemoveAction(oldprofilename);
dets = Math.Round(nUDDCBatt.Value, 1).ToString() + "|" + cBNotificationBatt.Checked + "|" + cbLightbarBatt.Checked + "|" +
bnEmptyColor.BackColor.R + "|" + bnEmptyColor.BackColor.G + "|" + bnEmptyColor.BackColor.B + "|" +
bnFullColor.BackColor.R + "|" + bnFullColor.BackColor.G + "|" + bnFullColor.BackColor.B;
Global.SaveAction(tBName.Text, string.Join("/", controls), cBActions.SelectedIndex, dets, edit);
}
else
{
cbLightbarBatt.ForeColor = Color.Red;
cBNotificationBatt.ForeColor = Color.Red;
}
break;
case 7:
if (multiMacrostag[0].Count + multiMacrostag[1].Count + multiMacrostag[2].Count > 0)
{
action = Properties.Resources.MultiAction;
actRe = true;
if (!string.IsNullOrEmpty(oldprofilename) && oldprofilename != tBName.Text)
Global.RemoveAction(oldprofilename);
//dets = cBTapDVR.SelectedIndex + "," + cBHoldDVR.SelectedIndex + "," + cBDTapDVR.SelectedIndex + "," + int.Parse(btnCustomDVRKey.Tag.ToString());
dets = string.Join("/", multiMacrostag[0]) + "," + string.Join("/", multiMacrostag[1]) + "," + string.Join("/", multiMacrostag[2]);
Global.SaveAction(tBName.Text, controls[0], cBActions.SelectedIndex, dets, edit);
}
else
{
}
break;
case 8:
action = Properties.Resources.SASteeringWheelEmulationCalibrate;
actRe = true;
if (!string.IsNullOrEmpty(oldprofilename) && oldprofilename != tBName.Text)
Global.RemoveAction(oldprofilename);
Global.SaveAction(tBName.Text, String.Join("/", controls), cBActions.SelectedIndex, Math.Round(nUDDCBT.Value, 1).ToString(), edit);
break;
}
if (actRe)
{
ListViewItem lvi = new ListViewItem(tBName.Text);
lvi.SubItems.Add(String.Join(", ", controls));
lvi.SubItems.Add(action);
lvi.Checked = true;
if (editIndex > -1)
opt.lVActions.Items.RemoveAt(editIndex);
opt.lVActions.Items.Add(lvi);
Close();
}
}
else if (string.IsNullOrEmpty(tBName.Text))
{
lbName.ForeColor = Color.Red;
}
else
{
btnBorder.BackColor = Color.Red;
}
}
private void tBName_TextChanged(object sender, EventArgs e)
{
lbName.ForeColor = Color.Black;
if (tBName.Text.Contains('/')) { tBName.ForeColor = Color.Red; btnSave.Enabled = false; }
else { tBName.ForeColor = Color.Black; btnSave.Enabled = true; }
}
private void cBActions_SelectedIndexChanged(object sender, EventArgs e)
{
int i = cBActions.SelectedIndex;
pnlMacro.Visible = i == 1;
pnlProgram.Visible = i == 2;
pnlProfile.Visible = i == 3;
pnlKeys.Visible = i == 4;
pnlDisconnectBT.Visible = i == 5 || i == 8; // SASteeringWheelEmulationCalibrate action #8 re-uses DisconnectBT panel ("hold for X secs" detail option)
pnlBatteryCheck.Visible = i == 6;
pnlGameDVR.Visible = i == 7;
btnSave.Enabled = i > 0;
}
private void btnBroswe_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
LoadProgram(openFileDialog1.FileName);
}
void LoadProgram(string path)
{
try
{
pBProgram.Image = Icon.ExtractAssociatedIcon(path).ToBitmap();
lbProgram.Text = Path.GetFileNameWithoutExtension(path);
program = path;
}
catch { }
}
private void lVTrigger_ItemChecked(object sender, ItemCheckedEventArgs e)
{
btnBorder.BackColor = SystemColors.ControlDark;
if (cBActions.SelectedIndex == 7 && e.Item.Checked)
{
foreach (ListViewItem lvi in lVTrigger.Items)
if (lvi != null && lvi.Checked && lvi != e.Item)
lvi.Checked = false;
}
}
private void btnSetUTrigger_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
lVTrigger.Visible = !lVTrigger.Visible;
if (lVTrigger.Visible)
button.Text = Properties.Resources.SetUnloadTrigger;
else
button.Text = Properties.Resources.SetRegularTrigger;
}
private void lVUnloadTrigger_ItemChecked(object sender, ItemCheckedEventArgs e)
{
btnSetUTriggerProfile.ForeColor = Color.Black;
btnSetUTriggerKeys.ForeColor = Color.Black;
}
private void btnSelectKey_Click(object sender, EventArgs e)
{
new KBM360(this, btnSelectKey, true).ShowDialog();
}
private void btnSelectKey_TextChanged(object sender, EventArgs e)
{
btnSetUTriggerKeys.Visible = btnSelectKey.Text.Contains("(Toggle)");
lbUnloadTipKey.Visible = btnSelectKey.Text.Contains("(Toggle)");
cBPressRelease.Visible = btnSelectKey.Text.Contains("(Toggle)");
if (!btnSelectKey.Text.Contains("(Toggle)"))
{
lVTrigger.Visible = true;
btnSetUTriggerKeys.Text = "Set Unload Trigger";
}
}
private void bnEmptyColor_Click(object sender, EventArgs e)
{
advColorDialog.Color = bnEmptyColor.BackColor;
if (advColorDialog.ShowDialog() == DialogResult.OK)
{
cbLightbarBatt.Checked = true;
bnEmptyColor.BackColor = advColorDialog.Color;
pBGraident.Refresh();
}
if (device < 4)
DS4LightBar.forcelight[device] = false;
}
private void bnFullColor_Click(object sender, EventArgs e)
{
advColorDialog.Color = bnFullColor.BackColor;
if (advColorDialog.ShowDialog() == DialogResult.OK)
{
cbLightbarBatt.Checked = true;
bnFullColor.BackColor = advColorDialog.Color;
pBGraident.Refresh();
}
if (device < 4)
DS4LightBar.forcelight[device] = false;
}
private void pBGraident_Paint(object sender, PaintEventArgs e)
{
System.Drawing.Drawing2D.LinearGradientBrush linGrBrush = new System.Drawing.Drawing2D.LinearGradientBrush(
new Point(0, pBGraident.Height),
new Point(pBGraident.Width, pBGraident.Height),
bnEmptyColor.BackColor, // Opaque red
bnFullColor.BackColor); // Opaque blue
Pen pen = new Pen(linGrBrush);
// e.Graphics.DrawLine(pen, 0, 10, 200, 10);
//e.Graphics.FillEllipse(linGrBrush, 0, 30, 200, 100);
e.Graphics.FillRectangle(linGrBrush, 0, 0, pBGraident.Width, pBGraident.Height);
}
private void advColorDialog_OnUpdateColor(Color color, EventArgs e)
{
if (device < 4)
{
DS4Color dcolor = new DS4Color { red = color.R, green = color.G, blue = color.B };
DS4LightBar.forcedColor[device] = dcolor;
DS4LightBar.forcedFlash[device] = 0;
DS4LightBar.forcelight[device] = true;
}
}
private void cBDVR_SelectedIndexChanged(object sender, EventArgs e)
{
/*if (((ComboBox)sender).SelectedIndex == 3)
{
if (!loadingAction)
new KBM360(this, btnCustomDVRKey, false).ShowDialog();
cBTapDVR.Items.RemoveAt(3);
cBTapDVR.Items.Insert(3, "Take Screenshot (" + btnCustomDVRKey.Text + ")");
cBHoldDVR.Items.RemoveAt(3);
cBHoldDVR.Items.Insert(3, "Take Screenshot (" + btnCustomDVRKey.Text + ")");
cBDTapDVR.Items.RemoveAt(3);
cBDTapDVR.Items.Insert(3, "Take Screenshot (" + btnCustomDVRKey.Text + ")");
((ComboBox)sender).SelectedIndexChanged -= cBDVR_SelectedIndexChanged;
((ComboBox)sender).SelectedIndex = 3;
((ComboBox)sender).SelectedIndexChanged += cBDVR_SelectedIndexChanged;
}*/
}
private void btnSTapT_Click(object sender, EventArgs e)
{
OpenRecordBox(0);
}
private void btnHoldT_Click(object sender, EventArgs e)
{
OpenRecordBox(1);
}
private void btnDTapT_Click(object sender, EventArgs e)
{
OpenRecordBox(2);
}
void OpenRecordBox(int i)
{
rb = new RecordBox(this, i);
rb.TopLevel = true;
rb.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
rb.ShowDialog();
}
private void cBBatt_CheckedChanged(object sender, EventArgs e)
{
cbLightbarBatt.ForeColor = Color.Black;
cBNotificationBatt.ForeColor = Color.Black;
}
}
}