Implement a slider widget for volume control that returns an exponentially scaled value

This commit is contained in:
netnazgul
2018-01-09 23:37:47 +03:00
committed by Oliver Brakmann
parent 9c08e430e2
commit c195699476
10 changed files with 77 additions and 22 deletions

View File

@@ -109,6 +109,7 @@ Also thanks to:
* Muh
* Mustafa Alperen Seki (MustaphaTR)
* Neil Shivkar (havok13888)
* Nikolay Fomin (netnazgul)
* Nooze
* Nukem
* Okunev Yu Dmitry (xaionaro)

View File

@@ -619,6 +619,7 @@
<Compile Include="UtilityCommands\PngSheetExportMetadataCommand.cs" />
<Compile Include="UtilityCommands\PngSheetImportMetadataCommand.cs" />
<Compile Include="Widgets\Logic\Editor\ActorEditLogic.cs" />
<Compile Include="Widgets\ExponentialSliderWidget.cs" />
<Compile Include="Widgets\Logic\MusicHotkeyLogic.cs" />
<Compile Include="WorldExtensions.cs" />
<Compile Include="UtilityCommands\GetMapHashCommand.cs" />

View 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)));
}
}
}

View File

@@ -84,12 +84,12 @@ namespace OpenRA.Mods.Common.Widgets
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);
}
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));
}

View File

@@ -138,12 +138,12 @@ Container@LOBBY_MUSIC_BIN:
Height: 25
Align: Right
Text: Volume:
Slider@MUSIC_SLIDER:
ExponentialSlider@MUSIC_SLIDER:
X: 70
Y: 186
Width: PARENT_RIGHT - 80
Height: 20
Ticks: 5
Ticks: 7
ScrollPanel@MUSIC_LIST:
X: 307
Width: PARENT_RIGHT - 307

View File

@@ -128,12 +128,12 @@ Container@MUSIC_PANEL:
Height: 16
ImageCollection: music
ImageName: next
Slider@MUSIC_SLIDER:
ExponentialSlider@MUSIC_SLIDER:
X: 145
Y: 3
Width: 185
Height: 20
Ticks: 5
Ticks: 7
Label@TIME_LABEL:
X: (PARENT_RIGHT - WIDTH) / 2
Y: 315

View File

@@ -277,12 +277,12 @@ Container@SETTINGS_PANEL:
Height: 25
Align: Right
Text: Sound Volume:
Slider@SOUND_VOLUME:
ExponentialSlider@SOUND_VOLUME:
X: PARENT_RIGHT - WIDTH - 15
Y: 43
Width: 250
Height: 20
Ticks: 5
Ticks: 7
Checkbox@CASH_TICKS:
X: 15
Y: 40
@@ -304,12 +304,12 @@ Container@SETTINGS_PANEL:
Height: 25
Align: Right
Text: Music Volume:
Slider@MUSIC_VOLUME:
ExponentialSlider@MUSIC_VOLUME:
X: PARENT_RIGHT - WIDTH - 15
Y: 73
Width: 250
Height: 20
Ticks: 5
Ticks: 7
Label@VIDEO_LABEL:
X: PARENT_RIGHT - WIDTH - 270
Y: 97
@@ -317,12 +317,12 @@ Container@SETTINGS_PANEL:
Height: 25
Align: Right
Text: Video Volume:
Slider@VIDEO_VOLUME:
ExponentialSlider@VIDEO_VOLUME:
X: PARENT_RIGHT - WIDTH - 15
Y: 103
Width: 250
Height: 20
Ticks: 5
Ticks: 7
Label@AUDIO_DEVICE_LABEL:
X: 190 - WIDTH - 5
Y: 244

View File

@@ -128,12 +128,12 @@ Container@LOBBY_MUSIC_BIN:
Height: 25
Align: Right
Text: Volume:
Slider@MUSIC_SLIDER:
ExponentialSlider@MUSIC_SLIDER:
X: 70
Y: 186
Width: PARENT_RIGHT - 80
Height: 20
Ticks: 5
Ticks: 7
ScrollPanel@MUSIC_LIST:
X: 268
Width: PARENT_RIGHT - 268

View File

@@ -116,12 +116,12 @@ Background@MUSIC_PANEL:
Height: 25
ImageCollection: music
ImageName: next
Slider@MUSIC_SLIDER:
ExponentialSlider@MUSIC_SLIDER:
X: 145
Y: 3
Width: 175
Height: 20
Ticks: 5
Ticks: 7
Label@TIME_LABEL:
X: (PARENT_RIGHT - WIDTH) / 2
Y: 330

View File

@@ -285,12 +285,12 @@ Background@SETTINGS_PANEL:
Height: 25
Align: Right
Text: Sound Volume:
Slider@SOUND_VOLUME:
ExponentialSlider@SOUND_VOLUME:
X: PARENT_RIGHT - WIDTH - 15
Y: 43
Width: 250
Height: 20
Ticks: 5
Ticks: 7
Checkbox@CASH_TICKS:
X: 15
Y: 40
@@ -312,12 +312,12 @@ Background@SETTINGS_PANEL:
Height: 25
Align: Right
Text: Music Volume:
Slider@MUSIC_VOLUME:
ExponentialSlider@MUSIC_VOLUME:
X: PARENT_RIGHT - WIDTH - 15
Y: 73
Width: 250
Height: 20
Ticks: 5
Ticks: 7
Label@VIDEO_LABEL:
X: PARENT_RIGHT - WIDTH - 270
Y: 97
@@ -325,12 +325,12 @@ Background@SETTINGS_PANEL:
Height: 25
Align: Right
Text: Video Volume:
Slider@VIDEO_VOLUME:
ExponentialSlider@VIDEO_VOLUME:
X: PARENT_RIGHT - WIDTH - 15
Y: 103
Width: 250
Height: 20
Ticks: 5
Ticks: 7
Label@AUDIO_DEVICE_LABEL:
X: 190 - WIDTH - 5
Y: 244