Class: CaseDessin
- Inherits:
-
Gtk::DrawingArea
- Object
- Gtk::DrawingArea
- CaseDessin
- Includes:
- Observable
- Defined in:
- app/components/CaseDessin.rb
Overview
Classe permettant de dessiner les cases d'une grille de Sudoku
Instance Attribute Summary collapse
-
#couleurCase(cr) ⇒ Object
Edite la couleur de la case.
-
#couleurCaseFixe ⇒ Object
Returns the value of attribute couleurCaseFixe.
-
#couleurIndices ⇒ Object
Returns the value of attribute couleurIndices.
-
#couleurPolice(cr) ⇒ Object
Définit la couleur de la police dans la case.
-
#couleurSurlignee ⇒ Object
Returns the value of attribute couleurSurlignee.
-
#editable ⇒ Object
Returns the value of attribute editable.
-
#indice ⇒ Object
Returns the value of attribute indice.
-
#indices ⇒ Object
Returns the value of attribute indices.
-
#nombre ⇒ Object
Returns the value of attribute nombre.
-
#size ⇒ Object
Returns the value of attribute size.
-
#state ⇒ Object
Returns the value of attribute state.
-
#taillePolice ⇒ Object
Returns the value of attribute taillePolice.
-
#x ⇒ Object
Returns the value of attribute x.
-
#y ⇒ Object
Returns the value of attribute y.
Instance Method Summary collapse
-
#dessiner(cr) ⇒ Object
Dessine une case.
-
#dessinerChiffre(cr) ⇒ Object
Dessine le chiffre.
-
#dessinerContour(cr) ⇒ Object
Dessine le contour de la case.
-
#dessinerIndices(cr) ⇒ Object
Dessine les indices.
-
#focused(evenement) ⇒ Object
Callback sur l'appui sur la souris (évènement ajouté à la main).
-
#hover ⇒ Object
Action lors du survol de la case.
-
#initialize(valeur, config) ⇒ CaseDessin
constructor
Initialisation.
-
#leave ⇒ Object
Action lors de la sortie du curseur de la case.
-
#redessiner ⇒ Object
Redessine la case avec les nouvelles valeurs si modifiées.
-
#resetIndices ⇒ Object
Réinitialise les indices de la cases.
-
#set_state=(etat) ⇒ Object
Définit l'état.
Constructor Details
#initialize(valeur, config) ⇒ CaseDessin
Initialisation
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'app/components/CaseDessin.rb', line 20 def initialize valeur, config super() @x = 0 @y = 0 @nombre = valeur["value"] @editable = valeur["editable"] @state = "" @indices = {"1" => false, "2" => false, "3" => false, "4" => false, "5" => false, "6" => false, "7" => false, "8" => false, "9" => false} @indice = false config = config @configurationModel = Configuration.instance() @police = config["police"] @taillePolice = config["taillePolice"] @tailleIndices = @taillePolice / 2 # Prend en compte la configuration utilisateur @couleurCase = @configurationModel.creerCouleur(config["caseBase"]) @couleurCaseFixe = @configurationModel.creerCouleur(config["caseFixe"]) @couleurIndices = @configurationModel.creerCouleur(config["couleurIndices"]) @couleurPolice = @configurationModel.creerCouleur(config["couleurTexte"]) @couleurSurlignee = @configurationModel.creerCouleur(config["caseSelectionne"]) ## Crée la zone de dessin au signal draw signal_connect "draw" do |_, cr| dessiner cr end if(@editable == true) ## Ajoute les évènements de survol et de clics add_events(Gdk::EventMask::ENTER_NOTIFY_MASK) add_events(Gdk::EventMask::BUTTON_PRESS_MASK) add_events(Gdk::EventMask::LEAVE_NOTIFY_MASK) ## Lie un callback sur la souris signal_connect "button_press_event" do |_, evenement| focused evenement end ## Lie un callback sur l'entrée du curseur dans la zone signal_connect "enter_notify_event" do hover end ## Lie un callback sur la sortie du curseur de la zone signal_connect "leave_notify_event" do leave end end end |
Instance Attribute Details
#couleurCase(cr) ⇒ Object
Edite la couleur de la case
223 224 225 |
# File 'app/components/CaseDessin.rb', line 223 def couleurCase @couleurCase end |
#couleurCaseFixe ⇒ Object
Returns the value of attribute couleurCaseFixe
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def couleurCaseFixe @couleurCaseFixe end |
#couleurIndices ⇒ Object
Returns the value of attribute couleurIndices
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def couleurIndices @couleurIndices end |
#couleurPolice(cr) ⇒ Object
Définit la couleur de la police dans la case
249 250 251 |
# File 'app/components/CaseDessin.rb', line 249 def couleurPolice @couleurPolice end |
#couleurSurlignee ⇒ Object
Returns the value of attribute couleurSurlignee
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def couleurSurlignee @couleurSurlignee end |
#editable ⇒ Object
Returns the value of attribute editable
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def editable @editable end |
#indice ⇒ Object
Returns the value of attribute indice
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def indice @indice end |
#indices ⇒ Object
Returns the value of attribute indices
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def indices @indices end |
#nombre ⇒ Object
Returns the value of attribute nombre
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def nombre @nombre end |
#size ⇒ Object
Returns the value of attribute size
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def size @size end |
#state ⇒ Object
Returns the value of attribute state
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def state @state end |
#taillePolice ⇒ Object
Returns the value of attribute taillePolice
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def taillePolice @taillePolice end |
#x ⇒ Object
Returns the value of attribute x
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def x @x end |
#y ⇒ Object
Returns the value of attribute y
15 16 17 |
# File 'app/components/CaseDessin.rb', line 15 def y @y end |
Instance Method Details
#dessiner(cr) ⇒ Object
Dessine une case
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 |
# File 'app/components/CaseDessin.rb', line 273 def dessiner cr ## On définit la taille comme 1/12 de la fenêtre pour garder de l'espace ## pour les boutons @size = Fenetre::fenetre.size[1] / 12 ## Définit la largeur et la hauteur de la case (obligatoire pour gestion des évènements) set_size_request(@size, @size ) ## Définit la couleur pour le dessin en fonction du type de case self.couleurCase cr ## Dessine un rectangle cr.rectangle 0, 0, @size, @size cr.fill ## Définit la couleur du texte self.couleurPolice cr if(@indice == false || !@editable || @nombre != nil) dessinerChiffre cr else dessinerIndices cr end dessinerContour cr cr.stroke return self end |
#dessinerChiffre(cr) ⇒ Object
Dessine le chiffre
361 362 363 364 365 366 367 368 369 370 371 |
# File 'app/components/CaseDessin.rb', line 361 def dessinerChiffre cr ## Définis les caractéristiques du texte cr.select_font_face @police, Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL cr.set_font_size @taillePolice extents = cr.text_extents @nombre.to_s cr.move_to @size / 2 - extents.width / 2, @size / 2 + extents.height / 2 ## Déplace le curseur de texte au centre de la case cr.show_text @nombre.to_s end |
#dessinerContour(cr) ⇒ Object
Dessine le contour de la case
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 |
# File 'app/components/CaseDessin.rb', line 312 def dessinerContour cr cr.set_source_rgb 0, 0, 0 cr.move_to 0 , 0 cr.set_line_width 0.5 ## Calcule le chemin du contour de la case cr.rel_line_to @size, 0 cr.rel_line_to 0, @size cr.rel_line_to -@size, 0 cr.rel_line_to 0, -@size cr.stroke cr.set_line_width 7 ## Bordure exétieure haut if(@x == 0) cr.move_to 0, 0 cr.line_to @size, 0 cr.stroke end ## Bordure extérieur gauche if(@y == 0) cr.move_to 0, 0 cr.line_to 0, @size cr.stroke end ## Bordure bas if(@x == 8 || @x % 3 == 2) cr.move_to 0, @size cr.line_to @size, @size cr.stroke end ## Bordure droite if(@y == 8 || @y % 3 == 2) cr.move_to @size, 0 cr.rel_line_to 0, @size cr.stroke end end |
#dessinerIndices(cr) ⇒ Object
Dessine les indices
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 |
# File 'app/components/CaseDessin.rb', line 376 def dessinerIndices cr cr.set_font_size @tailleIndices col = 1 lig = 1 @indices.each do | key, value| if(value == true) extents = cr.text_extents key cr.move_to (col * @size / 4) - extents.width / 2 , (lig * @size / 4).floor + (extents.height / 2).floor ## Déplace le curseur de texte au centre de la case cr.show_text key end if key.to_i % 3 == 0 lig += 1 col = 0 end col += 1 end end |
#focused(evenement) ⇒ Object
Callback sur l'appui sur la souris (évènement ajouté à la main)
90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'app/components/CaseDessin.rb', line 90 def focused evenement changed ## Clic gauche if evenement. == 1 @state = "clicked" end notify_observers(@x, @y, @state) return self end |
#hover ⇒ Object
Action lors du survol de la case
109 110 111 112 113 114 115 116 117 |
# File 'app/components/CaseDessin.rb', line 109 def hover changed @state = "hover" notify_observers(@x, @y, @state) return self end |
#leave ⇒ Object
Action lors de la sortie du curseur de la case
133 134 135 136 137 138 139 140 141 |
# File 'app/components/CaseDessin.rb', line 133 def leave changed @state = "leave" notify_observers(@x, @y, @state) return self end |
#redessiner ⇒ Object
Redessine la case avec les nouvelles valeurs si modifiées
262 263 264 |
# File 'app/components/CaseDessin.rb', line 262 def redessiner() self.queue_draw end |
#resetIndices ⇒ Object
Réinitialise les indices de la cases
81 82 83 |
# File 'app/components/CaseDessin.rb', line 81 def resetIndices @indices = {"1" => false, "2" => false, "3" => false, "4" => false, "5" => false, "6" => false, "7" => false, "8" => false, "9" => false} end |
#set_state=(etat) ⇒ Object
Définit l'état
122 123 124 125 126 |
# File 'app/components/CaseDessin.rb', line 122 def set_state=(etat) if(@state != "equal") @state = etat end end |