public void AddPoint(Vector2 pos) { IconPoint point = CreateInstance(typeof(IconPoint)) as IconPoint; point.SetLocalPosition(GetLocalPositionOnCanvas(gridRect, pos)); points.Add(point); }
IIconGridElement CreateVertex(Vector2 pos) { IconPoint p = CreateInstance(typeof(IconPoint)) as IconPoint; p.SetPosition(pos); return(p); }
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); } } }
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 } }); }
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); }
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(); }