SMSMod-AudioSettings/AudioVolumeSlider.cs
2025-06-08 21:39:06 +02:00

125 lines
5.1 KiB
C#

using BepInEx.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace AudioSettings
{
public class AudioVolumeSlider
{
public static GUIStyleState font { get; set; } = new GUIStyleState { textColor = Color.white };
public static int SliderCount = 0;
public List<(AudioSource source, float multiplier)> Sources = new List<(AudioSource source, float multiplier)>();
private float ValueLastTick { get; set; }
private string Name { get; set; }
private string Description { get; set; }
public static void Reset()
{
SliderCount = 0;
}
public ConfigEntry<float> Volume { get; set; }
public ConfigEntry<string> TranslatedName { get; set; }
public ConfigEntry<string> TranslatedDescription { get; set; }
public void Add(AudioSource source, float multiplier)
{
if (Sources.Any(x => x.source == source))
{
return;
}
Console.WriteLine("AudioSource on \"" + source.gameObject.name + "\" sorted into \"" + Name + "\".");
Sources.Add((source, multiplier));
Apply();
}
public void Apply()
{
var vol = Volume.Value;
Console.WriteLine("Applying volume setting \"" + Name + "\": " + vol + ", " + Sources.Count + " sources, " + Plugin.Sliders.Count + " sliders.");
foreach (var item in Sources)
{
item.source.volume = item.multiplier * vol;
}
}
public AudioVolumeSlider(ConfigFile Config, string name, string description)
{
Name = name;
Description = description;
Console.WriteLine("Volume slider \"" + name + "\" initiated.");
Volume = Config.Bind(name, "Volume", 1f, description + "\nValue goes from 0 to 1.");
TranslatedName = Translator.Config.Bind(name, "Name", name);
TranslatedDescription = Translator.Config.Bind(name, "Description", description);
Volume.SettingChanged += Volume_SettingChanged;
ValueLastTick = Volume.Value;
}
public void Volume_SettingChanged(object sender, EventArgs e)
{
Apply();
}
public void InitUI(int width)
{
//var go = GameObject.Find("Ingame Canvas");
//if (go == null) return null;
//var slider = DefaultControls.CreateSlider(DefaultControls.Resources.);
////slider.SetActive(false);
//slider.transform.position = new Vector3(0, 0, SliderCount * 25);
//slider.transform.SetParent(go.transform);
//return slider;
var rectNameLabel = new Rect(10, SliderCount * 50 + 10, width * (2f / 7f), 25);
var rectDescLabel = new Rect(10, SliderCount * 50 + 30, width, 25);
var rectPercLabel = new Rect(width * (2f / 7f), SliderCount * 50 + 10, width * (0.5f / 7f), 25);
GUI.Label(rectNameLabel, TranslatedName.Value, new GUIStyle { alignment = TextAnchor.MiddleLeft, normal = font });
GUI.Label(rectPercLabel, Volume.Value.ToString("##0%"), new GUIStyle { alignment = TextAnchor.MiddleRight, normal = font });
GUI.Label(rectDescLabel, TranslatedDescription.Value, new GUIStyle { alignment = TextAnchor.MiddleLeft, normal = font });
var rect = new Rect(width * (2.5f / 7f) + 10, SliderCount * 50 + 16, width * (4.5f / 7f), 25);
var style = new GUIStyle(GUI.skin.horizontalSlider);
style.normal.background = MakeTex(600, 1, Volume.Value, Color.white, Color.gray);
style.alignment = TextAnchor.MiddleLeft;
var value = GUI.HorizontalSlider(rect, Volume.Value, 0, 1, style, GUI.skin.horizontalScrollbarThumb);
if (value != ValueLastTick)
{
Volume.Value = value;
ValueLastTick = value;
}
SliderCount++;
}
Dictionary<string, Texture2D> TextureCache { get; set; } = new();
private Texture2D MakeTex(int width, int height, float midPointPercentage, Color col1, Color col2)
{
string texKey = width + "x" + height + ":" + midPointPercentage;
if(TextureCache.ContainsKey(texKey)) return TextureCache[texKey];
Color[] pix = new Color[width * height];
int midPoint = (int)(width * midPointPercentage);
// Left side is white
for (int x = 0; x < midPoint; x++)
{
for (int y = 0; y < height; y++)
{
pix[x + y * width] = col1;
}
}
// Right side is dark gray
for (int x = midPoint; x < width; x++)
{
for (int y = 0; y < height; y++)
{
pix[x + y * width] = col2;
}
}
Texture2D result = new Texture2D(width, height);
result.SetPixels(pix);
result.Apply();
TextureCache.Add(texKey, result);
return result;
}
}
}