#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.Drawing;
using System.Windows.Forms;
using VocaluxeLib.Menu.SingNotes;
using VocaluxeLib.Menu.SongMenu;
namespace VocaluxeLib.Menu
{
public abstract class CObjectInteractions
{
private readonly List _Interactions = new List();
private int _Selection;
private int _PrevMouseX;
private int _PrevMouseY;
protected int _MouseDX;
protected int _MouseDY;
protected bool _Active;
protected readonly COrderedDictionaryLite _Buttons;
protected readonly COrderedDictionaryLite _Texts;
protected readonly COrderedDictionaryLite _Backgrounds;
protected readonly COrderedDictionaryLite _Statics;
protected readonly COrderedDictionaryLite _SelectSlides;
protected readonly COrderedDictionaryLite _SongMenus;
protected readonly COrderedDictionaryLite _Lyrics;
protected readonly COrderedDictionaryLite _SingNotes;
protected readonly COrderedDictionaryLite _NameSelections;
protected readonly COrderedDictionaryLite _Equalizers;
protected readonly COrderedDictionaryLite _Playlists;
protected readonly COrderedDictionaryLite _ParticleEffects;
protected readonly COrderedDictionaryLite _ScreenSettings;
public CObjectInteractions()
{
_Backgrounds = new COrderedDictionaryLite(this);
_Buttons = new COrderedDictionaryLite(this);
_Texts = new COrderedDictionaryLite(this);
_Statics = new COrderedDictionaryLite(this);
_SelectSlides = new COrderedDictionaryLite(this);
_SongMenus = new COrderedDictionaryLite(this);
_Lyrics = new COrderedDictionaryLite(this);
_SingNotes = new COrderedDictionaryLite(this);
_NameSelections = new COrderedDictionaryLite(this);
_Equalizers = new COrderedDictionaryLite(this);
_Playlists = new COrderedDictionaryLite(this);
_ParticleEffects = new COrderedDictionaryLite(this);
_ScreenSettings = new COrderedDictionaryLite(this);
}
public virtual void Init()
{
_Selection = 0;
_PrevMouseX = 0;
_PrevMouseY = 0;
_MouseDX = 0;
_MouseDY = 0;
_Active = false;
}
protected void _ClearElements()
{
_Interactions.Clear();
_Backgrounds.Clear();
_Buttons.Clear();
_Texts.Clear();
_Statics.Clear();
_SelectSlides.Clear();
_SongMenus.Clear();
_Lyrics.Clear();
_SingNotes.Clear();
_NameSelections.Clear();
_Equalizers.Clear();
_Playlists.Clear();
_ParticleEffects.Clear();
_ScreenSettings.Clear();
}
#region MenuHandler
public virtual bool HandleInput(SKeyEvent keyEvent)
{
if (!CBase.Settings.IsTabNavigation())
{
if (keyEvent.Key == Keys.Left)
{
if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.SelectSlide && keyEvent.Mod != EModifier.Shift)
keyEvent.Handled = _PrevElement();
else
keyEvent.Handled = _NextInteraction(keyEvent);
}
if (keyEvent.Key == Keys.Right)
{
if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.SelectSlide && keyEvent.Mod != EModifier.Shift)
keyEvent.Handled = _NextElement();
else
keyEvent.Handled = _NextInteraction(keyEvent);
}
if (keyEvent.Key == Keys.Up || keyEvent.Key == Keys.Down)
keyEvent.Handled = _NextInteraction(keyEvent);
}
else
{
if (keyEvent.Key == Keys.Tab)
{
if (keyEvent.Mod == EModifier.Shift)
PrevInteraction();
else
NextInteraction();
}
if (keyEvent.Key == Keys.Left)
_PrevElement();
if (keyEvent.Key == Keys.Right)
_NextElement();
}
return true;
}
public virtual bool HandleMouse(SMouseEvent mouseEvent)
{
int selection = _Selection;
ProcessMouseMove(mouseEvent.X, mouseEvent.Y);
if (selection != _Selection)
{
_UnsetHighlighted(selection);
_SetHighlighted(_Selection);
}
if (mouseEvent.LB)
ProcessMouseClick(mouseEvent.X, mouseEvent.Y);
_PrevMouseX = mouseEvent.X;
_PrevMouseY = mouseEvent.Y;
return true;
}
public virtual bool HandleInputThemeEditor(SKeyEvent keyEvent)
{
_UnsetHighlighted(_Selection);
if (!keyEvent.KeyPressed)
{
switch (keyEvent.Key)
{
case Keys.Up:
if (keyEvent.Mod == EModifier.Ctrl)
_MoveElement(0, -1);
if (keyEvent.Mod == EModifier.Shift)
_ResizeElement(0, 1);
break;
case Keys.Down:
if (keyEvent.Mod == EModifier.Ctrl)
_MoveElement(0, 1);
if (keyEvent.Mod == EModifier.Shift)
_ResizeElement(0, -1);
break;
case Keys.Right:
if (keyEvent.Mod == EModifier.Ctrl)
_MoveElement(1, 0);
if (keyEvent.Mod == EModifier.Shift)
_ResizeElement(1, 0);
if (keyEvent.Mod == EModifier.None)
NextInteraction();
break;
case Keys.Left:
if (keyEvent.Mod == EModifier.Ctrl)
_MoveElement(-1, 0);
if (keyEvent.Mod == EModifier.Shift)
_ResizeElement(-1, 0);
if (keyEvent.Mod == EModifier.None)
PrevInteraction();
break;
}
}
return true;
}
public virtual bool HandleMouseThemeEditor(SMouseEvent mouseEvent)
{
_UnsetHighlighted(_Selection);
_MouseDX = mouseEvent.X - _PrevMouseX;
_MouseDY = mouseEvent.Y - _PrevMouseY;
int stepX = 0;
int stepY = 0;
if ((mouseEvent.Mod & EModifier.Ctrl) == EModifier.Ctrl)
{
_PrevMouseX = mouseEvent.X;
_PrevMouseY = mouseEvent.Y;
}
else
{
while (Math.Abs(mouseEvent.X - _PrevMouseX) >= 5)
{
if (mouseEvent.X - _PrevMouseX >= 5)
stepX += 5;
if (mouseEvent.X - _PrevMouseX <= -5)
stepX -= 5;
_PrevMouseX = mouseEvent.X - (_MouseDX - stepX);
}
while (Math.Abs(mouseEvent.Y - _PrevMouseY) >= 5)
{
if (mouseEvent.Y - _PrevMouseY >= 5)
stepY += 5;
if (mouseEvent.Y - _PrevMouseY <= -5)
stepY -= 5;
_PrevMouseY = mouseEvent.Y - (_MouseDY - stepY);
}
}
if (mouseEvent.LBH)
{
//if (IsMouseOver(MouseEvent.X, _PrevMouseY))
//{
if (mouseEvent.Mod == EModifier.None)
_MoveElement(stepX, stepY);
if (mouseEvent.Mod == EModifier.Ctrl)
_MoveElement(_MouseDX, _MouseDY);
if (mouseEvent.Mod == EModifier.Shift)
_ResizeElement(stepX, stepY);
if (mouseEvent.Mod == (EModifier.Shift | EModifier.Ctrl))
_ResizeElement(_MouseDX, _MouseDY);
//}
}
else
ProcessMouseMove(mouseEvent.X, mouseEvent.Y);
return true;
}
#endregion MenuHandler
#region Drawing
public virtual bool Draw()
{
_DrawBG();
_DrawFG();
return true;
}
protected void _DrawBG()
{
foreach (CBackground bg in _Backgrounds)
bg.Draw();
}
protected void _DrawFG()
{
if (_Interactions.Count <= 0)
return;
var items = new List();
for (int i = 0; i < _Interactions.Count; i++)
{
if (_IsVisible(i) && _Interactions[i].DrawAsForeground)
{
var zs = new SZSort {ID = i, Z = _GetZValue(i)};
items.Add(zs);
}
}
if (items.Count <= 0)
return;
items.Sort((s1, s2) => s2.Z.CompareTo(s1.Z));
for (int i = 0; i < items.Count; i++)
_DrawInteraction(items[i].ID);
}
#endregion Drawing
#region Element-Adding
protected void _AddBackground(CBackground bg, String key = null)
{
_AddInteraction(_Backgrounds.Add(bg, key), EType.Background);
}
protected void _AddButton(CButton button, String key = null)
{
_AddInteraction(_Buttons.Add(button, key), EType.Button);
}
protected void _AddSelectSlide(CSelectSlide slide, String key = null)
{
_AddInteraction(_SelectSlides.Add(slide, key), EType.SelectSlide);
}
protected void _AddStatic(CStatic stat, String key = null)
{
_AddInteraction(_Statics.Add(stat, key), EType.Static);
}
protected void _AddText(CText text, String key = null)
{
_AddInteraction(_Texts.Add(text, key), EType.Text);
}
protected void _AddSongMenu(CSongMenu songmenu, String key = null)
{
_AddInteraction(_SongMenus.Add(songmenu, key), EType.SongMenu);
}
protected void _AddLyric(CLyric lyric, String key = null)
{
_AddInteraction(_Lyrics.Add(lyric, key), EType.Lyric);
}
protected void _AddSingNote(CSingNotes sn, String key = null)
{
_AddInteraction(_SingNotes.Add(sn, key), EType.SingNote);
}
protected void _AddNameSelection(CNameSelection ns, String key = null)
{
_AddInteraction(_NameSelections.Add(ns, key), EType.NameSelection);
}
protected void _AddEqualizer(CEqualizer eq, String key = null)
{
_AddInteraction(_Equalizers.Add(eq, key), EType.Equalizer);
}
protected void _AddPlaylist(CPlaylist pls, String key = null)
{
_AddInteraction(_Playlists.Add(pls, key), EType.Playlist);
}
protected void _AddParticleEffect(CParticleEffect pe, String key = null)
{
_AddInteraction(_ParticleEffects.Add(pe, key), EType.ParticleEffect);
}
protected void _AddScreenSetting(CScreenSetting se, String key = null)
{
_ScreenSettings.Add(se, key);
}
#endregion Element-Adding
#region InteractionHandling
public void NextInteraction()
{
if (_Interactions.Count > 0)
_NextInteraction();
}
public void PrevInteraction()
{
if (_Interactions.Count > 0)
_PrevInteraction();
}
///
/// Selects the next element in a menu Interaction.
///
/// True if the next element is selected. False if either there is no next element or the Interaction does not provide such a method.
public bool NextElement()
{
if (_Interactions.Count > 0)
return _NextElement();
return false;
}
///
/// Selects the previous element in a menu Interaction.
///
/// True if the previous element is selected. False if either there is no next element or the Interaction does not provide such a method.
public bool PrevElement()
{
if (_Interactions.Count > 0)
return _PrevElement();
return false;
}
protected void _SetInteractionToButton(CButton button)
{
if (!button.Visible)
return;
for (int i = 0; i < _Interactions.Count; i++)
{
if (_Interactions[i].Type != EType.Button)
continue;
if (_Buttons[_Interactions[i].Num] == button)
{
_UnsetSelected();
_UnsetHighlighted(_Selection);
_Selection = i;
_SetSelected();
return;
}
}
}
protected void _SetInteractionToSelectSlide(CSelectSlide slide)
{
if (!slide.Visible)
return;
for (int i = 0; i < _Interactions.Count; i++)
{
if (_Interactions[i].Type != EType.SelectSlide)
continue;
if (_SelectSlides[_Interactions[i].Num] == slide)
{
_UnsetSelected();
_UnsetHighlighted(_Selection);
_Selection = i;
_SetSelected();
return;
}
}
}
public void ProcessMouseClick(int x, int y)
{
if (_Selection >= _Interactions.Count || _Selection < 0)
return;
if (_Interactions[_Selection].Type == EType.SelectSlide)
{
if (_SelectSlides[_Interactions[_Selection].Num].Visible)
_SelectSlides[_Interactions[_Selection].Num].ProcessMouseLBClick(x, y);
}
}
public void ProcessMouseMove(int x, int y)
{
_SelectByMouse(x, y);
if (_Selection >= _Interactions.Count || _Selection < 0)
return;
if (_Interactions[_Selection].Type == EType.SelectSlide)
{
if (_SelectSlides[_Interactions[_Selection].Num].Visible)
_SelectSlides[_Interactions[_Selection].Num].ProcessMouseMove(x, y);
}
}
private void _SelectByMouse(int x, int y)
{
float z = CBase.Settings.GetZFar();
for (int i = 0; i < _Interactions.Count; i++)
{
if ((CBase.Settings.GetProgramState() != EProgramState.EditTheme) && (_Interactions[i].ThemeEditorOnly || !_IsVisible(i) || !_IsEnabled(i)))
continue;
if (!_IsMouseOverElement(x, y, _Interactions[i]))
continue;
if (_GetZValue(_Interactions[i]) > z)
continue;
z = _GetZValue(_Interactions[i]);
_UnsetSelected();
_Selection = i;
_SetSelected();
}
}
protected bool _IsMouseOverCurSelection(SMouseEvent mouseEvent)
{
return _IsMouseOverCurSelection(mouseEvent.X, mouseEvent.Y);
}
private bool _IsMouseOverCurSelection(int x, int y)
{
if (_Selection >= _Interactions.Count || _Selection < 0)
return false;
return _Interactions.Count > 0 && _IsMouseOverElement(x, y, _Interactions[_Selection]);
}
private bool _IsMouseOverElement(int x, int y, CInteraction interact)
{
bool result = CHelper.IsInBounds(_GetRect(interact), x, y);
if (result)
return true;
if (interact.Type == EType.SelectSlide)
{
return CHelper.IsInBounds(_SelectSlides[interact.Num].RectArrowLeft, x, y) ||
CHelper.IsInBounds(_SelectSlides[interact.Num].RectArrowRight, x, y);
}
return false;
}
private float _GetZValue(CInteraction interact)
{
switch (interact.Type)
{
case EType.Button:
return _Buttons[interact.Num].Rect.Z;
case EType.SelectSlide:
return _SelectSlides[interact.Num].Rect.Z;
case EType.Static:
return _Statics[interact.Num].Rect.Z;
case EType.SongMenu:
return _SongMenus[interact.Num].Rect.Z;
case EType.Text:
return _Texts[interact.Num].Z;
case EType.Lyric:
return _Lyrics[interact.Num].Rect.Z;
case EType.NameSelection:
return _NameSelections[interact.Num].Rect.Z;
case EType.Equalizer:
return _Equalizers[interact.Num].Rect.Z;
case EType.Playlist:
return _Playlists[interact.Num].Rect.Z;
case EType.ParticleEffect:
return _ParticleEffects[interact.Num].Rect.Z;
}
return CBase.Settings.GetZFar();
}
private float _GetZValue(int interaction)
{
return _GetZValue(_Interactions[interaction]);
}
private void _NextInteraction()
{
_UnsetSelected();
if (CBase.Settings.GetProgramState() != EProgramState.EditTheme)
{
bool found = false;
int start = _Selection;
do
{
start++;
if (start > _Interactions.Count - 1)
start = 0;
if ((start == _Selection) || (!_Interactions[start].ThemeEditorOnly && _IsVisible(start) && _IsEnabled(start)))
found = true;
} while (!found);
_Selection = start;
}
else
{
_Selection++;
if (_Selection > _Interactions.Count - 1)
_Selection = 0;
}
_SetSelected();
}
private void _PrevInteraction()
{
_UnsetSelected();
if (CBase.Settings.GetProgramState() != EProgramState.EditTheme)
{
bool found = false;
int start = _Selection;
do
{
start--;
if (start < 0)
start = _Interactions.Count - 1;
if ((start == _Selection) || (!_Interactions[start].ThemeEditorOnly && _IsVisible(start) && _IsEnabled(start)))
found = true;
} while (!found);
_Selection = start;
}
else
{
_Selection--;
if (_Selection < 0)
_Selection = _Interactions.Count - 1;
}
_SetSelected();
}
///
/// Selects the next best interaction in a menu.
///
///
///
private bool _NextInteraction(SKeyEvent key)
{
var directions = new SKeyEvent[4];
var distances = new float[4];
var stages = new int[4];
var elements = new int[4];
for (int i = 0; i < 4; i++)
directions[i] = new SKeyEvent();
directions[0].Key = Keys.Up;
directions[1].Key = Keys.Right;
directions[2].Key = Keys.Down;
directions[3].Key = Keys.Left;
for (int i = 0; i < 4; i++)
elements[i] = _GetNextElement(directions[i], out distances[i], out stages[i]);
int element = _Selection;
int stage = int.MaxValue;
int direction = -1;
int mute = -1;
switch (key.Key)
{
case Keys.Up:
mute = 2;
break;
case Keys.Right:
mute = 3;
break;
case Keys.Down:
mute = 0;
break;
case Keys.Left:
mute = 1;
break;
}
for (int i = 0; i < 4; i++)
{
if (i != mute && elements[i] != _Selection && (stages[i] <= stage && directions[i].Key == key.Key))
{
stage = stages[i];
element = elements[i];
direction = i;
}
}
if (direction != -1)
{
// select the new element
if (directions[direction].Key == key.Key)
{
_UnsetHighlighted(_Selection);
_UnsetSelected();
_Selection = element;
_SetSelected();
_SetHighlighted(_Selection);
return true;
}
}
return false;
}
private int _GetNextElement(SKeyEvent key, out float distance, out int stage)
{
distance = float.MaxValue;
int min = _Selection;
SRectF actualRect = _GetRect(_Selection);
stage = int.MaxValue;
for (int i = 0; i < _Interactions.Count; i++)
{
if (i != _Selection && !_Interactions[i].ThemeEditorOnly && _IsVisible(i) && _IsEnabled(i))
{
SRectF targetRect = _GetRect(i);
float dist = _GetDistanceDirect(key, actualRect, targetRect);
if (dist >= 0f && dist < distance)
{
distance = dist;
min = i;
stage = 10;
}
}
}
if (min == _Selection)
{
for (int i = 0; i < _Interactions.Count; i++)
{
if (i != _Selection && !_Interactions[i].ThemeEditorOnly && _IsVisible(i) && _IsEnabled(i))
{
SRectF targetRect = _GetRect(i);
float dist = _GetDistance180(key, actualRect, targetRect);
if (dist >= 0f && dist < distance)
{
distance = dist;
min = i;
stage = 20;
}
}
}
}
if (min == _Selection)
{
switch (key.Key)
{
case Keys.Up:
actualRect = new SRectF(actualRect.X, CBase.Settings.GetRenderH(), 1, 1, actualRect.Z);
break;
case Keys.Down:
actualRect = new SRectF(actualRect.X, 0, 1, 1, actualRect.Z);
break;
case Keys.Left:
actualRect = new SRectF(CBase.Settings.GetRenderW(), actualRect.Y, 1, 1, actualRect.Z);
break;
case Keys.Right:
actualRect = new SRectF(0, actualRect.Y, 1, 1, actualRect.Z);
break;
}
for (int i = 0; i < _Interactions.Count; i++)
{
if (i != _Selection && !_Interactions[i].ThemeEditorOnly && _IsVisible(i) && _IsEnabled(i))
{
SRectF targetRect = _GetRect(i);
float dist = _GetDistance180(key, actualRect, targetRect);
if (dist >= 0f && dist < distance)
{
distance = dist;
min = i;
stage = 30;
}
}
}
}
return min;
}
private float _GetDistanceDirect(SKeyEvent key, SRectF actualRect, SRectF targetRect)
{
var source = new PointF(actualRect.X + actualRect.W / 2f, actualRect.Y + actualRect.H / 2f);
var dest = new PointF(targetRect.X + targetRect.W / 2f, targetRect.Y + targetRect.H / 2f);
var vector = new PointF(dest.X - source.X, dest.Y - source.Y);
var distance = (float)Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y);
bool inDirection = false;
switch (key.Key)
{
case Keys.Up:
if (vector.Y < 0f && (targetRect.X + targetRect.W > actualRect.X && actualRect.X + actualRect.W > targetRect.X))
inDirection = true;
break;
case Keys.Down:
if (vector.Y > 0f && (targetRect.X + targetRect.W > actualRect.X && actualRect.X + actualRect.W > targetRect.X))
inDirection = true;
break;
case Keys.Left:
if (vector.X < 0f && (targetRect.Y + targetRect.H > actualRect.Y && actualRect.Y + actualRect.H > targetRect.Y))
inDirection = true;
break;
case Keys.Right:
if (vector.X > 0f && (targetRect.Y + targetRect.H > actualRect.Y && actualRect.Y + actualRect.H > targetRect.Y))
inDirection = true;
break;
}
return !inDirection ? float.MaxValue : distance;
}
private float _GetDistance180(SKeyEvent key, SRectF actualRect, SRectF targetRect)
{
var source = new PointF(actualRect.X + actualRect.W / 2f, actualRect.Y + actualRect.H / 2f);
var dest = new PointF(targetRect.X + targetRect.W / 2f, targetRect.Y + targetRect.H / 2f);
var vector = new PointF(dest.X - source.X, dest.Y - source.Y);
var distance = (float)Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y);
bool inDirection = false;
switch (key.Key)
{
case Keys.Up:
if (vector.Y < 0f)
inDirection = true;
break;
case Keys.Down:
if (vector.Y > 0f)
inDirection = true;
break;
case Keys.Left:
if (vector.X < 0f)
inDirection = true;
break;
case Keys.Right:
if (vector.X > 0f)
inDirection = true;
break;
}
return !inDirection ? float.MaxValue : distance;
}
///
/// Selects the next element in a menu interaction.
///
/// True if the next element is selected. False if either there is no next element or the interaction does not provide such a method.
private bool _NextElement()
{
if (_Interactions[_Selection].Type == EType.SelectSlide)
return _SelectSlides[_Interactions[_Selection].Num].NextValue();
return false;
}
///
/// Selects the previous element in a menu interaction.
///
///
/// True if the previous element is selected. False if either there is no previous element or the interaction does not provide such a method.
///
private bool _PrevElement()
{
if (_Interactions[_Selection].Type == EType.SelectSlide)
return _SelectSlides[_Interactions[_Selection].Num].PrevValue();
return false;
}
private void _SetSelected()
{
switch (_Interactions[_Selection].Type)
{
case EType.Button:
_Buttons[_Interactions[_Selection].Num].Selected = true;
break;
case EType.SelectSlide:
_SelectSlides[_Interactions[_Selection].Num].Selected = true;
break;
case EType.Static:
_Statics[_Interactions[_Selection].Num].Selected = true;
break;
case EType.Text:
_Texts[_Interactions[_Selection].Num].Selected = true;
break;
case EType.SongMenu:
_SongMenus[_Interactions[_Selection].Num].Selected = true;
break;
case EType.Lyric:
_Lyrics[_Interactions[_Selection].Num].Selected = true;
break;
case EType.NameSelection:
_NameSelections[_Interactions[_Selection].Num].Selected = true;
break;
case EType.Equalizer:
_Equalizers[_Interactions[_Selection].Num].Selected = true;
break;
case EType.Playlist:
_Playlists[_Interactions[_Selection].Num].Selected = true;
break;
case EType.ParticleEffect:
_ParticleEffects[_Interactions[_Selection].Num].Selected = true;
break;
}
}
private void _UnsetSelected()
{
switch (_Interactions[_Selection].Type)
{
case EType.Button:
_Buttons[_Interactions[_Selection].Num].Selected = false;
break;
case EType.SelectSlide:
_SelectSlides[_Interactions[_Selection].Num].Selected = false;
break;
case EType.Static:
_Statics[_Interactions[_Selection].Num].Selected = false;
break;
case EType.Text:
_Texts[_Interactions[_Selection].Num].Selected = false;
break;
case EType.SongMenu:
_SongMenus[_Interactions[_Selection].Num].Selected = false;
break;
case EType.Lyric:
_Lyrics[_Interactions[_Selection].Num].Selected = false;
break;
case EType.NameSelection:
_NameSelections[_Interactions[_Selection].Num].Selected = false;
break;
case EType.Equalizer:
_Equalizers[_Interactions[_Selection].Num].Selected = false;
break;
case EType.Playlist:
_Playlists[_Interactions[_Selection].Num].Selected = false;
break;
case EType.ParticleEffect:
_ParticleEffects[_Interactions[_Selection].Num].Selected = false;
break;
}
}
private void _SetHighlighted(int selection)
{
if (selection >= _Interactions.Count || selection < 0)
return;
switch (_Interactions[selection].Type)
{
case EType.Button:
//_Buttons[_Interactions[selection].Num].Selected = true;
break;
case EType.SelectSlide:
_SelectSlides[_Interactions[selection].Num].Highlighted = true;
break;
case EType.Static:
//_Statics[_Interactions[selection].Num].Selected = true;
break;
case EType.Text:
//_Texts[_Interactions[selection].Num].Selected = true;
break;
case EType.SongMenu:
//_SongMenus[_Interactions[selection].Num].Selected = true;
break;
case EType.Lyric:
//_Lyrics[_Interactions[selection].Num].Selected = true;
break;
case EType.NameSelection:
//_NameSelections[_Interactions[selection].Num].Selected = true;
break;
case EType.Playlist:
//_Playlists[_Interactions[_Selection].Num].Selected = true;
break;
}
}
private void _UnsetHighlighted(int selection)
{
if (selection >= _Interactions.Count || selection < 0)
return;
switch (_Interactions[selection].Type)
{
case EType.Button:
//_Buttons[_Interactions[selection].Num].Selected = false;
break;
case EType.SelectSlide:
_SelectSlides[_Interactions[selection].Num].Highlighted = false;
break;
case EType.Static:
//_Statics[_Interactions[selection].Num].Selected = false;
break;
case EType.Text:
//_Texts[_Interactions[selection].Num].Selected = false;
break;
case EType.SongMenu:
//_SongMenus[_Interactions[selection].Num].Selected = false;
break;
case EType.Lyric:
//_Lyrics[_Interactions[selection].Num].Selected = false;
break;
case EType.NameSelection:
//_NameSelections[_Interactions[selection].Num].Selected = false;
break;
case EType.Playlist:
//_Playlists[_Interactions[_Selection].Num].Selected = true;
break;
}
}
private bool _IsVisible(int interaction)
{
if (_Selection >= _Interactions.Count || _Selection < 0)
return false;
switch (_Interactions[interaction].Type)
{
case EType.Button:
return _Buttons[_Interactions[interaction].Num].Visible;
case EType.SelectSlide:
return _SelectSlides[_Interactions[interaction].Num].Visible;
case EType.Static:
return _Statics[_Interactions[interaction].Num].Visible;
case EType.Text:
return _Texts[_Interactions[interaction].Num].Visible;
case EType.SongMenu:
return _SongMenus[_Interactions[interaction].Num].Visible;
case EType.Lyric:
return _Lyrics[_Interactions[interaction].Num].Visible;
case EType.NameSelection:
return _NameSelections[_Interactions[interaction].Num].Visible;
case EType.Equalizer:
return _Equalizers[_Interactions[interaction].Num].Visible;
case EType.Playlist:
return _Playlists[_Interactions[interaction].Num].Visible;
case EType.ParticleEffect:
return _ParticleEffects[_Interactions[interaction].Num].Visible;
}
return false;
}
private bool _IsEnabled(int interaction)
{
if (_Selection >= _Interactions.Count || _Selection < 0)
return false;
switch (_Interactions[interaction].Type)
{
case EType.Button:
return _Buttons[_Interactions[interaction].Num].Enabled;
case EType.SelectSlide:
return _SelectSlides[_Interactions[interaction].Num].Visible;
case EType.Static:
return false; //_Statics[_Interactions[interaction].Num].Visible;
case EType.Text:
return false; //_Texts[_Interactions[interaction].Num].Visible;
case EType.SongMenu:
return _SongMenus[_Interactions[interaction].Num].Visible;
case EType.Lyric:
return false; //_Lyrics[_Interactions[interaction].Num].Visible;
case EType.NameSelection:
return _NameSelections[_Interactions[interaction].Num].Visible;
case EType.Equalizer:
return false; //_Equalizers[_Interactions[interaction].Num].Visible;
case EType.Playlist:
return _Playlists[_Interactions[interaction].Num].Visible;
case EType.ParticleEffect:
return false; //_ParticleEffects[_Interactions[interaction].Num].Visible;
}
return false;
}
private SRectF _GetRect(CInteraction interaction)
{
var result = new SRectF();
switch (interaction.Type)
{
case EType.Button:
return _Buttons[interaction.Num].Rect;
case EType.SelectSlide:
return _SelectSlides[interaction.Num].Rect;
case EType.Static:
return _Statics[interaction.Num].Rect;
case EType.Text:
return _Texts[interaction.Num].Rect;
case EType.SongMenu:
return _SongMenus[interaction.Num].Rect;
case EType.Lyric:
return _Lyrics[interaction.Num].Rect;
case EType.NameSelection:
return _NameSelections[interaction.Num].Rect;
case EType.Equalizer:
return _Equalizers[interaction.Num].Rect;
case EType.Playlist:
return _Playlists[interaction.Num].Rect;
case EType.ParticleEffect:
return _ParticleEffects[interaction.Num].Rect;
}
return result;
}
private SRectF _GetRect(int interaction)
{
return _GetRect(_Interactions[interaction]);
}
private void _AddInteraction(int num, EType type)
{
_Interactions.Add(new CInteraction(num, type));
if (!_Interactions[_Selection].ThemeEditorOnly)
_SetSelected();
else
_NextInteraction();
}
private void _DrawInteraction(int interaction)
{
switch (_Interactions[interaction].Type)
{
case EType.Button:
_Buttons[_Interactions[interaction].Num].Draw();
break;
case EType.SelectSlide:
_SelectSlides[_Interactions[interaction].Num].Draw();
break;
case EType.Static:
_Statics[_Interactions[interaction].Num].Draw();
break;
case EType.Text:
_Texts[_Interactions[interaction].Num].Draw();
break;
case EType.SongMenu:
_SongMenus[_Interactions[interaction].Num].Draw();
break;
case EType.NameSelection:
_NameSelections[_Interactions[interaction].Num].Draw();
break;
case EType.Equalizer:
if (!_Equalizers[_Interactions[interaction].Num].ScreenHandles)
{
//TODO:
//Call Update-Method of Equalizer and give infos about bg-sound.
//_Equalizers[_Interactions[interaction].Num].Draw();
}
break;
case EType.Playlist:
_Playlists[_Interactions[interaction].Num].Draw();
break;
case EType.ParticleEffect:
_ParticleEffects[_Interactions[interaction].Num].Draw();
break;
//TODO:
//case EType.TLyric:
// _Lyrics[_Interactions[interaction].Num].Draw(0);
// break;
}
}
#endregion InteractionHandling
#region Theme Handling
private void _MoveElement(int stepX, int stepY)
{
if (_Interactions.Count <= 0)
return;
switch (_Interactions[_Selection].Type)
{
case EType.Button:
_Buttons[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.SelectSlide:
_SelectSlides[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.Static:
_Statics[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.Text:
_Texts[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.SongMenu:
_SongMenus[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.Lyric:
_Lyrics[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.NameSelection:
_NameSelections[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.Equalizer:
_Equalizers[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.Playlist:
_Playlists[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
case EType.ParticleEffect:
_ParticleEffects[_Interactions[_Selection].Num].MoveElement(stepX, stepY);
break;
}
}
private void _ResizeElement(int stepW, int stepH)
{
if (_Interactions.Count <= 0)
return;
switch (_Interactions[_Selection].Type)
{
case EType.Button:
_Buttons[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.SelectSlide:
_SelectSlides[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.Static:
_Statics[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.Text:
_Texts[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.SongMenu:
_SongMenus[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.Lyric:
_Lyrics[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.NameSelection:
_NameSelections[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.Equalizer:
_Equalizers[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.Playlist:
_Playlists[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
case EType.ParticleEffect:
_ParticleEffects[_Interactions[_Selection].Num].ResizeElement(stepW, stepH);
break;
}
}
#endregion Theme Handling
}
}