Merge pull request #209 from zumero/image-scaling
Image Display fixes for Ooui.Forms
This commit is contained in:
		
						commit
						e8b6fd4cfc
					
				|  | @ -9,6 +9,8 @@ namespace Ooui.Forms.Renderers | |||
|     public class ImageRenderer : ViewRenderer<Xamarin.Forms.Image, Ooui.Image> | ||||
|     { | ||||
|         bool _isDisposed; | ||||
|         double ClientHeight = -1; | ||||
|         double ClientWidth = -1; | ||||
| 
 | ||||
|         protected override void Dispose (bool disposing) | ||||
|         { | ||||
|  | @ -29,6 +31,8 @@ namespace Ooui.Forms.Renderers | |||
|                 var imageView = new Ooui.Image (); | ||||
|                 SetNativeControl (imageView); | ||||
|                 this.Style.Overflow = "hidden"; | ||||
| 
 | ||||
|                 Control.Loaded += OnLoad; | ||||
|             } | ||||
| 
 | ||||
|             if (e.NewElement != null) { | ||||
|  | @ -48,7 +52,44 @@ namespace Ooui.Forms.Renderers | |||
|             else if (e.PropertyName == Xamarin.Forms.Image.IsOpaqueProperty.PropertyName) | ||||
|                 SetOpacity (); | ||||
|             else if (e.PropertyName == Xamarin.Forms.Image.AspectProperty.PropertyName) | ||||
|                 SetAspect (); | ||||
|                 SetAspect(); | ||||
|             else if (e.PropertyName == VisualElement.WidthProperty.PropertyName) | ||||
|                 SetDimensions (); | ||||
|         } | ||||
| 
 | ||||
|         void OnLoad(object sender, EventArgs eventArgs) | ||||
|         { | ||||
|             var args = (TargetEventArgs)eventArgs; | ||||
|             ClientHeight = args.ClientHeight; | ||||
|             ClientWidth = args.ClientWidth; | ||||
| 
 | ||||
|             SetDimensions(); | ||||
|         } | ||||
| 
 | ||||
|         void SetDimensions() | ||||
|         { | ||||
|             var b = Element.Bounds; | ||||
|             double scale = 1; | ||||
| 
 | ||||
|             if (ClientWidth < 0 || ClientHeight < 0) | ||||
|                 return; | ||||
| 
 | ||||
|             if (Math.Abs(b.Width) > 0) | ||||
|             { | ||||
|                 scale = b.Width / ClientWidth; | ||||
|                 Element.WidthRequest = b.Width; | ||||
|                 Element.HeightRequest = scale * ClientHeight; | ||||
|             } | ||||
|             else if (Math.Abs(b.Height) > 0) | ||||
|             { | ||||
|                 scale = b.Height / ClientHeight; | ||||
|                 Element.WidthRequest = scale * ClientWidth; | ||||
|                 Element.HeightRequest = b.Height; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // We can't really know what to do in this case | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         void SetAspect () | ||||
|  | @ -112,7 +153,7 @@ namespace Ooui.Forms.Renderers | |||
|                     return; | ||||
| 
 | ||||
|                 var imageView = Control; | ||||
|                 if (imageView != null) | ||||
|                 if (imageView != null && uiimage != null) | ||||
|                     imageView.Source = uiimage; | ||||
| 
 | ||||
|                 ((IVisualElementController)Element).NativeSizeChanged (); | ||||
|  |  | |||
|  | @ -37,6 +37,10 @@ const inputEvents = { | |||
|     keyup: true, | ||||
| }; | ||||
| 
 | ||||
| const elementEvents = { | ||||
|     load: true | ||||
| } | ||||
| 
 | ||||
| function getSize () { | ||||
|     return { | ||||
|         height: window.innerHeight, | ||||
|  | @ -304,6 +308,12 @@ function msgListen (m) { | |||
|                 offsetY: e.offsetY, | ||||
|             }; | ||||
|         } | ||||
|         else if (elementEvents[m.k]) { | ||||
|             em.v = { | ||||
|                 clientHeight: node.clientHeight, | ||||
|                 clientWidth: node.clientWidth | ||||
|             } | ||||
|         } | ||||
|         const ems = JSON.stringify (em); | ||||
|         send (ems); | ||||
|         if (debug) console.log ("Event", em); | ||||
|  |  | |||
|  | @ -52,7 +52,12 @@ namespace Ooui | |||
|             add => AddEventListener ("keyup", value); | ||||
|             remove => RemoveEventListener ("keyup", value); | ||||
|         } | ||||
| 
 | ||||
|          | ||||
|         public event TargetEventHandler Loaded { | ||||
|             add => AddEventListener ("load", value); | ||||
|             remove => RemoveEventListener ("load", value); | ||||
|         } | ||||
|          | ||||
|         public event TargetEventHandler MouseDown { | ||||
|             add => AddEventListener ("mousedown", value); | ||||
|             remove => RemoveEventListener ("mousedown", value); | ||||
|  |  | |||
|  | @ -220,8 +220,16 @@ namespace Ooui | |||
|             if (handlers != null) { | ||||
|                 var args = new TargetEventArgs (); | ||||
|                 if (message.Value is Newtonsoft.Json.Linq.JObject o) { | ||||
|                     args.OffsetX = (double)o["offsetX"]; | ||||
|                     args.OffsetY = (double)o["offsetY"]; | ||||
|                     if (o["offsetX"] != null) | ||||
|                     { | ||||
|                         args.OffsetX = (double)o["offsetX"]; | ||||
|                         args.OffsetY = (double)o["offsetY"]; | ||||
|                     } | ||||
|                     if (o["clientHeight"] != null) | ||||
|                     { | ||||
|                         args.ClientHeight = (double)o.GetValue("clientHeight"); | ||||
|                         args.ClientWidth = (double)o.GetValue("clientWidth"); | ||||
|                     } | ||||
|                 } | ||||
|                 foreach (var h in handlers) { | ||||
|                     h.Invoke (this, args); | ||||
|  | @ -257,5 +265,7 @@ namespace Ooui | |||
|     { | ||||
|         public double OffsetX { get; set; } | ||||
|         public double OffsetY { get; set; } | ||||
|         public double ClientHeight { get; set; } | ||||
|         public double ClientWidth { get; set; } | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue