diff --git a/Vocaluxe/Menu/CNameSelection.cs b/Vocaluxe/Menu/CNameSelection.cs new file mode 100644 index 00000000..526969cf --- /dev/null +++ b/Vocaluxe/Menu/CNameSelection.cs @@ -0,0 +1,380 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Xml; +using System.Xml.XPath; + +using Vocaluxe.Base; +using Vocaluxe.Lib.Draw; + +namespace Vocaluxe.Menu +{ + struct SThemeNameSelection + { + public string Name; + public string TextureSelectorName; + public string ColorSelectorName; + public string TextureEmptyTileName; + public string ColorEmptyTileName; + public float NameSpace; + public float NameHeight; + public string NameFont; + public EStyle NameStyle; + public SColorF NameColor; + public string NameColorName; + } + + class CNameSelection : IMenuElement + { + + class CTile + { + public int PlayerNr; + public CStatic Avatar; + public CText Name; + + public CTile() + { + } + + public CTile(CStatic av, CText tex, int pl) + { + Avatar = av; + Name = tex; + PlayerNr = pl; + } + } + + private SThemeNameSelection _Theme; + private bool _ThemeLoaded; + + public bool Selected = false; + public bool Visible = true; + + public SRectF Rect; + private List _Tiles; + + private STexture _TextureSelector; + private STexture _TextureEmptyTile; + + public SColorF ColorSelector; + public SColorF ColorEmptyTile; + + private int _NumW; + private int _NumH; + + private float _SpaceW; + private float _SpaceH; + + private int _TileW; + private int _TileH; + + public int _Offset = 0; + private int _actualSelection = -1; + + + public CNameSelection() + { + _Theme = new SThemeNameSelection(); + + _TextureSelector = CTheme.GetSkinTexture(_Theme.TextureSelectorName); + _TextureEmptyTile = CTheme.GetSkinTexture(_Theme.TextureEmptyTileName); + + _Tiles = new List(); + } + + public void Init() + { + _Tiles.Clear(); + for (int i = 0; i < _NumH; i++) + { + for (int j = 0; j < _NumW; j++) + { + SRectF rect = new SRectF(Rect.X + j * (_TileW + _SpaceW), Rect.Y + i * (_TileH + _SpaceH), _TileW, _TileH, Rect.Z); + CStatic tileStatic = new CStatic(_TextureEmptyTile, ColorEmptyTile, rect); + CText tileText = new CText(rect.X + rect.W / 2, rect.Y + rect.H + _Theme.NameSpace, rect.Z, _Theme.NameHeight, rect.W, EAlignment.Center, _Theme.NameStyle, _Theme.NameFont, _Theme.NameColor, "Name"); + _Tiles.Add(new CTile(tileStatic, tileText, -1)); + } + } + + UpdateList(0); + } + + public bool LoadTheme(string XmlPath, string ElementName, XPathNavigator navigator, int SkinIndex) + { + string item = XmlPath + "/" + ElementName; + _ThemeLoaded = true; + + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/X", navigator, ref Rect.X); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Y", navigator, ref Rect.Y); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Z", navigator, ref Rect.Z); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/W", navigator, ref Rect.W); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/H", navigator, ref Rect.H); + + _ThemeLoaded &= CHelper.GetValueFromXML(item + "/SkinSelector", navigator, ref _Theme.TextureSelectorName, String.Empty); + + if (CHelper.GetValueFromXML(item + "/ColorSelector", navigator, ref _Theme.ColorSelectorName, String.Empty)) + { + _ThemeLoaded &= CTheme.GetColor(_Theme.ColorSelectorName, SkinIndex, ref ColorSelector); + } + else + { + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/R", navigator, ref ColorSelector.R); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/G", navigator, ref ColorSelector.G); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/B", navigator, ref ColorSelector.B); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/A", navigator, ref ColorSelector.A); + } + + + _ThemeLoaded &= CHelper.GetValueFromXML(item + "/SkinEmptyTile", navigator, ref _Theme.TextureEmptyTileName, String.Empty); + + if (CHelper.GetValueFromXML(item + "/ColorEmptyTile", navigator, ref _Theme.ColorEmptyTileName, String.Empty)) + { + _ThemeLoaded &= CTheme.GetColor(_Theme.ColorEmptyTileName, SkinIndex, ref ColorEmptyTile); + } + else + { + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/R", navigator, ref ColorEmptyTile.R); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/G", navigator, ref ColorEmptyTile.G); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/B", navigator, ref ColorEmptyTile.B); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/A", navigator, ref ColorEmptyTile.A); + } + + _ThemeLoaded &= CHelper.TryGetIntValueFromXML(item + "/Tiles/W", navigator, ref _TileW); + _ThemeLoaded &= CHelper.TryGetIntValueFromXML(item + "/Tiles/H", navigator, ref _TileH); + _ThemeLoaded &= CHelper.TryGetIntValueFromXML(item + "/Tiles/NumW", navigator, ref _NumW); + _ThemeLoaded &= CHelper.TryGetIntValueFromXML(item + "/Tiles/NumH", navigator, ref _NumH); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/SpaceW", navigator, ref _SpaceW); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/SpaceH", navigator, ref _SpaceH); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/Space", navigator, ref _Theme.NameSpace); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/H", navigator, ref _Theme.NameHeight); + _ThemeLoaded &= CHelper.GetValueFromXML(item + "/Tiles/Name/Font", navigator, ref _Theme.NameFont, "Normal"); + _ThemeLoaded &= CHelper.TryGetEnumValueFromXML(item + "/Tiles/Name/Style", navigator, ref _Theme.NameStyle); + if (CHelper.GetValueFromXML(item + "/Tiles/Name/Color", navigator, ref _Theme.NameColorName, String.Empty)) + { + _ThemeLoaded &= CTheme.GetColor(_Theme.NameColorName, SkinIndex, ref _Theme.NameColor); + } + else + { + if (CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/R", navigator, ref _Theme.NameColor.R)) + { + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/G", navigator, ref _Theme.NameColor.G); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/B", navigator, ref _Theme.NameColor.B); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/A", navigator, ref _Theme.NameColor.A); + } + } + + + if (_ThemeLoaded) + { + _Theme.Name = ElementName; + LoadTextures(); + } + return _ThemeLoaded; + } + + public bool SaveTheme(XmlWriter writer) + { + if (_ThemeLoaded) + { + writer.WriteStartElement(_Theme.Name); + + writer.WriteComment(", , , , : NameSelection position, width and height"); + writer.WriteElementString("X", Rect.X.ToString("#0")); + writer.WriteElementString("Y", Rect.Y.ToString("#0")); + writer.WriteElementString("Z", Rect.Z.ToString("#0.00")); + writer.WriteElementString("W", Rect.W.ToString("#0")); + writer.WriteElementString("H", Rect.H.ToString("#0")); + + + writer.WriteComment(": Texture name"); + writer.WriteElementString("SkinSelector", _Theme.TextureSelectorName); + + writer.WriteComment(": Static color from ColorScheme (high priority)"); + writer.WriteComment("or , , , (lower priority)"); + if (_Theme.ColorSelectorName != String.Empty) + { + writer.WriteElementString("ColorSelector", _Theme.ColorSelectorName); + } + else + { + writer.WriteElementString("R", ColorSelector.R.ToString("#0.00")); + writer.WriteElementString("G", ColorSelector.G.ToString("#0.00")); + writer.WriteElementString("B", ColorSelector.B.ToString("#0.00")); + writer.WriteElementString("A", ColorSelector.A.ToString("#0.00")); + } + + writer.WriteComment(": Texture name"); + writer.WriteElementString("SkinEmptyTile", _Theme.TextureEmptyTileName); + + writer.WriteComment(": Static color from ColorScheme (high priority)"); + writer.WriteComment("or , , , (lower priority)"); + if (_Theme.ColorEmptyTileName != String.Empty) + { + writer.WriteElementString("ColorEmptyTile", _Theme.ColorEmptyTileName); + } + else + { + writer.WriteElementString("R", ColorEmptyTile.R.ToString("#0.00")); + writer.WriteElementString("G", ColorEmptyTile.G.ToString("#0.00")); + writer.WriteElementString("B", ColorEmptyTile.B.ToString("#0.00")); + writer.WriteElementString("A", ColorEmptyTile.A.ToString("#0.00")); + } + + writer.WriteStartElement("Tiles"); + writer.WriteElementString("W", _TileW.ToString()); + writer.WriteElementString("H", _TileH.ToString()); + writer.WriteElementString("NumW", _NumW.ToString()); + writer.WriteElementString("NumH", _NumH.ToString()); + writer.WriteElementString("SpaceW", _SpaceW.ToString("#0.00")); + writer.WriteElementString("SpaceH", _SpaceH.ToString("#0.00")); + writer.WriteStartElement("Name"); + writer.WriteElementString("Space", _Theme.NameSpace.ToString("#0.0")); + writer.WriteElementString("Font", _Theme.NameFont); + if (_Theme.NameColorName != String.Empty) + { + writer.WriteElementString("Color", _Theme.NameColorName); + } + else + { + writer.WriteElementString("R", _Theme.NameColor.R.ToString("#0.00")); + writer.WriteElementString("G", _Theme.NameColor.G.ToString("#0.00")); + writer.WriteElementString("B", _Theme.NameColor.B.ToString("#0.00")); + writer.WriteElementString("A", _Theme.NameColor.A.ToString("#0.00")); + } + writer.WriteElementString("Style", _Theme.NameStyle.ToString()); + writer.WriteElementString("H", _Theme.NameHeight.ToString("#.00")); + writer.WriteEndElement(); + writer.WriteEndElement(); + + writer.WriteEndElement(); + return true; + } + return false; + } + + public void Draw() + { + Draw(false); + } + + public void ForceDraw() + { + Draw(true); + } + + public void Draw(bool ForceDraw) + { + foreach (CTile tile in _Tiles) + { + tile.Avatar.Draw(); + tile.Name.Draw(); + } + } + + public void UpdateList(int offset) + { + if (offset < 0) + offset = 0; + + if ( _Tiles.Count * (offset + 1) - CProfiles.Profiles.Length < _Tiles.Count) + { + + for (int i = 0; i < _Tiles.Count; i++) + { + if ((i + offset * _Tiles.Count) < CProfiles.Profiles.Length) + { + _Tiles[i].Avatar.Texture = CProfiles.Profiles[i + offset * _Tiles.Count].Avatar.Texture; + _Tiles[i].Avatar.Color = new SColorF(1, 1, 1, 1); + _Tiles[i].Name.Text = CProfiles.Profiles[i + offset * _Tiles.Count].PlayerName; + _Tiles[i].PlayerNr = i + offset * _Tiles.Count; + } + else + { + _Tiles[i].Avatar.Texture = _TextureEmptyTile; + _Tiles[i].Avatar.Color = ColorEmptyTile; + _Tiles[i].Name.Text = "Name"; + _Tiles[i].PlayerNr = -1; + } + } + _Offset = offset; + } + } + + public bool isOverTile(MouseEvent mevent) + { + bool isOver = false; + foreach (CTile tile in _Tiles) + { + if (CHelper.IsInBounds(tile.Avatar.Rect, mevent)) + { + isOver = true; + } + } + return isOver; + } + + public int TilePlayerNr(MouseEvent mevent) + { + foreach (CTile tile in _Tiles) + { + if (CHelper.IsInBounds(tile.Avatar.Rect, mevent)) + { + return tile.PlayerNr; + } + } + + return -1; + } + + public CStatic TilePlayerAvatar(MouseEvent mevent) + { + foreach (CTile tile in _Tiles) + { + if (CHelper.IsInBounds(tile.Avatar.Rect, mevent)) + { + return tile.Avatar; + } + } + + return new CStatic(); + } + + public void UnloadTextures() + { + } + + public void LoadTextures() + { + if (_Theme.ColorSelectorName != String.Empty) + ColorSelector = CTheme.GetColor(_Theme.ColorSelectorName); + } + + public void ReloadTextures() + { + UnloadTextures(); + LoadTextures(); + } + + #region ThemeEdit + public void MoveElement(int stepX, int stepY) + { + Rect.X += stepX; + Rect.Y += stepY; + } + + public void ResizeElement(int stepW, int stepH) + { + Rect.W += stepW; + if (Rect.W <= 0) + Rect.W = 1; + + Rect.H += stepH; + if (Rect.H <= 0) + Rect.H = 1; + } + #endregion ThemeEdit + + } +} diff --git a/Vocaluxe/Screens/CScreenNames.cs b/Vocaluxe/Screens/CScreenNames.cs index f61fc9f8..f2c045ce 100644 --- a/Vocaluxe/Screens/CScreenNames.cs +++ b/Vocaluxe/Screens/CScreenNames.cs @@ -141,17 +141,17 @@ namespace Vocaluxe.Screens OldMouseX = MouseEvent.X; OldMouseY = MouseEvent.Y; //Check if mouse if over tile - if (NameSelections[htNameSelections(NameSelection)].isOverTile(OldMouseX, OldMouseY)) + if (NameSelections[htNameSelections(NameSelection)].isOverTile(MouseEvent)) { //Get player-number of tile - SelectedPlayerNr = NameSelections[htNameSelections(NameSelection)].TilePlayerNr(OldMouseX, OldMouseY); + SelectedPlayerNr = NameSelections[htNameSelections(NameSelection)].TilePlayerNr(MouseEvent); if (SelectedPlayerNr != -1) { //Activate mouse-selecting selectingMouseActive = true; //Update of Drag/Drop-Texture - CStatic SelectedPlayer = NameSelections[htNameSelections(NameSelection)].TilePlayerAvatar(OldMouseX, OldMouseY); + CStatic SelectedPlayer = NameSelections[htNameSelections(NameSelection)].TilePlayerAvatar(MouseEvent); chooseAvatarStatic.Visible = true; chooseAvatarStatic.Rect = SelectedPlayer.Rect; chooseAvatarStatic.Rect.Z = CSettings.zNear - 5; @@ -232,6 +232,15 @@ namespace Vocaluxe.Screens { CGraphics.FadeTo(EScreens.ScreenSong); } + + if (MouseEvent.Wheel != 0) + { + if (CHelper.IsInBounds(NameSelections[htNameSelections(NameSelection)].Rect, MouseEvent)) + { + int offset = NameSelections[htNameSelections(NameSelection)]._Offset + MouseEvent.Wheel; + NameSelections[htNameSelections(NameSelection)].UpdateList(offset); + } + } return true; }