Implement a slider widget for volume control that returns an exponentially scaled value
This commit is contained in:
committed by
Oliver Brakmann
parent
9c08e430e2
commit
c195699476
1
AUTHORS
1
AUTHORS
@@ -109,6 +109,7 @@ Also thanks to:
|
|||||||
* Muh
|
* Muh
|
||||||
* Mustafa Alperen Seki (MustaphaTR)
|
* Mustafa Alperen Seki (MustaphaTR)
|
||||||
* Neil Shivkar (havok13888)
|
* Neil Shivkar (havok13888)
|
||||||
|
* Nikolay Fomin (netnazgul)
|
||||||
* Nooze
|
* Nooze
|
||||||
* Nukem
|
* Nukem
|
||||||
* Okunev Yu Dmitry (xaionaro)
|
* Okunev Yu Dmitry (xaionaro)
|
||||||
|
|||||||
@@ -619,6 +619,7 @@
|
|||||||
<Compile Include="UtilityCommands\PngSheetExportMetadataCommand.cs" />
|
<Compile Include="UtilityCommands\PngSheetExportMetadataCommand.cs" />
|
||||||
<Compile Include="UtilityCommands\PngSheetImportMetadataCommand.cs" />
|
<Compile Include="UtilityCommands\PngSheetImportMetadataCommand.cs" />
|
||||||
<Compile Include="Widgets\Logic\Editor\ActorEditLogic.cs" />
|
<Compile Include="Widgets\Logic\Editor\ActorEditLogic.cs" />
|
||||||
|
<Compile Include="Widgets\ExponentialSliderWidget.cs" />
|
||||||
<Compile Include="Widgets\Logic\MusicHotkeyLogic.cs" />
|
<Compile Include="Widgets\Logic\MusicHotkeyLogic.cs" />
|
||||||
<Compile Include="WorldExtensions.cs" />
|
<Compile Include="WorldExtensions.cs" />
|
||||||
<Compile Include="UtilityCommands\GetMapHashCommand.cs" />
|
<Compile Include="UtilityCommands\GetMapHashCommand.cs" />
|
||||||
|
|||||||
53
OpenRA.Mods.Common/Widgets/ExponentialSliderWidget.cs
Normal file
53
OpenRA.Mods.Common/Widgets/ExponentialSliderWidget.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2018 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version. For more
|
||||||
|
* information, see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using OpenRA.Graphics;
|
||||||
|
using OpenRA.Widgets;
|
||||||
|
|
||||||
|
namespace OpenRA.Mods.Common.Widgets
|
||||||
|
{
|
||||||
|
public class ExponentialSliderWidget : SliderWidget
|
||||||
|
{
|
||||||
|
// Values are according to https://www.dr-lex.be/info-stuff/volumecontrols.html
|
||||||
|
public double ExpA = 1.0e-3;
|
||||||
|
public double ExpB = 6.908;
|
||||||
|
|
||||||
|
public ExponentialSliderWidget() :
|
||||||
|
base() { }
|
||||||
|
public ExponentialSliderWidget(ExponentialSliderWidget other) :
|
||||||
|
base(other) { }
|
||||||
|
|
||||||
|
float ExpFromLinear(float x)
|
||||||
|
{
|
||||||
|
if (x <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return (float)(ExpA * Math.Exp(ExpB * x)).Clamp(0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float LinearFromExp(float x)
|
||||||
|
{
|
||||||
|
return (float)(Math.Log(x / ExpA) / ExpB).Clamp(0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override float ValueFromPx(int x)
|
||||||
|
{
|
||||||
|
return MinimumValue + (MaximumValue - MinimumValue) * ExpFromLinear((x - 0.5f * RenderBounds.Height) / (RenderBounds.Width - RenderBounds.Height));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override int PxFromValue(float x)
|
||||||
|
{
|
||||||
|
return (int)(0.5f * RenderBounds.Height + (RenderBounds.Width - RenderBounds.Height) * LinearFromExp((x - MinimumValue) / (MaximumValue - MinimumValue)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -84,12 +84,12 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
return ThumbRect.Contains(mi.Location);
|
return ThumbRect.Contains(mi.Location);
|
||||||
}
|
}
|
||||||
|
|
||||||
float ValueFromPx(int x)
|
protected virtual float ValueFromPx(int x)
|
||||||
{
|
{
|
||||||
return MinimumValue + (MaximumValue - MinimumValue) * (x - 0.5f * RenderBounds.Height) / (RenderBounds.Width - RenderBounds.Height);
|
return MinimumValue + (MaximumValue - MinimumValue) * (x - 0.5f * RenderBounds.Height) / (RenderBounds.Width - RenderBounds.Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int PxFromValue(float x)
|
protected virtual int PxFromValue(float x)
|
||||||
{
|
{
|
||||||
return (int)(0.5f * RenderBounds.Height + (RenderBounds.Width - RenderBounds.Height) * (x - MinimumValue) / (MaximumValue - MinimumValue));
|
return (int)(0.5f * RenderBounds.Height + (RenderBounds.Width - RenderBounds.Height) * (x - MinimumValue) / (MaximumValue - MinimumValue));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,12 +138,12 @@ Container@LOBBY_MUSIC_BIN:
|
|||||||
Height: 25
|
Height: 25
|
||||||
Align: Right
|
Align: Right
|
||||||
Text: Volume:
|
Text: Volume:
|
||||||
Slider@MUSIC_SLIDER:
|
ExponentialSlider@MUSIC_SLIDER:
|
||||||
X: 70
|
X: 70
|
||||||
Y: 186
|
Y: 186
|
||||||
Width: PARENT_RIGHT - 80
|
Width: PARENT_RIGHT - 80
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
ScrollPanel@MUSIC_LIST:
|
ScrollPanel@MUSIC_LIST:
|
||||||
X: 307
|
X: 307
|
||||||
Width: PARENT_RIGHT - 307
|
Width: PARENT_RIGHT - 307
|
||||||
|
|||||||
@@ -128,12 +128,12 @@ Container@MUSIC_PANEL:
|
|||||||
Height: 16
|
Height: 16
|
||||||
ImageCollection: music
|
ImageCollection: music
|
||||||
ImageName: next
|
ImageName: next
|
||||||
Slider@MUSIC_SLIDER:
|
ExponentialSlider@MUSIC_SLIDER:
|
||||||
X: 145
|
X: 145
|
||||||
Y: 3
|
Y: 3
|
||||||
Width: 185
|
Width: 185
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
Label@TIME_LABEL:
|
Label@TIME_LABEL:
|
||||||
X: (PARENT_RIGHT - WIDTH) / 2
|
X: (PARENT_RIGHT - WIDTH) / 2
|
||||||
Y: 315
|
Y: 315
|
||||||
|
|||||||
@@ -277,12 +277,12 @@ Container@SETTINGS_PANEL:
|
|||||||
Height: 25
|
Height: 25
|
||||||
Align: Right
|
Align: Right
|
||||||
Text: Sound Volume:
|
Text: Sound Volume:
|
||||||
Slider@SOUND_VOLUME:
|
ExponentialSlider@SOUND_VOLUME:
|
||||||
X: PARENT_RIGHT - WIDTH - 15
|
X: PARENT_RIGHT - WIDTH - 15
|
||||||
Y: 43
|
Y: 43
|
||||||
Width: 250
|
Width: 250
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
Checkbox@CASH_TICKS:
|
Checkbox@CASH_TICKS:
|
||||||
X: 15
|
X: 15
|
||||||
Y: 40
|
Y: 40
|
||||||
@@ -304,12 +304,12 @@ Container@SETTINGS_PANEL:
|
|||||||
Height: 25
|
Height: 25
|
||||||
Align: Right
|
Align: Right
|
||||||
Text: Music Volume:
|
Text: Music Volume:
|
||||||
Slider@MUSIC_VOLUME:
|
ExponentialSlider@MUSIC_VOLUME:
|
||||||
X: PARENT_RIGHT - WIDTH - 15
|
X: PARENT_RIGHT - WIDTH - 15
|
||||||
Y: 73
|
Y: 73
|
||||||
Width: 250
|
Width: 250
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
Label@VIDEO_LABEL:
|
Label@VIDEO_LABEL:
|
||||||
X: PARENT_RIGHT - WIDTH - 270
|
X: PARENT_RIGHT - WIDTH - 270
|
||||||
Y: 97
|
Y: 97
|
||||||
@@ -317,12 +317,12 @@ Container@SETTINGS_PANEL:
|
|||||||
Height: 25
|
Height: 25
|
||||||
Align: Right
|
Align: Right
|
||||||
Text: Video Volume:
|
Text: Video Volume:
|
||||||
Slider@VIDEO_VOLUME:
|
ExponentialSlider@VIDEO_VOLUME:
|
||||||
X: PARENT_RIGHT - WIDTH - 15
|
X: PARENT_RIGHT - WIDTH - 15
|
||||||
Y: 103
|
Y: 103
|
||||||
Width: 250
|
Width: 250
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
Label@AUDIO_DEVICE_LABEL:
|
Label@AUDIO_DEVICE_LABEL:
|
||||||
X: 190 - WIDTH - 5
|
X: 190 - WIDTH - 5
|
||||||
Y: 244
|
Y: 244
|
||||||
|
|||||||
@@ -128,12 +128,12 @@ Container@LOBBY_MUSIC_BIN:
|
|||||||
Height: 25
|
Height: 25
|
||||||
Align: Right
|
Align: Right
|
||||||
Text: Volume:
|
Text: Volume:
|
||||||
Slider@MUSIC_SLIDER:
|
ExponentialSlider@MUSIC_SLIDER:
|
||||||
X: 70
|
X: 70
|
||||||
Y: 186
|
Y: 186
|
||||||
Width: PARENT_RIGHT - 80
|
Width: PARENT_RIGHT - 80
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
ScrollPanel@MUSIC_LIST:
|
ScrollPanel@MUSIC_LIST:
|
||||||
X: 268
|
X: 268
|
||||||
Width: PARENT_RIGHT - 268
|
Width: PARENT_RIGHT - 268
|
||||||
|
|||||||
@@ -116,12 +116,12 @@ Background@MUSIC_PANEL:
|
|||||||
Height: 25
|
Height: 25
|
||||||
ImageCollection: music
|
ImageCollection: music
|
||||||
ImageName: next
|
ImageName: next
|
||||||
Slider@MUSIC_SLIDER:
|
ExponentialSlider@MUSIC_SLIDER:
|
||||||
X: 145
|
X: 145
|
||||||
Y: 3
|
Y: 3
|
||||||
Width: 175
|
Width: 175
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
Label@TIME_LABEL:
|
Label@TIME_LABEL:
|
||||||
X: (PARENT_RIGHT - WIDTH) / 2
|
X: (PARENT_RIGHT - WIDTH) / 2
|
||||||
Y: 330
|
Y: 330
|
||||||
|
|||||||
@@ -285,12 +285,12 @@ Background@SETTINGS_PANEL:
|
|||||||
Height: 25
|
Height: 25
|
||||||
Align: Right
|
Align: Right
|
||||||
Text: Sound Volume:
|
Text: Sound Volume:
|
||||||
Slider@SOUND_VOLUME:
|
ExponentialSlider@SOUND_VOLUME:
|
||||||
X: PARENT_RIGHT - WIDTH - 15
|
X: PARENT_RIGHT - WIDTH - 15
|
||||||
Y: 43
|
Y: 43
|
||||||
Width: 250
|
Width: 250
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
Checkbox@CASH_TICKS:
|
Checkbox@CASH_TICKS:
|
||||||
X: 15
|
X: 15
|
||||||
Y: 40
|
Y: 40
|
||||||
@@ -312,12 +312,12 @@ Background@SETTINGS_PANEL:
|
|||||||
Height: 25
|
Height: 25
|
||||||
Align: Right
|
Align: Right
|
||||||
Text: Music Volume:
|
Text: Music Volume:
|
||||||
Slider@MUSIC_VOLUME:
|
ExponentialSlider@MUSIC_VOLUME:
|
||||||
X: PARENT_RIGHT - WIDTH - 15
|
X: PARENT_RIGHT - WIDTH - 15
|
||||||
Y: 73
|
Y: 73
|
||||||
Width: 250
|
Width: 250
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
Label@VIDEO_LABEL:
|
Label@VIDEO_LABEL:
|
||||||
X: PARENT_RIGHT - WIDTH - 270
|
X: PARENT_RIGHT - WIDTH - 270
|
||||||
Y: 97
|
Y: 97
|
||||||
@@ -325,12 +325,12 @@ Background@SETTINGS_PANEL:
|
|||||||
Height: 25
|
Height: 25
|
||||||
Align: Right
|
Align: Right
|
||||||
Text: Video Volume:
|
Text: Video Volume:
|
||||||
Slider@VIDEO_VOLUME:
|
ExponentialSlider@VIDEO_VOLUME:
|
||||||
X: PARENT_RIGHT - WIDTH - 15
|
X: PARENT_RIGHT - WIDTH - 15
|
||||||
Y: 103
|
Y: 103
|
||||||
Width: 250
|
Width: 250
|
||||||
Height: 20
|
Height: 20
|
||||||
Ticks: 5
|
Ticks: 7
|
||||||
Label@AUDIO_DEVICE_LABEL:
|
Label@AUDIO_DEVICE_LABEL:
|
||||||
X: 190 - WIDTH - 5
|
X: 190 - WIDTH - 5
|
||||||
Y: 244
|
Y: 244
|
||||||
|
|||||||
Reference in New Issue
Block a user