NoteMAUI/GraphDrawable.cs

80 lines
3.4 KiB
C#

using Microsoft.Maui.Graphics;
using System.Collections.Generic;
namespace NotesDataAnalyst
{
public class GraphDrawable : IDrawable
{
private readonly List<GraphNode> _nodes;
private readonly List<GraphConnection> _connections;
public GraphDrawable(List<GraphNode> nodes, List<GraphConnection> 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);
}
}
}
}
}