Implement SwitchRenderer using Bootstrap Toggle
This commit is contained in:
parent
11d9e1c2fb
commit
57f98b7d61
|
@ -14,6 +14,7 @@ using Xamarin.Forms.Internals;
|
||||||
[assembly: ExportRenderer (typeof (Frame), typeof (FrameRenderer))]
|
[assembly: ExportRenderer (typeof (Frame), typeof (FrameRenderer))]
|
||||||
[assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))]
|
[assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))]
|
||||||
[assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))]
|
[assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))]
|
||||||
|
[assembly: ExportRenderer (typeof (Switch), typeof (SwitchRenderer))]
|
||||||
|
|
||||||
namespace Ooui.Forms
|
namespace Ooui.Forms
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
using System;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Ooui.Forms.Renderers
|
||||||
|
{
|
||||||
|
public class SwitchRenderer : ViewRenderer<Switch, Input>
|
||||||
|
{
|
||||||
|
public override SizeRequest GetDesiredSize (double widthConstraint, double heightConstraint)
|
||||||
|
{
|
||||||
|
var size = new Size (54, 38);
|
||||||
|
return new SizeRequest (size, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Dispose (bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing)
|
||||||
|
Control.Changed -= OnControlValueChanged;
|
||||||
|
|
||||||
|
base.Dispose (disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnElementChanged (ElementChangedEventArgs<Switch> e)
|
||||||
|
{
|
||||||
|
if (e.OldElement != null)
|
||||||
|
e.OldElement.Toggled -= OnElementToggled;
|
||||||
|
|
||||||
|
if (e.NewElement != null) {
|
||||||
|
if (Control == null) {
|
||||||
|
var input = new Input (InputType.Checkbox);
|
||||||
|
input.SetAttribute ("data-toggle", "toggle");
|
||||||
|
SetNativeControl (input);
|
||||||
|
input.Call ("$.bootstrapToggle");
|
||||||
|
Control.Changed += OnControlValueChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
Control.IsChecked = Element.IsToggled;
|
||||||
|
e.NewElement.Toggled += OnElementToggled;
|
||||||
|
}
|
||||||
|
|
||||||
|
base.OnElementChanged (e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnControlValueChanged (object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
((IElementController)Element).SetValueFromRenderer (Switch.IsToggledProperty, Control.IsChecked);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnElementToggled (object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Control.IsChecked = Element.IsToggled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -81,97 +81,97 @@ namespace Ooui
|
||||||
|
|
||||||
public void Save ()
|
public void Save ()
|
||||||
{
|
{
|
||||||
SendCall ("save");
|
Call ("save");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Restore ()
|
public void Restore ()
|
||||||
{
|
{
|
||||||
SendCall ("restore");
|
Call ("restore");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearRect (double x, double y, double w, double h)
|
public void ClearRect (double x, double y, double w, double h)
|
||||||
{
|
{
|
||||||
SendCall ("clearRect", x, y, w, h);
|
Call ("clearRect", x, y, w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FillRect (double x, double y, double w, double h)
|
public void FillRect (double x, double y, double w, double h)
|
||||||
{
|
{
|
||||||
SendCall ("fillRect", x, y, w, h);
|
Call ("fillRect", x, y, w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StrokeRect (double x, double y, double w, double h)
|
public void StrokeRect (double x, double y, double w, double h)
|
||||||
{
|
{
|
||||||
SendCall ("strokeRect", x, y, w, h);
|
Call ("strokeRect", x, y, w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BeginPath ()
|
public void BeginPath ()
|
||||||
{
|
{
|
||||||
SendCall ("beginPath");
|
Call ("beginPath");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClosePath ()
|
public void ClosePath ()
|
||||||
{
|
{
|
||||||
SendCall ("closePath");
|
Call ("closePath");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MoveTo (double x, double y)
|
public void MoveTo (double x, double y)
|
||||||
{
|
{
|
||||||
SendCall ("moveTo", x, y);
|
Call ("moveTo", x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LineTo (double x, double y)
|
public void LineTo (double x, double y)
|
||||||
{
|
{
|
||||||
SendCall ("lineTo", x, y);
|
Call ("lineTo", x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void QuadraticCurveTo (double cpx, double cpy, double x, double y)
|
public void QuadraticCurveTo (double cpx, double cpy, double x, double y)
|
||||||
{
|
{
|
||||||
SendCall ("quadraticCurveTo", cpx, cpy, x, y);
|
Call ("quadraticCurveTo", cpx, cpy, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BezierCurveTo (double cp1x, double cp1y, double cp2x, double cp2y, double x, double y)
|
public void BezierCurveTo (double cp1x, double cp1y, double cp2x, double cp2y, double x, double y)
|
||||||
{
|
{
|
||||||
SendCall ("bezierCurveTo", cp1x, cp1y, cp2x, cp2y, x, y);
|
Call ("bezierCurveTo", cp1x, cp1y, cp2x, cp2y, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ArcTo (double x1, double y1, double x2, double y2, double radius)
|
public void ArcTo (double x1, double y1, double x2, double y2, double radius)
|
||||||
{
|
{
|
||||||
SendCall ("arcTo", x1, y1, x2, y2, radius);
|
Call ("arcTo", x1, y1, x2, y2, radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Rect (double x, double y, double w, double h)
|
public void Rect (double x, double y, double w, double h)
|
||||||
{
|
{
|
||||||
SendCall ("rect", x, y, w, h);
|
Call ("rect", x, y, w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Arc (double x, double y, double radius, double startAngle, double endAngle, bool counterclockwise)
|
public void Arc (double x, double y, double radius, double startAngle, double endAngle, bool counterclockwise)
|
||||||
{
|
{
|
||||||
SendCall ("arc", x, y, radius, startAngle, endAngle, counterclockwise);
|
Call ("arc", x, y, radius, startAngle, endAngle, counterclockwise);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Fill ()
|
public void Fill ()
|
||||||
{
|
{
|
||||||
SendCall ("fill");
|
Call ("fill");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Stroke ()
|
public void Stroke ()
|
||||||
{
|
{
|
||||||
SendCall ("stroke");
|
Call ("stroke");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Clip ()
|
public void Clip ()
|
||||||
{
|
{
|
||||||
SendCall ("clip");
|
Call ("clip");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FillText (string text, double x, double y, double? maxWidth)
|
public void FillText (string text, double x, double y, double? maxWidth)
|
||||||
{
|
{
|
||||||
SendCall ("fillText", text, x, y, maxWidth);
|
Call ("fillText", text, x, y, maxWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StrokeText (string text, double x, double y, double? maxWidth)
|
public void StrokeText (string text, double x, double y, double? maxWidth)
|
||||||
{
|
{
|
||||||
SendCall ("strokeText", text, x, y, maxWidth);
|
Call ("strokeText", text, x, y, maxWidth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,11 +65,19 @@ function ooui (rootElementPath) {
|
||||||
const messages = JSON.parse (event.data);
|
const messages = JSON.parse (event.data);
|
||||||
if (debug) console.log("Messages", messages);
|
if (debug) console.log("Messages", messages);
|
||||||
if (Array.isArray (messages)) {
|
if (Array.isArray (messages)) {
|
||||||
|
const jqs = []
|
||||||
messages.forEach (function (m) {
|
messages.forEach (function (m) {
|
||||||
// console.log('Raw value from server', m.v);
|
// console.log('Raw value from server', m.v);
|
||||||
m.v = fixupValue (m.v);
|
m.v = fixupValue (m.v);
|
||||||
|
if (m.k.startsWith ("$.")) {
|
||||||
|
jqs.push (m);
|
||||||
|
}
|
||||||
|
else {
|
||||||
processMessage (m);
|
processMessage (m);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
// Run jQuery functions last since they usually require a fully built DOM
|
||||||
|
jqs.forEach (processMessage);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -163,9 +171,11 @@ function msgCall (m) {
|
||||||
console.error ("Unknown node id", m);
|
console.error ("Unknown node id", m);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const f = node[m.k];
|
const isJQuery = m.k.startsWith ("$.");
|
||||||
|
const target = isJQuery ? $(node) : node;
|
||||||
|
const f = isJQuery ? target[m.k.slice(2)] : target[m.k];
|
||||||
if (debug) console.log ("Call", node, f, m.v);
|
if (debug) console.log ("Call", node, f, m.v);
|
||||||
const r = f.apply (node, m.v);
|
const r = f.apply (target, m.v);
|
||||||
if (typeof m.rid === 'string' || m.rid instanceof String) {
|
if (typeof m.rid === 'string' || m.rid instanceof String) {
|
||||||
nodes[m.rid] = r;
|
nodes[m.rid] = r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,5 +116,19 @@ namespace Ooui
|
||||||
{
|
{
|
||||||
SendSet ("style." + Style.GetJsName (e.PropertyName), Style[e.PropertyName]);
|
SendSet ("style." + Style.GetJsName (e.PropertyName), Style[e.PropertyName]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override bool SaveStateMessageIfNeeded (Message message)
|
||||||
|
{
|
||||||
|
if (message.TargetId != Id)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (message.MessageType) {
|
||||||
|
case MessageType.Call when message.Key.StartsWith ("$.", StringComparison.Ordinal):
|
||||||
|
AddStateMessage (message);
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return base.SaveStateMessageIfNeeded (message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ namespace Ooui
|
||||||
MessageSent?.Invoke (message);
|
MessageSent?.Invoke (message);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void SendCall (string methodName, params object[] args)
|
public void Call (string methodName, params object[] args)
|
||||||
{
|
{
|
||||||
Send (Message.Call (Id, methodName, args));
|
Send (Message.Call (Id, methodName, args));
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ namespace Ooui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
newChild.MessageSent += HandleChildMessageSent;
|
newChild.MessageSent += HandleChildMessageSent;
|
||||||
SendCall ("insertBefore", newChild, referenceChild);
|
Call ("insertBefore", newChild, referenceChild);
|
||||||
OnChildInsertedBefore (newChild, referenceChild);
|
OnChildInsertedBefore (newChild, referenceChild);
|
||||||
return newChild;
|
return newChild;
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ namespace Ooui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
child.MessageSent -= HandleChildMessageSent;
|
child.MessageSent -= HandleChildMessageSent;
|
||||||
SendCall ("removeChild", child);
|
Call ("removeChild", child);
|
||||||
OnChildRemoved (child);
|
OnChildRemoved (child);
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ namespace Ooui
|
||||||
}
|
}
|
||||||
foreach (var child in toRemove) {
|
foreach (var child in toRemove) {
|
||||||
child.MessageSent -= HandleChildMessageSent;
|
child.MessageSent -= HandleChildMessageSent;
|
||||||
SendCall ("removeChild", child);
|
Call ("removeChild", child);
|
||||||
}
|
}
|
||||||
InsertBefore (newNode, null);
|
InsertBefore (newNode, null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,10 +40,14 @@ namespace Ooui
|
||||||
<title>@Title</title>
|
<title>@Title</title>
|
||||||
<meta name=""viewport"" content=""width=device-width, initial-scale=1"" />
|
<meta name=""viewport"" content=""width=device-width, initial-scale=1"" />
|
||||||
<link rel=""stylesheet"" href=""https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"" />
|
<link rel=""stylesheet"" href=""https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"" />
|
||||||
|
<link rel=""stylesheet"" href=""https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css"" />
|
||||||
<style>@Styles</style>
|
<style>@Styles</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id=""ooui-body"" class=""container-fluid""></div>
|
<div id=""ooui-body"" class=""container-fluid""></div>
|
||||||
|
|
||||||
|
<script type=""text/javascript"" src=""https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js""></script>
|
||||||
|
<script type=""text/javascript"" src=""https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js""></script>
|
||||||
<script src=""/ooui.js""></script>
|
<script src=""/ooui.js""></script>
|
||||||
<script>ooui(""@WebSocketPath"");</script>
|
<script>ooui(""@WebSocketPath"");</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
<ActivityIndicator x:Name="activity" />
|
<ActivityIndicator x:Name="activity" />
|
||||||
<ProgressBar x:Name="progress" />
|
<ProgressBar x:Name="progress" />
|
||||||
<DatePicker x:Name="datePicker" />
|
<DatePicker x:Name="datePicker" />
|
||||||
|
<StackLayout Orientation="Horizontal">
|
||||||
|
<Switch x:Name="switch1" IsToggled="true" />
|
||||||
|
<Switch x:Name="switch2" IsToggled="false" />
|
||||||
|
</StackLayout>
|
||||||
<Button Text="Tap to Display Alert"
|
<Button Text="Tap to Display Alert"
|
||||||
Clicked="OnButtonClicked" />
|
Clicked="OnButtonClicked" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|
Loading…
Reference in New Issue