Skip to content
Snippets Groups Projects
Commit 624bf28e authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Add minimal home page, settings and gameplay

parent 62756e34
No related branches found
No related tags found
1 merge request!2Resolve "Add minimal gameplay"
Pipeline #1363 passed
...@@ -2,26 +2,109 @@ import 'package:flutter/foundation.dart'; ...@@ -2,26 +2,109 @@ import 'package:flutter/foundation.dart';
class Data extends ChangeNotifier { class Data extends ChangeNotifier {
// randomization // Configuration available values
bool _searchingImage = false; List _availableDifficultyLevels = ['easy', 'medium', 'hard'];
String _image = ''; List _availableSizes = [2, 3];
List _availableSkins = ['default'];
bool get searchingImage => _searchingImage; List get availableDifficultyLevels => _availableDifficultyLevels;
List get availableSizes => _availableSizes;
List get availableSkins => _availableSkins;
set searchingImage(bool value) { // Application default configuration
_searchingImage = value; String _level = 'medium';
int _size = 3;
String _skin = 'default';
// Game data
bool _stateRunning = false;
List _cells = [];
int _currentCellCol = null;
int _currentCellRow = null;
String get level => _level;
set updateLevel(String level) {
_level = level;
notifyListeners(); notifyListeners();
} }
String get image => _image; int get size => _size;
set updateSize(int size) {
_size = size;
notifyListeners();
}
String get skin => _skin;
set updateSkin(String skin) {
_skin = skin;
notifyListeners();
}
getParameterValue(String parameterCode) {
switch(parameterCode) {
case 'difficulty': { return _level; }
break;
case 'size': { return _size; }
break;
case 'skin': { return _skin; }
break;
}
}
List getParameterAvailableValues(String parameterCode) {
switch(parameterCode) {
case 'difficulty': { return _availableDifficultyLevels; }
break;
case 'size': { return _availableSizes; }
break;
case 'skin': { return _availableSkins; }
break;
}
}
setParameterValue(String parameterCode, var parameterValue) {
switch(parameterCode) {
case 'difficulty': { updateLevel = parameterValue; }
break;
case 'size': { updateSize = parameterValue; }
break;
case 'skin': { updateSkin = parameterValue; }
break;
}
}
List get cells => _cells;
set updateCells(List cells) {
_cells = cells;
notifyListeners();
}
int get currentCellCol => _currentCellCol;
set updateCurrentCellCol(int currentCellCol) {
_currentCellCol = currentCellCol;
notifyListeners();
}
int get currentCellRow => _currentCellRow;
set updateCurrentCellRow(int currentCellRow) {
_currentCellRow = currentCellRow;
notifyListeners();
}
selectCell(int col, int row) {
_currentCellCol = col;
_currentCellRow = row;
notifyListeners();
}
set updateImage(String value) { updateCellValue(int col, int row, int value) {
_image = value; _cells[row][col].value = value;
notifyListeners(); notifyListeners();
} }
void resetGame() { bool get stateRunning => _stateRunning;
_image = ''; set updateStateRunning(bool stateRunning) {
_stateRunning = stateRunning;
notifyListeners(); notifyListeners();
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../entities/cell.dart';
import '../provider/data.dart'; import '../provider/data.dart';
class Home extends StatelessWidget { class Home extends StatelessWidget {
static const String id = 'home'; static const String id = 'home';
@override static const double _parameterButtonSize = 70;
Widget build(BuildContext context) { static const double _startButtonSize = 150;
Data _myProvider = Provider.of<Data>(context);
return Scaffold( Future<void> resetGame(Data myProvider) async {
appBar: AppBar( myProvider.updateStateRunning = false;
title: Text('Sudoku'), }
Future<void> startGame(Data myProvider) async {
myProvider.updateStateRunning = true;
myProvider.updateCells = createEmptyBoard(myProvider.size);
}
List createEmptyBoard(int size) {
int index = 0;
List cells = [];
for (var rowIndex = 0; rowIndex < (size * size); rowIndex++) {
List row = [];
for (var colIndex = 0; colIndex < (size * size); colIndex++) {
row.add(
Cell(
(index++ % ((size * size) + 1)), // for debug purpose only :')
colIndex,
rowIndex
)
);
}
cells.add(row);
}
return cells;
}
Container _buildParametersSelector(Data myProvider) {
return Container(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
_buildParameterSelector(myProvider, 'difficulty'),
_buildParameterSelector(myProvider, 'size'),
_buildParameterSelector(myProvider, 'skin'),
_buildStartGameButton(myProvider),
],
), ),
body: Center( );
child: Column( }
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ Column _buildStartGameButton(Data myProvider) {
Container( return Column(
child: Column( mainAxisSize: MainAxisSize.min,
mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, children: [
children: [ FlatButton(
Container( child: Image(
margin: EdgeInsets.all(4), image: AssetImage('assets/icons/button_start.png'),
padding: EdgeInsets.all(4), width: _startButtonSize,
decoration: BoxDecoration( height: _startButtonSize,
color: Colors.blue, fit: BoxFit.fill
borderRadius: BorderRadius.circular(4), ),
border: Border.all( onPressed: () => startGame(myProvider),
color: Colors.green, )
width: 4, ],
), );
), }
child: FlatButton(
child: Text( Column _buildParameterSelector(Data myProvider, String parameterCode) {
'🎲', List availableValues = myProvider.getParameterAvailableValues(parameterCode);
textAlign: TextAlign.center,
style: TextStyle( return Column(
fontSize: 50, children: [
fontWeight: FontWeight.w600, Table(
color: Colors.black, defaultColumnWidth: IntrinsicColumnWidth(),
), children: [
), TableRow(
), children: [
for (var index = 0; index < availableValues.length; index++)
Column(
children: [
_buildParameterButton(myProvider, parameterCode, availableValues[index])
]
), ),
], ],
),
), ),
], ],
), ),
SizedBox(height: 20),
]
);
}
FlatButton _buildParameterButton(Data myProvider, String parameterCode, var parameterValue) {
String currentValue = myProvider.getParameterValue(parameterCode).toString();
bool isActive = (parameterValue.toString() == currentValue);
String imageAsset = 'assets/icons/' + parameterCode + '_' + parameterValue.toString() + '.png';
return FlatButton(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
border: Border.all(
color: isActive ? Colors.blue : Colors.white,
width: 10,
),
),
child: Image(
image: AssetImage(imageAsset),
width: _parameterButtonSize,
height: _parameterButtonSize,
fit: BoxFit.fill
),
),
onPressed: () => myProvider.setParameterValue(parameterCode, parameterValue),
);
}
Container _buildGameWidget(Data myProvider) {
return Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildGameBoard(myProvider),
SizedBox(height: 2),
_buildSelectCellValueBar(myProvider)
],
),
);
}
Container _buildGameBoard(Data myProvider) {
List cells = myProvider.cells;
int size = myProvider.size;
Color borderColor = _checkBoardIsSolved(cells) ? Colors.green : Colors.orange;
return Container(
margin: EdgeInsets.all(2),
padding: EdgeInsets.all(2),
decoration: BoxDecoration(
color: borderColor,
borderRadius: BorderRadius.circular(2),
border: Border.all(
color: borderColor,
width: 2,
),
),
child: Table(
defaultColumnWidth: IntrinsicColumnWidth(),
children: [
for (var row = 0; row < (size * size); row++)
TableRow(children: [
for (var col = 0; col < (size * size); col++)
Column(children: [
cells[row][col].widget(myProvider)
]),
]),
]
),
);
}
Container _buildSelectCellValueBar(Data myProvider) {
List cells = myProvider.cells;
int size = myProvider.size;
Color borderColor = Colors.blue;
bool isCellSelected = (myProvider.currentCellCol != null && myProvider.currentCellRow != null);
return Container(
margin: EdgeInsets.all(2),
padding: EdgeInsets.all(2),
child: Table(
defaultColumnWidth: IntrinsicColumnWidth(),
children: [
TableRow(
children: [
for (var value = 0; value < ((size * size) + 1); value++)
Column(
children: [
Cell(
isCellSelected ? value : 0,
isCellSelected ? myProvider.currentCellCol : null,
isCellSelected ? myProvider.currentCellRow : null
).widgetUpdateValue(myProvider)
]
),
]
),
]
), ),
); );
} }
bool _checkBoardIsSolved(List cells) {
return false;
}
@override
Widget build(BuildContext context) {
Data myProvider = Provider.of<Data>(context);
return Scaffold(
appBar: AppBar(
title: Text('🔢'),
actions: [
if (myProvider.stateRunning)
FlatButton(
child: Text('◀️'),
onPressed: () => resetGame(myProvider),
),
],
),
body: SafeArea(
child: Center(
child: myProvider.stateRunning ? _buildGameWidget(myProvider) : _buildParametersSelector(myProvider)
),
)
);
}
} }
...@@ -18,4 +18,5 @@ dev_dependencies: ...@@ -18,4 +18,5 @@ dev_dependencies:
flutter: flutter:
uses-material-design: true uses-material-design: true
assets: assets:
- assets/files/ - assets/icons/
- assets/skins/
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment