clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

refactor/root-tui-model
puzzletea / games / sudoku / print_adapter.go
print_adapter.go 2.7K
1package sudoku23import (4 "strconv"56 "codeberg.org/go-pdf/fpdf"7 "github.com/FelineStateMachine/puzzletea/export/pdf"8)910type printAdapter struct{}1112var PDFPrintAdapter = printAdapter{}1314func (printAdapter) CanonicalGameType() string { return "Sudoku" }15func (printAdapter) Aliases() []string { return []string{"sudoku"} }1617func (printAdapter) BuildPDFPayload(save []byte) (any, error) {18 return pdfexport.ParseSudokuPrintData(save)19}2021func (printAdapter) RenderPDFBody(pdf *fpdf.Fpdf, payload any) error {22 switch data := payload.(type) {23 case *pdfexport.SudokuData:24 renderSudokuPage(pdf, data)25 }26 return nil27}2829func renderSudokuPage(pdf *fpdf.Fpdf, data *pdfexport.SudokuData) {30 if data == nil {31 return32 }3334 pageW, pageH := pdf.GetPageSize()35 pageNo := pdf.PageNo()36 body := pdfexport.PuzzleBodyRect(pageW, pageH, pageNo)37 rules := []string{"Fill rows, columns, and 3x3 boxes with 1-9"}38 ruleLines := pdfexport.InstructionLineCount(pdf, body.W, rules)39 area := pdfexport.PuzzleBoardRect(pageW, pageH, pageNo, ruleLines)40 cellSize := pdfexport.FitSudokuCellSize(9, 9, area)41 if cellSize <= 0 {42 return43 }4445 boardH := 9.0 * cellSize46 startX, startY := pdfexport.CenteredOrigin(area, 9, 9, cellSize)4748 drawSudokuGridLines(pdf, startX, startY, cellSize)49 drawSudokuGivens(pdf, startX, startY, cellSize, data.Givens)5051 ruleY := pdfexport.InstructionY(startY+boardH, pageH, ruleLines)52 pdfexport.RenderInstructions(pdf, body.X, ruleY, body.W, rules)53}5455func drawSudokuGridLines(pdf *fpdf.Fpdf, startX, startY, cellSize float64) {56 pdf.SetDrawColor(25, 25, 25)5758 for i := range 10 {59 x := startX + float64(i)*cellSize60 pdf.SetLineWidth(sudokuLineWidthFor(i))61 pdf.Line(x, startY, x, startY+9.0*cellSize)62 }6364 for i := range 10 {65 y := startY + float64(i)*cellSize66 pdf.SetLineWidth(sudokuLineWidthFor(i))67 pdf.Line(startX, y, startX+9.0*cellSize, y)68 }69}7071func sudokuLineWidthFor(index int) float64 {72 switch {73 case index == 0 || index == 9:74 return 0.7275 case index%3 == 0:76 return 0.5677 default:78 return pdfexport.ThinGridLineMM79 }80}8182func drawSudokuGivens(pdf *fpdf.Fpdf, startX, startY, cellSize float64, givens [9][9]int) {83 fontSize := pdfexport.StandardCellFontSize(cellSize, 0.62)84 lineH := fontSize * 0.8585 pdf.SetFont(pdfexport.SansFontFamily, "B", fontSize)86 pdf.SetTextColor(pdfexport.PrimaryTextGray, pdfexport.PrimaryTextGray, pdfexport.PrimaryTextGray)8788 for y := range 9 {89 for x := range 9 {90 value := givens[y][x]91 if value < 1 || value > 9 {92 continue93 }94 cellX := startX + float64(x)*cellSize95 cellY := startY + float64(y)*cellSize96 pdf.SetXY(cellX, cellY+(cellSize-lineH)/2)97 pdf.CellFormat(cellSize, lineH, strconv.Itoa(value), "", 0, "C", false, 0, "")98 }99 }100}