mirror of
https://github.com/cemu-project/DS4Windows.git
synced 2024-11-22 17:29:18 +01:00
1247 lines
54 KiB
C#
1247 lines
54 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
using System.Windows.Documents;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using System.Windows.Media.Imaging;
|
|
using System.Windows.Navigation;
|
|
using System.Windows.Shapes;
|
|
using Microsoft.Win32;
|
|
using NonFormTimer = System.Timers.Timer;
|
|
using DS4WinWPF.DS4Forms.ViewModels;
|
|
using DS4Windows;
|
|
|
|
namespace DS4WinWPF.DS4Forms
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for ProfileEditor.xaml
|
|
/// </summary>
|
|
public partial class ProfileEditor : UserControl
|
|
{
|
|
private class HoverImageInfo
|
|
{
|
|
public Point point;
|
|
public Size size;
|
|
}
|
|
|
|
private int deviceNum;
|
|
private ProfileSettingsViewModel profileSettingsVM;
|
|
private MappingListViewModel mappingListVM;
|
|
private ProfileEntity currentProfile;
|
|
private SpecialActionsListViewModel specialActionsVM;
|
|
|
|
public event EventHandler Closed;
|
|
public delegate void CreatedProfileHandler(ProfileEditor sender, string profile);
|
|
public event CreatedProfileHandler CreatedProfile;
|
|
|
|
private Dictionary<Button, ImageBrush> hoverImages =
|
|
new Dictionary<Button, ImageBrush>();
|
|
private Dictionary<Button, HoverImageInfo> hoverLocations = new Dictionary<Button, HoverImageInfo>();
|
|
private Dictionary<Button, int> hoverIndexes = new Dictionary<Button, int>();
|
|
private Dictionary<int, Button> reverseHoverIndexes = new Dictionary<int, Button>();
|
|
|
|
private StackPanel activeTouchPanel;
|
|
private StackPanel activeGyroModePanel;
|
|
private bool keepsize;
|
|
private bool controllerReadingsTabActive = false;
|
|
public bool Keepsize { get => keepsize; }
|
|
|
|
private NonFormTimer inputTimer;
|
|
|
|
public ProfileEditor(int device)
|
|
{
|
|
InitializeComponent();
|
|
|
|
deviceNum = device;
|
|
emptyColorGB.Visibility = Visibility.Collapsed;
|
|
profileSettingsVM = new ProfileSettingsViewModel(device);
|
|
picBoxHover.Visibility = Visibility.Hidden;
|
|
picBoxHover2.Visibility = Visibility.Hidden;
|
|
bool touchMouse = profileSettingsVM.UseTouchMouse;
|
|
if (!touchMouse)
|
|
{
|
|
useMousePanel.Visibility = Visibility.Collapsed;
|
|
useControlsPanel.Visibility = Visibility.Visible;
|
|
useTouchControlsRadio.IsChecked = true;
|
|
}
|
|
else
|
|
{
|
|
useTouchMouseRadio.IsChecked = true;
|
|
}
|
|
|
|
//useControlsPanel.Visibility = !touchMouse ? Visibility.Visible : Visibility.Collapsed;
|
|
activeTouchPanel = touchMouse ? useMousePanel : useControlsPanel;
|
|
//activeTouchPanel = useMousePanel;
|
|
|
|
switch (profileSettingsVM.GyroOutModeIndex)
|
|
{
|
|
case 0:
|
|
activeGyroModePanel = gyroControlsPanel; break;
|
|
case 1:
|
|
activeGyroModePanel = gyroMousePanel; break;
|
|
case 2:
|
|
activeGyroModePanel = gyroMouseJoystickPanel; break;
|
|
default:
|
|
activeGyroModePanel = gyroControlsPanel; break;
|
|
}
|
|
|
|
//activeGyroModePanel = gyroControlsPanel;
|
|
gyroControlsPanel.Visibility = Visibility.Collapsed;
|
|
gyroMousePanel.Visibility = Visibility.Collapsed;
|
|
gyroMouseJoystickPanel.Visibility = Visibility.Collapsed;
|
|
activeGyroModePanel.Visibility = Visibility.Visible;
|
|
|
|
mappingListVM = new MappingListViewModel(deviceNum, profileSettingsVM.ContType);
|
|
specialActionsVM = new SpecialActionsListViewModel(device);
|
|
|
|
RemoveHoverBtnText();
|
|
PopulateHoverImages();
|
|
PopulateHoverLocations();
|
|
PopulateHoverIndexes();
|
|
PopulateReverseHoverIndexes();
|
|
|
|
ColorByBatteryPerCheck();
|
|
AssignTiltAssociation();
|
|
AssignSwipeAssociation();
|
|
|
|
inputTimer = new NonFormTimer(100);
|
|
inputTimer.Elapsed += InputDS4;
|
|
SetupEvents();
|
|
}
|
|
|
|
private void SetupEvents()
|
|
{
|
|
gyroOutModeCombo.SelectionChanged += GyroOutModeCombo_SelectionChanged;
|
|
outConTypeCombo.SelectionChanged += OutConTypeCombo_SelectionChanged;
|
|
mappingListBox.SelectionChanged += MappingListBox_SelectionChanged;
|
|
Closed += ProfileEditor_Closed;
|
|
profileSettingsVM.LSDeadZoneChanged += UpdateReadingsLsDeadZone;
|
|
profileSettingsVM.RSDeadZoneChanged += UpdateReadingsRsDeadZone;
|
|
profileSettingsVM.L2DeadZoneChanged += UpdateReadingsL2DeadZone;
|
|
profileSettingsVM.R2DeadZoneChanged += UpdateReadingsR2DeadZone;
|
|
profileSettingsVM.SXDeadZoneChanged += UpdateReadingsSXDeadZone;
|
|
profileSettingsVM.SZDeadZoneChanged += UpdateReadingsSZDeadZone;
|
|
}
|
|
|
|
private void UpdateReadingsSZDeadZone(object sender, EventArgs e)
|
|
{
|
|
conReadingsUserCon.SixAxisZDead = profileSettingsVM.SZDeadZone;
|
|
}
|
|
|
|
private void UpdateReadingsSXDeadZone(object sender, EventArgs e)
|
|
{
|
|
conReadingsUserCon.SixAxisXDead = profileSettingsVM.SXDeadZone;
|
|
}
|
|
|
|
private void UpdateReadingsR2DeadZone(object sender, EventArgs e)
|
|
{
|
|
conReadingsUserCon.R2Dead = profileSettingsVM.R2DeadZone;
|
|
}
|
|
|
|
private void UpdateReadingsL2DeadZone(object sender, EventArgs e)
|
|
{
|
|
conReadingsUserCon.L2Dead = profileSettingsVM.L2DeadZone;
|
|
}
|
|
|
|
private void UpdateReadingsRsDeadZone(object sender, EventArgs e)
|
|
{
|
|
conReadingsUserCon.RsDead = profileSettingsVM.RSDeadZone;
|
|
}
|
|
|
|
private void UpdateReadingsLsDeadZone(object sender, EventArgs e)
|
|
{
|
|
conReadingsUserCon.LsDead = profileSettingsVM.LSDeadZone;
|
|
}
|
|
|
|
private void AssignTiltAssociation()
|
|
{
|
|
gyroZNLb.DataContext = mappingListVM.ControlMap[DS4Windows.DS4Controls.GyroZNeg];
|
|
gyroZPLb.DataContext = mappingListVM.ControlMap[DS4Windows.DS4Controls.GyroZPos];
|
|
gyroXNLb.DataContext = mappingListVM.ControlMap[DS4Windows.DS4Controls.GyroXNeg];
|
|
gyroXLb.DataContext = mappingListVM.ControlMap[DS4Windows.DS4Controls.GyroXPos];
|
|
}
|
|
|
|
private void AssignSwipeAssociation()
|
|
{
|
|
swipeUpLb.DataContext = mappingListVM.ControlMap[DS4Windows.DS4Controls.SwipeUp];
|
|
swipeDownLb.DataContext = mappingListVM.ControlMap[DS4Windows.DS4Controls.SwipeDown];
|
|
swipeLeftLb.DataContext = mappingListVM.ControlMap[DS4Windows.DS4Controls.SwipeLeft];
|
|
swipeRightLb.DataContext = mappingListVM.ControlMap[DS4Windows.DS4Controls.SwipeRight];
|
|
}
|
|
|
|
private void MappingListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (mappingListVM.SelectedIndex >= 0)
|
|
{
|
|
if (reverseHoverIndexes.TryGetValue(mappingListVM.SelectedIndex, out Button tempBtn))
|
|
{
|
|
InputControlHighlight(tempBtn);
|
|
}
|
|
//;
|
|
}
|
|
|
|
}
|
|
|
|
private void PopulateReverseHoverIndexes()
|
|
{
|
|
foreach(KeyValuePair<Button, int> pair in hoverIndexes)
|
|
{
|
|
reverseHoverIndexes.Add(pair.Value, pair.Key);
|
|
}
|
|
}
|
|
|
|
private void PopulateHoverIndexes()
|
|
{
|
|
hoverIndexes[crossConBtn] = 0;
|
|
hoverIndexes[circleConBtn] = 1;
|
|
hoverIndexes[squareConBtn] = 2;
|
|
hoverIndexes[triangleConBtn] = 3;
|
|
hoverIndexes[optionsConBtn] = 4;
|
|
hoverIndexes[shareConBtn] = 5;
|
|
hoverIndexes[upConBtn] = 6;
|
|
hoverIndexes[downConBtn] = 7;
|
|
hoverIndexes[leftConBtn] = 8;
|
|
hoverIndexes[rightConBtn] = 9;
|
|
hoverIndexes[guideConBtn] = 10;
|
|
hoverIndexes[l1ConBtn] = 11;
|
|
hoverIndexes[r1ConBtn] = 12;
|
|
hoverIndexes[l2ConBtn] = 13;
|
|
hoverIndexes[r2ConBtn] = 14;
|
|
hoverIndexes[l3ConBtn] = 15;
|
|
hoverIndexes[r3ConBtn] = 16;
|
|
hoverIndexes[leftTouchConBtn] = 17;
|
|
hoverIndexes[rightTouchConBtn] = 18;
|
|
hoverIndexes[multiTouchConBtn] = 19;
|
|
hoverIndexes[topTouchConBtn] = 20;
|
|
|
|
hoverIndexes[lsuConBtn] = 21;
|
|
hoverIndexes[lsdConBtn] = 22;
|
|
hoverIndexes[lslConBtn] = 23;
|
|
hoverIndexes[lsrConBtn] = 24;
|
|
|
|
hoverIndexes[rsuConBtn] = 25;
|
|
hoverIndexes[rsdConBtn] = 26;
|
|
hoverIndexes[rslConBtn] = 27;
|
|
hoverIndexes[rsrConBtn] = 28;
|
|
|
|
hoverIndexes[gyroZNBtn] = 29;
|
|
hoverIndexes[gyroZPBtn] = 30;
|
|
hoverIndexes[gyroXNBtn] = 31;
|
|
hoverIndexes[gyroXPBtn] = 32;
|
|
|
|
hoverIndexes[swipeUpBtn] = 33;
|
|
hoverIndexes[swipeDownBtn] = 34;
|
|
hoverIndexes[swipeLeftBtn] = 35;
|
|
hoverIndexes[swipeRightBtn] = 36;
|
|
}
|
|
|
|
private void PopulateHoverLocations()
|
|
{
|
|
hoverLocations[crossConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(crossConBtn), Canvas.GetTop(crossConBtn)),
|
|
size = new Size(crossConBtn.Width, crossConBtn.Height) };
|
|
hoverLocations[circleConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(circleConBtn), Canvas.GetTop(circleConBtn)),
|
|
size = new Size(circleConBtn.Width, circleConBtn.Height) };
|
|
hoverLocations[squareConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(squareConBtn), Canvas.GetTop(squareConBtn)),
|
|
size = new Size(squareConBtn.Width, squareConBtn.Height) };
|
|
hoverLocations[triangleConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(triangleConBtn), Canvas.GetTop(triangleConBtn)),
|
|
size = new Size(triangleConBtn.Width, triangleConBtn.Height) };
|
|
hoverLocations[l1ConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(l1ConBtn), Canvas.GetTop(l1ConBtn)),
|
|
size = new Size(l1ConBtn.Width, l1ConBtn.Height) };
|
|
hoverLocations[r1ConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(r1ConBtn), Canvas.GetTop(r1ConBtn)),
|
|
size = new Size(r1ConBtn.Width, r1ConBtn.Height) };
|
|
hoverLocations[l2ConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(l2ConBtn), Canvas.GetTop(l2ConBtn)),
|
|
size = new Size(l2ConBtn.Width, l2ConBtn.Height) };
|
|
hoverLocations[r2ConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(r2ConBtn), Canvas.GetTop(r2ConBtn)),
|
|
size = new Size(r2ConBtn.Width, r2ConBtn.Height) };
|
|
hoverLocations[shareConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(shareConBtn), Canvas.GetTop(shareConBtn)),
|
|
size = new Size(shareConBtn.Width, shareConBtn.Height) };
|
|
hoverLocations[optionsConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(optionsConBtn), Canvas.GetTop(optionsConBtn)),
|
|
size = new Size(optionsConBtn.Width, optionsConBtn.Height) };
|
|
hoverLocations[guideConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(guideConBtn), Canvas.GetTop(guideConBtn)),
|
|
size = new Size(guideConBtn.Width, guideConBtn.Height) };
|
|
|
|
hoverLocations[leftTouchConBtn] = new HoverImageInfo() { point = new Point(144, 44), size = new Size(140, 98) };
|
|
hoverLocations[multiTouchConBtn] = new HoverImageInfo() { point = new Point(143, 42), size = new Size(158, 100) };
|
|
hoverLocations[rightTouchConBtn] = new HoverImageInfo() { point = new Point(156, 47), size = new Size(146, 94) };
|
|
hoverLocations[topTouchConBtn] = new HoverImageInfo() { point = new Point(155, 6), size = new Size(153, 114) };
|
|
|
|
hoverLocations[l3ConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(l3ConBtn), Canvas.GetTop(l3ConBtn)),
|
|
size = new Size(l3ConBtn.Width, l3ConBtn.Height) };
|
|
hoverLocations[lsuConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(l3ConBtn), Canvas.GetTop(l3ConBtn)),
|
|
size = new Size(l3ConBtn.Width, l3ConBtn.Height) };
|
|
hoverLocations[lsrConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(l3ConBtn), Canvas.GetTop(l3ConBtn)),
|
|
size = new Size(l3ConBtn.Width, l3ConBtn.Height) };
|
|
hoverLocations[lsdConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(l3ConBtn), Canvas.GetTop(l3ConBtn)),
|
|
size = new Size(l3ConBtn.Width, l3ConBtn.Height) };
|
|
hoverLocations[lslConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(l3ConBtn), Canvas.GetTop(l3ConBtn)),
|
|
size = new Size(l3ConBtn.Width, l3ConBtn.Height) };
|
|
|
|
hoverLocations[r3ConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(r3ConBtn), Canvas.GetTop(r3ConBtn)),
|
|
size = new Size(r3ConBtn.Width, r3ConBtn.Height) };
|
|
hoverLocations[rsuConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(r3ConBtn), Canvas.GetTop(r3ConBtn)),
|
|
size = new Size(r3ConBtn.Width, r3ConBtn.Height) };
|
|
hoverLocations[rsrConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(r3ConBtn), Canvas.GetTop(r3ConBtn)),
|
|
size = new Size(r3ConBtn.Width, r3ConBtn.Height) };
|
|
hoverLocations[rsdConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(r3ConBtn), Canvas.GetTop(r3ConBtn)),
|
|
size = new Size(r3ConBtn.Width, r3ConBtn.Height) };
|
|
hoverLocations[rslConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(r3ConBtn), Canvas.GetTop(r3ConBtn)),
|
|
size = new Size(r3ConBtn.Width, r3ConBtn.Height) };
|
|
|
|
hoverLocations[upConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(upConBtn), Canvas.GetTop(upConBtn)),
|
|
size = new Size(upConBtn.Width, upConBtn.Height) };
|
|
hoverLocations[rightConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(rightConBtn), Canvas.GetTop(rightConBtn)),
|
|
size = new Size(rightConBtn.Width, rightConBtn.Height) };
|
|
hoverLocations[downConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(downConBtn), Canvas.GetTop(downConBtn)),
|
|
size = new Size(downConBtn.Width, downConBtn.Height) };
|
|
hoverLocations[leftConBtn] = new HoverImageInfo() { point = new Point(Canvas.GetLeft(leftConBtn), Canvas.GetTop(leftConBtn)),
|
|
size = new Size(leftConBtn.Width, leftConBtn.Height) };
|
|
}
|
|
|
|
private void RemoveHoverBtnText()
|
|
{
|
|
crossConBtn.Content = "";
|
|
circleConBtn.Content = "";
|
|
squareConBtn.Content = "";
|
|
triangleConBtn.Content = "";
|
|
l1ConBtn.Content = "";
|
|
r1ConBtn.Content = "";
|
|
l2ConBtn.Content = "";
|
|
r2ConBtn.Content = "";
|
|
shareConBtn.Content = "";
|
|
optionsConBtn.Content = "";
|
|
guideConBtn.Content = "";
|
|
leftTouchConBtn.Content = "";
|
|
multiTouchConBtn.Content = "";
|
|
rightTouchConBtn.Content = "";
|
|
topTouchConBtn.Content = "";
|
|
|
|
l3ConBtn.Content = "";
|
|
lsuConBtn.Content = "";
|
|
lsrConBtn.Content = "";
|
|
lsdConBtn.Content = "";
|
|
lslConBtn.Content = "";
|
|
|
|
r3ConBtn.Content = "";
|
|
rsuConBtn.Content = "";
|
|
rsrConBtn.Content = "";
|
|
rsdConBtn.Content = "";
|
|
rslConBtn.Content = "";
|
|
|
|
upConBtn.Content = "";
|
|
rightConBtn.Content = "";
|
|
downConBtn.Content = "";
|
|
leftConBtn.Content = "";
|
|
}
|
|
|
|
private void PopulateHoverImages()
|
|
{
|
|
ImageSourceConverter sourceConverter = new ImageSourceConverter();
|
|
|
|
ImageSource temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Cross.png") as ImageSource;
|
|
ImageBrush crossHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Circle.png") as ImageSource;
|
|
ImageBrush circleHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Square.png") as ImageSource;
|
|
ImageBrush squareHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Triangle.png") as ImageSource;
|
|
ImageBrush triangleHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_L1.png") as ImageSource;
|
|
ImageBrush l1Hover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_R1.png") as ImageSource;
|
|
ImageBrush r1Hover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_L2.png") as ImageSource;
|
|
ImageBrush l2Hover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_R2.png") as ImageSource;
|
|
ImageBrush r2Hover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Share.png") as ImageSource;
|
|
ImageBrush shareHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_options.png") as ImageSource;
|
|
ImageBrush optionsHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_PS.png") as ImageSource;
|
|
ImageBrush guideHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_TouchLeft.png") as ImageSource;
|
|
ImageBrush leftTouchHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_TouchMulti.png") as ImageSource;
|
|
ImageBrush multiTouchTouchHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_TouchRight.png") as ImageSource;
|
|
ImageBrush rightTouchHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_TouchUpper.png") as ImageSource;
|
|
ImageBrush topTouchHover = new ImageBrush(temp);
|
|
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_LS.png") as ImageSource;
|
|
ImageBrush l3Hover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_LS.png") as ImageSource;
|
|
ImageBrush lsuHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_LS.png") as ImageSource;
|
|
ImageBrush lsrHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_LS.png") as ImageSource;
|
|
ImageBrush lsdHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_LS.png") as ImageSource;
|
|
ImageBrush lslHover = new ImageBrush(temp);
|
|
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_RS.png") as ImageSource;
|
|
ImageBrush r3Hover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_RS.png") as ImageSource;
|
|
ImageBrush rsuHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_RS.png") as ImageSource;
|
|
ImageBrush rsrHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_RS.png") as ImageSource;
|
|
ImageBrush rsdHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_RS.png") as ImageSource;
|
|
ImageBrush rslHover = new ImageBrush(temp);
|
|
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Up.png") as ImageSource;
|
|
ImageBrush upHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Right.png") as ImageSource;
|
|
ImageBrush rightHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Down.png") as ImageSource;
|
|
ImageBrush downHover = new ImageBrush(temp);
|
|
|
|
temp = sourceConverter.
|
|
ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/DS4-Config_Left.png") as ImageSource;
|
|
ImageBrush leftHover = new ImageBrush(temp);
|
|
|
|
hoverImages[crossConBtn] = crossHover;
|
|
hoverImages[circleConBtn] = circleHover;
|
|
hoverImages[squareConBtn] = squareHover;
|
|
hoverImages[triangleConBtn] = triangleHover;
|
|
hoverImages[l1ConBtn] = l1Hover;
|
|
hoverImages[r1ConBtn] = r1Hover;
|
|
hoverImages[l2ConBtn] = l2Hover;
|
|
hoverImages[r2ConBtn] = r2Hover;
|
|
hoverImages[shareConBtn] = shareHover;
|
|
hoverImages[optionsConBtn] = optionsHover;
|
|
hoverImages[guideConBtn] = guideHover;
|
|
|
|
hoverImages[leftTouchConBtn] = leftTouchHover;
|
|
hoverImages[multiTouchConBtn] = multiTouchTouchHover;
|
|
hoverImages[rightTouchConBtn] = rightTouchHover;
|
|
hoverImages[topTouchConBtn] = topTouchHover;
|
|
hoverImages[l3ConBtn] = l3Hover;
|
|
hoverImages[lsuConBtn] = lsuHover;
|
|
hoverImages[lsrConBtn] = lsrHover;
|
|
hoverImages[lsdConBtn] = lsdHover;
|
|
hoverImages[lslConBtn] = lslHover;
|
|
hoverImages[r3ConBtn] = r3Hover;
|
|
hoverImages[rsuConBtn] = rsuHover;
|
|
hoverImages[rsrConBtn] = rsrHover;
|
|
hoverImages[rsdConBtn] = rsdHover;
|
|
hoverImages[rslConBtn] = rslHover;
|
|
|
|
hoverImages[upConBtn] = upHover;
|
|
hoverImages[rightConBtn] = rightHover;
|
|
hoverImages[downConBtn] = downHover;
|
|
hoverImages[leftConBtn] = leftHover;
|
|
}
|
|
|
|
public void Reload(int device, ProfileEntity profile = null)
|
|
{
|
|
profileSettingsTabCon.DataContext = null;
|
|
touchpadSettingsPanel.DataContext = null;
|
|
mappingListBox.DataContext = null;
|
|
specialActionsTab.DataContext = null;
|
|
lightbarRect.DataContext = null;
|
|
|
|
deviceNum = device;
|
|
if (profile != null)
|
|
{
|
|
currentProfile = profile;
|
|
if (device == 4)
|
|
{
|
|
Global.ProfilePath[4] = profile.Name;
|
|
}
|
|
|
|
Global.LoadProfile(device, false, App.rootHub);
|
|
profileNameTxt.Text = profile.Name;
|
|
}
|
|
else
|
|
{
|
|
currentProfile = null;
|
|
Global.LoadBlankDevProfile(device, false, App.rootHub, false);
|
|
}
|
|
|
|
if (device < 4)
|
|
{
|
|
useControllerUD.Value = device + 1;
|
|
conReadingsUserCon.UseDevice(device);
|
|
}
|
|
else
|
|
{
|
|
useControllerUD.Value = 1;
|
|
conReadingsUserCon.UseDevice(0);
|
|
}
|
|
|
|
conReadingsUserCon.EnableControl(false);
|
|
|
|
specialActionsVM.LoadActions(currentProfile == null);
|
|
mappingListVM.UpdateMappings();
|
|
profileSettingsVM.UpdateLateProperties();
|
|
profileSettingsVM.PopulateTouchDisInver(touchDisInvertBtn.ContextMenu);
|
|
profileSettingsVM.PopulateGyroMouseTrig(gyroMouseTrigBtn.ContextMenu);
|
|
profileSettingsVM.PopulateGyroMouseStickTrig(gyroMouseStickTrigBtn.ContextMenu);
|
|
profileSettingsTabCon.DataContext = profileSettingsVM;
|
|
touchpadSettingsPanel.DataContext = profileSettingsVM;
|
|
mappingListBox.DataContext = mappingListVM;
|
|
specialActionsTab.DataContext = specialActionsVM;
|
|
lightbarRect.DataContext = profileSettingsVM;
|
|
|
|
conReadingsUserCon.LsDead = profileSettingsVM.LSDeadZone;
|
|
conReadingsUserCon.RsDead = profileSettingsVM.RSDeadZone;
|
|
conReadingsUserCon.L2Dead = profileSettingsVM.L2DeadZone;
|
|
conReadingsUserCon.R2Dead = profileSettingsVM.R2DeadZone;
|
|
conReadingsUserCon.SixAxisXDead = profileSettingsVM.SXDeadZone;
|
|
conReadingsUserCon.SixAxisZDead = profileSettingsVM.SZDeadZone;
|
|
|
|
if (profileSettingsVM.UseControllerReadout)
|
|
{
|
|
inputTimer.Start();
|
|
}
|
|
}
|
|
|
|
private void CancelBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (profileSettingsVM.FuncDevNum < 4)
|
|
{
|
|
App.rootHub.setRumble(0, 0, profileSettingsVM.FuncDevNum);
|
|
}
|
|
DS4Windows.Global.outDevTypeTemp[deviceNum] = DS4Windows.OutContType.X360;
|
|
DS4Windows.Global.LoadProfile(deviceNum, false, App.rootHub);
|
|
Closed?.Invoke(this, EventArgs.Empty);
|
|
}
|
|
|
|
private void HoverConBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
MappedControl mpControl = mappingListVM.Mappings[mappingListVM.SelectedIndex];
|
|
BindingWindow window = new BindingWindow(deviceNum, mpControl.Setting);
|
|
window.Owner = App.Current.MainWindow;
|
|
window.ShowDialog();
|
|
mpControl.UpdateMappingName();
|
|
UpdateHighlightLabel(mpControl);
|
|
}
|
|
|
|
private void InputControlHighlight(Button control)
|
|
{
|
|
if (hoverImages.TryGetValue(control, out ImageBrush tempBrush))
|
|
{
|
|
picBoxHover.Source = tempBrush.ImageSource;
|
|
//picBoxHover.Width = tempBrush.ImageSource.Width * .8;
|
|
//picBoxHover.Height = tempBrush.ImageSource.Height * .8;
|
|
//control.Background = tempBrush;
|
|
//control.Background = new SolidColorBrush(Colors.Green);
|
|
//control.Width = tempBrush.ImageSource.Width;
|
|
//control.Height = tempBrush.ImageSource.Height;
|
|
}
|
|
|
|
if (hoverLocations.TryGetValue(control, out HoverImageInfo tempInfo))
|
|
{
|
|
Canvas.SetLeft(picBoxHover, tempInfo.point.X);
|
|
Canvas.SetTop(picBoxHover, tempInfo.point.Y);
|
|
picBoxHover.Width = tempInfo.size.Width;
|
|
picBoxHover.Height = tempInfo.size.Height;
|
|
picBoxHover.Stretch = Stretch.Fill;
|
|
picBoxHover.Visibility = Visibility.Visible;
|
|
}
|
|
|
|
if (hoverIndexes.TryGetValue(control, out int tempIndex))
|
|
{
|
|
mappingListVM.SelectedIndex = tempIndex;
|
|
mappingListBox.ScrollIntoView(mappingListBox.SelectedItem);
|
|
MappedControl mapped = mappingListVM.Mappings[tempIndex];
|
|
UpdateHighlightLabel(mapped);
|
|
}
|
|
}
|
|
|
|
private void UpdateHighlightLabel(MappedControl mapped)
|
|
{
|
|
string display = $"{mapped.ControlName}: {mapped.MappingName}";
|
|
if (mapped.HasShiftAction())
|
|
{
|
|
display += "\nShift: ";
|
|
display += mapped.ShiftMappingName;
|
|
}
|
|
|
|
highlightControlDisplayLb.Content = display;
|
|
}
|
|
|
|
private void ContBtn_MouseEnter(object sender, MouseEventArgs e)
|
|
{
|
|
Button control = sender as Button;
|
|
InputControlHighlight(control);
|
|
}
|
|
|
|
private void ContBtn_MouseLeave(object sender, MouseEventArgs e)
|
|
{
|
|
//Button control = sender as Button;
|
|
//control.Background = new SolidColorBrush(Colors.Transparent);
|
|
Canvas.SetLeft(picBoxHover, 0);
|
|
Canvas.SetTop(picBoxHover, 0);
|
|
picBoxHover.Visibility = Visibility.Hidden;
|
|
}
|
|
|
|
private void UseTouchMouseRadio_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
activeTouchPanel.Visibility = Visibility.Collapsed;
|
|
useMousePanel.Visibility = Visibility.Visible;
|
|
activeTouchPanel = useMousePanel;
|
|
profileSettingsVM.UseTouchMouse = true;
|
|
}
|
|
|
|
private void UseTouchControlsRadio_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
activeTouchPanel.Visibility = Visibility.Collapsed;
|
|
useControlsPanel.Visibility = Visibility.Visible;
|
|
activeTouchPanel = useControlsPanel;
|
|
profileSettingsVM.UseTouchMouse = false;
|
|
}
|
|
|
|
private void GyroOutModeCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
int idx = gyroOutModeCombo.SelectedIndex;
|
|
if (idx >= 0)
|
|
{
|
|
activeGyroModePanel.Visibility = Visibility.Collapsed;
|
|
|
|
if (idx == 0)
|
|
{
|
|
activeGyroModePanel = gyroControlsPanel;
|
|
}
|
|
else if (idx == 1)
|
|
{
|
|
activeGyroModePanel = gyroMousePanel;
|
|
}
|
|
else if (idx == 2)
|
|
{
|
|
activeGyroModePanel = gyroMouseJoystickPanel;
|
|
}
|
|
|
|
activeGyroModePanel.Visibility = Visibility.Visible;
|
|
|
|
if (deviceNum < 4)
|
|
{
|
|
App.rootHub.touchPad[deviceNum]?.ResetToggleGyroM();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SetLateProperties()
|
|
{
|
|
DS4Windows.Global.BTPollRate[deviceNum] = profileSettingsVM.TempBTPollRateIndex;
|
|
DS4Windows.Global.OutContType[deviceNum] = profileSettingsVM.TempConType;
|
|
DS4Windows.Global.outDevTypeTemp[deviceNum] = DS4Windows.OutContType.X360;
|
|
}
|
|
|
|
private void SaveBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (profileSettingsVM.FuncDevNum < 4)
|
|
{
|
|
App.rootHub.setRumble(0, 0, profileSettingsVM.FuncDevNum);
|
|
}
|
|
|
|
string temp = profileNameTxt.Text;
|
|
if (!string.IsNullOrWhiteSpace(temp) &&
|
|
temp.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) == -1)
|
|
{
|
|
SetLateProperties();
|
|
DS4Windows.Global.ProfilePath[deviceNum] =
|
|
DS4Windows.Global.OlderProfilePath[deviceNum] = temp;
|
|
|
|
if (currentProfile != null)
|
|
{
|
|
if (temp != currentProfile.Name)
|
|
{
|
|
//File.Delete(DS4Windows.Global.appdatapath + @"\Profiles\" + currentProfile.Name + ".xml");
|
|
currentProfile.DeleteFile();
|
|
currentProfile.Name = temp;
|
|
}
|
|
}
|
|
|
|
if (currentProfile != null)
|
|
{
|
|
currentProfile.SaveProfile(deviceNum);
|
|
currentProfile.FireSaved();
|
|
Closed?.Invoke(this, EventArgs.Empty);
|
|
}
|
|
else
|
|
{
|
|
string tempprof = Global.appdatapath + @"\Profiles\" + temp + ".xml";
|
|
if (!File.Exists(tempprof))
|
|
{
|
|
Global.SaveProfile(deviceNum, temp);
|
|
Global.calculateProfileActionCount(deviceNum);
|
|
Global.calculateProfileActionDicts(deviceNum);
|
|
Global.cacheProfileCustomsFlags(deviceNum);
|
|
CreatedProfile?.Invoke(this, temp);
|
|
Closed?.Invoke(this, EventArgs.Empty);
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(Properties.Resources.ValidName, Properties.Resources.NotValid,
|
|
MessageBoxButton.OK, MessageBoxImage.Exclamation);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(Properties.Resources.ValidName, Properties.Resources.NotValid,
|
|
MessageBoxButton.OK, MessageBoxImage.Exclamation);
|
|
}
|
|
}
|
|
|
|
private void KeepSizeBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
keepsize = true;
|
|
ImageSourceConverter c = new ImageSourceConverter();
|
|
sizeImage.Source = c.ConvertFromString("pack://application:,,,/DS4Windows;component/Resources/checked.png") as ImageSource;
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
if (profileSettingsVM.FuncDevNum < 4)
|
|
{
|
|
App.rootHub.setRumble(0, 0, profileSettingsVM.FuncDevNum);
|
|
}
|
|
|
|
Closed?.Invoke(this, EventArgs.Empty);
|
|
}
|
|
|
|
private void ColorByBatteryPerCk_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ColorByBatteryPerCheck();
|
|
}
|
|
|
|
private void ColorByBatteryPerCheck()
|
|
{
|
|
bool state = profileSettingsVM.ColorBatteryPercent;
|
|
if (state)
|
|
{
|
|
colorGB.Header = Translations.Strings.Full;
|
|
emptyColorGB.Visibility = Visibility.Visible;
|
|
}
|
|
else
|
|
{
|
|
colorGB.Header = Translations.Strings.Color;
|
|
emptyColorGB.Visibility = Visibility.Hidden;
|
|
}
|
|
}
|
|
|
|
private void FlashColorBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ColorPickerWindow dialog = new ColorPickerWindow();
|
|
dialog.Owner = Application.Current.MainWindow;
|
|
Color tempcolor = profileSettingsVM.FlashColorMedia;
|
|
dialog.colorPicker.SelectedColor = tempcolor;
|
|
profileSettingsVM.StartForcedColor(tempcolor);
|
|
dialog.ColorChanged += (sender2, color) =>
|
|
{
|
|
profileSettingsVM.UpdateForcedColor(color);
|
|
};
|
|
dialog.ShowDialog();
|
|
profileSettingsVM.EndForcedColor();
|
|
profileSettingsVM.UpdateFlashColor(dialog.colorPicker.SelectedColor.GetValueOrDefault());
|
|
}
|
|
|
|
private void LowColorBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ColorPickerWindow dialog = new ColorPickerWindow();
|
|
dialog.Owner = Application.Current.MainWindow;
|
|
Color tempcolor = profileSettingsVM.LowColorMedia;
|
|
dialog.colorPicker.SelectedColor = tempcolor;
|
|
profileSettingsVM.StartForcedColor(tempcolor);
|
|
dialog.ColorChanged += (sender2, color) =>
|
|
{
|
|
profileSettingsVM.UpdateForcedColor(color);
|
|
};
|
|
dialog.ShowDialog();
|
|
profileSettingsVM.EndForcedColor();
|
|
profileSettingsVM.UpdateLowColor(dialog.colorPicker.SelectedColor.GetValueOrDefault());
|
|
}
|
|
|
|
private void HeavyRumbleTestBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
int deviceNum = profileSettingsVM.FuncDevNum;
|
|
if (deviceNum < 4)
|
|
{
|
|
DS4Device d = App.rootHub.DS4Controllers[deviceNum];
|
|
if (d != null)
|
|
{
|
|
bool rumbleActive = profileSettingsVM.HeavyRumbleActive;
|
|
if (!rumbleActive)
|
|
{
|
|
profileSettingsVM.HeavyRumbleActive = true;
|
|
d.setRumble(d.LeftHeavySlowRumble,
|
|
(byte)Math.Min(255, 255 * profileSettingsVM.RumbleBoost / 100));
|
|
heavyRumbleTestBtn.Content = Properties.Resources.StopHText;
|
|
}
|
|
else
|
|
{
|
|
profileSettingsVM.HeavyRumbleActive = false;
|
|
d.setRumble(0, 0);
|
|
heavyRumbleTestBtn.Content = Properties.Resources.TestHText;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void LightRumbleTestBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
int deviceNum = profileSettingsVM.FuncDevNum;
|
|
if (deviceNum < 4)
|
|
{
|
|
DS4Device d = App.rootHub.DS4Controllers[deviceNum];
|
|
if (d != null)
|
|
{
|
|
bool rumbleActive = profileSettingsVM.LightRumbleActive;
|
|
if (!rumbleActive)
|
|
{
|
|
profileSettingsVM.LightRumbleActive = true;
|
|
d.setRumble((byte)Math.Min(255, 255 * profileSettingsVM.RumbleBoost / 100),
|
|
d.RightLightFastRumble);
|
|
lightRumbleTestBtn.Content = Properties.Resources.StopLText;
|
|
}
|
|
else
|
|
{
|
|
profileSettingsVM.LightRumbleActive = false;
|
|
d.setRumble(0, 0);
|
|
lightRumbleTestBtn.Content = Properties.Resources.TestLText;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CustomEditorBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
Button btn = sender as Button;
|
|
string tag = btn.Tag.ToString();
|
|
if (tag == "LS") LaunchCurveEditor(profileSettingsVM.LSCustomCurve);
|
|
else if (tag == "RS") LaunchCurveEditor(profileSettingsVM.RSCustomCurve);
|
|
else if (tag == "L2") LaunchCurveEditor(profileSettingsVM.L2CustomCurve);
|
|
else if (tag == "R2") LaunchCurveEditor(profileSettingsVM.R2CustomCurve);
|
|
else if (tag == "SX") LaunchCurveEditor(profileSettingsVM.SXCustomCurve);
|
|
else if (tag == "SZ") LaunchCurveEditor(profileSettingsVM.SZCustomCurve);
|
|
}
|
|
|
|
private void LaunchCurveEditor(string customDefinition)
|
|
{
|
|
profileSettingsVM.LaunchCurveEditor(customDefinition);
|
|
}
|
|
|
|
private void LaunchProgBrowseBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
OpenFileDialog dialog = new OpenFileDialog();
|
|
dialog.Multiselect = false;
|
|
dialog.AddExtension = true;
|
|
dialog.DefaultExt = ".exe";
|
|
dialog.Filter = "Program (*.exe)|*.exe";
|
|
dialog.Title = "Select Program";
|
|
|
|
dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
|
|
if (dialog.ShowDialog() == true)
|
|
{
|
|
profileSettingsVM.UpdateLaunchProgram(dialog.FileName);
|
|
}
|
|
}
|
|
|
|
private void FrictionUD_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
|
|
{
|
|
if (deviceNum < 4)
|
|
{
|
|
App.rootHub.touchPad[deviceNum]?.ResetTrackAccel(frictionUD.Value.GetValueOrDefault());
|
|
}
|
|
}
|
|
|
|
private void RainbowBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
bool active = profileSettingsVM.Rainbow != 0.0;
|
|
if (active)
|
|
{
|
|
profileSettingsVM.Rainbow = 0.0;
|
|
colorByBatteryPerCk.Content = Properties.Resources.ColorByBattery;
|
|
colorGB.IsEnabled = true;
|
|
emptyColorGB.IsEnabled = true;
|
|
}
|
|
else
|
|
{
|
|
profileSettingsVM.Rainbow = 5.0;
|
|
colorByBatteryPerCk.Content = Properties.Resources.DimByBattery;
|
|
colorGB.IsEnabled = false;
|
|
emptyColorGB.IsEnabled = false;
|
|
}
|
|
}
|
|
|
|
private void ChargingColorBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ColorPickerWindow dialog = new ColorPickerWindow();
|
|
dialog.Owner = Application.Current.MainWindow;
|
|
Color tempcolor = profileSettingsVM.ChargingColorMedia;
|
|
dialog.colorPicker.SelectedColor = tempcolor;
|
|
profileSettingsVM.StartForcedColor(tempcolor);
|
|
dialog.ColorChanged += (sender2, color) =>
|
|
{
|
|
profileSettingsVM.UpdateForcedColor(color);
|
|
};
|
|
dialog.ShowDialog();
|
|
profileSettingsVM.EndForcedColor();
|
|
profileSettingsVM.UpdateChargingColor(dialog.colorPicker.SelectedColor.GetValueOrDefault());
|
|
}
|
|
|
|
private void SteeringWheelEmulationCalibrateBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (profileSettingsVM.SASteeringWheelEmulationAxisIndex > 0)
|
|
{
|
|
DS4Windows.DS4Device d = App.rootHub.DS4Controllers[profileSettingsVM.FuncDevNum];
|
|
if (d != null)
|
|
{
|
|
System.Drawing.Point origWheelCenterPoint = new System.Drawing.Point(d.wheelCenterPoint.X, d.wheelCenterPoint.Y);
|
|
System.Drawing.Point origWheel90DegPointLeft = new System.Drawing.Point(d.wheel90DegPointLeft.X, d.wheel90DegPointLeft.Y);
|
|
System.Drawing.Point origWheel90DegPointRight = new System.Drawing.Point(d.wheel90DegPointRight.X, d.wheel90DegPointRight.Y);
|
|
|
|
d.WheelRecalibrateActiveState = 1;
|
|
|
|
MessageBoxResult result = MessageBox.Show($"{Properties.Resources.SASteeringWheelEmulationCalibrate}.\n\n" +
|
|
$"{Properties.Resources.SASteeringWheelEmulationCalibrateInstruction1}.\n" +
|
|
$"{Properties.Resources.SASteeringWheelEmulationCalibrateInstruction2}.\n" +
|
|
$"{Properties.Resources.SASteeringWheelEmulationCalibrateInstruction3}.\n\n" +
|
|
$"{Properties.Resources.SASteeringWheelEmulationCalibrateInstruction}.\n",
|
|
Properties.Resources.SASteeringWheelEmulationCalibrate, MessageBoxButton.OKCancel, MessageBoxImage.Information, MessageBoxResult.OK);
|
|
|
|
if (result == MessageBoxResult.OK)
|
|
{
|
|
// Accept new calibration values (State 3 is "Complete calibration" state)
|
|
d.WheelRecalibrateActiveState = 3;
|
|
}
|
|
else
|
|
{
|
|
// Cancel calibration and reset back to original calibration values
|
|
d.WheelRecalibrateActiveState = 4;
|
|
|
|
d.wheelFullTurnCount = 0;
|
|
d.wheelCenterPoint = origWheelCenterPoint;
|
|
d.wheel90DegPointLeft = origWheel90DegPointLeft;
|
|
d.wheel90DegPointRight = origWheel90DegPointRight;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show($"{Properties.Resources.SASteeringWheelEmulationCalibrateNoControllerError}.");
|
|
}
|
|
}
|
|
}
|
|
|
|
private void TouchDisInvertBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
touchDisInvertBtn.ContextMenu.IsOpen = true;
|
|
}
|
|
|
|
private void TouchDisInvertMenuItem_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
profileSettingsVM.UpdateTouchDisInvert(touchDisInvertBtn.ContextMenu);
|
|
}
|
|
|
|
private void GyroMouseTrigMenuItem_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ContextMenu menu = gyroMouseTrigBtn.ContextMenu;
|
|
int itemCount = menu.Items.Count;
|
|
MenuItem alwaysOnItem = menu.Items[itemCount - 1] as MenuItem;
|
|
|
|
profileSettingsVM.UpdateGyroMouseTrig(menu, e.OriginalSource == alwaysOnItem);
|
|
}
|
|
|
|
private void GyroMouseStickTrigMenuItem_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ContextMenu menu = gyroMouseStickTrigBtn.ContextMenu;
|
|
int itemCount = menu.Items.Count;
|
|
MenuItem alwaysOnItem = menu.Items[itemCount - 1] as MenuItem;
|
|
|
|
profileSettingsVM.UpdateGyroMouseStickTrig(menu, e.OriginalSource == alwaysOnItem);
|
|
}
|
|
|
|
private void GyroMouseTrigBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
gyroMouseTrigBtn.ContextMenu.IsOpen = true;
|
|
}
|
|
|
|
private void GyroMouseStickTrigBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
gyroMouseStickTrigBtn.ContextMenu.IsOpen = true;
|
|
}
|
|
|
|
private void OutConTypeCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
int index = outConTypeCombo.SelectedIndex;
|
|
if (index >= 0)
|
|
{
|
|
mappingListVM.UpdateMappingDevType(profileSettingsVM.TempConType);
|
|
}
|
|
}
|
|
|
|
private void NewActionBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
baseSpeActPanel.Visibility = Visibility.Collapsed;
|
|
ProfileList profList = (Application.Current.MainWindow as MainWindow).ProfileListHolder;
|
|
SpecialActionEditor actEditor = new SpecialActionEditor(deviceNum, profList, null);
|
|
specialActionDockPanel.Children.Add(actEditor);
|
|
actEditor.Visibility = Visibility.Visible;
|
|
actEditor.Cancel += (sender2, args) =>
|
|
{
|
|
specialActionDockPanel.Children.Remove(actEditor);
|
|
baseSpeActPanel.Visibility = Visibility.Visible;
|
|
};
|
|
actEditor.Saved += (sender2, actionName) =>
|
|
{
|
|
DS4Windows.SpecialAction action = DS4Windows.Global.GetAction(actionName);
|
|
SpecialActionItem newitem = specialActionsVM.CreateActionItem(action);
|
|
specialActionsVM.ActionCol.Add(newitem);
|
|
specialActionDockPanel.Children.Remove(actEditor);
|
|
baseSpeActPanel.Visibility = Visibility.Visible;
|
|
};
|
|
}
|
|
|
|
private void EditActionBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (specialActionsVM.SpecialActionIndex >= 0)
|
|
{
|
|
int currentIndex = specialActionsVM.SpecialActionIndex;
|
|
SpecialActionItem item = specialActionsVM.ActionCol[specialActionsVM.SpecialActionIndex];
|
|
baseSpeActPanel.Visibility = Visibility.Collapsed;
|
|
ProfileList profList = (Application.Current.MainWindow as MainWindow).ProfileListHolder;
|
|
SpecialActionEditor actEditor = new SpecialActionEditor(deviceNum, profList, item.SpecialAction);
|
|
specialActionDockPanel.Children.Add(actEditor);
|
|
actEditor.Visibility = Visibility.Visible;
|
|
actEditor.Cancel += (sender2, args) =>
|
|
{
|
|
specialActionDockPanel.Children.Remove(actEditor);
|
|
baseSpeActPanel.Visibility = Visibility.Visible;
|
|
};
|
|
actEditor.Saved += (sender2, actionName) =>
|
|
{
|
|
DS4Windows.SpecialAction action = DS4Windows.Global.GetAction(actionName);
|
|
SpecialActionItem newitem = specialActionsVM.CreateActionItem(action);
|
|
newitem.Active = item.Active;
|
|
specialActionsVM.ActionCol.RemoveAt(currentIndex);
|
|
specialActionsVM.ActionCol.Insert(currentIndex, newitem);
|
|
specialActionDockPanel.Children.Remove(actEditor);
|
|
baseSpeActPanel.Visibility = Visibility.Visible;
|
|
};
|
|
}
|
|
}
|
|
|
|
private void RemoveActionBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (specialActionsVM.SpecialActionIndex >= 0)
|
|
{
|
|
SpecialActionItem item = specialActionsVM.ActionCol[specialActionsVM.SpecialActionIndex];
|
|
specialActionsVM.RemoveAction(item);
|
|
}
|
|
}
|
|
|
|
private void SpecialActionCheckBox_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
specialActionsVM.ExportEnabledActions();
|
|
}
|
|
|
|
private void Ds4LightbarColorBtn_MouseEnter(object sender, MouseEventArgs e)
|
|
{
|
|
highlightControlDisplayLb.Content = "Click the lightbar for color picker";
|
|
}
|
|
|
|
private void Ds4LightbarColorBtn_MouseLeave(object sender, MouseEventArgs e)
|
|
{
|
|
highlightControlDisplayLb.Content = "";
|
|
}
|
|
|
|
private void Ds4LightbarColorBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ColorPickerWindow dialog = new ColorPickerWindow();
|
|
dialog.Owner = Application.Current.MainWindow;
|
|
Color tempcolor = profileSettingsVM.MainColor;
|
|
dialog.colorPicker.SelectedColor = tempcolor;
|
|
profileSettingsVM.StartForcedColor(tempcolor);
|
|
dialog.ColorChanged += (sender2, color) =>
|
|
{
|
|
profileSettingsVM.UpdateForcedColor(color);
|
|
};
|
|
dialog.ShowDialog();
|
|
profileSettingsVM.EndForcedColor();
|
|
profileSettingsVM.UpdateMainColor(dialog.colorPicker.SelectedColor.GetValueOrDefault());
|
|
}
|
|
|
|
private void InputDS4(object sender, System.Timers.ElapsedEventArgs e)
|
|
{
|
|
inputTimer.Stop();
|
|
|
|
bool activeWin = false;
|
|
int tempDeviceNum = 0;
|
|
Dispatcher.Invoke(() =>
|
|
{
|
|
activeWin = Application.Current.MainWindow.IsActive;
|
|
tempDeviceNum = profileSettingsVM.FuncDevNum;
|
|
});
|
|
|
|
if (activeWin && profileSettingsVM.UseControllerReadout)
|
|
{
|
|
int index = -1;
|
|
switch(Program.rootHub.GetActiveInputControl(tempDeviceNum))
|
|
{
|
|
case DS4Controls.None: break;
|
|
case DS4Controls.Cross: index = 0; break;
|
|
case DS4Controls.Circle: index = 1; break;
|
|
case DS4Controls.Square: index = 2; break;
|
|
case DS4Controls.Triangle: index = 3; break;
|
|
case DS4Controls.Options: index = 4; break;
|
|
case DS4Controls.Share: index = 5; break;
|
|
case DS4Controls.DpadUp: index = 6; break;
|
|
case DS4Controls.DpadDown: index = 7; break;
|
|
case DS4Controls.DpadLeft: index = 8; break;
|
|
case DS4Controls.DpadRight: index = 9; break;
|
|
case DS4Controls.PS: index = 10; break;
|
|
case DS4Controls.L1: index = 11; break;
|
|
case DS4Controls.R1: index = 12; break;
|
|
case DS4Controls.L2: index = 13; break;
|
|
case DS4Controls.R2: index = 14; break;
|
|
case DS4Controls.L3: index = 15; break;
|
|
case DS4Controls.R3: index = 16; break;
|
|
case DS4Controls.TouchLeft: index = 17; break;
|
|
case DS4Controls.TouchRight: index = 18; break;
|
|
case DS4Controls.TouchMulti: index = 19; break;
|
|
case DS4Controls.TouchUpper: index = 20; break;
|
|
case DS4Controls.LYNeg: index = 21; break;
|
|
case DS4Controls.LYPos: index = 22; break;
|
|
case DS4Controls.LXNeg: index = 23; break;
|
|
case DS4Controls.LXPos: index = 24; break;
|
|
case DS4Controls.RYNeg: index = 25; break;
|
|
case DS4Controls.RYPos: index = 26; break;
|
|
case DS4Controls.RXNeg: index = 27; break;
|
|
case DS4Controls.RXPos: index = 28; break;
|
|
default: break;
|
|
}
|
|
|
|
if (index >= 0)
|
|
{
|
|
Dispatcher.BeginInvoke((Action)(() =>
|
|
{
|
|
mappingListVM.SelectedIndex = index;
|
|
ShowControlBindingWindow();
|
|
}));
|
|
}
|
|
}
|
|
|
|
if (profileSettingsVM.UseControllerReadout)
|
|
{
|
|
inputTimer.Start();
|
|
}
|
|
}
|
|
private void ProfileEditor_Closed(object sender, EventArgs e)
|
|
{
|
|
profileSettingsVM.UseControllerReadout = false;
|
|
inputTimer.Stop();
|
|
conReadingsUserCon.EnableControl(false);
|
|
}
|
|
|
|
private void UseControllerReadoutCk_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (profileSettingsVM.UseControllerReadout && profileSettingsVM.Device < 4)
|
|
{
|
|
inputTimer.Start();
|
|
}
|
|
else
|
|
{
|
|
inputTimer.Stop();
|
|
}
|
|
}
|
|
|
|
private void ShowControlBindingWindow()
|
|
{
|
|
MappedControl mpControl = mappingListVM.Mappings[mappingListVM.SelectedIndex];
|
|
BindingWindow window = new BindingWindow(deviceNum, mpControl.Setting);
|
|
window.Owner = App.Current.MainWindow;
|
|
window.ShowDialog();
|
|
mpControl.UpdateMappingName();
|
|
UpdateHighlightLabel(mpControl);
|
|
}
|
|
|
|
private void MappingListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (mappingListVM.SelectedIndex >= 0)
|
|
{
|
|
ShowControlBindingWindow();
|
|
}
|
|
}
|
|
|
|
private void SidebarTabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (sidebarTabControl.SelectedItem == contReadingsTab)
|
|
{
|
|
controllerReadingsTabActive = true;
|
|
conReadingsUserCon.EnableControl(true);
|
|
}
|
|
else if (controllerReadingsTabActive)
|
|
{
|
|
controllerReadingsTabActive = false;
|
|
conReadingsUserCon.EnableControl(false);
|
|
}
|
|
}
|
|
}
|
|
}
|