import 'package:flutter/material.dart'; import 'package:sudoku_app/models/sudoku_theme.dart'; class NumberPad extends StatelessWidget { final int blockSize; final SudokuTheme theme; final Map numberCounts; final int? selectedNumber; final Function(int) onNumberTapped; final bool isLandscape; // ๐Ÿ‘ˆ [์ถ”๊ฐ€] ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค const NumberPad({ super.key, required this.blockSize, required this.theme, required this.numberCounts, required this.selectedNumber, required this.onNumberTapped, required this.isLandscape, // ๐Ÿ‘ˆ [์ถ”๊ฐ€] ์ƒ์„ฑ์ž์— ์ถ”๊ฐ€ }); @override Widget build(BuildContext context) { final int gridSize = blockSize * blockSize; // 1. ๋ฒ„ํŠผ ์œ„์ ฏ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ List numberButtons = List.generate(gridSize, (index) { int numberValue = index + 1; String numberSymbol = theme.getSymbol(numberValue); bool isSelected = (numberValue == selectedNumber); bool isCompleted = (numberCounts[numberValue] ?? 0) >= gridSize; Widget button = ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: isSelected ? Colors.blue.shade300 : null, foregroundColor: isSelected ? Colors.white : null, padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 0), textStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)) ), onPressed: isCompleted ? null : () => onNumberTapped(numberValue), child: Text(numberSymbol), ); // ๊ฐ€๋กœ ๋ชจ๋“œ(Wrap)์—์„œ๋Š” Flexible๋กœ ๊ฐ์‹ธ๊ณ , // ์„ธ๋กœ ๋ชจ๋“œ(Grid)์—์„œ๋Š” ๊ฐ์‹ธ์ง€ ์•Š์Œ if (isLandscape) { // Flexible์„ ์‚ฌ์šฉํ•ด Wrap ๋‚ด์—์„œ ๋ฒ„ํŠผ์ด ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋„๋ก ํ•จ return Flexible(child: button); } else { return button; } }); // 2. ๊ฐ€๋กœ/์„ธ๋กœ ๋ชจ๋“œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ ๋ฐ˜ํ™˜ if (isLandscape) { // --- ๊ฐ€๋กœ ๋ชจ๋“œ: Wrap ์‚ฌ์šฉ (๋ฒ„ํŠผ์ด ๊ฐ€๋กœ๋กœ ํ๋ฆ„) --- return Wrap( runSpacing: 4.0, // ์ค„(์„ธ๋กœ) ๊ฐ„๊ฒฉ spacing: 4.0, // ๋ฒ„ํŠผ(๊ฐ€๋กœ) ๊ฐ„๊ฒฉ children: numberButtons, ); } else { // --- ์„ธ๋กœ ๋ชจ๋“œ: GridView ์‚ฌ์šฉ (๋ธ”๋ก ๋ชจ์–‘) --- return GridView.count( crossAxisCount: blockSize, // 2x2, 3x3, 4x4, 5x5 shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, mainAxisSpacing: 4, crossAxisSpacing: 4, children: numberButtons, ); } } }