Skip to content

Commit

Permalink
Merge pull request #336 from CatalystCode/scrollHack
Browse files Browse the repository at this point in the history
hack(ScrollView): The most embarassing hack of my life
  • Loading branch information
rozele committed Apr 8, 2016
2 parents f6428ef + 02dfcc9 commit 8b4b87b
Showing 1 changed file with 74 additions and 1 deletion.
75 changes: 74 additions & 1 deletion ReactWindows/ReactNative/Views/Scroll/ReactScrollViewManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ReactNative.UIManager;
using ReactNative.UIManager.Events;
using System;
Expand Down Expand Up @@ -321,6 +322,9 @@ private void OnDirectManipulationCompleted(object sender, object e)
scrollViewer.HorizontalOffset,
scrollViewer.VerticalOffset,
scrollViewer.ZoomFactor);

// TODO: (#327) Remove all this fake touch nonsense
EmitFakeTouch(scrollViewer);
}

private void OnDirectManipulationStarted(object sender, object e)
Expand Down Expand Up @@ -403,6 +407,17 @@ private void EmitScrollEvent(
{ "zoomScale", zoomFactor },
}));
}

private void EmitFakeTouch(ScrollViewer scrollViewer)
{
var reactTag = scrollViewer.GetTag();
var eventDispatcher = scrollViewer.GetReactContext()
.GetNativeModule<UIManagerModule>()
.EventDispatcher;

eventDispatcher.DispatchEvent(new FakeTouchEvent(reactTag, TouchEventType.Start));
eventDispatcher.DispatchEvent(new FakeTouchEvent(reactTag, TouchEventType.End));
}

private static FrameworkElement EnsureChild(ScrollViewer view)
{
Expand Down Expand Up @@ -451,5 +466,63 @@ public override void Dispatch(RCTEventEmitter eventEmitter)
eventEmitter.receiveEvent(ViewTag, EventName, _data);
}
}

class FakeTouchEvent : Event
{
private static readonly JArray s_dummyIndices = new JArray { 0 };

private readonly TouchEventType _touchEventType;
private readonly JArray _touches;

public FakeTouchEvent(int viewTag, TouchEventType touchEventType)
: base(viewTag, TimeSpan.FromTicks(Environment.TickCount))
{
_touchEventType = touchEventType;
_touches = new JArray
{
JToken.FromObject(new FakePointer
{
Target = viewTag,
}),
};
}

public override string EventName
{
get
{
return _touchEventType.GetJavaScriptEventName();
}
}

public override void Dispatch(RCTEventEmitter eventEmitter)
{
eventEmitter.receiveTouches(EventName, _touches, s_dummyIndices);
}

class FakePointer
{
[JsonProperty(PropertyName = "target")]
public int Target { get; set; }

[JsonProperty(PropertyName = "identifier")]
public uint Identifier { get; set; }

[JsonProperty(PropertyName = "timestamp")]
public ulong Timestamp { get; set; }

[JsonProperty(PropertyName = "locationX")]
public float LocationX { get; set; }

[JsonProperty(PropertyName = "locationY")]
public float LocationY { get; set; }

[JsonProperty(PropertyName = "pageX")]
public float PageX { get; set; }

[JsonProperty(PropertyName = "pageY")]
public float PageY { get; set; }
}
}
}
}

0 comments on commit 8b4b87b

Please sign in to comment.