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
This commit is part of merge request !2. Comments created here will be created in the context of that merge request.
......@@ -2,26 +2,109 @@ import 'package:flutter/foundation.dart';
class Data extends ChangeNotifier {
// randomization
bool _searchingImage = false;
String _image = '';
// Configuration available values
List _availableDifficultyLevels = ['easy', 'medium', 'hard'];
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) {
_searchingImage = value;
// Application default configuration
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();
}
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();
}
String get image => _image;
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) {
_image = value;
updateCellValue(int col, int row, int value) {
_cells[row][col].value = value;
notifyListeners();
}
void resetGame() {
_image = '';
bool get stateRunning => _stateRunning;
set updateStateRunning(bool stateRunning) {
_stateRunning = stateRunning;
notifyListeners();
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../entities/cell.dart';
import '../provider/data.dart';
class Home extends StatelessWidget {
static const String id = 'home';
@override
Widget build(BuildContext context) {
Data _myProvider = Provider.of<Data>(context);
static const double _parameterButtonSize = 70;
static const double _startButtonSize = 150;
return Scaffold(
appBar: AppBar(
title: Text('Sudoku'),
),
body: Center(
Future<void> resetGame(Data myProvider) async {
myProvider.updateStateRunning = false;
}
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: <Widget>[
Container(
child: Column(
children: [
_buildParameterSelector(myProvider, 'difficulty'),
_buildParameterSelector(myProvider, 'size'),
_buildParameterSelector(myProvider, 'skin'),
_buildStartGameButton(myProvider),
],
),
);
}
Column _buildStartGameButton(Data myProvider) {
return Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.all(4),
padding: EdgeInsets.all(4),
FlatButton(
child: Image(
image: AssetImage('assets/icons/button_start.png'),
width: _startButtonSize,
height: _startButtonSize,
fit: BoxFit.fill
),
onPressed: () => startGame(myProvider),
)
],
);
}
Column _buildParameterSelector(Data myProvider, String parameterCode) {
List availableValues = myProvider.getParameterAvailableValues(parameterCode);
return Column(
children: [
Table(
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.blue,
borderRadius: BorderRadius.circular(4),
color: Colors.white,
borderRadius: BorderRadius.circular(10),
border: Border.all(
color: Colors.green,
width: 4,
color: isActive ? Colors.blue : Colors.white,
width: 10,
),
),
child: FlatButton(
child: Text(
'🎲',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 50,
fontWeight: FontWeight.w600,
color: Colors.black,
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:
flutter:
uses-material-design: true
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