Esempio n. 1
0
        private static SafeControlHandle GetHandle(SurfaceHandler handler, bool scrollable, int width, int height, out Libui.uiAreaHandler outHandler)
        {
            outHandler = new Libui.uiAreaHandler
            {
                Draw = (nativeHandler, surface, args) =>
                {
                    DrawEventArgs e = new DrawEventArgs(args);
                    handler.Draw(surfaceCache[surface], ref e);
                },
                MouseEvent = (nativeHandler, surface, args) =>
                {
                    MouseEventArgs e = new MouseEventArgs(args);
                    handler.MouseEvent(surfaceCache[surface], ref e);
                },
                MouseCrossed = (nativeHandler, surface, left) =>
                {
                    handler.MouseCrossed(surfaceCache[surface], left);
                },
                DragBroken = (nativeHandler, surface) => handler.DragBroken(surfaceCache[surface]),
                KeyEvent   = (nativeHandler, surface, args) =>
                {
                    KeyEventArgs e = new KeyEventArgs(args);
                    return(handler.KeyEvent(surfaceCache[surface], ref e));
                }
            };

            return(!scrollable
                ? new SafeControlHandle(Libui.Call <Libui.uiNewArea>()(outHandler))
                : new SafeControlHandle(Libui.Call <Libui.uiNewScrollingArea>()(outHandler, width, height)));
        }
Esempio n. 2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Surface"/> class with the specified handler.
        /// </summary>
        /// <param name="events">The specified event handler.</param>
        /// <param name="scrollable">Whether this surface is scrollable or not.</param>
        /// <param name="width">The width of the scrollable surface.</param>
        /// <param name="height">The height of the scrollable surface.</param>
        public Surface(ISurfaceHandler events, bool scrollable = false, int width = -1, int height = -1)
        {
            SurfaceHandler surfaceEvents = new SurfaceHandler
            {
                Draw = (IntPtr surfaceHandler, IntPtr surface, ref Libui.uiAreaDrawParams args) =>
                {
                    Surface       realSurface = Surfaces[surface];
                    DrawEventArgs a           = new DrawEventArgs(new Context(args.Context), new RectangleD(args.ClipX, args.ClipY, args.ClipWidth, args.ClipHeight), new SizeD(args.AreaWidth, args.AreaHeight));
                    events.Draw(realSurface, ref a);
                },
                MouseEvent = (IntPtr surfaceHandler, IntPtr surface, ref Libui.uiAreaMouseEvent args) =>
                {
                    Surface        realSurface = Surfaces[surface];
                    MouseEventArgs a           = new MouseEventArgs(new PointD(args.X, args.Y), new SizeD(args.AreaWidth, args.AreaHeight), args.Up, args.Down, args.Count, args.Modifiers, args.Held1To64);
                    events.MouseEvent(realSurface, ref a);
                },
                MouseCrossed = (IntPtr surfaceHandler, IntPtr surface, bool left) =>
                {
                    Surface realSurface     = Surfaces[surface];
                    MouseCrossedEventArgs a = new MouseCrossedEventArgs(left);
                    events.MouseCrossed(realSurface, a);
                },
                DragBroken = (IntPtr surfaceHandler, IntPtr surface) =>
                {
                    Surface realSurface = Surfaces[surface];
                    events.DragBroken(realSurface);
                },
                KeyEvent = (IntPtr surfaceHandler, IntPtr surface, ref Libui.uiAreaKeyEvent args) =>
                {
                    Surface      realSurface = Surfaces[surface];
                    KeyEventArgs a           = new KeyEventArgs(args.Key, args.ExtKey, args.Modifier, args.Modifiers, args.Up);
                    return(events.KeyEvent(realSurface, ref a));
                }
            };

            EventHandler = new Libui.uiAreaHandler
            {
                DragBroken   = Marshal.GetFunctionPointerForDelegate(surfaceEvents.DragBroken),
                Draw         = Marshal.GetFunctionPointerForDelegate(surfaceEvents.Draw),
                KeyEvent     = Marshal.GetFunctionPointerForDelegate(surfaceEvents.KeyEvent),
                MouseCrossed = Marshal.GetFunctionPointerForDelegate(surfaceEvents.MouseCrossed),
                MouseEvent   = Marshal.GetFunctionPointerForDelegate(surfaceEvents.MouseEvent)
            };

            IsScrollable = scrollable;
            if (scrollable)
            {
                Handle = Libui.uiNewScrollingArea(EventHandler, width, height);
            }
            else
            {
                Handle = Libui.uiNewArea(EventHandler);
            }
            Surfaces[Handle] = this;
        }