feat: redesign page1 header - centered title, info boxes row (Tipologia/Data/Bid/Ask)
This commit is contained in:
@@ -73,41 +73,74 @@ public class AnagraficaSectionRenderer : IPdfSectionRenderer
|
||||
|
||||
private float DrawTitle(PdfGraphics g, CertificateInfo info, float w, float y)
|
||||
{
|
||||
// ISIN + titolo a sinistra
|
||||
// ── Titolo centrato ──────────────────────────────────────────
|
||||
g.DrawString($"Scheda Prodotto {info.Isin}",
|
||||
PdfTheme.SectionTitleFont,
|
||||
new PdfSolidBrush(PdfTheme.AccentBlue),
|
||||
new RectangleF(0, y, w * 0.65f, 20f));
|
||||
|
||||
// Bid/Ask a destra
|
||||
if (!string.IsNullOrEmpty(info.Bid) && !string.IsNullOrEmpty(info.Ask))
|
||||
{
|
||||
string bidAsk = $"{info.Bid} BID {info.Ask} ASK";
|
||||
g.DrawString(info.LastPriceDate, PdfTheme.Small,
|
||||
new PdfSolidBrush(PdfTheme.TextSecondary),
|
||||
new RectangleF(w * 0.65f, y, w * 0.35f, 10f),
|
||||
new PdfStringFormat(PdfTextAlignment.Right));
|
||||
g.DrawString(bidAsk, PdfTheme.Bold,
|
||||
new PdfSolidBrush(PdfTheme.AccentBlue),
|
||||
new RectangleF(w * 0.65f, y + 10f, w * 0.35f, 12f),
|
||||
new PdfStringFormat(PdfTextAlignment.Right));
|
||||
}
|
||||
|
||||
y += 22f;
|
||||
|
||||
// Tipologia sotto il titolo
|
||||
if (!string.IsNullOrEmpty(info.Categoria))
|
||||
{
|
||||
g.DrawString($"Tipologia: {info.Categoria}", PdfTheme.Regular,
|
||||
new PdfSolidBrush(PdfTheme.TextSecondary),
|
||||
new RectangleF(0, y, w, 12f));
|
||||
y += 13f;
|
||||
}
|
||||
new RectangleF(0, y, w, 20f),
|
||||
new PdfStringFormat(PdfTextAlignment.Center));
|
||||
y += 24f;
|
||||
|
||||
// Linea separatrice blu
|
||||
g.DrawLine(PdfTheme.AccentBluePen, 0, y + 2f, w, y + 2f);
|
||||
g.DrawLine(PdfTheme.AccentBluePen, 0, y, w, y);
|
||||
y += 8f;
|
||||
|
||||
// ── Riga box: Tipologia | Data | Bid | Ask ───────────────────
|
||||
const float boxH = 28f;
|
||||
const float gap = 6f;
|
||||
const float dataW = 84f;
|
||||
const float bidW = 70f;
|
||||
const float askW = 70f;
|
||||
|
||||
bool showTip = !string.IsNullOrEmpty(info.Categoria);
|
||||
bool showData = !string.IsNullOrEmpty(info.LastPriceDate);
|
||||
bool showBidAsk = !string.IsNullOrEmpty(info.Bid) && !string.IsNullOrEmpty(info.Ask);
|
||||
|
||||
// Calcolo dinamico larghezza Tipologia in base ai box presenti
|
||||
int nBoxes = (showTip ? 1 : 0) + (showData ? 1 : 0) + (showBidAsk ? 2 : 0);
|
||||
float totalGaps = Math.Max(0, nBoxes - 1) * gap;
|
||||
float fixedW = (showData ? dataW : 0f) + (showBidAsk ? bidW + askW : 0f);
|
||||
float tipW = showTip ? (w - totalGaps - fixedW) : 0f;
|
||||
|
||||
float xCursor = 0f;
|
||||
|
||||
if (showTip)
|
||||
{
|
||||
DrawInfoBox(g, xCursor, y, tipW, boxH,
|
||||
"TIPOLOGIA", info.Categoria,
|
||||
PdfTheme.BoxLightBlueBgBrush, PdfTheme.AccentBlueBrush,
|
||||
PdfTheme.AccentBlueBrush, PdfTheme.AccentBlueDarkBrush,
|
||||
PdfTheme.Bold);
|
||||
xCursor += tipW + gap;
|
||||
}
|
||||
|
||||
if (showData)
|
||||
{
|
||||
DrawInfoBox(g, xCursor, y, dataW, boxH,
|
||||
"DATA", info.LastPriceDate,
|
||||
PdfTheme.BoxGrayBgBrush, PdfTheme.BoxGrayAccentBrush,
|
||||
PdfTheme.BoxGrayLabelBrush, PdfTheme.BoxGrayValueBrush,
|
||||
PdfTheme.Bold);
|
||||
xCursor += dataW + gap;
|
||||
}
|
||||
|
||||
if (showBidAsk)
|
||||
{
|
||||
DrawInfoBox(g, xCursor, y, bidW, boxH,
|
||||
"BID", info.Bid,
|
||||
PdfTheme.BoxLightBlueBgBrush, PdfTheme.AccentBlueBrush,
|
||||
PdfTheme.AccentBlueBrush, PdfTheme.AccentBlueDarkBrush,
|
||||
PdfTheme.Bold);
|
||||
xCursor += bidW + gap;
|
||||
|
||||
DrawInfoBox(g, xCursor, y, askW, boxH,
|
||||
"ASK", info.Ask,
|
||||
PdfTheme.BoxLightBlueBgBrush, PdfTheme.AccentBlueBrush,
|
||||
PdfTheme.AccentBlueBrush, PdfTheme.AccentBlueDarkBrush,
|
||||
PdfTheme.Bold);
|
||||
}
|
||||
|
||||
y += boxH + 10f;
|
||||
return y;
|
||||
}
|
||||
|
||||
@@ -125,6 +158,28 @@ public class AnagraficaSectionRenderer : IPdfSectionRenderer
|
||||
return y + 16f;
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// INFO BOX (box colorato con accent line laterale)
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
private void DrawInfoBox(
|
||||
PdfGraphics g,
|
||||
float x, float y, float w, float boxH,
|
||||
string label, string value,
|
||||
PdfBrush bgBrush, PdfBrush accentBrush,
|
||||
PdfBrush labelBrush, PdfBrush valueBrush,
|
||||
PdfFont valueFont)
|
||||
{
|
||||
g.DrawRectangle(bgBrush, new RectangleF(x, y, w, boxH));
|
||||
g.DrawRectangle(accentBrush, new RectangleF(x, y, 4f, boxH));
|
||||
float innerX = x + 4f + 6f;
|
||||
float innerW = w - 4f - 6f - 4f;
|
||||
g.DrawString(label, PdfTheme.Small, labelBrush,
|
||||
new RectangleF(innerX, y + 4f, innerW, 10f));
|
||||
g.DrawString(value, valueFont, valueBrush,
|
||||
new RectangleF(innerX, y + 14f, innerW, 14f));
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// SEZIONE A: CARATTERISTICHE PRODOTTO
|
||||
// Sinistra: tabella emittente | Destra: cedole + rendimento totale
|
||||
|
||||
Reference in New Issue
Block a user