/*
* @author Valentin Simonov / http://va.lent.in/
*/
#if TOUCHSCRIPT_DEBUG
using System;
using System.Collections.Generic;
using TouchScript.Debugging.Filters;
using TouchScript.Pointers;
using TouchScript.Utils;
namespace TouchScript.Debugging.Loggers
{
///
/// A default implementation of used in editor.
///
///
public class PointerLogger : IPointerLogger
{
#region Consts
public const int MIN_POINTER_LIST_SIZE = 1000;
#endregion
#region Public properties
///
public int PointerCount
{
get { return pointerCount; }
}
#endregion
#region Private variables
private int pointerCount = 0;
private int eventCount = 0;
protected List data = new List(1);
protected List> events = new List>(1);
#endregion
#region Public methods
///
public virtual void Log(Pointer pointer, PointerEvent evt)
{
var id = checkId(pointer);
var list = getPointerList(id);
var log = new PointerLog()
{
Id = eventCount,
Tick = DateTime.Now.Ticks,
PointerId = id,
Event = evt,
State = new PointerState()
{
Buttons = pointer.Buttons,
Position = pointer.Position,
PreviousPosition = pointer.PreviousPosition,
Flags = pointer.Flags,
Target = pointer.GetPressData().Target,
TargetPath = TransformUtils.GetHeirarchyPath(pointer.GetPressData().Target),
}
};
list.Add(log);
eventCount++;
}
///
public virtual List GetFilteredPointerData(IPointerDataFilter filter = null)
{
//if (filter == null)
return new List(data);
}
///
public virtual List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null)
{
if (id < 0 || id >= pointerCount)
return new List();
List list = events[id];
if (filter == null)
return new List(list);
var count = list.Count;
List filtered = new List(count);
for (var i = 0; i < count; i++)
{
var item = list[i];
if (filter.Applies(ref item)) filtered.Add(item);
}
return filtered;
}
///
public virtual void Dispose() {}
#endregion
#region Private functions
private IList getPointerList(int id)
{
return events[id];
}
private int checkId(Pointer pointer)
{
var id = pointer.Id;
if (id > pointerCount) throw new InvalidOperationException("Pointer id desync!");
if (id != pointerCount) return id;
var list = new List(MIN_POINTER_LIST_SIZE);
events.Add(list);
data.Add(new PointerData()
{
Id = id,
Type = pointer.Type,
});
pointerCount++;
return id;
}
#endregion
}
}
#endif