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.
Files changed (134) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +39 -0
  4. data/app/Historique/Action.rb +29 -0
  5. data/app/Historique/ChangerCase.rb +44 -0
  6. data/app/Historique/HistoriqueAction.rb +114 -0
  7. data/app/components/CaseDessin.rb +325 -0
  8. data/app/components/GrilleDessin.rb +235 -0
  9. data/app/components/Header.rb +194 -0
  10. data/app/config/app.yml +0 -0
  11. data/app/config/database.yml +2 -0
  12. data/app/controller/ApprentissageControleur.rb +75 -0
  13. data/app/controller/ChargerControleur.rb +41 -0
  14. data/app/controller/JeuLibreControleur.rb +244 -0
  15. data/app/controller/MenuControleur.rb +57 -0
  16. data/app/controller/NiveauControleur.rb +54 -0
  17. data/app/controller/NouvellePartieControleur.rb +34 -0
  18. data/app/controller/PrincipaleControleur.rb +30 -0
  19. data/app/controller/PseudoControleur.rb +95 -0
  20. data/app/controller/ReglagesControleur.rb +86 -0
  21. data/app/controller/ReglesControleur.rb +34 -0
  22. data/app/controller/ScoresControleur.rb +42 -0
  23. data/app/controller/StatistiquesControleur.rb +64 -0
  24. data/app/core/Conf.rb +26 -0
  25. data/app/core/Controller.rb +180 -0
  26. data/app/core/Core.rb +186 -0
  27. data/app/core/Model.rb +159 -0
  28. data/app/core/View.rb +56 -0
  29. data/app/db/main.sqlite3 +0 -0
  30. data/app/model/Configuration.rb +180 -0
  31. data/app/model/Grille.rb +180 -0
  32. data/app/model/Jeu.rb +74 -0
  33. data/app/model/Score.rb +100 -0
  34. data/app/model/Utilisateur.rb +113 -0
  35. data/app/utils/DSubset.rb +98 -0
  36. data/app/utils/Generateur.rb +171 -0
  37. data/app/utils/HPTriple.rb +75 -0
  38. data/app/utils/Peche.rb +46 -0
  39. data/app/utils/SCandidate.rb +86 -0
  40. data/app/utils/SCell.rb +73 -0
  41. data/app/utils/Technique.rb +202 -0
  42. data/app/utils/TechniqueUsine.rb +25 -0
  43. data/app/utils/XWing.rb +203 -0
  44. data/app/view/Fenetre.rb +424 -0
  45. data/app/view/FenetreApprentissage.rb +272 -0
  46. data/app/view/FenetreCharger.rb +31 -0
  47. data/app/view/FenetreJeuLibre.rb +468 -0
  48. data/app/view/FenetreMenu.rb +198 -0
  49. data/app/view/FenetreNiveau.rb +105 -0
  50. data/app/view/FenetreNouvellePartie.rb +92 -0
  51. data/app/view/FenetrePrincipale.rb +45 -0
  52. data/app/view/FenetrePseudo.rb +115 -0
  53. data/app/view/FenetreReglages.rb +209 -0
  54. data/app/view/FenetreRegles.rb +111 -0
  55. data/app/view/FenetreScores.rb +120 -0
  56. data/app/view/FenetreStatistiques.rb +134 -0
  57. data/assets/css/style.css +69 -0
  58. data/assets/img/eraser.png +0 -0
  59. data/assets/img/fond.jpg +0 -0
  60. data/assets/img/iconApp.png +0 -0
  61. data/assets/img/logoS.jpeg +0 -0
  62. data/assets/img/sudokuIntro.jpg +0 -0
  63. data/assets/img/user.png +0 -0
  64. data/bin/dogeku +19 -0
  65. data/doc/Action.html +309 -0
  66. data/doc/ApprentissageControleur.html +568 -0
  67. data/doc/CaseDessin.html +2405 -0
  68. data/doc/ChangerCase.html +405 -0
  69. data/doc/ChargerControleur.html +342 -0
  70. data/doc/Conf.html +378 -0
  71. data/doc/Configuration.html +1115 -0
  72. data/doc/Controller.html +1008 -0
  73. data/doc/Core.html +1191 -0
  74. data/doc/DSubset.html +647 -0
  75. data/doc/Fenetre.html +2631 -0
  76. data/doc/FenetreApprentissage.html +1175 -0
  77. data/doc/FenetreCharger.html +343 -0
  78. data/doc/FenetreJeuLibre.html +1859 -0
  79. data/doc/FenetreMenu.html +900 -0
  80. data/doc/FenetreNiveau.html +626 -0
  81. data/doc/FenetreNouvellePartie.html +602 -0
  82. data/doc/FenetrePrincipale.html +371 -0
  83. data/doc/FenetrePseudo.html +695 -0
  84. data/doc/FenetreReglages.html +946 -0
  85. data/doc/FenetreRegles.html +636 -0
  86. data/doc/FenetreScores.html +650 -0
  87. data/doc/FenetreStatistiques.html +672 -0
  88. data/doc/Generateur.html +1015 -0
  89. data/doc/Grille.html +1348 -0
  90. data/doc/GrilleDessin.html +1281 -0
  91. data/doc/HPTriple.html +593 -0
  92. data/doc/Header.html +1253 -0
  93. data/doc/HistoriqueAction.html +792 -0
  94. data/doc/Jeu.html +923 -0
  95. data/doc/JeuLibreControleur.html +1445 -0
  96. data/doc/MenuControleur.html +522 -0
  97. data/doc/Model.html +996 -0
  98. data/doc/NiveauControleur.html +451 -0
  99. data/doc/NouvellePartieControleur.html +330 -0
  100. data/doc/Peche.html +396 -0
  101. data/doc/PrincipaleControleur.html +320 -0
  102. data/doc/PseudoControleur.html +695 -0
  103. data/doc/ReglagesControleur.html +747 -0
  104. data/doc/ReglesControleur.html +330 -0
  105. data/doc/SCandidate.html +617 -0
  106. data/doc/SCell.html +587 -0
  107. data/doc/Score.html +926 -0
  108. data/doc/ScoresControleur.html +346 -0
  109. data/doc/StatistiquesControleur.html +390 -0
  110. data/doc/Technique.html +543 -0
  111. data/doc/TechniqueUsine.html +252 -0
  112. data/doc/Utilisateur.html +806 -0
  113. data/doc/View.html +844 -0
  114. data/doc/XWing.html +1031 -0
  115. data/doc/_index.html +478 -0
  116. data/doc/class_list.html +51 -0
  117. data/doc/css/common.css +1 -0
  118. data/doc/css/full_list.css +58 -0
  119. data/doc/css/style.css +492 -0
  120. data/doc/file.README.html +141 -0
  121. data/doc/file_list.html +56 -0
  122. data/doc/frames.html +17 -0
  123. data/doc/index.html +141 -0
  124. data/doc/js/app.js +243 -0
  125. data/doc/js/full_list.js +216 -0
  126. data/doc/js/jquery.js +4 -0
  127. data/doc/method_list.html +2523 -0
  128. data/doc/top-level-namespace.html +112 -0
  129. data/test/Generateur/grilleCorrecte.rb +198 -0
  130. data/test/Model/scoreCorrecte.rb +55 -0
  131. data/test/Model/utilisateurCorrecte.rb +68 -0
  132. data/test/test_helper.rb +2 -0
  133. data/test/unitTest.rb +72 -0
  134. 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
+ [![Build Status](https://travis-ci.org/DanAurea/Sudoku-L3S6.svg?branch=master)](https://travis-ci.org/DanAurea/Sudoku-L3S6)
2
+ [![Issue Count](https://codeclimate.com/github/DanAurea/Sudoku-L3S6/badges/issue_count.svg)](https://codeclimate.com/github/DanAurea/Sudoku-L3S6)
3
+ [![Code Climate](https://codeclimate.com/github/DanAurea/Sudoku-L3S6/badges/gpa.svg)](https://codeclimate.com/github/DanAurea/Sudoku-L3S6)
4
+ [![Inline docs](http://inch-ci.org/github/DanAurea/Sudoku-L3S6.svg?branch=master)](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