#region license // This file is part of Vocaluxe. // // Vocaluxe is free software: you can redistribute it and/or modify // it 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. // // Vocaluxe is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Vocaluxe. If not, see . #endregion using System; using System.Collections.Generic; using System.Diagnostics; using System.Xml.Serialization; using VocaluxeLib.Draw; using VocaluxeLib.Xml; namespace VocaluxeLib.Menu { [XmlType("ProgressColor")] public struct SThemeProgressBarColor { public float From; public SThemeColor Color; } [XmlType("ProgressBar")] public struct SThemeProgressBar { [XmlAttribute(AttributeName = "Name")] public string Name; public string SkinBackground; public string SkinForeground; public string SkinProgressLeft; public string SkinProgressMid; public string SkinProgressRight; public SThemeColor ColorBackground; public SThemeColor ColorForeground; public EDirection Direction; public EOffOn AnimateMovement; public EOffOn AnimateColoring; public SRectF Rect; [XmlArrayItem("ProgressColor"), XmlArray] public List ProgressColors; public SReflection? Reflection; } public sealed class CProgressBar : CMenuElementBase, IMenuElement, IThemeable { private readonly int _PartyModeID; private SThemeProgressBar _Theme; public string GetThemeName() { return _Theme.Name; } public bool ThemeLoaded { get; private set; } public bool Selectable { get { return false; } } private CTextureRef _TextureBackground; public CTextureRef TextureBackground { get { return _TextureBackground ?? CBase.Themes.GetSkinTexture(_Theme.SkinBackground, _PartyModeID); } set { _TextureBackground = value; } } private CTextureRef _TextureForeground; public CTextureRef TextureForeground { get { return _TextureForeground ?? CBase.Themes.GetSkinTexture(_Theme.SkinForeground, _PartyModeID); } set { _TextureForeground = value; } } private CTextureRef _TextureProgressLeft; public CTextureRef TextureProgressLeft { get { return _TextureProgressLeft ?? CBase.Themes.GetSkinTexture(_Theme.SkinProgressLeft, _PartyModeID); } set { _TextureProgressLeft = value; } } private CTextureRef _TextureProgressMid; public CTextureRef TextureProgressMid { get { return _TextureProgressMid ?? CBase.Themes.GetSkinTexture(_Theme.SkinProgressMid, _PartyModeID); } set { _TextureProgressMid = value; } } private CTextureRef _TextureProgressRight; public CTextureRef TextureProgressRight { get { return _TextureProgressRight ?? CBase.Themes.GetSkinTexture(_Theme.SkinProgressRight, _PartyModeID); } set { _TextureProgressRight = value; } } public SColorF ColorBackground; public SColorF ColorForeground; public bool Reflection; public float ReflectionSpace; public float ReflectionHeight; public float Alpha = 1; private float _ProgressTarget; public float Progress { get { return _ProgressTarget; } set { if (value != _ProgressTarget) { _ProgressTarget = value; _UpdateProgress(); } } } private float _ProgressCurrent; private SColorF _ColorProgressCurrent; private SColorF _ColorProgressTarget; private SRectF _RectProgressBegin; private SRectF _RectProgressMid; private SRectF _RectProgressEnd; private CTextureRef _TextureProgressBegin; private CTextureRef _TextureProgressEnd; public CProgressBar(int partyModeID) { _PartyModeID = partyModeID; } public CProgressBar(CProgressBar pb) { _PartyModeID = pb._PartyModeID; _TextureBackground = pb.TextureBackground; _TextureForeground = pb.TextureForeground; _TextureProgressLeft = pb.TextureProgressLeft; _TextureProgressMid = pb._TextureProgressMid; _TextureProgressRight = pb._TextureProgressRight; ColorBackground = pb.ColorBackground; ColorForeground = pb.ColorForeground; MaxRect = pb.MaxRect; Reflection = pb.Reflection; ReflectionSpace = pb.ReflectionHeight; ReflectionHeight = pb.ReflectionSpace; Alpha = pb.Alpha; Visible = pb.Visible; } public CProgressBar(SThemeProgressBar theme, int partyModeID) { _PartyModeID = partyModeID; _Theme = theme; _Theme.ProgressColors.Sort((x, y) => x.From.CompareTo(y.From)); _UpdateProgress(); ThemeLoaded = true; } public bool LoadTheme(string xmlPath, string elementName, CXmlReader xmlReader) { //Will be removed return false; } public void Draw() { Draw(1f); } public void Draw(float scale = 1f, float zModify = 0f, bool forceDraw = false) { if (scale <= 0) return; if (Visible || forceDraw || (CBase.Settings.GetProgramState() == EProgramState.EditTheme)) { //Draw background SColorF color = new SColorF(ColorBackground.R, ColorBackground.G, ColorBackground.B, ColorBackground.A * Alpha); if (_TextureBackground != null) { CBase.Drawing.DrawTexture(_TextureBackground, Rect, color); if (Reflection) CBase.Drawing.DrawTextureReflection(_TextureBackground, Rect, color, Rect, ReflectionSpace, ReflectionHeight); } else CBase.Drawing.DrawRect(ColorBackground, Rect); //Draw progress if (_TextureProgressBegin != null) { CBase.Drawing.DrawTexture(_TextureProgressBegin, _RectProgressBegin, _ColorProgressCurrent); if (Reflection) CBase.Drawing.DrawTextureReflection(_TextureProgressBegin, _RectProgressBegin, _ColorProgressCurrent, _RectProgressBegin, ReflectionSpace, ReflectionHeight); } else CBase.Drawing.DrawRect(_ColorProgressCurrent, _RectProgressBegin); if (_TextureProgressMid != null) { CBase.Drawing.DrawTexture(_TextureProgressMid, _RectProgressMid, _ColorProgressCurrent); if (Reflection) CBase.Drawing.DrawTextureReflection(_TextureProgressMid, _RectProgressMid, _ColorProgressCurrent, _RectProgressMid, ReflectionSpace, ReflectionHeight); } else CBase.Drawing.DrawRect(_ColorProgressCurrent, _RectProgressMid); if (_TextureProgressEnd != null) { CBase.Drawing.DrawTexture(_TextureProgressEnd, _RectProgressEnd, _ColorProgressCurrent); if (Reflection) CBase.Drawing.DrawTextureReflection(_TextureProgressEnd, _RectProgressEnd, _ColorProgressCurrent, _RectProgressEnd, ReflectionSpace, ReflectionHeight); } else CBase.Drawing.DrawRect(_ColorProgressCurrent, _RectProgressEnd); //Draw foreground color = new SColorF(ColorForeground.R, ColorForeground.G, ColorForeground.B, ColorForeground.A * Alpha); if (_TextureForeground != null) { CBase.Drawing.DrawTexture(_TextureForeground, Rect, color); if (Reflection) CBase.Drawing.DrawTextureReflection(_TextureForeground, Rect, color, Rect, ReflectionSpace, ReflectionHeight); } else CBase.Drawing.DrawRect(ColorForeground, Rect); } if (Selected && (CBase.Settings.GetProgramState() == EProgramState.EditTheme)) CBase.Drawing.DrawRect(new SColorF(1f, 1f, 1f, 0.5f), Rect); } public void UnloadSkin() {} public void LoadSkin() { if (!ThemeLoaded) return; _Theme.ColorBackground.Get(_PartyModeID, out ColorBackground); _Theme.ColorForeground.Get(_PartyModeID, out ColorForeground); TextureBackground = CBase.Themes.GetSkinTexture(_Theme.SkinBackground, _PartyModeID); TextureForeground = CBase.Themes.GetSkinTexture(_Theme.SkinForeground, _PartyModeID); TextureProgressLeft = CBase.Themes.GetSkinTexture(_Theme.SkinProgressLeft, _PartyModeID); TextureProgressMid = CBase.Themes.GetSkinTexture(_Theme.SkinProgressMid, _PartyModeID); TextureProgressRight = CBase.Themes.GetSkinTexture(_Theme.SkinProgressRight, _PartyModeID); MaxRect = _Theme.Rect; Reflection = _Theme.Reflection.HasValue; if (Reflection) { Debug.Assert(_Theme.Reflection != null); ReflectionSpace = _Theme.Reflection.Value.Space; ReflectionHeight = _Theme.Reflection.Value.Height; } } public void ReloadSkin() { UnloadSkin(); LoadSkin(); } public object GetTheme() { return _Theme; } private void _UpdateProgress() { foreach (SThemeProgressBarColor col in _Theme.ProgressColors) if (col.From < _ProgressTarget) col.Color.Get(_PartyModeID, out _ColorProgressTarget); _ColorProgressCurrent = _ColorProgressTarget; _UpdateProgressLeft(); _UpdateProgressMid(); _UpdateProgressRight(); } private void _UpdateProgressLeft() { switch (_Theme.Direction) { case EDirection.Right: _TextureProgressBegin = TextureProgressLeft; _RectProgressBegin = new SRectF(Rect.X, Rect.Y, Rect.H * _TextureProgressBegin.OrigAspect, Rect.H, Rect.Z); break; case EDirection.Up: _TextureProgressBegin = TextureProgressRight; _RectProgressBegin = new SRectF(Rect.X, Rect.Y + Rect.H - Rect.W * _TextureProgressBegin.OrigAspect, Rect.W, Rect.W * _TextureProgressBegin.OrigAspect, Rect.Z); break; case EDirection.Left: _TextureProgressBegin = TextureProgressRight; _RectProgressBegin = new SRectF(Rect.X + Rect.W - Rect.H * _TextureProgressBegin.OrigAspect, Rect.Y, Rect.H *_TextureProgressBegin.OrigAspect, Rect.H, Rect.Z); break; case EDirection.Down: _TextureProgressBegin = TextureProgressLeft; _RectProgressBegin = new SRectF(Rect.X, Rect.Y, Rect.W, Rect.W * _TextureProgressBegin.OrigAspect, Rect.Z); break; } } private void _UpdateProgressMid() { _ProgressCurrent = _ProgressTarget; switch (_Theme.Direction) { case EDirection.Right: _RectProgressMid = new SRectF(_RectProgressBegin.X + _RectProgressBegin.W, Rect.Y, (Rect.W - 2 * Rect.H) * _ProgressCurrent, Rect.H, Rect.Z); break; case EDirection.Up: float newHeight = (Rect.H - 2 * Rect.W) * _ProgressCurrent; _RectProgressMid = new SRectF(Rect.X, _RectProgressBegin.Y - newHeight, Rect.W, newHeight, Rect.Z); break; case EDirection.Left: float newWidth = (Rect.W - 2 * Rect.H) * _ProgressCurrent; _RectProgressMid = new SRectF(_RectProgressBegin.X - newWidth, Rect.Y, newWidth, Rect.H, Rect.Z); break; case EDirection.Down: _RectProgressMid = new SRectF(Rect.X, _RectProgressBegin.Y + _RectProgressBegin.H, (Rect.H - 2 * Rect.W) * _ProgressCurrent, Rect.W, Rect.Z); break; } } private void _UpdateProgressRight() { switch (_Theme.Direction) { case EDirection.Right: _TextureProgressEnd = _TextureProgressRight; _RectProgressEnd = new SRectF(_RectProgressMid.X + _RectProgressMid.W, Rect.Y, Rect.H * _TextureProgressBegin.OrigAspect, Rect.H, Rect.Z); break; case EDirection.Up: _TextureProgressEnd = _TextureProgressLeft; _RectProgressEnd = new SRectF(Rect.X, _RectProgressMid.Y + Rect.W, Rect.W, Rect.W * _TextureProgressBegin.OrigAspect, Rect.Z); break; case EDirection.Left: _TextureProgressEnd = _TextureProgressLeft; _RectProgressEnd = new SRectF(_RectProgressMid.X - Rect.H, Rect.Y, Rect.H * _TextureProgressBegin.OrigAspect, Rect.H, Rect.Z); break; case EDirection.Down: _TextureProgressEnd = _TextureProgressRight; _RectProgressEnd = new SRectF(Rect.X, _RectProgressMid.Y + _RectProgressMid.H, Rect.W, Rect.W * _TextureProgressBegin.OrigAspect, Rect.Z); break; } } #region ThemeEdit public void MoveElement(int stepX, int stepY) { X += stepX; Y += stepY; _Theme.Rect.X += stepX; _Theme.Rect.Y += stepY; } public void ResizeElement(int stepW, int stepH) { W += stepW; if (W <= 0) W = 1; H += stepH; if (H <= 0) H = 1; _Theme.Rect.W = Rect.W; _Theme.Rect.H = Rect.H; } #endregion ThemeEdit } }