New UI for Options, no more tabs! Same with the actions window

This commit is contained in:
jays2kings 2014-05-12 01:48:50 -04:00
parent 629390b12e
commit a3ca56d8a6
17 changed files with 3037 additions and 2748 deletions

View File

@ -146,6 +146,9 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Resources\UpperTouch.png" />
<None Include="Resources\sticks.png" />
<None Include="Resources\Touch.png" />
<None Include="Resources\Touch states2.png" />
<None Include="Resources\sticks2.png" />
<None Include="Resources\360 fades.png" />
@ -154,6 +157,9 @@
<None Include="Resources\mouse.png" />
<None Include="Resources\rainbow.png" />
<None Include="Resources\rainbowC.png" />
<None Include="Resources\LeftTouch.png" />
<None Include="Resources\MultiTouch.png" />
<None Include="Resources\RightTouch.png" />
<Content Include="Resources\Scp_All.ico" />
</ItemGroup>
<ItemGroup>

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,7 @@ namespace ScpServer
private int device;
private Button button;
private Options ops;
public KBM360(DS4Control.Control bus_device, int deviceNum, Options ooo, Button buton, int tabStart)
public KBM360(DS4Control.Control bus_device, int deviceNum, Options ooo, Button buton)
{
InitializeComponent();
device = deviceNum;
@ -27,12 +27,9 @@ namespace ScpServer
if (button.Font.Bold)
cbScanCode.Checked = true;
Text = "Select an action for " + button.Name.Substring(2);
foreach (System.Windows.Forms.Control control in tabKBM.Controls)
foreach (System.Windows.Forms.Control control in this.Controls)
if (control is Button)
((Button)control).Click += new System.EventHandler(anybtn_Click);
foreach (System.Windows.Forms.Control control in tab360.Controls)
if (control is Button)
((Button)control).Click += new System.EventHandler(anybtn_Click360);
if (button.Name.Contains("Touch"))
{
bnMOUSEDOWN.Visible = false;
@ -40,11 +37,6 @@ namespace ScpServer
bnMOUSERIGHT.Visible = false;
bnMOUSEUP.Visible = false;
}
if (tabStart < 2)
tabControl1.SelectedIndex = tabStart;
else
tabControl1.SelectedIndex = 0;
ReFocus();
}
public void anybtn_Click(object sender, EventArgs e)
@ -69,27 +61,16 @@ namespace ScpServer
}
else
keyname = ((Button)sender).Text;
object keytag = ((Button)sender).Tag;
object keytag;
if (((Button)sender).Tag == "X360")
keytag = ((Button)sender).Text;
else
keytag = ((Button)sender).Tag;
ops.ChangeButtonText(keyname, keytag);
this.Close();
}
}
private void ReFocus()
{
if (ops.Focused)
this.Enabled = false;
}
public void anybtn_Click360(object sender, EventArgs e)
{
if (sender is Button)
{
string keyname = ((Button)sender).Text;
ops.ChangeButtonText(keyname);
this.Close();
}
}
private void finalMeasure(object sender, FormClosedEventArgs e)
{
ops.Toggle_Repeat(cbRepeat.Checked);

File diff suppressed because it is too large Load Diff

View File

@ -13,7 +13,6 @@ namespace ScpServer
private DS4Control.Control scpDevice;
private int device;
private string filename;
private ScpForm mainWin;
Byte[] oldLedColor, oldLowLedColor;
Timer sixaxisTimer = new Timer();
private List<Button> buttons = new List<Button>();
@ -22,13 +21,12 @@ namespace ScpServer
private Color reg, full;
private Image colored, greyscale;
public Options(DS4Control.Control bus_device, int deviceNum, string name, ScpForm mainWindow)
public Options(DS4Control.Control bus_device, int deviceNum, string name)
{
InitializeComponent();
device = deviceNum;
scpDevice = bus_device;
filename = name;
mainWin = mainWindow;
colored = pBRainbow.Image;
greyscale = GreyscaleImage((Bitmap)pBRainbow.Image);
if (filename != "")
@ -63,17 +61,13 @@ namespace ScpServer
// Force update of color choosers
alphacolor = Math.Max(redBar.Value, Math.Max(greenBar.Value, blueBar.Value));
reg = Color.FromArgb(color.red, color.green, color.blue);
full = HuetoRGB(reg.GetHue(), reg.GetSaturation());
colorChooserButton.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
pBController.BackColor = colorChooserButton.BackColor;
full = HuetoRGB(reg.GetHue(), reg.GetBrightness(), reg);
pBController.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
alphacolor = Math.Max(lowRedBar.Value, Math.Max(greenBar.Value, blueBar.Value));
reg = Color.FromArgb(lowColor.red, lowColor.green, lowColor.blue);
full = HuetoRGB(reg.GetHue(), reg.GetSaturation());
full = HuetoRGB(reg.GetHue(), reg.GetBrightness(), reg);
lowColorChooserButton.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
lowRedValLabel.Text = lowColor.red.ToString();
lowGreenValLabel.Text = lowColor.green.ToString();
lowBlueValLabel.Text = lowColor.blue.ToString();
numUDRainbow.Value = (decimal)Global.getRainbow(device);
if (Global.getRainbow(device) == 0)
{
@ -108,29 +102,25 @@ namespace ScpServer
});
sixaxisTimer.Interval = 1000 / 60;
#endregion
foreach (System.Windows.Forms.Control control in tabControls.Controls)
foreach (System.Windows.Forms.Control control in this.MainPanel.Controls)
if (control is Button)
if (!((Button)control).Text.Contains("btn"))
if (!((Button)control).Name.Contains("btn"))
buttons.Add((Button)control);
foreach (System.Windows.Forms.Control control in tabTouchPad.Controls)
foreach (System.Windows.Forms.Control control in this.SticksPanel.Controls)
if (control is Button)
buttons.Add((Button)control);
foreach (System.Windows.Forms.Control control in tabAnalogSticks.Controls)
if (control is Button)
buttons.Add((Button)control);
if (!((Button)control).Name.Contains("btn"))
buttons.Add((Button)control);
if (filename != "" && filename != "New Profile")
Global.LoadProfile(device, buttons.ToArray());
ToolTip tp = new ToolTip();
tp.SetToolTip(cBlowerRCOn, "Best used with right side as mouse");
tp.SetToolTip(cBlowerRCOn, "Use lower right Touchpad as right mouse");
tp.SetToolTip(cBDoubleTap, "Tap and hold to drag, slight delay with one tap");
tp.SetToolTip(btnLightbar, "Click to change color");
advColorDialog.OnUpdateColor += advColorDialog_OnUpdateColor;
btnLeftStick.Enter += btnSticks_Enter;
btnRightStick.Enter += btnSticks_Enter;
btnTouchtab.Enter += btnTouchtab_Enter;
UpdateLists();
}
private void SetDynamicTrackBarValue(TrackBar trackBar, int value)
{
@ -141,27 +131,51 @@ namespace ScpServer
trackBar.Value = value;
}
private void Set()
{
Global.saveColor(device, (byte)redBar.Value, (byte)greenBar.Value, (byte)blueBar.Value);
Global.saveLowColor(device, (byte)lowRedBar.Value, (byte)lowGreenBar.Value, (byte)lowBlueBar.Value);
Global.setLeftTriggerMiddle(device, (double)numUDL2.Value);
Global.setRightTriggerMiddle(device, (double)numUDR2.Value);
Global.saveRumbleBoost(device, (byte)rumbleBoostBar.Value);
Global.setTouchSensitivity(device, (byte)numUDTouch.Value);
Global.setTouchpadJitterCompensation(device, touchpadJitterCompensation.Checked);
Global.setLowerRCOn(device, cBlowerRCOn.Checked);
Global.setScrollSensitivity(device, (byte)numUDScroll.Value);
Global.setDoubleTap(device, cBDoubleTap.Checked);
Global.setButtonMouseSensitivity(device, tBMouseSens.Value);
Global.setTapSensitivity(device, (byte)numUDTap.Value);
Global.setIdleDisconnectTimeout(device, (int)idleDisconnectTimeout.Value);
Global.setButtonMouseSensitivity(device, tBMouseSens.Value);
Global.setRainbow(device, (int)numUDRainbow.Value);
if (numUDRainbow.Value == 0) pBRainbow.Image = greyscale;
else pBRainbow.Image = colored;
}
private void saveButton_Click(object sender, EventArgs e)
{
Set();
if (tBProfile.Text != null && tBProfile.Text != "" && !tBProfile.Text.Contains("\\") && !tBProfile.Text.Contains("/") && !tBProfile.Text.Contains(":") && !tBProfile.Text.Contains("*") && !tBProfile.Text.Contains("?") && !tBProfile.Text.Contains("\"") && !tBProfile.Text.Contains("<") && !tBProfile.Text.Contains(">") && !tBProfile.Text.Contains("|"))
{
System.IO.File.Delete(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName + @"\Profiles\" + filename + ".xml");
Global.setAProfile(device, tBProfile.Text);
Global.SaveProfile(device, tBProfile.Text, buttons.ToArray());
Global.Save();
this.Close();
}
else
MessageBox.Show("Please enter a valid name", "Not valid", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
KBM360 kbm360 = null;
private void Show_ControlsBn(object sender, EventArgs e)
{
lastSelected = (Button)sender;
kbm360 = new KBM360(scpDevice, device, this, lastSelected, 0);
kbm360 = new KBM360(scpDevice, device, this, lastSelected);
kbm360.Icon = this.Icon;
kbm360.ShowDialog();
//kbm360.FormClosed += delegate { kbm360 = null; };
//this.Enabled = false;
}
private void Show360Controls(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
lastSelected = (Button)sender;
kbm360 = new KBM360(scpDevice, device, this, lastSelected, 1);
kbm360.Icon = this.Icon;
kbm360.ShowDialog();
}
}
public void ChangeButtonText(string controlname, object tag)
@ -202,140 +216,157 @@ namespace ScpServer
}
private void btnSticks_Enter(object sender, EventArgs e)
{
tabOptions.SelectTab(1);
SticksPanel.Visible = true;
MainPanel.Visible = false;
}
private void btnTouchtab_Enter(object sender, EventArgs e)
private void btnFullView_Click(object sender, EventArgs e)
{
tabOptions.SelectTab(2);
SticksPanel.Visible = false;
MainPanel.Visible = true;
}
private void btnLightbar_Click(object sender, EventArgs e)
{
tabOptions.SelectTab(3);
}
private void Set()
{
Global.saveColor(device, (byte)redBar.Value, (byte)greenBar.Value, (byte)blueBar.Value);
Global.saveLowColor(device, (byte)lowRedBar.Value, (byte)lowGreenBar.Value, (byte)lowBlueBar.Value);
Global.setLeftTriggerMiddle(device, (double)numUDL2.Value);
Global.setRightTriggerMiddle(device, (double)numUDR2.Value);
Global.saveRumbleBoost(device, (byte)rumbleBoostBar.Value);
Global.setTouchSensitivity(device, (byte)numUDTouch.Value);
Global.setTouchpadJitterCompensation(device, touchpadJitterCompensation.Checked);
Global.setLowerRCOn(device, cBlowerRCOn.Checked);
Global.setScrollSensitivity(device, (byte)numUDScroll.Value);
Global.setDoubleTap(device, cBDoubleTap.Checked);
Global.setButtonMouseSensitivity(device, tBMouseSens.Value);
Global.setTapSensitivity(device, (byte)numUDTap.Value);
Global.setIdleDisconnectTimeout(device, (int)idleDisconnectTimeout.Value);
Global.setButtonMouseSensitivity(device, tBMouseSens.Value);
Global.setRainbow(device, (int)numUDRainbow.Value);
if (numUDRainbow.Value == 0) pBRainbow.Image = greyscale;
else pBRainbow.Image = colored;
}
private void saveButton_Click(object sender, EventArgs e)
{
Set();
if (tBProfile.Text != null && tBProfile.Text != "" && !tBProfile.Text.Contains("\\") && !tBProfile.Text.Contains("/") && !tBProfile.Text.Contains(":") && !tBProfile.Text.Contains("*") && !tBProfile.Text.Contains("?") && !tBProfile.Text.Contains("\"") && !tBProfile.Text.Contains("<") && !tBProfile.Text.Contains(">") && !tBProfile.Text.Contains("|"))
advColorDialog.Color = Color.FromArgb(redBar.Value, greenBar.Value, blueBar.Value);
advColorDialog_OnUpdateColor(pBController.BackColor, e);
if (advColorDialog.ShowDialog() == DialogResult.OK)
{
Global.setAProfile(device, tBProfile.Text);
Global.SaveProfile(device, tBProfile.Text, buttons.ToArray());
Global.Save();
this.Close();
pBController.BackColor = advColorDialog.Color;
redBar.Value = advColorDialog.Color.R;
greenBar.Value = advColorDialog.Color.G;
blueBar.Value = advColorDialog.Color.B;
}
else Global.saveColor(device, oldLedColor[0], oldLedColor[1], oldLedColor[2]);
//Global.saveLowColor(device, oldLowLedColor[0], oldLowLedColor[1], oldLowLedColor[2]);
oldLedColor = null;
oldLowLedColor = null;
}
private void lowColorChooserButton_Click(object sender, EventArgs e)
{
advColorDialog.Color = lowColorChooserButton.BackColor;
advColorDialog_OnUpdateColor(lowColorChooserButton.BackColor, e);
if (advColorDialog.ShowDialog() == DialogResult.OK)
{
lowColorChooserButton.BackColor = advColorDialog.Color;
lowRedBar.Value = advColorDialog.Color.R;
lowGreenBar.Value = advColorDialog.Color.G;
lowBlueBar.Value = advColorDialog.Color.B;
}
else Global.saveLowColor(device, oldLowLedColor[0], oldLowLedColor[1], oldLowLedColor[2]);
Global.saveColor(device, oldLedColor[0], oldLedColor[1], oldLedColor[2]);
oldLedColor = null;
oldLowLedColor = null;
}
private void advColorDialog_OnUpdateColor(object sender, EventArgs e)
{
if (oldLedColor == null || oldLowLedColor == null)
{
DS4Color color = Global.loadColor(device);
oldLedColor = new Byte[] { color.red, color.green, color.blue };
color = Global.loadLowColor(device);
oldLowLedColor = new Byte[] { color.red, color.green, color.blue };
}
if (sender is Color)
{
Color color = (Color)sender;
Global.saveColor(device, color.R, color.G, color.B);
Global.saveLowColor(device, color.R, color.G, color.B);
}
else
MessageBox.Show("Please enter a valid name", "Not valid", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
private void redBar_ValueChanged(object sender, EventArgs e)
{
int value = ((TrackBar)sender).Value;
int sat = 244 - (value < 244 ? value : 244);
int som = 244 + 11 * (int)(value * 0.0039215);
((TrackBar)sender).BackColor = Color.FromArgb(som, sat, sat);
alphacolor = Math.Max(redBar.Value, Math.Max(greenBar.Value, blueBar.Value));
reg = Color.FromArgb(redBar.Value, greenBar.Value, blueBar.Value);
full = HuetoRGB(reg.GetHue(), reg.GetSaturation());
colorChooserButton.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
full = HuetoRGB(reg.GetHue(), reg.GetBrightness(), reg);
pBController.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
Global.saveColor(device, (byte)redBar.Value, (byte)greenBar.Value, (byte)blueBar.Value);
pBController.BackColor = colorChooserButton.BackColor;
redValLabel.Text = redBar.Value.ToString();
}
private void greenBar_ValueChanged(object sender, EventArgs e)
{
int value = ((TrackBar)sender).Value;
int sat = 244 - (value < 244 ? value : 244);
int som = 244 + 11 * (int)(value * 0.0039215);
((TrackBar)sender).BackColor = Color.FromArgb(sat, som, sat);
alphacolor = Math.Max(redBar.Value, Math.Max(greenBar.Value, blueBar.Value));
reg = Color.FromArgb(redBar.Value, greenBar.Value, blueBar.Value);
full = HuetoRGB(reg.GetHue(), reg.GetSaturation());
colorChooserButton.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
full = HuetoRGB(reg.GetHue(), reg.GetBrightness(), reg);
pBController.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
Global.saveColor(device, (byte)redBar.Value, (byte)greenBar.Value, (byte)blueBar.Value);
pBController.BackColor = colorChooserButton.BackColor;
greenValLabel.Text = greenBar.Value.ToString();
}
private void blueBar_ValueChanged(object sender, EventArgs e)
{
int value = ((TrackBar)sender).Value;
int sat = 244 - (value < 244 ? value : 244);
int som = 244 + 11 * (int)(value * 0.0039215);
((TrackBar)sender).BackColor = Color.FromArgb(sat, sat, som);
alphacolor = Math.Max(redBar.Value, Math.Max(greenBar.Value, blueBar.Value));
reg = Color.FromArgb(redBar.Value, greenBar.Value, blueBar.Value);
full = HuetoRGB(reg.GetHue(), reg.GetSaturation());
colorChooserButton.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
full = HuetoRGB(reg.GetHue(), reg.GetBrightness(), reg);
pBController.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
Global.saveColor(device, (byte)redBar.Value, (byte)greenBar.Value, (byte)blueBar.Value);
pBController.BackColor = colorChooserButton.BackColor;
blueValLabel.Text = blueBar.Value.ToString();
}
private void lowRedBar_ValueChanged(object sender, EventArgs e)
{
int value = ((TrackBar)sender).Value;
int sat = 244 - (value < 244 ? value : 244);
int som = 244 + 11 * (int)(value * 0.0039215);
((TrackBar)sender).BackColor = Color.FromArgb(som, sat, sat);
alphacolor = Math.Max(lowRedBar.Value, Math.Max(lowGreenBar.Value, lowBlueBar.Value));
reg = Color.FromArgb(lowRedBar.Value, lowGreenBar.Value, lowBlueBar.Value);
full = HuetoRGB(reg.GetHue(), reg.GetSaturation());
full = HuetoRGB(reg.GetHue(), reg.GetBrightness(), reg);
lowColorChooserButton.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
Global.saveLowColor(device, (byte)lowRedBar.Value, (byte)lowGreenBar.Value, (byte)lowBlueBar.Value);
lowRedValLabel.Text = lowRedBar.Value.ToString();
}
private void lowGreenBar_ValueChanged(object sender, EventArgs e)
{
int value = ((TrackBar)sender).Value;
int sat = 244 - (value < 244 ? value : 244);
int som = 244 + 11 * (int)(value * 0.0039215);
((TrackBar)sender).BackColor = Color.FromArgb(sat, som, sat);
alphacolor = Math.Max(lowRedBar.Value, Math.Max(lowGreenBar.Value, lowBlueBar.Value));
reg = Color.FromArgb(lowRedBar.Value, lowGreenBar.Value, lowBlueBar.Value);
full = HuetoRGB(reg.GetHue(), reg.GetSaturation());
full = HuetoRGB(reg.GetHue(), reg.GetBrightness(), reg);
lowColorChooserButton.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
Global.saveLowColor(device, (byte)lowRedBar.Value, (byte)lowGreenBar.Value, (byte)lowBlueBar.Value);
lowGreenValLabel.Text = lowGreenBar.Value.ToString();
}
private void lowBlueBar_ValueChanged(object sender, EventArgs e)
{
int value = ((TrackBar)sender).Value;
int sat = 244 - (value < 244 ? value : 244);
int som = 244 + 11 * (int)(value * 0.0039215);
((TrackBar)sender).BackColor = Color.FromArgb(sat, sat, som);
alphacolor = Math.Max(lowRedBar.Value, Math.Max(lowGreenBar.Value, lowBlueBar.Value));
reg = Color.FromArgb(lowRedBar.Value, lowGreenBar.Value, lowBlueBar.Value);
full = HuetoRGB(reg.GetHue(), reg.GetSaturation());
full = HuetoRGB(reg.GetHue(), reg.GetBrightness(), reg);
lowColorChooserButton.BackColor = Color.FromArgb((alphacolor > 205 ? 255 : (alphacolor + 50)), full);
Global.saveLowColor(device, (byte)lowRedBar.Value, (byte)lowGreenBar.Value, (byte)lowBlueBar.Value);
lowBlueValLabel.Text = lowBlueBar.Value.ToString();
}
public Color HuetoRGB(float hue, float sat)
public Color HuetoRGB(float hue, float light, Color rgb)
{
int C = (int)(sat * 255);
int X = (int)((sat * (float)(1 - Math.Abs((hue / 60) % 2 - 1))) * 255);
if (sat == 0)
return Color.FromName("White");
else if (0 <= hue && hue < 60)
return Color.FromArgb(C, X, 0);
else if (60 <= hue && hue < 120)
return Color.FromArgb(X, C, 0);
else if (120 <= hue && hue < 180)
return Color.FromArgb(0, C, X);
else if (180 <= hue && hue < 240)
return Color.FromArgb(0, X, C);
else if (240 <= hue && hue < 300)
return Color.FromArgb(X, 0, C);
else if (300 <= hue && hue < 360)
return Color.FromArgb(C, 0, X);
else
return Color.FromName("Black");
float L = (float)Math.Max(.5, light);
float C = (1 - Math.Abs(2 * L - 1));
float X = (C * (1 - Math.Abs((hue / 60) % 2 - 1)));
float m = L - C / 2;
float R =0, G=0, B=0;
if (light == 1) return Color.FromName("White");
else if (rgb.R == rgb.G && rgb.G == rgb.B) return Color.FromName("White");
else if (0 <= hue && hue < 60) { R = C; G = X; }
else if (60 <= hue && hue < 120) { R = X; G = C; }
else if (120 <= hue && hue < 180) { G = C; B = X; }
else if (180 <= hue && hue < 240) { G = X; B = C; }
else if (240 <= hue && hue < 300) { R = X; B = C; }
else if (300 <= hue && hue < 360) { R = C; B = X; }
return Color.FromArgb((int)((R + m) * 255), (int)((G + m) * 255), (int)((B + m) * 255));
}
private void rumbleBoostBar_ValueChanged(object sender, EventArgs e)
{
Global.saveRumbleBoost(device, (byte)rumbleBoostBar.Value);
@ -376,15 +407,11 @@ namespace ScpServer
private void numUDTap_ValueChanged(object sender, EventArgs e)
{
Global.setTapSensitivity(device, (byte)numUDTap.Value);
if (numUDTap.Value == 0)
cBDoubleTap.Enabled = false;
else
cBDoubleTap.Enabled = true;
}
private void numUDScroll_ValueChanged(object sender, EventArgs e)
{
Global.setScrollSensitivity(device, (byte)numUDScroll.Value);
Global.setScrollSensitivity(device, (int)numUDScroll.Value);
}
private void ledAsBatteryIndicator_CheckedChanged(object sender, EventArgs e)
{
@ -392,22 +419,24 @@ namespace ScpServer
// New settings
if (batteryLed.Checked)
{
lowLedPanel.Visible = true;
//lowLedCheckBox.Visible = true;
fullLedPanel.Size = new Size(174, 127);
fullColorLabel.Visible = true;
{
while (this.Size.Height < 530)
this.Size += new Size(0, 1);
lowBatteryPanel.Visible = true;
batteryOpsPanel.Location = new Point(batteryOpsPanel.Location.X, 430);
SixaxisPanel.Location = new Point(SixaxisPanel.Location.X, 460);
lbLightbar.Text = "Full:";
Global.setLedAsBatteryIndicator(device, true);
}
else
{
lowLedPanel.Visible = false;
//lowLedCheckBox.Visible = false;
fullLedPanel.Size = new Size(351, 127);
fullColorLabel.Visible = false;
while (this.Size.Height > 500)
this.Size -= new Size(0, 1);
lowBatteryPanel.Visible = false;
batteryOpsPanel.Location = new Point(batteryOpsPanel.Location.X, 400);
SixaxisPanel.Location = new Point(SixaxisPanel.Location.X, 430);
lbLightbar.Text = "Light Bar:";
Global.setLedAsBatteryIndicator(device, false);
}
}
@ -422,64 +451,9 @@ namespace ScpServer
private void touchpadJitterCompensation_CheckedChanged(object sender, EventArgs e)
{
Global.setTouchpadJitterCompensation(device, touchpadJitterCompensation.Checked);
}
private void colorChooserButton_Click(object sender, EventArgs e)
{
advColorDialog.Color = Color.FromArgb(redBar.Value, greenBar.Value, blueBar.Value);
advColorDialog_OnUpdateColor(colorChooserButton.BackColor, e);
if (advColorDialog.ShowDialog() == DialogResult.OK)
{
redValLabel.Text = advColorDialog.Color.R.ToString();
greenValLabel.Text = advColorDialog.Color.G.ToString();
blueValLabel.Text = advColorDialog.Color.B.ToString();
colorChooserButton.BackColor = advColorDialog.Color;
redBar.Value = advColorDialog.Color.R;
greenBar.Value = advColorDialog.Color.G;
blueBar.Value = advColorDialog.Color.B;
}
else Global.saveColor(device, oldLedColor[0], oldLedColor[1], oldLedColor[2]);
//Global.saveLowColor(device, oldLowLedColor[0], oldLowLedColor[1], oldLowLedColor[2]);
oldLedColor = null;
oldLowLedColor = null;
}
private void lowColorChooserButton_Click(object sender, EventArgs e)
{
advColorDialog.Color = lowColorChooserButton.BackColor;
advColorDialog_OnUpdateColor(lowColorChooserButton.BackColor, e);
if (advColorDialog.ShowDialog() == DialogResult.OK)
{
lowRedValLabel.Text = advColorDialog.Color.R.ToString();
lowGreenValLabel.Text = advColorDialog.Color.G.ToString();
lowBlueValLabel.Text = advColorDialog.Color.B.ToString();
lowColorChooserButton.BackColor = advColorDialog.Color;
lowRedBar.Value = advColorDialog.Color.R;
lowGreenBar.Value = advColorDialog.Color.G;
lowBlueBar.Value = advColorDialog.Color.B;
}
else Global.saveLowColor(device, oldLowLedColor[0], oldLowLedColor[1], oldLowLedColor[2]);
Global.saveColor(device, oldLedColor[0], oldLedColor[1], oldLedColor[2]);
oldLedColor = null;
oldLowLedColor = null;
}
private void advColorDialog_OnUpdateColor(object sender, EventArgs e)
{
if (oldLedColor == null || oldLowLedColor == null)
{
DS4Color color = Global.loadColor(device);
oldLedColor = new Byte[] { color.red, color.green, color.blue };
color = Global.loadLowColor(device);
oldLowLedColor = new Byte[] { color.red, color.green, color.blue };
}
if (sender is Color)
{
Color color = (Color)sender;
Global.saveColor(device, color.R, color.G, color.B);
Global.saveLowColor(device, color.R, color.G, color.B);
}
}
private void flushHIDQueue_CheckedChanged(object sender, EventArgs e)
{
Global.setFlushHIDQueue(device, flushHIDQueue.Checked);
@ -487,7 +461,7 @@ namespace ScpServer
private void idleDisconnectTimeout_ValueChanged(object sender, EventArgs e)
{
Global.setIdleDisconnectTimeout(device, (int)(idleDisconnectTimeout.Value * 60));
}
private void Options_Closed(object sender, FormClosedEventArgs e)
@ -496,17 +470,15 @@ namespace ScpServer
sixaxisTimer.Stop();
for (int i = 0; i < 4; i++)
Global.LoadProfile(i); //Refreshes all profiles in case other controllers are using the same profile
mainWin.RefreshProfiles();
}
private void tBProfile_TextChanged(object sender, EventArgs e)
{
if (tBProfile.Text != null && tBProfile.Text != "" && !tBProfile.Text.Contains("\\") && !tBProfile.Text.Contains("/") && !tBProfile.Text.Contains(":") && !tBProfile.Text.Contains("*") && !tBProfile.Text.Contains("?") && !tBProfile.Text.Contains("\"") && !tBProfile.Text.Contains("<") && !tBProfile.Text.Contains(">") && !tBProfile.Text.Contains("|"))
{
tBProfile.ForeColor = System.Drawing.SystemColors.WindowText;
}
if (tBProfile.Text != null && tBProfile.Text != "" && !tBProfile.Text.Contains("\\") && !tBProfile.Text.Contains("/") && !tBProfile.Text.Contains(":") && !tBProfile.Text.Contains("*") && !tBProfile.Text.Contains("?") && !tBProfile.Text.Contains("\"") && !tBProfile.Text.Contains("<") && !tBProfile.Text.Contains(">") && !tBProfile.Text.Contains("|"))
tBProfile.ForeColor = System.Drawing.SystemColors.WindowText;
else
tBProfile.ForeColor = System.Drawing.SystemColors.GrayText;
//if (System.IO.File.Exists(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName + @"\Profiles\" + tBProfile.Text + ".xml"))
}
private void tBProfile_Enter(object sender, EventArgs e)
@ -521,7 +493,7 @@ namespace ScpServer
tBProfile.Text = "<type profile name here>";
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
private void cBSlide_CheckedChanged(object sender, EventArgs e)
{
if (cBSlide.Checked)
numUDTouch.Value = 100;
@ -546,6 +518,7 @@ namespace ScpServer
else
numUDTap.Value = 0;
numUDTap.Enabled = cBTap.Checked;
cBDoubleTap.Enabled = cBTap.Checked;
}
private void cBDoubleTap_CheckedChanged(object sender, EventArgs e)
@ -578,70 +551,53 @@ namespace ScpServer
lBControls.Items[14] = "R2 : " + bnR2.Text;
lBControls.Items[15] = "L3 : " + bnL3.Text;
lBControls.Items[16] = "R3 : " + bnR3.Text;
lBControls.Items[17] = "Left Stick : " + bnLSUp.Text + ", " + bnLSDown.Text + ", " + bnLSLeft.Text + ", " + bnLSRight.Text;
lBControls.Items[18] = "Right Stick : " + bnRSUp.Text + ", " + bnRSDown.Text + ", " + bnRSLeft.Text + ", " + bnRSRight.Text;
lBControls.Items[19] = "Touchpad : " + bnTouchLeft.Text + ", " + bnTouchUpper.Text + ", " + bnTouchMulti.Text + ", " + bnTouchRight.Text;
lBAnalogSticks.Items[0] = lBControls.Items[15];
lBAnalogSticks.Items[1] = lBControls.Items[16];
lBAnalogSticks.Items[2] = "LS Up : " + bnLSUp.Text;
lBAnalogSticks.Items[3] = "LS Down : " + bnLSDown.Text;
lBAnalogSticks.Items[4] = "LS Left :" + bnLSLeft.Text;
lBAnalogSticks.Items[5] = "LS Right : " + bnLSRight.Text;
lBAnalogSticks.Items[6] = "RS Up : " + bnRSUp.Text;
lBAnalogSticks.Items[7] = "RS Down : " + bnRSDown.Text;
lBAnalogSticks.Items[8] = "RS Left : " + bnRSLeft.Text;
lBAnalogSticks.Items[9] = "RS Right : " + bnRSRight.Text;
lBTouchControls.Items[0] = "Left Side : " + bnTouchLeft.Text;
lBTouchControls.Items[1] = "Upperpad : " + bnTouchUpper.Text;
lBTouchControls.Items[2] = "Multitouch : " + bnTouchMulti.Text;
lBTouchControls.Items[3] = "Right Side : " + bnTouchRight.Text;
lBControls.Items[17] = "Left Touch : " + bnTouchLeft.Text;
lBControls.Items[18] = "Right Touch : " + bnTouchRight.Text;
lBControls.Items[19] = "Multitouch : " + bnTouchMulti.Text;
lBControls.Items[20] = "Upper Touch : " + bnTouchUpper.Text;
lBControls.Items[21] = "LS Up : " + bnLSUp.Text;
lBControls.Items[22] = "LS Down : " + bnLSDown.Text;
lBControls.Items[23] = "LS Left : " + bnLSLeft.Text;
lBControls.Items[24] = "LS Right : " + bnLSRight.Text;
lBControls.Items[25] = "RS Up : " + bnRSUp.Text;
lBControls.Items[26] = "RS Down : " + bnRSDown.Text;
lBControls.Items[27] = "RS Left : " + bnRSLeft.Text;
lBControls.Items[28] = "RS Right : " + bnRSRight.Text;
}
private void Show_ControlsList(object sender, EventArgs e)
{
if (tabOptions.SelectedTab == tabControls)
{
if (lBControls.SelectedIndex == 0) Show_ControlsBn(bnCross, e);
if (lBControls.SelectedIndex == 1) Show_ControlsBn(bnCircle, e);
if (lBControls.SelectedIndex == 2) Show_ControlsBn(bnSquare, e);
if (lBControls.SelectedIndex == 3) Show_ControlsBn(bnTriangle, e);
if (lBControls.SelectedIndex == 4) Show_ControlsBn(bnOptions, e);
if (lBControls.SelectedIndex == 5) Show_ControlsBn(bnShare, e);
if (lBControls.SelectedIndex == 6) Show_ControlsBn(bnUp, e);
if (lBControls.SelectedIndex == 7) Show_ControlsBn(bnDown, e);
if (lBControls.SelectedIndex == 8) Show_ControlsBn(bnLeft, e);
if (lBControls.SelectedIndex == 9) Show_ControlsBn(bnRight, e);
if (lBControls.SelectedIndex == 10) Show_ControlsBn(bnPS, e);
if (lBControls.SelectedIndex == 11) Show_ControlsBn(bnL1, e);
if (lBControls.SelectedIndex == 12) Show_ControlsBn(bnR1, e);
if (lBControls.SelectedIndex == 13) Show_ControlsBn(bnL2, e);
if (lBControls.SelectedIndex == 14) Show_ControlsBn(bnR2, e);
if (lBControls.SelectedIndex == 15) Show_ControlsBn(bnL3, e);
if (lBControls.SelectedIndex == 16) Show_ControlsBn(bnR3, e);
if (lBControls.SelectedIndex == 17) tabOptions.SelectTab(1);
if (lBControls.SelectedIndex == 18) tabOptions.SelectTab(1);
if (lBControls.SelectedIndex == 19) tabOptions.SelectTab(2);
}
else if (tabOptions.SelectedTab == tabAnalogSticks)
{
if (lBAnalogSticks.SelectedIndex == 0) Show_ControlsBn(bnL3, e);
if (lBAnalogSticks.SelectedIndex == 1) Show_ControlsBn(bnR3, e);
if (lBAnalogSticks.SelectedIndex == 2) Show_ControlsBn(bnLSUp, e);
if (lBAnalogSticks.SelectedIndex == 3) Show_ControlsBn(bnLSDown, e);
if (lBAnalogSticks.SelectedIndex == 4) Show_ControlsBn(bnLSLeft, e);
if (lBAnalogSticks.SelectedIndex == 5) Show_ControlsBn(bnLSRight, e);
if (lBAnalogSticks.SelectedIndex == 6) Show_ControlsBn(bnRSUp, e);
if (lBAnalogSticks.SelectedIndex == 7) Show_ControlsBn(bnRSDown, e);
if (lBAnalogSticks.SelectedIndex == 8) Show_ControlsBn(bnRSLeft, e);
if (lBAnalogSticks.SelectedIndex == 9) Show_ControlsBn(bnRSRight, e);
}
else if (tabOptions.SelectedTab == tabTouchPad)
{
if (lBTouchControls.SelectedIndex == 0) Show_ControlsBn(bnTouchLeft, e);
if (lBTouchControls.SelectedIndex == 1) Show_ControlsBn(bnTouchUpper, e);
if (lBTouchControls.SelectedIndex == 2) Show_ControlsBn(bnTouchMulti, e);
if (lBTouchControls.SelectedIndex == 3) Show_ControlsBn(bnTouchRight, e);
}
if (lBControls.SelectedIndex == 0) Show_ControlsBn(bnCross, e);
if (lBControls.SelectedIndex == 1) Show_ControlsBn(bnCircle, e);
if (lBControls.SelectedIndex == 2) Show_ControlsBn(bnSquare, e);
if (lBControls.SelectedIndex == 3) Show_ControlsBn(bnTriangle, e);
if (lBControls.SelectedIndex == 4) Show_ControlsBn(bnOptions, e);
if (lBControls.SelectedIndex == 5) Show_ControlsBn(bnShare, e);
if (lBControls.SelectedIndex == 6) Show_ControlsBn(bnUp, e);
if (lBControls.SelectedIndex == 7) Show_ControlsBn(bnDown, e);
if (lBControls.SelectedIndex == 8) Show_ControlsBn(bnLeft, e);
if (lBControls.SelectedIndex == 9) Show_ControlsBn(bnRight, e);
if (lBControls.SelectedIndex == 10) Show_ControlsBn(bnPS, e);
if (lBControls.SelectedIndex == 11) Show_ControlsBn(bnL1, e);
if (lBControls.SelectedIndex == 12) Show_ControlsBn(bnR1, e);
if (lBControls.SelectedIndex == 13) Show_ControlsBn(bnL2, e);
if (lBControls.SelectedIndex == 14) Show_ControlsBn(bnR2, e);
if (lBControls.SelectedIndex == 15) Show_ControlsBn(bnL3, e);
if (lBControls.SelectedIndex == 16) Show_ControlsBn(bnR3, e);
if (lBControls.SelectedIndex == 17) Show_ControlsBn(bnTouchLeft, e);
if (lBControls.SelectedIndex == 18) Show_ControlsBn(bnTouchRight, e);
if (lBControls.SelectedIndex == 19) Show_ControlsBn(bnTouchMulti, e);
if (lBControls.SelectedIndex == 20) Show_ControlsBn(bnTouchUpper, e);
if (lBControls.SelectedIndex == 21) Show_ControlsBn(bnLSUp, e);
if (lBControls.SelectedIndex == 22) Show_ControlsBn(bnLSDown, e);
if (lBControls.SelectedIndex == 23) Show_ControlsBn(bnLSLeft, e);
if (lBControls.SelectedIndex == 24) Show_ControlsBn(bnLSRight, e);
if (lBControls.SelectedIndex == 25) Show_ControlsBn(bnRSUp, e);
if (lBControls.SelectedIndex == 26) Show_ControlsBn(bnRSDown, e);
if (lBControls.SelectedIndex == 27) Show_ControlsBn(bnRSLeft, e);
if (lBControls.SelectedIndex == 28) Show_ControlsBn(bnRSRight, e);
}
private void List_MouseDoubleClick(object sender, MouseEventArgs e)
@ -672,7 +628,7 @@ namespace ScpServer
}
}
private void pictureBox2_Click(object sender, EventArgs e)
private void pbRainbow_Click(object sender, EventArgs e)
{
if (pBRainbow.Image == greyscale)
{
@ -693,19 +649,19 @@ namespace ScpServer
numUDRainbow.Visible = on;
if (on)
{
pBRainbow.Location = new Point(137, 139);
pBRainbow.Location = new Point(207 - 78, pBRainbow.Location.Y);
pBController.BackgroundImage = Properties.Resources.rainbowC;
batteryLed.Text = "Battery Level Dim";
}
else
{
pBRainbow.Location = new Point(215, 139);
pBRainbow.Location = new Point(207, pBRainbow.Location.Y);
pBController.BackgroundImage = null;
batteryLed.Text = "Battery Level Color";
}
lBspc.Visible = on;
fullLedPanel.Enabled = !on;
lowLedPanel.Enabled = !on;
LightbarPanel.Enabled = !on;
lowBatteryPanel.Enabled = !on;
flashLed.Enabled = !on;
}
@ -741,5 +697,63 @@ namespace ScpServer
{
}
private void leftMotorLabel_Click(object sender, EventArgs e)
{
}
private void rightMotorLabel_Click(object sender, EventArgs e)
{
}
private void rumbleBoostLabel_Click(object sender, EventArgs e)
{
}
private void Options_Resize(object sender, EventArgs e)
{
}
private void greenBar_Scroll(object sender, EventArgs e)
{
}
private void flashLed_CheckedChanged(object sender, EventArgs e)
{
}
Image L = Properties.Resources.LeftTouch;
Image R = Properties.Resources.RightTouch;
Image M = Properties.Resources.MultiTouch;
Image U = Properties.Resources.UpperTouch;
private void bnTouchLeft_MouseHover(object sender, EventArgs e)
{
pBController.Image = L; }
private void bnTouchMulti_MouseHover(object sender, EventArgs e)
{
pBController.Image = M;
}
private void bnTouchRight_MouseHover(object sender, EventArgs e)
{
pBController.Image = R;
}
private void bnTouchUpper_MouseHover(object sender, EventArgs e)
{
pBController.Image = U;
}
private void Toucpad_Leave(object sender, EventArgs e)
{
pBController.Image = Properties.Resources.DS4_Controller;
}
}
}

View File

@ -117,6 +117,464 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pBController.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<metadata name="advColorDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>

View File

@ -129,15 +129,9 @@
<value>Stop</value>
<comment>To be localized.</comment>
</data>
<data name="sticks2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\sticks2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="_360_fades" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\360 fades.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DS4_Controller" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DS4 Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Touch_states2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Touch states2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -150,4 +144,28 @@
<data name="rainbowC" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\rainbowC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DS4_Controller" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DS4 Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="LeftTouch" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\LeftTouch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="MultiTouch" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\MultiTouch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="RightTouch" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\RightTouch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="sticks" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\sticks.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="sticks2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\sticks2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Touch" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Touch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="UpperTouch" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\UpperTouch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@ -90,6 +90,16 @@ namespace ScpServer.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap LeftTouch {
get {
object obj = ResourceManager.GetObject("LeftTouch", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -100,6 +110,16 @@ namespace ScpServer.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap MultiTouch {
get {
object obj = ResourceManager.GetObject("MultiTouch", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -120,6 +140,16 @@ namespace ScpServer.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap RightTouch {
get {
object obj = ResourceManager.GetObject("RightTouch", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized string similar to Start.
/// </summary>
@ -129,6 +159,16 @@ namespace ScpServer.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap sticks {
get {
object obj = ResourceManager.GetObject("sticks", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -148,6 +188,16 @@ namespace ScpServer.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap Touch {
get {
object obj = ResourceManager.GetObject("Touch", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -157,5 +207,15 @@ namespace ScpServer.Properties {
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap UpperTouch {
get {
object obj = ResourceManager.GetObject("UpperTouch", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
DS4Tool/Resources/Touch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -69,12 +69,12 @@
this.lbLastMessage = new System.Windows.Forms.Label();
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
this.cMTaskbar = new System.Windows.Forms.ContextMenuStrip(this.components);
this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.editProfileForController1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editProfileForController2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editProfileForController3ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.editProfileForController4ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.pnlButton.SuspendLayout();
@ -456,7 +456,6 @@
// cBController4
//
this.cBController4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cBController4.Enabled = false;
this.cBController4.FormattingEnabled = true;
this.cBController4.Location = new System.Drawing.Point(571, 84);
this.cBController4.Name = "cBController4";
@ -468,7 +467,6 @@
// cBController3
//
this.cBController3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cBController3.Enabled = false;
this.cBController3.FormattingEnabled = true;
this.cBController3.Location = new System.Drawing.Point(571, 61);
this.cBController3.Name = "cBController3";
@ -480,7 +478,6 @@
// cBController2
//
this.cBController2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cBController2.Enabled = false;
this.cBController2.FormattingEnabled = true;
this.cBController2.Location = new System.Drawing.Point(571, 38);
this.cBController2.Name = "cBController2";
@ -492,7 +489,6 @@
// cBController1
//
this.cBController1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cBController1.Enabled = false;
this.cBController1.FormattingEnabled = true;
this.cBController1.Location = new System.Drawing.Point(571, 15);
this.cBController1.Name = "cBController1";
@ -532,21 +528,9 @@
this.openToolStripMenuItem,
this.exitToolStripMenuItem});
this.cMTaskbar.Name = "cMTaskbar";
this.cMTaskbar.Size = new System.Drawing.Size(215, 164);
this.cMTaskbar.Size = new System.Drawing.Size(215, 142);
this.cMTaskbar.Tag = "25";
//
// openToolStripMenuItem
//
this.openToolStripMenuItem.Name = "openToolStripMenuItem";
this.openToolStripMenuItem.Size = new System.Drawing.Size(214, 22);
this.openToolStripMenuItem.Text = "Open";
this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(211, 6);
//
// editProfileForController1ToolStripMenuItem
//
this.editProfileForController1ToolStripMenuItem.Name = "editProfileForController1ToolStripMenuItem";
@ -579,6 +563,18 @@
this.editProfileForController4ToolStripMenuItem.Text = "Edit Profile for Controller 4";
this.editProfileForController4ToolStripMenuItem.Click += new System.EventHandler(this.editMenu_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(211, 6);
//
// openToolStripMenuItem
//
this.openToolStripMenuItem.Name = "openToolStripMenuItem";
this.openToolStripMenuItem.Size = new System.Drawing.Size(214, 22);
this.openToolStripMenuItem.Text = "Open";
this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
//
// exitToolStripMenuItem
//
this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";

View File

@ -295,58 +295,37 @@ namespace ScpServer
}
private Options[] OptionsDialog = { null, null, null, null };
private void ShowOptions(int devID, string profile)
{
if (OptionsDialog[devID] == null)
{
Options opt;
opt = OptionsDialog[devID] = new Options(rootHub, devID, profile);
opt.Text = "Options for Controller " + (devID + 1);
opt.Icon = this.Icon;
opt.FormClosed += delegate { OptionsDialog[devID] = null; RefreshProfiles(); };
opt.Show();
}
}
private void editButtons_Click(object sender, EventArgs e)
{
Button bn = (Button)sender;
int i = Int32.Parse(bn.Tag.ToString());
if (OptionsDialog[i] == null)
{
Options opt;
if (cbs[i].Text == "(No Profile Found)")
opt = OptionsDialog[i] = new Options(rootHub, i, "", this);
ShowOptions(i, "");
else
opt = OptionsDialog[i] = new Options(rootHub, i, cbs[i].Text, this);
opt.Text = "Options for Controller " + (i + 1);
opt.Icon = this.Icon;
opt.FormClosed += delegate
{
OptionsDialog[i] = null;
};
opt.Show();
}
ShowOptions(i, cbs[i].Text);
}
private void editMenu_Click(object sender, EventArgs e)
{
ToolStripMenuItem em = (ToolStripMenuItem)sender;
int i = Int32.Parse(em.Tag.ToString());
if (OptionsDialog[i] == null)
{
if (em.Text == "Make Profile for Controller " + (i + 1))
{
Options opt = OptionsDialog[i] = new Options(rootHub, i, "", this);
opt.Text = "Options for Controller " + (i + 1);
opt.Icon = this.Icon;
opt.FormClosed += delegate
{
OptionsDialog[i] = null;
};
opt.Show();
}
ShowOptions(i, "");
else
foreach (ToolStripMenuItem t in em.DropDownItems)
if (((ToolStripMenuItem)t).Checked)
{
Options opt = OptionsDialog[i] = new Options(rootHub, i, ((ToolStripMenuItem)t).Text, this);
opt.Text = "Options for Controller " + (i + 1);
opt.Icon = this.Icon;
opt.FormClosed += delegate
{
OptionsDialog[i] = null;
};
opt.Show();
break;
}
}
for (int t=0; t < em.DropDownItems.Count-2; t++)
if (((ToolStripMenuItem)em.DropDownItems[t]).Checked)
ShowOptions(i, ((ToolStripMenuItem)em.DropDownItems[t]).Text);
}
private void Enable_Controls(int device, bool on)
{
@ -430,20 +409,7 @@ namespace ScpServer
Global.LoadProfile(tdevice);
}
else if (cb.SelectedIndex == cb.Items.Count - 1 && cb.Items.Count > 1) //if +New Profile selected
{
if (OptionsDialog[tdevice] == null)
{
Options opt = OptionsDialog[tdevice] = new Options(rootHub, tdevice, "", this);
opt.Text = "Options for Controller " + (tdevice + 1);
opt.Icon = this.Icon;
int i = tdevice;
opt.FormClosed += delegate
{
OptionsDialog[i] = null;
};
opt.Show();
}
}
ShowOptions(tdevice, "");
if (cb.Text == "(No Profile Found)")
ebns[tdevice].Text = "New";
else
@ -456,19 +422,9 @@ namespace ScpServer
ToolStripMenuItem tS = (ToolStripMenuItem)sender;
int tdevice = Int32.Parse(tS.Tag.ToString());
if (!(e.ClickedItem is ToolStripSeparator))
if (e.ClickedItem != tS.DropDownItems[tS.DropDownItems.Count - 1]) //if +New Profile not selected
if (((ToolStripMenuItem)e.ClickedItem).Checked && OptionsDialog[tdevice] == null)
{
Options opt = OptionsDialog[tdevice] = new Options(rootHub, tdevice, e.ClickedItem.Text, this);
opt.Text = "Options for Controller " + (tdevice + 1);
opt.Icon = this.Icon;
int i = tdevice;
opt.FormClosed += delegate
{
OptionsDialog[i] = null;
};
opt.Show();
}
if (e.ClickedItem != tS.DropDownItems[tS.DropDownItems.Count - 1]) //if +New Profile not selected
if (((ToolStripMenuItem)e.ClickedItem).Checked)
ShowOptions(tdevice, e.ClickedItem.Text);
else
{
for (int i = 0; i < tS.DropDownItems.Count; i++)
@ -481,18 +437,8 @@ namespace ScpServer
Global.Save();
Global.LoadProfile(tdevice);
}
else if (OptionsDialog[tdevice] == null) //if +New Profile selected
{
Options opt = OptionsDialog[tdevice] = new Options(rootHub, tdevice, "", this);
opt.Text = "Options for Controller " + (tdevice + 1);
opt.Icon = this.Icon;
int i = tdevice;
opt.FormClosed += delegate
{
OptionsDialog[i] = null;
};
opt.Show();
}
else //if +New Profile selected
ShowOptions(tdevice, "");
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)