Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
org.benoitharrault.sudoku
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
android
org.benoitharrault.sudoku
Commits
624bf28e
Commit
624bf28e
authored
3 years ago
by
Benoît Harrault
Browse files
Options
Downloads
Patches
Plain Diff
Add minimal home page, settings and gameplay
parent
62756e34
No related branches found
No related tags found
1 merge request
!2
Resolve "Add minimal gameplay"
Pipeline
#1363
passed
3 years ago
Stage: update
Stage: build-debug
Changes
43
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
lib/provider/data.dart
+94
-11
94 additions, 11 deletions
lib/provider/data.dart
lib/screens/home.dart
+217
-39
217 additions, 39 deletions
lib/screens/home.dart
pubspec.yaml
+2
-1
2 additions, 1 deletion
pubspec.yaml
with
313 additions
and
51 deletions
lib/provider/data.dart
+
94
−
11
View file @
624bf28e
...
@@ -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
update
Image
(
Str
in
g
value
)
{
update
CellValue
(
int
col
,
int
row
,
in
t
value
)
{
_
imag
e
=
value
;
_
cells
[
row
][
col
]
.
valu
e
=
value
;
notifyListeners
();
notifyListeners
();
}
}
void
resetGame
()
{
bool
get
stateRunning
=
>
_stateRunning
;
_image
=
''
;
set
updateStateRunning
(
bool
stateRunning
)
{
_stateRunning
=
stateRunning
;
notifyListeners
();
notifyListeners
();
}
}
}
}
This diff is collapsed.
Click to expand it.
lib/screens/home.dart
+
217
−
39
View file @
624bf28e
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
)
),
)
);
}
}
}
This diff is collapsed.
Click to expand it.
pubspec.yaml
+
2
−
1
View file @
624bf28e
...
@@ -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/
This diff is collapsed.
Click to expand it.
Prev
1
2
3
Next
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment