Class: CaseDessin

Inherits:
Gtk::DrawingArea
  • Object
show all
Includes:
Observable
Defined in:
app/components/CaseDessin.rb

Overview

Classe permettant de dessiner les cases d'une grille de Sudoku

Instance Attribute Summary collapse

Instance Method Summary collapse

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

Parameters:

  • cr

    case

Returns:

  • self



223
224
225
# File 'app/components/CaseDessin.rb', line 223

def couleurCase
  @couleurCase
end

#couleurCaseFixeObject

Returns the value of attribute couleurCaseFixe



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def couleurCaseFixe
  @couleurCaseFixe
end

#couleurIndicesObject

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

Parameters:

  • cr

    case

Returns:

  • self



249
250
251
# File 'app/components/CaseDessin.rb', line 249

def couleurPolice
  @couleurPolice
end

#couleurSurligneeObject

Returns the value of attribute couleurSurlignee



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def couleurSurlignee
  @couleurSurlignee
end

#editableObject

Returns the value of attribute editable



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def editable
  @editable
end

#indiceObject

Returns the value of attribute indice



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def indice
  @indice
end

#indicesObject

Returns the value of attribute indices



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def indices
  @indices
end

#nombreObject

Returns the value of attribute nombre



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def nombre
  @nombre
end

#sizeObject

Returns the value of attribute size



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def size
  @size
end

#stateObject

Returns the value of attribute state



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def state
  @state
end

#taillePoliceObject

Returns the value of attribute taillePolice



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def taillePolice
  @taillePolice
end

#xObject

Returns the value of attribute x



15
16
17
# File 'app/components/CaseDessin.rb', line 15

def x
  @x
end

#yObject

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

Parameters:

  • cr

    case à dessiner

Returns:

  • self



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

Parameters:

  • cr

    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)

Returns:

  • self



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.button == 1
        @state = "clicked"
    end

    notify_observers(@x, @y, @state)
    
    return self
end

#hoverObject

Action lors du survol de la case

Returns:

  • self



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

#leaveObject

Action lors de la sortie du curseur de la case

Returns:

  • self



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

#redessinerObject

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

#resetIndicesObject

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