Dogeku 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +39 -0
- data/app/Historique/Action.rb +29 -0
- data/app/Historique/ChangerCase.rb +44 -0
- data/app/Historique/HistoriqueAction.rb +114 -0
- data/app/components/CaseDessin.rb +325 -0
- data/app/components/GrilleDessin.rb +235 -0
- data/app/components/Header.rb +194 -0
- data/app/config/app.yml +0 -0
- data/app/config/database.yml +2 -0
- data/app/controller/ApprentissageControleur.rb +75 -0
- data/app/controller/ChargerControleur.rb +41 -0
- data/app/controller/JeuLibreControleur.rb +244 -0
- data/app/controller/MenuControleur.rb +57 -0
- data/app/controller/NiveauControleur.rb +54 -0
- data/app/controller/NouvellePartieControleur.rb +34 -0
- data/app/controller/PrincipaleControleur.rb +30 -0
- data/app/controller/PseudoControleur.rb +95 -0
- data/app/controller/ReglagesControleur.rb +86 -0
- data/app/controller/ReglesControleur.rb +34 -0
- data/app/controller/ScoresControleur.rb +42 -0
- data/app/controller/StatistiquesControleur.rb +64 -0
- data/app/core/Conf.rb +26 -0
- data/app/core/Controller.rb +180 -0
- data/app/core/Core.rb +186 -0
- data/app/core/Model.rb +159 -0
- data/app/core/View.rb +56 -0
- data/app/db/main.sqlite3 +0 -0
- data/app/model/Configuration.rb +180 -0
- data/app/model/Grille.rb +180 -0
- data/app/model/Jeu.rb +74 -0
- data/app/model/Score.rb +100 -0
- data/app/model/Utilisateur.rb +113 -0
- data/app/utils/DSubset.rb +98 -0
- data/app/utils/Generateur.rb +171 -0
- data/app/utils/HPTriple.rb +75 -0
- data/app/utils/Peche.rb +46 -0
- data/app/utils/SCandidate.rb +86 -0
- data/app/utils/SCell.rb +73 -0
- data/app/utils/Technique.rb +202 -0
- data/app/utils/TechniqueUsine.rb +25 -0
- data/app/utils/XWing.rb +203 -0
- data/app/view/Fenetre.rb +424 -0
- data/app/view/FenetreApprentissage.rb +272 -0
- data/app/view/FenetreCharger.rb +31 -0
- data/app/view/FenetreJeuLibre.rb +468 -0
- data/app/view/FenetreMenu.rb +198 -0
- data/app/view/FenetreNiveau.rb +105 -0
- data/app/view/FenetreNouvellePartie.rb +92 -0
- data/app/view/FenetrePrincipale.rb +45 -0
- data/app/view/FenetrePseudo.rb +115 -0
- data/app/view/FenetreReglages.rb +209 -0
- data/app/view/FenetreRegles.rb +111 -0
- data/app/view/FenetreScores.rb +120 -0
- data/app/view/FenetreStatistiques.rb +134 -0
- data/assets/css/style.css +69 -0
- data/assets/img/eraser.png +0 -0
- data/assets/img/fond.jpg +0 -0
- data/assets/img/iconApp.png +0 -0
- data/assets/img/logoS.jpeg +0 -0
- data/assets/img/sudokuIntro.jpg +0 -0
- data/assets/img/user.png +0 -0
- data/bin/dogeku +19 -0
- data/doc/Action.html +309 -0
- data/doc/ApprentissageControleur.html +568 -0
- data/doc/CaseDessin.html +2405 -0
- data/doc/ChangerCase.html +405 -0
- data/doc/ChargerControleur.html +342 -0
- data/doc/Conf.html +378 -0
- data/doc/Configuration.html +1115 -0
- data/doc/Controller.html +1008 -0
- data/doc/Core.html +1191 -0
- data/doc/DSubset.html +647 -0
- data/doc/Fenetre.html +2631 -0
- data/doc/FenetreApprentissage.html +1175 -0
- data/doc/FenetreCharger.html +343 -0
- data/doc/FenetreJeuLibre.html +1859 -0
- data/doc/FenetreMenu.html +900 -0
- data/doc/FenetreNiveau.html +626 -0
- data/doc/FenetreNouvellePartie.html +602 -0
- data/doc/FenetrePrincipale.html +371 -0
- data/doc/FenetrePseudo.html +695 -0
- data/doc/FenetreReglages.html +946 -0
- data/doc/FenetreRegles.html +636 -0
- data/doc/FenetreScores.html +650 -0
- data/doc/FenetreStatistiques.html +672 -0
- data/doc/Generateur.html +1015 -0
- data/doc/Grille.html +1348 -0
- data/doc/GrilleDessin.html +1281 -0
- data/doc/HPTriple.html +593 -0
- data/doc/Header.html +1253 -0
- data/doc/HistoriqueAction.html +792 -0
- data/doc/Jeu.html +923 -0
- data/doc/JeuLibreControleur.html +1445 -0
- data/doc/MenuControleur.html +522 -0
- data/doc/Model.html +996 -0
- data/doc/NiveauControleur.html +451 -0
- data/doc/NouvellePartieControleur.html +330 -0
- data/doc/Peche.html +396 -0
- data/doc/PrincipaleControleur.html +320 -0
- data/doc/PseudoControleur.html +695 -0
- data/doc/ReglagesControleur.html +747 -0
- data/doc/ReglesControleur.html +330 -0
- data/doc/SCandidate.html +617 -0
- data/doc/SCell.html +587 -0
- data/doc/Score.html +926 -0
- data/doc/ScoresControleur.html +346 -0
- data/doc/StatistiquesControleur.html +390 -0
- data/doc/Technique.html +543 -0
- data/doc/TechniqueUsine.html +252 -0
- data/doc/Utilisateur.html +806 -0
- data/doc/View.html +844 -0
- data/doc/XWing.html +1031 -0
- data/doc/_index.html +478 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +492 -0
- data/doc/file.README.html +141 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +141 -0
- data/doc/js/app.js +243 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +2523 -0
- data/doc/top-level-namespace.html +112 -0
- data/test/Generateur/grilleCorrecte.rb +198 -0
- data/test/Model/scoreCorrecte.rb +55 -0
- data/test/Model/utilisateurCorrecte.rb +68 -0
- data/test/test_helper.rb +2 -0
- data/test/unitTest.rb +72 -0
- metadata +187 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 7b19e310a2440b17d8bb566bb11320cc68d21eb9
|
|
4
|
+
data.tar.gz: f6859d3e8ce4573a24ea88e89cd682f5c4b493d7
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 79d958c04e6be14586b8a667b811876f6846a71dc16e41cfd58ef3f228a35a300fc286a201fb048d690b7358d3c97063f8b41e6f185371ce4f85e82374a88a8c
|
|
7
|
+
data.tar.gz: 837523155b97e2a1c38657125ade068dea39d4c9972a39ce6403b6d325b64bccce2b3ddde803082ea1914b8686602e056bf5a5ec8e3c8ec7fbcff2c2e84878eb
|
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2017
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
[](https://travis-ci.org/DanAurea/Sudoku-L3S6)
|
|
2
|
+
[](https://codeclimate.com/github/DanAurea/Sudoku-L3S6)
|
|
3
|
+
[](https://codeclimate.com/github/DanAurea/Sudoku-L3S6)
|
|
4
|
+
[](http://inch-ci.org/github/DanAurea/Sudoku-L3S6)
|
|
5
|
+
|
|
6
|
+
# Introduction
|
|
7
|
+
## Présentation
|
|
8
|
+
Sudoku-L3S6 est un projet d'une application ayant pour but d'élaborer un assistant à la résolution d'un Sudoku, le projet s'inscrivant dans le module de Génie Logiciel dispensé à l'Université du Maine en fin de semestre de licence 3 de Sciences Pour l'Ingénieur.
|
|
9
|
+
|
|
10
|
+
Ce Sudoku représente notre application de l'ensemble des connaissances étudiées au cours de cette année. Cela va de la gestion de projet (répartition des rôles, rédaction de cahier des charges et de conception, gestion d'un dépôt Github) à sa modélisation (programmation orientée objet, gestion de base de données) et à son lancement.
|
|
11
|
+
|
|
12
|
+
Pour jouer, l'utilisateur se connecte via un nom profil qu'il insère au début de l'application. Puis selon ce qu'il souhaite jouer, il peut choisir le mode 'Apprentissage avec aides' ou bien 'Jeu Libre'. Le premier mode permet de mieux cerner le fonctionnement de chaque technique d'aide à la résolution du Sudoku avec des instructions pas à pas tandis que le deuxième mode fait jouer l'utilisateur selon un niveau de difficulté qu'il aura choisi avec des aides qui lui coûteront des points pour le score final. Ce score lui permettra d'ailleurs de se comparer aux autres joueurs pour pouvoir voir sa progression.
|
|
13
|
+
De plus, l'utilisateur peut tout à fait modifier la police ainsi que les couleurs liées aux cases, au texte ou aux indices dans les règlages. S'il ne connaît pas les règles, un rappel lui est donné dans la section appropriée dans le menu principal.
|
|
14
|
+
|
|
15
|
+
## Composition de l'équipe et rôle
|
|
16
|
+
Cette application a été réalisé par 8 étudiants de l'Université du Maine en utilisant comme langage de programmation Ruby associé à la bibliothèque Gtk. Chaque membre du groupe a un rôle afin d'organiser au mieux le projet :
|
|
17
|
+
* Bodineau Bastien [__Développeur & Testeur unitaires__]
|
|
18
|
+
* Bussereau Keryann [__Développeur__]
|
|
19
|
+
* Cousin Brandon [__Architecte & Intégrateur__]
|
|
20
|
+
* Duran Alizée [__Documentaliste & Client-type__]
|
|
21
|
+
* Guenver Yann [__Développeur & Testeur intégration__]
|
|
22
|
+
* Jean Marvin [__Chef de projet__]
|
|
23
|
+
* Pavard Valentin [__Développeur GUI & Intégrateur__]
|
|
24
|
+
* Tabot Alexandre [__Développeur & Testeur intégration__]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# Installation
|
|
28
|
+
Pour installer l'application rien de plus simple:
|
|
29
|
+
|
|
30
|
+
> gem install Dogeku
|
|
31
|
+
>
|
|
32
|
+
|
|
33
|
+
Assurez-vous d'avoir SQLite3 et GTK3 d'installé sur votre machine pour utiliser l'application.
|
|
34
|
+
|
|
35
|
+
# Exécution
|
|
36
|
+
Pour lancer l'application lancer simplement la commande shell suivante:
|
|
37
|
+
|
|
38
|
+
> dogeku
|
|
39
|
+
>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# => Author:: keryann
|
|
2
|
+
# => Version:: 0.1
|
|
3
|
+
# => Copyright:: © 2016
|
|
4
|
+
# => License:: Distributes under the same terms as Ruby
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
## Classe Action permettant d'initialiser et afficher une étiquette
|
|
8
|
+
##
|
|
9
|
+
class Action
|
|
10
|
+
##VI
|
|
11
|
+
@etiquette
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
## Initialise l'étiquette
|
|
15
|
+
##
|
|
16
|
+
## @param etiquette The etiquette
|
|
17
|
+
##
|
|
18
|
+
def initialize(etiquette)
|
|
19
|
+
@etiquette=etiquette
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
## Affiche l'étiquette
|
|
24
|
+
##
|
|
25
|
+
def faire()
|
|
26
|
+
print @etiquette
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# => Author:: keryann
|
|
2
|
+
# => Version:: 0.1
|
|
3
|
+
# => Copyright:: © 2016
|
|
4
|
+
# => License:: Distributes under the same terms as Ruby
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
## Classe ChangerCase permettant de faire ou de défaire les actions de l'utilisateur
|
|
8
|
+
##
|
|
9
|
+
|
|
10
|
+
class ChangerCase < Action
|
|
11
|
+
##VI
|
|
12
|
+
@valeur
|
|
13
|
+
@ancienneValeur
|
|
14
|
+
@case
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## Initialise
|
|
18
|
+
##
|
|
19
|
+
## @param cas Case à initialiser
|
|
20
|
+
## @param entier Valeur à affecter à la case
|
|
21
|
+
##
|
|
22
|
+
def initialize(cas, entier)
|
|
23
|
+
@case=cas
|
|
24
|
+
@valeur=entier
|
|
25
|
+
@ancienneValeur=nil
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
##
|
|
29
|
+
## Change la valeur de la case
|
|
30
|
+
##
|
|
31
|
+
def faire()
|
|
32
|
+
@ancienneValeur=@case.get
|
|
33
|
+
@case.set(@valeur)
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
##
|
|
38
|
+
## Défait le changement
|
|
39
|
+
##
|
|
40
|
+
def defaire()
|
|
41
|
+
@ancienneValeur=@valeur
|
|
42
|
+
@case.set(@ancienneValeur)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
load "Action.rb"
|
|
2
|
+
|
|
3
|
+
## => Author:: keryann
|
|
4
|
+
## => version:: 0.1
|
|
5
|
+
## => copyright:: © 2016
|
|
6
|
+
## => license:: Distributes under the same terms as Ruby
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
## Classe pour l'historique des actions.
|
|
10
|
+
##--
|
|
11
|
+
## Regarder slice-1 pour enlever bas de la pile
|
|
12
|
+
##++
|
|
13
|
+
class HistoriqueAction
|
|
14
|
+
##VI
|
|
15
|
+
@pileRefaire
|
|
16
|
+
@pileDefaire
|
|
17
|
+
@maxActions
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
## Méthode qui effectue une action présente dans la pileDefaire
|
|
21
|
+
##
|
|
22
|
+
## @return lui-même
|
|
23
|
+
##
|
|
24
|
+
def faire()
|
|
25
|
+
action=@pileDefaire.last()
|
|
26
|
+
action.faire()
|
|
27
|
+
return self
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
##
|
|
32
|
+
## Méthode qui annule la dernière action et l'empile dans pileRefaire
|
|
33
|
+
##
|
|
34
|
+
## @return lui-même
|
|
35
|
+
##
|
|
36
|
+
def defaire()
|
|
37
|
+
@pileRefaire.push(@pileDefaire.pop())
|
|
38
|
+
action=@pileDefaire.last()
|
|
39
|
+
action.faire()
|
|
40
|
+
return self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
## Méthode qui permet de refaire une action qu'on a annulé
|
|
46
|
+
##
|
|
47
|
+
## @return lui-même
|
|
48
|
+
##
|
|
49
|
+
def refaire()
|
|
50
|
+
@pileDefaire.push(@pileRefaire.pop())
|
|
51
|
+
action=@pileDefaire.last()
|
|
52
|
+
action.faire()
|
|
53
|
+
return self
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
## Fonction d'initialisation
|
|
59
|
+
##
|
|
60
|
+
def initialize()
|
|
61
|
+
@pileRefaire=[]
|
|
62
|
+
@pileDefaire=[]
|
|
63
|
+
@maxActions=10
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
##
|
|
68
|
+
## Ajoute une nouvelle fonction dans la pileDefaire
|
|
69
|
+
##
|
|
70
|
+
## @param action L'action à ajouter
|
|
71
|
+
##
|
|
72
|
+
## @return lui-même
|
|
73
|
+
##
|
|
74
|
+
def nouvelleAction(action)
|
|
75
|
+
@pileDefaire.push(action)
|
|
76
|
+
return self
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
##
|
|
80
|
+
## Défait une action
|
|
81
|
+
##
|
|
82
|
+
## @return L'action dépilée
|
|
83
|
+
##
|
|
84
|
+
def defaireAction()
|
|
85
|
+
action=@pileDefaire.pop
|
|
86
|
+
@pileRefaire.push(action)
|
|
87
|
+
return action
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
##
|
|
92
|
+
## Fonction de test
|
|
93
|
+
##
|
|
94
|
+
def HistoriqueAction.Test()
|
|
95
|
+
histo=HistoriqueAction.new()
|
|
96
|
+
act1=Action.new("Premiere action")
|
|
97
|
+
act2=Action.new("Deuxieme action")
|
|
98
|
+
#act3=Action.new("Troisieme action")
|
|
99
|
+
#act4=Action.new("Quatrieme action")
|
|
100
|
+
#act5=Action.new("Cinquieme action")
|
|
101
|
+
histo.nouvelleAction(act1)
|
|
102
|
+
histo.nouvelleAction(act2)
|
|
103
|
+
#histo.nouvelleAction(act3)
|
|
104
|
+
#histo.nouvelleAction(act4)
|
|
105
|
+
#histo.nouvelleAction(act5)
|
|
106
|
+
histo.faire()
|
|
107
|
+
print("\n")
|
|
108
|
+
histo.defaire()
|
|
109
|
+
print("\n")
|
|
110
|
+
histo.refaire()
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
HistoriqueAction.Test()
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
require "observer"
|
|
2
|
+
require Core::ROOT + "model/Configuration.rb"
|
|
3
|
+
|
|
4
|
+
## => Author:: DanAurea
|
|
5
|
+
## => version:: 0.1
|
|
6
|
+
## => copyright:: © 2016
|
|
7
|
+
## => license:: Distributes under the same terms as Ruby
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
## Classe permettant de dessiner les cases d'une grille de Sudoku
|
|
11
|
+
##
|
|
12
|
+
class CaseDessin < Gtk::DrawingArea
|
|
13
|
+
include Observable
|
|
14
|
+
|
|
15
|
+
attr_accessor :x, :y, :size, :nombre, :editable, :indices, :indice, :state
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
## Initialisation
|
|
19
|
+
##
|
|
20
|
+
def initialize valeur, config
|
|
21
|
+
|
|
22
|
+
super()
|
|
23
|
+
|
|
24
|
+
@x = 0
|
|
25
|
+
@y = 0
|
|
26
|
+
|
|
27
|
+
@nombre = valeur["value"]
|
|
28
|
+
@editable = valeur["editable"]
|
|
29
|
+
@state = ""
|
|
30
|
+
|
|
31
|
+
@indices = {"1" => false, "2" => false, "3" => false, "4" => false, "5" => false, "6" => false, "7" => false, "8" => false, "9" => false}
|
|
32
|
+
@indice = false
|
|
33
|
+
|
|
34
|
+
config = config
|
|
35
|
+
@configurationModel = Configuration.instance()
|
|
36
|
+
|
|
37
|
+
@police = config["police"]
|
|
38
|
+
@taillePolice = config["taillePolice"]
|
|
39
|
+
@tailleIndices = @taillePolice / 2
|
|
40
|
+
|
|
41
|
+
# Prend en compte la configuration utilisateur
|
|
42
|
+
@couleurCase = @configurationModel.creerCouleur(config["caseBase"])
|
|
43
|
+
@couleurCaseFixe = @configurationModel.creerCouleur(config["caseFixe"])
|
|
44
|
+
@couleurIndices = @configurationModel.creerCouleur(config["couleurIndices"])
|
|
45
|
+
@couleurPolice = @configurationModel.creerCouleur(config["couleurTexte"])
|
|
46
|
+
@couleurSurlignee = @configurationModel.creerCouleur(config["caseSelectionne"])
|
|
47
|
+
|
|
48
|
+
## Crée la zone de dessin au signal draw
|
|
49
|
+
signal_connect "draw" do |_, cr|
|
|
50
|
+
dessiner cr
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
if(@editable == true)
|
|
54
|
+
## Ajoute les évènements de survol et de clics
|
|
55
|
+
add_events(Gdk::EventMask::ENTER_NOTIFY_MASK)
|
|
56
|
+
add_events(Gdk::EventMask::BUTTON_PRESS_MASK)
|
|
57
|
+
add_events(Gdk::EventMask::LEAVE_NOTIFY_MASK)
|
|
58
|
+
|
|
59
|
+
## Lie un callback sur la souris
|
|
60
|
+
signal_connect "button_press_event" do |_, evenement|
|
|
61
|
+
focused evenement
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
## Lie un callback sur l'entrée du curseur dans la zone
|
|
65
|
+
signal_connect "enter_notify_event" do
|
|
66
|
+
hover
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
## Lie un callback sur la sortie du curseur de la zone
|
|
70
|
+
signal_connect "leave_notify_event" do
|
|
71
|
+
leave
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
##
|
|
79
|
+
## Réinitialise les indices de la cases
|
|
80
|
+
##
|
|
81
|
+
def resetIndices
|
|
82
|
+
@indices = {"1" => false, "2" => false, "3" => false, "4" => false, "5" => false, "6" => false, "7" => false, "8" => false, "9" => false}
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
##
|
|
86
|
+
## Callback sur l'appui sur la souris (évènement ajouté à la main)
|
|
87
|
+
##
|
|
88
|
+
## @return self
|
|
89
|
+
##
|
|
90
|
+
def focused evenement
|
|
91
|
+
changed
|
|
92
|
+
|
|
93
|
+
## Clic gauche
|
|
94
|
+
if evenement.button == 1
|
|
95
|
+
@state = "clicked"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
notify_observers(@x, @y, @state)
|
|
99
|
+
|
|
100
|
+
return self
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
##
|
|
105
|
+
## Action lors du survol de la case
|
|
106
|
+
##
|
|
107
|
+
## @return self
|
|
108
|
+
##
|
|
109
|
+
def hover
|
|
110
|
+
changed
|
|
111
|
+
|
|
112
|
+
@state = "hover"
|
|
113
|
+
|
|
114
|
+
notify_observers(@x, @y, @state)
|
|
115
|
+
|
|
116
|
+
return self
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
##
|
|
120
|
+
## Définit l'état
|
|
121
|
+
##
|
|
122
|
+
def set_state=(etat)
|
|
123
|
+
if(@state != "equal")
|
|
124
|
+
@state = etat
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
## Action lors de la sortie du curseur de la case
|
|
130
|
+
##
|
|
131
|
+
## @return self
|
|
132
|
+
##
|
|
133
|
+
def leave
|
|
134
|
+
changed
|
|
135
|
+
|
|
136
|
+
@state = "leave"
|
|
137
|
+
|
|
138
|
+
notify_observers(@x, @y, @state)
|
|
139
|
+
|
|
140
|
+
return self
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
##
|
|
144
|
+
## Edite la couleur de la case
|
|
145
|
+
##
|
|
146
|
+
## @param cr case
|
|
147
|
+
##
|
|
148
|
+
## @return self
|
|
149
|
+
##
|
|
150
|
+
def couleurCase cr
|
|
151
|
+
if(@editable && @state != "focus" && @state != "hover")
|
|
152
|
+
cr.set_source_color @couleurCase
|
|
153
|
+
elsif(@state == "focus" || @state == "hover")
|
|
154
|
+
cr.set_source_color @couleurSurlignee
|
|
155
|
+
elsif(@state == "equal")
|
|
156
|
+
coeff = 0.7
|
|
157
|
+
rouge, vert, bleu = @couleurSurlignee.red * coeff, @couleurSurlignee.green * coeff, @couleurSurlignee.blue * coeff
|
|
158
|
+
composantes = [rouge, vert, bleu].join(",")
|
|
159
|
+
|
|
160
|
+
cr.set_source_color @configurationModel.creerCouleur(composantes)
|
|
161
|
+
|
|
162
|
+
else
|
|
163
|
+
cr.set_source_color @couleurCaseFixe
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
return self
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
##
|
|
170
|
+
## Définit la couleur de la police dans la case
|
|
171
|
+
##
|
|
172
|
+
## @param cr case
|
|
173
|
+
##
|
|
174
|
+
## @return self
|
|
175
|
+
##
|
|
176
|
+
def couleurPolice cr
|
|
177
|
+
if((@indice == false || !@editable || @nombre != nil))
|
|
178
|
+
cr.set_source_color @couleurPolice
|
|
179
|
+
else
|
|
180
|
+
cr.set_source_color @couleurIndices
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
return self
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
##
|
|
187
|
+
## Redessine la case avec les nouvelles valeurs si modifiées
|
|
188
|
+
##
|
|
189
|
+
def redessiner()
|
|
190
|
+
self.queue_draw
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
##
|
|
194
|
+
## Dessine une case
|
|
195
|
+
##
|
|
196
|
+
## @param cr case à dessiner
|
|
197
|
+
##
|
|
198
|
+
## @return self
|
|
199
|
+
##
|
|
200
|
+
def dessiner cr
|
|
201
|
+
|
|
202
|
+
## On définit la taille comme 1/12 de la fenêtre pour garder de l'espace
|
|
203
|
+
## pour les boutons
|
|
204
|
+
@size = Fenetre::fenetre.size[1] / 12
|
|
205
|
+
|
|
206
|
+
## Définit la largeur et la hauteur de la case (obligatoire pour gestion des évènements)
|
|
207
|
+
set_size_request(@size, @size )
|
|
208
|
+
|
|
209
|
+
## Définit la couleur pour le dessin en fonction du type de case
|
|
210
|
+
self.couleurCase cr
|
|
211
|
+
|
|
212
|
+
## Dessine un rectangle
|
|
213
|
+
cr.rectangle 0, 0, @size, @size
|
|
214
|
+
cr.fill
|
|
215
|
+
|
|
216
|
+
## Définit la couleur du texte
|
|
217
|
+
self.couleurPolice cr
|
|
218
|
+
|
|
219
|
+
if(@indice == false || !@editable || @nombre != nil)
|
|
220
|
+
dessinerChiffre cr
|
|
221
|
+
else
|
|
222
|
+
dessinerIndices cr
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
dessinerContour cr
|
|
226
|
+
|
|
227
|
+
cr.stroke
|
|
228
|
+
|
|
229
|
+
return self
|
|
230
|
+
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
##
|
|
235
|
+
## Dessine le contour de la case
|
|
236
|
+
##
|
|
237
|
+
## @param cr case
|
|
238
|
+
##
|
|
239
|
+
def dessinerContour cr
|
|
240
|
+
cr.set_source_rgb 0, 0, 0
|
|
241
|
+
|
|
242
|
+
cr.move_to 0 , 0
|
|
243
|
+
|
|
244
|
+
cr.set_line_width 0.5
|
|
245
|
+
|
|
246
|
+
## Calcule le chemin du contour de la case
|
|
247
|
+
cr.rel_line_to @size, 0
|
|
248
|
+
cr.rel_line_to 0, @size
|
|
249
|
+
cr.rel_line_to -@size, 0
|
|
250
|
+
cr.rel_line_to 0, -@size
|
|
251
|
+
cr.stroke
|
|
252
|
+
|
|
253
|
+
cr.set_line_width 7
|
|
254
|
+
|
|
255
|
+
## Bordure exétieure haut
|
|
256
|
+
if(@x == 0)
|
|
257
|
+
cr.move_to 0, 0
|
|
258
|
+
cr.line_to @size, 0
|
|
259
|
+
cr.stroke
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
## Bordure extérieur gauche
|
|
263
|
+
if(@y == 0)
|
|
264
|
+
cr.move_to 0, 0
|
|
265
|
+
cr.line_to 0, @size
|
|
266
|
+
cr.stroke
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
## Bordure bas
|
|
270
|
+
if(@x == 8 || @x % 3 == 2)
|
|
271
|
+
cr.move_to 0, @size
|
|
272
|
+
cr.line_to @size, @size
|
|
273
|
+
cr.stroke
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
## Bordure droite
|
|
277
|
+
if(@y == 8 || @y % 3 == 2)
|
|
278
|
+
cr.move_to @size, 0
|
|
279
|
+
cr.rel_line_to 0, @size
|
|
280
|
+
cr.stroke
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
##
|
|
286
|
+
## Dessine le chiffre
|
|
287
|
+
##
|
|
288
|
+
def dessinerChiffre cr
|
|
289
|
+
## Définis les caractéristiques du texte
|
|
290
|
+
cr.select_font_face @police,
|
|
291
|
+
Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL
|
|
292
|
+
cr.set_font_size @taillePolice
|
|
293
|
+
|
|
294
|
+
extents = cr.text_extents @nombre.to_s
|
|
295
|
+
cr.move_to @size / 2 - extents.width / 2, @size / 2 + extents.height / 2
|
|
296
|
+
## Déplace le curseur de texte au centre de la case
|
|
297
|
+
cr.show_text @nombre.to_s
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
##
|
|
301
|
+
## Dessine les indices
|
|
302
|
+
##
|
|
303
|
+
def dessinerIndices cr
|
|
304
|
+
cr.set_font_size @tailleIndices
|
|
305
|
+
|
|
306
|
+
col = 1
|
|
307
|
+
lig = 1
|
|
308
|
+
@indices.each do | key, value|
|
|
309
|
+
|
|
310
|
+
if(value == true)
|
|
311
|
+
extents = cr.text_extents key
|
|
312
|
+
cr.move_to (col * @size / 4) - extents.width / 2 , (lig * @size / 4).floor + (extents.height / 2).floor
|
|
313
|
+
## Déplace le curseur de texte au centre de la case
|
|
314
|
+
cr.show_text key
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
if key.to_i % 3 == 0
|
|
318
|
+
lig += 1
|
|
319
|
+
col = 0
|
|
320
|
+
end
|
|
321
|
+
col += 1
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
end
|