namespace JiDangJia.Views;
public sealed class RibbonDrawable : IDrawable
{
public void Draw(ICanvas c,RectF r)
{
c.StrokeSize=.65f;
for(int i=0;i<8;i++) {c.StrokeColor=Ui.Gold.WithAlpha(.05f+i*.008f);var p=new PathF();p.MoveTo(r.Width*.3f,r.Height+40);p.CurveTo(r.Width*.76f,r.Height+i*5,r.Width*.72f,r.Height*.5f+i*5,r.Width+100,15+i*8);c.DrawPath(p);}
}
}
public sealed class AdDrawable : IDrawable
{
public void Draw(ICanvas c,RectF r)
{
c.StrokeColor=Ui.Bronze.WithAlpha(.17f);c.StrokeSize=1;
for(int i=0;i<5;i++)c.DrawCircle(r.Width-20,r.Height/2,35+i*20);
c.StrokeColor=Ui.Bronze.WithAlpha(.5f);c.StrokeSize=1.5f;var p=new PathF();float x=r.Width-63,y=r.Height/2;p.MoveTo(x-25,y-6);p.LineTo(x,y-25);p.LineTo(x+25,y-6);c.DrawPath(p);c.DrawRoundedRectangle(x-18,y-6,36,37,3);c.DrawLine(x-9,y+6,x+9,y+6);c.DrawLine(x-9,y+15,x+9,y+15);c.DrawLine(x,y,x,y+25);
}
}
public sealed class IncomeDrawable(IReadOnlyList<(string label,decimal value)> data) : IDrawable
{
public void Draw(ICanvas c,RectF r)
{
float baseline=r.Height-27,top=24;decimal max=Math.Max(1,data.Max(p=>p.value));c.FontSize=10;c.FontColor=Ui.Muted;c.StrokeColor=Ui.Line;c.StrokeSize=1;
for(int i=0;i<3;i++){float y=top+i*(baseline-top)/2;c.DrawLine(0,y,r.Width,y);}
float cell=r.Width/data.Count;
for(int i=0;i<data.Count;i++) {float height=(float)(data[i].value/max)*(baseline-top-12),x=i*cell+cell*.25f;c.FillColor=i==data.Count-1?Ui.Bronze:Ui.Gold.WithAlpha(.45f);if(height>0)c.FillRoundedRectangle(x,baseline-height,cell*.5f,height,4);c.DrawString(data[i].label,i*cell,baseline+10,cell,16,HorizontalAlignment.Center,VerticalAlignment.Center);if(data[i].value>0)c.DrawString(data[i].value.ToString("0.##"),i*cell,baseline-height-18,cell,15,HorizontalAlignment.Center,VerticalAlignment.Center);}
if(data.All(p=>p.value==0)) {c.FontColor=Ui.Muted;c.FontSize=12;c.DrawString("暂无收入数据",0,60,r.Width,30,HorizontalAlignment.Center,VerticalAlignment.Center);}
}
}
namespace JiDangJia.Views;
public sealed class RibbonDrawable : IDrawable
{
public void Draw(ICanvas c,RectF r)
{
c.StrokeSize=.65f;
for(int i=0;i<8;i++) {c.StrokeColor=Ui.Gold.WithAlpha(.05f+i*.008f);var p=new PathF();p.MoveTo(r.Width*.3f,r.Height+40);p.CurveTo(r.Width*.76f,r.Height+i*5,r.Width*.72f,r.Height*.5f+i*5,r.Width+100,15+i*8);c.DrawPath(p);}
}
}
public sealed class AdDrawable : IDrawable
{
public void Draw(ICanvas c,RectF r)
{
c.StrokeColor=Ui.Bronze.WithAlpha(.17f);c.StrokeSize=1;
for(int i=0;i<5;i++)c.DrawCircle(r.Width-20,r.Height/2,35+i*20);
c.StrokeColor=Ui.Bronze.WithAlpha(.5f);c.StrokeSize=1.5f;var p=new PathF();float x=r.Width-63,y=r.Height/2;p.MoveTo(x-25,y-6);p.LineTo(x,y-25);p.LineTo(x+25,y-6);c.DrawPath(p);c.DrawRoundedRectangle(x-18,y-6,36,37,3);c.DrawLine(x-9,y+6,x+9,y+6);c.DrawLine(x-9,y+15,x+9,y+15);c.DrawLine(x,y,x,y+25);
}
}
public sealed class IncomeDrawable(IReadOnlyList<(string label,decimal value)> data) : IDrawable
{
public void Draw(ICanvas c,RectF r)
{
float baseline=r.Height-27,top=24;decimal max=Math.Max(1,data.Max(p=>p.value));c.FontSize=10;c.FontColor=Ui.Muted;c.StrokeColor=Ui.Line;c.StrokeSize=1;
for(int i=0;i<3;i++){float y=top+i*(baseline-top)/2;c.DrawLine(0,y,r.Width,y);}
float cell=r.Width/data.Count;
for(int i=0;i<data.Count;i++) {float height=(float)(data[i].value/max)*(baseline-top-12),x=i*cell+cell*.25f;c.FillColor=i==data.Count-1?Ui.Bronze:Ui.Gold.WithAlpha(.45f);if(height>0)c.FillRoundedRectangle(x,baseline-height,cell*.5f,height,4);c.DrawString(data[i].label,i*cell,baseline+10,cell,16,HorizontalAlignment.Center,VerticalAlignment.Center);if(data[i].value>0)c.DrawString(data[i].value.ToString("0.##"),i*cell,baseline-height-18,cell,15,HorizontalAlignment.Center,VerticalAlignment.Center);}
if(data.All(p=>p.value==0)) {c.FontColor=Ui.Muted;c.FontSize=12;c.DrawString("暂无收入数据",0,60,r.Width,30,HorizontalAlignment.Center,VerticalAlignment.Center);}
}
}