Project management family: tasks, milestones, Gantt bars and risk shapes

Overview

Base Control: PMControl : MaterialControl
Namespace: Beep.Skia.PM

The PMControl is the root control for this diagram family. It inherits MaterialControl and provides shared port management, styling, and template methods for all nodes in the family.

This family contains 12 node types.

Node Types

Node ClassShapeDescription
TaskNodeRectangle with barsWork task with duration, start/end dates, completion %.
MilestoneNodeDiamondKey milestone with target date.
PhaseNodeRounded rectangleProject phase grouping tasks.
SummaryNodeBlack bar/rectangleSummary task aggregating child tasks.
DependencyNodeArrow/diamondTask dependency (FS, FF, SS, SF).
GanttBarNodeHorizontal barVisual Gantt chart bar representing task duration.
ResourceNodePerson/resource iconTeam member or resource with allocation %.
BudgetNodeDollar/metric rectangleBudget/cost tracking with planned vs actual.
CriticalPathNodeRed-highlighted pathCritical path indicator for longest dependency chain.
DeliverableNodePackage/box iconProject deliverable with acceptance criteria.
IssueNodeWarning triangleIssue/bug tracker with severity and status.
RiskNodeRisk matrix rectangleRisk with probability, impact, and mitigation plan.

TaskNode

Work task with duration, start/end dates, completion %.

ShapeRectangle with bars
Input Ports1 (left)
Output Ports1 (right)

MilestoneNode

Key milestone with target date.

ShapeDiamond
Input Ports1+
Output Ports1+

PhaseNode

Project phase grouping tasks.

ShapeRounded rectangle
Input Ports1
Output Ports1

SummaryNode

Summary task aggregating child tasks.

ShapeBlack bar/rectangle
Input Ports1
Output Ports1

DependencyNode

Task dependency (FS, FF, SS, SF).

ShapeArrow/diamond
Input Ports1
Output Ports1

GanttBarNode

Visual Gantt chart bar representing task duration.

ShapeHorizontal bar
Input Ports0
Output Ports0

ResourceNode

Team member or resource with allocation %.

ShapePerson/resource icon
Input Ports1
Output Ports1

BudgetNode

Budget/cost tracking with planned vs actual.

ShapeDollar/metric rectangle
Input Ports1
Output Ports1

CriticalPathNode

Critical path indicator for longest dependency chain.

ShapeRed-highlighted path
Input Ports1
Output Ports1

DeliverableNode

Project deliverable with acceptance criteria.

ShapePackage/box icon
Input Ports1
Output Ports1

IssueNode

Issue/bug tracker with severity and status.

ShapeWarning triangle
Input Ports1
Output Ports1

RiskNode

Risk with probability, impact, and mitigation plan.

ShapeRisk matrix rectangle
Input Ports1
Output Ports1

Connection Points

Every node in this family exposes connection points (ports) for linking to other nodes. Port positions are computed lazily by LayoutPorts(), which runs when MarkPortsDirty() flags the layout as stale after a move or resize.

Node ClassInput PortsOutput PortsExtra
TaskNode1 (left)1 (right)—
MilestoneNode1+1+—
PhaseNode11—
SummaryNode11—
DependencyNode11—
GanttBarNode00—
ResourceNode11—
BudgetNode11—
CriticalPathNode11—
DeliverableNode11—
IssueNode11—
RiskNode11—

Connection Conventions

When building diagrams with this family, follow these conventions:

  • Task dependencies follow standard FS/FF/SS/SF notation
  • Gantt bars are time-scaled horizontally
  • Critical path is highlighted in red/orange
  • Milestones typically connect to preceding tasks

Usage Example

Complete example showing creation, node placement, and connection:

C# Example

var pm = new PMControl
{
    X = 50, Y = 50,
    Width = 700, Height = 400
};
drawingManager.AddComponent(pm);

var task = new TaskNode
{
    X = 150, Y = 100,
    Text = "Implement Login",
    Duration = TimeSpan.FromDays(5)
};
var milestone = new MilestoneNode
{
    X = 400, Y = 100,
    Text = "M1: Alpha Release",
    Date = DateTime.Now.AddDays(30)
};
var dep = new DependencyNode
{
    X = 300, Y = 100,
    DependencyType = "FS" // Finish-to-Start
};

drawingManager.AddComponent(task);
drawingManager.AddComponent(milestone);
drawingManager.AddComponent(dep);

drawingManager.ConnectComponents(task.OutPoints[0], dep.InPoints[0]);
drawingManager.ConnectComponents(dep.OutPoints[0], milestone.InPoints[0]);