80 lines
3.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|