示例#1
0
    public void AddPoint(Vector2 pos)
    {
        IconPoint point = CreateInstance(typeof(IconPoint)) as IconPoint;

        point.SetLocalPosition(GetLocalPositionOnCanvas(gridRect, pos));
        points.Add(point);
    }
示例#2
0
    IIconGridElement CreateVertex(Vector2 pos)
    {
        IconPoint p = CreateInstance(typeof(IconPoint)) as IconPoint;

        p.SetPosition(pos);
        return(p);
    }
示例#3
0
        public IEnumerable <(int x, int y)> GetIconsPositions()
        {
            var wnd = GetDesktopWindow();

            User32.GetWindowThreadProcessId(wnd, out uint pid);

            var desktopProcessHandle = IntPtr.Zero;
            var sharedMemoryPointer  = IntPtr.Zero;

            try
            {
                desktopProcessHandle = Kernel32.OpenProcess(ProcessAccess.VmOperation
                                                            | ProcessAccess.VmRead
                                                            | ProcessAccess.VmWrite, false, pid);
                sharedMemoryPointer = Kernel32.VirtualAllocEx(desktopProcessHandle, IntPtr.Zero, 4096,
                                                              AllocationType.Reserve | AllocationType.Commit, MemoryProtection.ReadWrite);

                var iconsCount = GetNumberOfIcons();
                var icons      = new List <(int x, int y)>();

                for (var index = 0; index < iconsCount; index++)
                {
                    uint numberOfBytes = 0;
                    var  points        = new IconPoint[1];

                    Kernel32.WriteProcessMemory(desktopProcessHandle, sharedMemoryPointer,
                                                Marshal.UnsafeAddrOfPinnedArrayElement(points, 0), Marshal.SizeOf(typeof(IconPoint)),
                                                ref numberOfBytes);

                    User32.SendMessage(wnd, User32.LVM_GETITEMPOSITION, index, sharedMemoryPointer);

                    Kernel32.ReadProcessMemory(desktopProcessHandle, sharedMemoryPointer,
                                               Marshal.UnsafeAddrOfPinnedArrayElement(points, 0), Marshal.SizeOf(typeof(IconPoint)),
                                               ref numberOfBytes);

                    icons.Add((x: points[0].X, y: points[0].Y));
                }

                return(icons);
            }
            finally
            {
                if (desktopProcessHandle != IntPtr.Zero)
                {
                    Kernel32.CloseHandle(desktopProcessHandle);
                }
                if (sharedMemoryPointer != IntPtr.Zero)
                {
                    Kernel32.VirtualFreeEx(desktopProcessHandle, sharedMemoryPointer, 0, FreeType.Release);
                }
            }
        }
示例#4
0
    public List <Vector2[]> GetReferenceLines(IconPoint p)
    {
        Vector2 center = p.rect.position;
        Vector2 top    = new Vector2(center.x, container.yMin);
        Vector2 bottom = new Vector2(center.x, container.yMax);
        Vector2 left   = new Vector2(container.xMin, center.y);
        Vector2 right  = new Vector2(container.xMax, center.y);

        return(new List <Vector2[]>()
        {
            new Vector2[] { left, right }, new Vector2[] { top, bottom }
        });
    }
示例#5
0
    public static Vector2 GetSnappedLocation(IconPoint p)
    {
        Vector2 pos = p.localPosition;

        float closestX = float.MaxValue;
        float closestY = float.MaxValue;

        foreach (IconCanvasGuide guide in Guides)
        {
            guide.hovered = false;
            if (guide.type == IconCanvasGuideType.Horizontal)
            {
                float distance = Mathf.Abs(pos.y - guide.y);
                if (distance < guide.normalizedSnapThreshold)
                {
                    if (distance < closestY)
                    {
                        closestY      = guide.y;
                        guide.hovered = p.dragging;
                    }
                }
            }
            else
            {
                float distance = Mathf.Abs(pos.x - guide.x);
                if (distance < guide.normalizedSnapThreshold)
                {
                    if (distance < closestX)
                    {
                        closestX      = guide.x;
                        guide.hovered = p.dragging;
                    }
                }
            }
        }

        pos.x = (closestX != float.MaxValue) ? closestX : pos.x;
        pos.y = (closestY != float.MaxValue) ? closestY : pos.y;

        return(pos);
    }
示例#6
0
    public void DrawReferenceLines(IconPoint p)
    {
        if (!p.drawRefLines)
        {
            return;
        }

        Handles.BeginGUI();
        Handles.color = Color.red;


        Vector2 center = p.rect.position;
        Vector2 top    = new Vector2(center.x, container.yMin);
        Vector2 bottom = new Vector2(center.x, container.yMax);
        Vector2 left   = new Vector2(container.xMin, center.y);
        Vector2 right  = new Vector2(container.xMax, center.y);

        Handles.DrawLine(left, right);
        Handles.DrawLine(top, bottom);

        Handles.color = Color.white;
        Handles.EndGUI();
    }