private void Canvas_MouseUp(object sender, MouseEventArgs e) { canvas.Focus(); if (e.Button == MouseButtons.Left && selectionBegin) { canvas.UnselectAll(); PointF selectionStart = selectionBox.Points[0]; PointF selectionEnd = selectionBox.Points[2]; PointF selectionOrigin = new PointF(); SizeF selectionSize = new SizeF(); selectionSize.Width = Math.Abs(selectionEnd.X - selectionStart.X); selectionSize.Height = Math.Abs(selectionEnd.Y - selectionStart.Y); if (selectionEnd.X > selectionStart.X) { if (selectionEnd.Y > selectionStart.Y) { selectionOrigin.X = selectionStart.X; selectionOrigin.Y = selectionStart.Y; } else { selectionOrigin.X = selectionStart.X; selectionOrigin.Y = selectionEnd.Y; } } else { if (selectionEnd.Y > selectionStart.Y) { selectionOrigin.X = selectionEnd.X; selectionOrigin.Y = selectionStart.Y; } else { selectionOrigin.X = selectionEnd.X; selectionOrigin.Y = selectionEnd.Y; } } RectangleF rect = new RectangleF(selectionOrigin.X, selectionOrigin.Y, selectionSize.Width, selectionSize.Height); float square = selectionSize.Width * selectionSize.Height; if (square >= 4.0F) { List <CanvasItem> items = canvas.BoxTest(rect); if (items.Count != 0) { foreach (var item in items) { item.Select(); } canvas.Invalidate(); } } canvas.RemoveItem(selectionBox); selectionBox = null; selectionBegin = false; canvas.Invalidate(); } else if (e.Button == MouseButtons.Left && draggingBegin) { draggingBegin = false; canvas.Cursor = Cursors.Default; } else if (e.Button == MouseButtons.Right && scrollingBegin) { scrollingBegin = false; canvas.Cursor = Cursors.Default; } }
private void Canvas_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && !selectionBegin) { PointF pos = canvas.ScreenToWorld(new Point(e.X, e.Y)); CanvasItem item = canvas.HitTest(pos); if (item != null) { // Нажали внутри итема if (!item.Selected) { // Если не выделен - выделить if (canvas.GetModifierKeys() != Keys.Shift) { canvas.UnselectAll(); } item.Select(); canvas.Invalidate(); } else { // Если выделен - начать перетаскивание selectedDragItems = canvas.GetSelected(); foreach (var next in selectedDragItems) { next.SavedPos = new PointF(next.Pos.X, next.Pos.Y); next.SavedPosEnd = new PointF(next.PosEnd.X, next.PosEnd.Y); next.SavedPoints = new List <PointF>(); foreach (var point in next.Points) { next.SavedPoints.Add(point); } } savedMouse = new Point(e.X, e.Y); draggingBegin = true; } } else { // Рамка выделения List <PointF> points = new List <PointF>(); points.Add(pos); points.Add(pos); points.Add(pos); points.Add(pos); points.Add(pos); selectionBox = new CanvasPolyLine(points); selectionBox.FrontColor = Color.Black; canvas.AddItem(selectionBox); selectionBegin = true; } } else if (e.Button == MouseButtons.Right && !scrollingBegin) { savedScroll = new PointF(canvas.Scroll.X, canvas.Scroll.Y); savedMouse = new Point(e.X, e.Y); canvas.Cursor = Cursors.SizeAll; scrollingBegin = true; } }
private void VisualizeLogisim(LogisimConverter.LogisimModel model) { canvasControl1.RemoveAllItems(); // Comps foreach (var comp in model.comps) { CanvasRect rect = new CanvasRect((PointF)comp.loc, LogisimConverter.CompSize, LogisimConverter.CompSize, Color.Gold); rect.Text = comp.name; if (comp.name == "Text") { // Skip labels continue; } else if (comp.name == "1") { rect.FrontColor = Color.Tomato; } else if (comp.name == "0") { rect.FrontColor = Color.LimeGreen; } #if DEBUG rect.Text += " #" + comp.id.ToString(); #endif canvasControl1.AddItem(rect); } // Wires foreach (var wire in model.wires) { List <PointF> path = new List <PointF>(); foreach (var p in wire.path) { path.Add(p); } CanvasPolyLine line = new CanvasPolyLine(path, 1, Color.Black); line.Text = wire.name; WireMeta meta = new WireMeta(); meta.wire = wire; line.UserData = meta; canvasControl1.AddItem(line); WireDirection(wire, meta); } // Vias foreach (var vias in model.viases) { CanvasPoint point = new CanvasPoint(vias.loc, 5, Color.Gold); #if DEBUG //point.Text = vias.id.ToString(); //point.TextColor = Color.DeepPink; #endif canvasControl1.AddItem(point); } canvasControl1.Invalidate(); }