using Microsoft.Maui.Graphics; using System.Collections.Generic; namespace NotesDataAnalyst { public class GraphDrawable : IDrawable { private readonly List _nodes; private readonly List _connections; public GraphDrawable(List nodes, List connections) { _nodes = nodes; _connections = connections; } private void DrawConnection(ICanvas canvas, GraphConnection connection) { var startX = connection.FromNode.Position.X + connection.FromNode.Size.Width / 2; var startY = connection.FromNode.Position.Y + connection.FromNode.Size.Height / 2; var endX = connection.ToNode.Position.X + connection.ToNode.Size.Width / 2; var endY = connection.ToNode.Position.Y + connection.ToNode.Size.Height / 2; canvas.StrokeColor = Colors.Gray; canvas.StrokeSize = 2; canvas.DrawLine((float)startX, (float)startY, (float)endX, (float)endY); } private void DrawNode(ICanvas canvas, GraphNode node) { canvas.FillColor = node.BackgroundColor; canvas.FillRectangle((float)node.Position.X, (float)node.Position.Y, (float)node.Size.Width, (float)node.Size.Height); canvas.FontColor = Colors.Black; canvas.DrawString(node.Text, (float)node.Position.X + 10, (float)node.Position.Y + 20, HorizontalAlignment.Left); } public void Draw(ICanvas canvas, RectF dirtyRect) { canvas.StrokeColor = Colors.Black; canvas.StrokeSize = 2; // Отрисовка связей foreach (var connection in _connections) { canvas.DrawLine( (float)connection.FromNode.Position.X, (float)connection.FromNode.Position.Y, (float)connection.ToNode.Position.X, (float)connection.ToNode.Position.Y); } // Отрисовка узлов foreach (var node in _nodes) { // Заливка фона узла canvas.FillColor = node.BackgroundColor; canvas.FillRectangle((float)node.Position.X, (float)node.Position.Y, (float)node.Size.Width, (float)node.Size.Height); // Отрисовка текста canvas.FontColor = Colors.Black; canvas.DrawString(node.Text, (float)node.Position.X + 5, (float)node.Position.Y + 5, HorizontalAlignment.Left); // Если нода выбрана, рисуем пунктирную обводку и "ручку" для изменения размера if (node.IsActive) { canvas.StrokeColor = Colors.Blue; canvas.StrokeDashPattern = new float[] { 4, 2 }; canvas.DrawRectangle((float)node.Position.X, (float)node.Position.Y, (float)node.Size.Width, (float)node.Size.Height); // Ручка для изменения размера canvas.FillColor = Colors.Gray; canvas.FillRectangle( (float)(node.Position.X + node.Size.Width - 10), (float)(node.Position.Y + node.Size.Height - 10), 10, 10); } } } } }