cemu-DS4Windows/DS4Windows/DS4Forms/SpecActions.cs
Jays2Kings 1bfc69ee37 Version 1.4.5
Added support for the New DS4 USB Adapater (Thanks to boganhobo and
Chamilsaan)
Implemented teokp's amazing fix for hide ds4 not working on the
anniversary update of Windows 10: when a controller fails to enter
exclusive mode, DS4Windows will ask for admin privilages to fix the
issue.
Now (near)unlimited Special Actions can be made from the previous limit
of 50
Special Action Xbox Game DVR is now no longer limited to Windows 10,
renamed multi action button: Assign a macro to single tap, double tap,
and holding down a button
Added option for White DS4Windows Icon in the notification tray (While
not merged from, thanks to tehmantra)
Added option to temporarily turn off DS4Windows when using a certain
program (togglable in the Auto Profiles Tab) (Same case as above but
thanks to dedChar to bring to light)
Fixed Options crashes in certain locales where decimal points are
repesented with commas, such as German (Thanks to kiliansch)
Added/Updated translations for many languauges, now including Japanese,
Slovenian, Hungarian, Greek, Finnish, Czech, Indonesian, and Ukrainian
2016-09-21 21:38:38 -04:00

536 lines
24 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;
}
}
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;
}
}
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;
}
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;
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(object sender, EventArgs e)
{
if (sender is Color && device < 4)
{
Color color = (Color)sender;
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;
}
}
}