glimmer-dsl-gtk 0.0.3 → 0.0.7
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 +4 -4
- data/CHANGELOG.md +38 -0
- data/README.md +925 -29
- data/VERSION +1 -1
- data/glimmer-dsl-gtk.gemspec +0 -0
- data/images/breaking-blue-wave.png +0 -0
- data/lib/glimmer/gtk/shape/arc_negative.rb +70 -0
- data/lib/glimmer/gtk/shape/path.rb +55 -0
- data/lib/glimmer/gtk/shape.rb +71 -21
- data/lib/glimmer/gtk/transformable.rb +93 -0
- data/lib/glimmer/gtk/widget_proxy/drawing_area_proxy.rb +16 -0
- data/lib/glimmer/gtk/widget_proxy.rb +2 -2
- data/samples/cairo/arc.rb +44 -0
- data/samples/cairo/arc_negative.rb +44 -0
- data/samples/cairo/clip.rb +34 -0
- data/samples/cairo/clip_image.rb +28 -0
- data/samples/cairo/curve_to.rb +39 -0
- data/samples/cairo/dashes.rb +30 -0
- data/samples/cairo/fill_and_stroke2.rb +36 -0
- data/samples/cairo/fill_style.rb +43 -0
- data/samples/cairo/gradient.rb +31 -0
- data/samples/cairo/image.rb +23 -0
- data/samples/cairo/image_gradient.rb +32 -0
- data/samples/cairo/multi_segment_caps.rb +27 -0
- data/samples/cairo/rounded_rectangle.rb +20 -0
- data/samples/cairo/set_line_cap.rb +53 -0
- data/samples/cairo/set_line_join.rb +43 -0
- data/samples/cairo/text.rb +46 -0
- data/samples/elaborate/tetris/model/game.rb +12 -0
- data/samples/elaborate/tetris.rb +172 -1
- data/samples/hello/hello_drawing_area.rb +1 -3
- data/samples/hello/hello_drawing_area_manual.rb +20 -21
- metadata +23 -3
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Dashes'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                dashes = [ 50.0, # ink
         | 
| 13 | 
            +
                                   10.0,  # skip
         | 
| 14 | 
            +
                                   10.0,  # ink
         | 
| 15 | 
            +
                                   10.0   # skip
         | 
| 16 | 
            +
                        ]
         | 
| 17 | 
            +
                offset = -50.0
         | 
| 18 | 
            +
                
         | 
| 19 | 
            +
                path {
         | 
| 20 | 
            +
                  move_to 128.0, 25.6
         | 
| 21 | 
            +
                  line_to 230.4, 230.4
         | 
| 22 | 
            +
                  rel_line_to -102.4, 0.0
         | 
| 23 | 
            +
                  curve_to 51.2, 230.4, 51.2, 128.0, 128.0, 128.0
         | 
| 24 | 
            +
                  
         | 
| 25 | 
            +
                  line_width 10
         | 
| 26 | 
            +
                  dash dashes, offset
         | 
| 27 | 
            +
                  stroke 0, 0, 0
         | 
| 28 | 
            +
                }
         | 
| 29 | 
            +
              }
         | 
| 30 | 
            +
            }.show
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Fill and Stroke 2'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                path {
         | 
| 13 | 
            +
                  move_to 128.0, 25.6
         | 
| 14 | 
            +
                  line_to 230.4, 230.4
         | 
| 15 | 
            +
                  rel_line_to -102.4, 0.0
         | 
| 16 | 
            +
                  curve_to 51.2, 230.4, 51.2, 128.0, 128.0, 128.0
         | 
| 17 | 
            +
                  close_path
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  fill 0, 0, 255
         | 
| 20 | 
            +
                  stroke 0, 0, 0
         | 
| 21 | 
            +
                  line_width 10
         | 
| 22 | 
            +
                }
         | 
| 23 | 
            +
                
         | 
| 24 | 
            +
                path {
         | 
| 25 | 
            +
                  move_to 64.0, 25.6
         | 
| 26 | 
            +
                  rel_line_to 51.2, 51.2
         | 
| 27 | 
            +
                  rel_line_to -51.2, 51.2
         | 
| 28 | 
            +
                  rel_line_to -51.2, -51.2
         | 
| 29 | 
            +
                  close_path
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  fill 0, 0, 255
         | 
| 32 | 
            +
                  stroke 0, 0, 0
         | 
| 33 | 
            +
                  line_width 10
         | 
| 34 | 
            +
                }
         | 
| 35 | 
            +
              }
         | 
| 36 | 
            +
            }.show
         | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Fill Style'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                path {
         | 
| 13 | 
            +
                  rectangle 12, 12, 232, 70
         | 
| 14 | 
            +
                  path { # sub-path
         | 
| 15 | 
            +
                    arc 64, 64, 40, 0, 2*Math::PI
         | 
| 16 | 
            +
                  }
         | 
| 17 | 
            +
                  path { # sub-path
         | 
| 18 | 
            +
                    arc_negative 192, 64, 40, 0, -2*Math::PI
         | 
| 19 | 
            +
                  }
         | 
| 20 | 
            +
                  
         | 
| 21 | 
            +
                  fill_rule Cairo::FILL_RULE_EVEN_ODD
         | 
| 22 | 
            +
                  line_width 6
         | 
| 23 | 
            +
                  fill 0, 178.5, 0
         | 
| 24 | 
            +
                  stroke 0, 0, 0
         | 
| 25 | 
            +
                }
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                path {
         | 
| 28 | 
            +
                  rectangle 12, 12, 232, 70
         | 
| 29 | 
            +
                  path { # sub-path
         | 
| 30 | 
            +
                    arc 64, 64, 40, 0, 2*Math::PI
         | 
| 31 | 
            +
                  }
         | 
| 32 | 
            +
                  path { # sub-path
         | 
| 33 | 
            +
                    arc_negative 192, 64, 40, 0, -2*Math::PI
         | 
| 34 | 
            +
                  }
         | 
| 35 | 
            +
                  
         | 
| 36 | 
            +
                  translate 0, 128
         | 
| 37 | 
            +
                  fill_rule Cairo::FILL_RULE_WINDING
         | 
| 38 | 
            +
                  line_width 6
         | 
| 39 | 
            +
                  fill 0, 0, 229.5
         | 
| 40 | 
            +
                  stroke 0, 0, 0
         | 
| 41 | 
            +
                }
         | 
| 42 | 
            +
              }
         | 
| 43 | 
            +
            }.show
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Gradient'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                    
         | 
| 12 | 
            +
                # Create the Linear Pattern
         | 
| 13 | 
            +
                rectangle(0, 0, 256, 256) {
         | 
| 14 | 
            +
                  pat = Cairo::LinearPattern.new(0.0, 0.0,  0.0, 256.0)
         | 
| 15 | 
            +
                  pat.add_color_stop_rgba(1, 0, 0, 0, 1)
         | 
| 16 | 
            +
                  pat.add_color_stop_rgba(0, 1, 1, 1, 1)
         | 
| 17 | 
            +
                  
         | 
| 18 | 
            +
                  fill pat
         | 
| 19 | 
            +
                }
         | 
| 20 | 
            +
                
         | 
| 21 | 
            +
                # Create the radial pattern
         | 
| 22 | 
            +
                arc(128.0, 128.0, 76.8, 0, 2 * Math::PI) {
         | 
| 23 | 
            +
                  pat = Cairo::RadialPattern.new(115.2, 102.4, 25.6,
         | 
| 24 | 
            +
                                                     102.4,  102.4, 128.0)
         | 
| 25 | 
            +
                  pat.add_color_stop_rgba(0, 1, 1, 1, 1)
         | 
| 26 | 
            +
                  pat.add_color_stop_rgba(1, 0, 0, 0, 1)
         | 
| 27 | 
            +
                  
         | 
| 28 | 
            +
                  fill pat
         | 
| 29 | 
            +
                }
         | 
| 30 | 
            +
              }
         | 
| 31 | 
            +
            }.show
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Image'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                    
         | 
| 12 | 
            +
                image = Cairo::ImageSurface.from_png(File.expand_path(File.join('..', '..', 'images', 'breaking-blue-wave.png'), __dir__))
         | 
| 13 | 
            +
                w = image.width
         | 
| 14 | 
            +
                h = image.height
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                translate 128.0, 128.0
         | 
| 17 | 
            +
                rotate 45*Math::PI/180
         | 
| 18 | 
            +
                scale 256.0/w, 256.0/h
         | 
| 19 | 
            +
                translate -0.5*w, -0.5*h
         | 
| 20 | 
            +
                
         | 
| 21 | 
            +
                paint image, 0, 0
         | 
| 22 | 
            +
              }
         | 
| 23 | 
            +
            }.show
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Image Gradient'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                image = Cairo::ImageSurface.from_png(File.expand_path(File.join('..', '..', 'images', 'breaking-blue-wave.png'), __dir__))
         | 
| 13 | 
            +
                w = image.width
         | 
| 14 | 
            +
                h = image.height
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                # Load the image as a surface pattern
         | 
| 17 | 
            +
                pattern = Cairo::SurfacePattern.new(image)
         | 
| 18 | 
            +
                pattern.extend = Cairo::EXTEND_REPEAT
         | 
| 19 | 
            +
                
         | 
| 20 | 
            +
                # Set up the scale matrix
         | 
| 21 | 
            +
                pattern.matrix = Cairo::Matrix.scale(w/256.0 * 5.0, h/256.0 * 5.0)
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                rectangle(0, 0, 256, 256) {
         | 
| 24 | 
            +
                  translate 128.0, 128.0
         | 
| 25 | 
            +
                  rotate Math::PI / 4
         | 
| 26 | 
            +
                  scale 1/Math.sqrt(2), 1/Math.sqrt(2)
         | 
| 27 | 
            +
                  translate -128.0, -128.0
         | 
| 28 | 
            +
                    
         | 
| 29 | 
            +
                  fill pattern
         | 
| 30 | 
            +
                }
         | 
| 31 | 
            +
              }
         | 
| 32 | 
            +
            }.show
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Multi Segment Caps'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                path {
         | 
| 13 | 
            +
                  move_to 50.0, 75.0
         | 
| 14 | 
            +
                  line_to 200.0, 75.0
         | 
| 15 | 
            +
                  
         | 
| 16 | 
            +
                  move_to 50.0, 125.0
         | 
| 17 | 
            +
                  line_to 200.0, 125.0
         | 
| 18 | 
            +
                  
         | 
| 19 | 
            +
                  move_to 50.0, 175.0
         | 
| 20 | 
            +
                  line_to 200.0, 175.0
         | 
| 21 | 
            +
                  
         | 
| 22 | 
            +
                  line_width 30
         | 
| 23 | 
            +
                  line_cap Cairo::LINE_CAP_ROUND
         | 
| 24 | 
            +
                  stroke 0, 0, 0
         | 
| 25 | 
            +
                }
         | 
| 26 | 
            +
              }
         | 
| 27 | 
            +
            }.show
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Rounded Rectangle'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                path {
         | 
| 13 | 
            +
                  rounded_rectangle(25.6, 25.6, 204.8, 204.8, 20)
         | 
| 14 | 
            +
                
         | 
| 15 | 
            +
                  fill 127.5, 127.5, 255
         | 
| 16 | 
            +
                  line_width 10.0
         | 
| 17 | 
            +
                  stroke 127.5, 0, 0, 0.5
         | 
| 18 | 
            +
                }
         | 
| 19 | 
            +
              }
         | 
| 20 | 
            +
            }.show
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Set line cap'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                # The main code
         | 
| 13 | 
            +
                path {
         | 
| 14 | 
            +
                  move_to 64.0, 50.0
         | 
| 15 | 
            +
                  line_to 64.0, 200.0
         | 
| 16 | 
            +
                  
         | 
| 17 | 
            +
                  line_cap Cairo::LINE_CAP_BUTT #  default
         | 
| 18 | 
            +
                  line_width 30
         | 
| 19 | 
            +
                  stroke 0, 0, 0
         | 
| 20 | 
            +
                }
         | 
| 21 | 
            +
                
         | 
| 22 | 
            +
                path {
         | 
| 23 | 
            +
                  move_to 128.0, 50.0
         | 
| 24 | 
            +
                  line_to 128.0, 200.0
         | 
| 25 | 
            +
                  
         | 
| 26 | 
            +
                  line_cap Cairo::LINE_CAP_ROUND
         | 
| 27 | 
            +
                  line_width 30
         | 
| 28 | 
            +
                  stroke 0, 0, 0
         | 
| 29 | 
            +
                }
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                path {
         | 
| 32 | 
            +
                  move_to 192.0, 50.0
         | 
| 33 | 
            +
                  line_to 192.0, 200.0
         | 
| 34 | 
            +
                  
         | 
| 35 | 
            +
                  line_cap Cairo::LINE_CAP_SQUARE
         | 
| 36 | 
            +
                  line_width 30
         | 
| 37 | 
            +
                  stroke 0, 0, 0
         | 
| 38 | 
            +
                }
         | 
| 39 | 
            +
                
         | 
| 40 | 
            +
                #  draw helping lines */
         | 
| 41 | 
            +
                path {
         | 
| 42 | 
            +
                  move_to 64.0, 50.0
         | 
| 43 | 
            +
                  line_to 64.0, 200.0
         | 
| 44 | 
            +
                  move_to 128.0, 50.0
         | 
| 45 | 
            +
                  line_to 128.0, 200.0
         | 
| 46 | 
            +
                  move_to 192.0, 50.0
         | 
| 47 | 
            +
                  line_to 192.0, 200.0
         | 
| 48 | 
            +
                  
         | 
| 49 | 
            +
                  line_width 2.56
         | 
| 50 | 
            +
                  stroke 255, 51, 51
         | 
| 51 | 
            +
                }
         | 
| 52 | 
            +
              }
         | 
| 53 | 
            +
            }.show
         | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Set line join'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                # The main code
         | 
| 13 | 
            +
                path {
         | 
| 14 | 
            +
                  move_to 76.8, 84.48
         | 
| 15 | 
            +
                  rel_line_to 51.2, -51.2
         | 
| 16 | 
            +
                  rel_line_to 51.2, 51.2
         | 
| 17 | 
            +
                  
         | 
| 18 | 
            +
                  line_join Cairo::LINE_JOIN_MITER # default
         | 
| 19 | 
            +
                  line_width 40.96
         | 
| 20 | 
            +
                  stroke 0, 0, 0
         | 
| 21 | 
            +
                }
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                path {
         | 
| 24 | 
            +
                  move_to 76.8, 161.28
         | 
| 25 | 
            +
                  rel_line_to 51.2, -51.2
         | 
| 26 | 
            +
                  rel_line_to 51.2, 51.2
         | 
| 27 | 
            +
                  
         | 
| 28 | 
            +
                  line_join Cairo::LINE_JOIN_BEVEL
         | 
| 29 | 
            +
                  line_width 40.96
         | 
| 30 | 
            +
                  stroke 0, 0, 0
         | 
| 31 | 
            +
                }
         | 
| 32 | 
            +
                
         | 
| 33 | 
            +
                path {
         | 
| 34 | 
            +
                  move_to 76.8, 238.08
         | 
| 35 | 
            +
                  rel_line_to 51.2, -51.2
         | 
| 36 | 
            +
                  rel_line_to 51.2, 51.2
         | 
| 37 | 
            +
                  
         | 
| 38 | 
            +
                  line_join Cairo::LINE_JOIN_ROUND
         | 
| 39 | 
            +
                  line_width 40.96
         | 
| 40 | 
            +
                  stroke 0, 0, 0
         | 
| 41 | 
            +
                }
         | 
| 42 | 
            +
              }
         | 
| 43 | 
            +
            }.show
         | 
| @@ -0,0 +1,46 @@ | |
| 1 | 
            +
            require 'glimmer-dsl-gtk'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            include Glimmer
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            window {
         | 
| 6 | 
            +
              title 'Text'
         | 
| 7 | 
            +
              default_size 256, 256
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              drawing_area {
         | 
| 10 | 
            +
                paint 242.25, 242.25, 242.25
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                font_family = OS.linux? ? 'Sans' : (OS.mac? ? 'Helvetica' : 'Arial')
         | 
| 13 | 
            +
                
         | 
| 14 | 
            +
                # The main code
         | 
| 15 | 
            +
                path {
         | 
| 16 | 
            +
                  move_to 10.0, 135.0
         | 
| 17 | 
            +
                  show_text 'Hello'
         | 
| 18 | 
            +
                  
         | 
| 19 | 
            +
                  font_face font_family, Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD
         | 
| 20 | 
            +
                  font_size 90.0
         | 
| 21 | 
            +
                  line_width 2.56
         | 
| 22 | 
            +
                  fill 0, 0, 0
         | 
| 23 | 
            +
                  stroke 0, 0, 0
         | 
| 24 | 
            +
                }
         | 
| 25 | 
            +
                
         | 
| 26 | 
            +
                path {
         | 
| 27 | 
            +
                  move_to 70.0, 165.0
         | 
| 28 | 
            +
                  text_path 'void'
         | 
| 29 | 
            +
                  
         | 
| 30 | 
            +
                  font_face font_family, Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD
         | 
| 31 | 
            +
                  font_size 90.0
         | 
| 32 | 
            +
                  line_width 2.56
         | 
| 33 | 
            +
                  fill 127.5, 127.5, 255
         | 
| 34 | 
            +
                  stroke 0, 0, 0
         | 
| 35 | 
            +
                }
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
                # draw helping lines
         | 
| 38 | 
            +
                path {
         | 
| 39 | 
            +
                  arc 10.0, 135.0, 5.12, 0, 2*Math::PI
         | 
| 40 | 
            +
                  close_path
         | 
| 41 | 
            +
                  arc 70.0, 165.0, 5.12, 0, 2*Math::PI
         | 
| 42 | 
            +
                  
         | 
| 43 | 
            +
                  fill 255, 51, 51, 0.6
         | 
| 44 | 
            +
                }
         | 
| 45 | 
            +
              }
         | 
| 46 | 
            +
            }.show
         | 
| @@ -215,6 +215,10 @@ class Tetris | |
| 215 215 | 
             
                    self.up_arrow_action == :instant_down
         | 
| 216 216 | 
             
                  end
         | 
| 217 217 |  | 
| 218 | 
            +
                  def instant_down_on_up!
         | 
| 219 | 
            +
                    self.up_arrow_action = :instant_down
         | 
| 220 | 
            +
                  end
         | 
| 221 | 
            +
                  
         | 
| 218 222 | 
             
                  def rotate_right_on_up=(value)
         | 
| 219 223 | 
             
                    self.up_arrow_action = :rotate_right if value
         | 
| 220 224 | 
             
                  end
         | 
| @@ -223,6 +227,10 @@ class Tetris | |
| 223 227 | 
             
                    self.up_arrow_action == :rotate_right
         | 
| 224 228 | 
             
                  end
         | 
| 225 229 |  | 
| 230 | 
            +
                  def rotate_right_on_up!
         | 
| 231 | 
            +
                    self.up_arrow_action = :rotate_right
         | 
| 232 | 
            +
                  end
         | 
| 233 | 
            +
                  
         | 
| 226 234 | 
             
                  def rotate_left_on_up=(value)
         | 
| 227 235 | 
             
                    self.up_arrow_action = :rotate_left if value
         | 
| 228 236 | 
             
                  end
         | 
| @@ -231,6 +239,10 @@ class Tetris | |
| 231 239 | 
             
                    self.up_arrow_action == :rotate_left
         | 
| 232 240 | 
             
                  end
         | 
| 233 241 |  | 
| 242 | 
            +
                  def rotate_left_on_up!
         | 
| 243 | 
            +
                    self.up_arrow_action = :rotate_left
         | 
| 244 | 
            +
                  end
         | 
| 245 | 
            +
                  
         | 
| 234 246 | 
             
                  def reset_tetrominoes
         | 
| 235 247 | 
             
                    @tetrominoes = []
         | 
| 236 248 | 
             
                  end
         | 
    
        data/samples/elaborate/tetris.rb
    CHANGED
    
    | @@ -26,7 +26,14 @@ class Tetris | |
| 26 26 | 
             
                  default_size Model::Game::PLAYFIELD_WIDTH * BLOCK_SIZE, Model::Game::PLAYFIELD_HEIGHT * BLOCK_SIZE # + 98
         | 
| 27 27 |  | 
| 28 28 | 
             
                  box(:vertical) {
         | 
| 29 | 
            -
                     | 
| 29 | 
            +
                    tetris_menu_bar
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    box(:horizontal) {
         | 
| 32 | 
            +
                      @playfield_blocks = playfield(playfield_width: @game.playfield_width, playfield_height: @game.playfield_height, block_size: BLOCK_SIZE)
         | 
| 33 | 
            +
                      
         | 
| 34 | 
            +
                      score_board
         | 
| 35 | 
            +
                    }
         | 
| 36 | 
            +
                    
         | 
| 30 37 | 
             
                  }
         | 
| 31 38 |  | 
| 32 39 | 
             
                  on(:key_press_event) do |widget, key_event|
         | 
| @@ -84,6 +91,135 @@ class Tetris | |
| 84 91 | 
             
                    end
         | 
| 85 92 | 
             
                  end
         | 
| 86 93 | 
             
                end
         | 
| 94 | 
            +
                
         | 
| 95 | 
            +
                Model::Game::PREVIEW_PLAYFIELD_HEIGHT.times do |row|
         | 
| 96 | 
            +
                  Model::Game::PREVIEW_PLAYFIELD_WIDTH.times do |column|
         | 
| 97 | 
            +
                    observe(@game.preview_playfield[row][column], :color) do |new_color|
         | 
| 98 | 
            +
                      color = new_color
         | 
| 99 | 
            +
                      block = @preview_playfield_blocks[row][column]
         | 
| 100 | 
            +
                      block[:background_square].fill = color
         | 
| 101 | 
            +
                      block[:top_bevel_edge].fill = [color[0] + 4*BEVEL_CONSTANT, color[1] + 4*BEVEL_CONSTANT, color[2] + 4*BEVEL_CONSTANT]
         | 
| 102 | 
            +
                      block[:right_bevel_edge].fill = [color[0] - BEVEL_CONSTANT, color[1] - BEVEL_CONSTANT, color[2] - BEVEL_CONSTANT]
         | 
| 103 | 
            +
                      block[:bottom_bevel_edge].fill = [color[0] - BEVEL_CONSTANT, color[1] - BEVEL_CONSTANT, color[2] - BEVEL_CONSTANT]
         | 
| 104 | 
            +
                      block[:left_bevel_edge].fill = [color[0] - BEVEL_CONSTANT, color[1] - BEVEL_CONSTANT, color[2] - BEVEL_CONSTANT]
         | 
| 105 | 
            +
                      block[:border_square].stroke = new_color == Model::Block::COLOR_CLEAR ? COLOR_GRAY : color
         | 
| 106 | 
            +
                      block[:drawing_area].queue_draw
         | 
| 107 | 
            +
                    end
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
                
         | 
| 111 | 
            +
                observe(@game, :score) do |new_score|
         | 
| 112 | 
            +
                  @score_label.text = new_score.to_s
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                observe(@game, :lines) do |new_lines|
         | 
| 116 | 
            +
                  @lines_label.text = new_lines.to_s
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                observe(@game, :level) do |new_level|
         | 
| 120 | 
            +
                  @level_label.text = new_level.to_s
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
              
         | 
| 124 | 
            +
              def tetris_menu_bar
         | 
| 125 | 
            +
                menu_bar {
         | 
| 126 | 
            +
                  menu_item(label: 'Game') { |mi|
         | 
| 127 | 
            +
                    m = menu {
         | 
| 128 | 
            +
                      check_menu_item(label: 'Pause') {
         | 
| 129 | 
            +
                        on(:activate) do
         | 
| 130 | 
            +
                          @game.paused = !@game.paused?
         | 
| 131 | 
            +
                        end
         | 
| 132 | 
            +
                      }
         | 
| 133 | 
            +
                      
         | 
| 134 | 
            +
                      menu_item(label: 'Restart') {
         | 
| 135 | 
            +
                        on(:activate) do
         | 
| 136 | 
            +
                          @game.restart!
         | 
| 137 | 
            +
                        end
         | 
| 138 | 
            +
                      }
         | 
| 139 | 
            +
                      
         | 
| 140 | 
            +
                      separator_menu_item
         | 
| 141 | 
            +
                      
         | 
| 142 | 
            +
                      menu_item(label: 'Exit') {
         | 
| 143 | 
            +
                        on(:activate) do
         | 
| 144 | 
            +
                          @main_window.close
         | 
| 145 | 
            +
                        end
         | 
| 146 | 
            +
                      }
         | 
| 147 | 
            +
                    }
         | 
| 148 | 
            +
                    mi.submenu = m.gtk
         | 
| 149 | 
            +
                  }
         | 
| 150 | 
            +
                  
         | 
| 151 | 
            +
                  menu_item(label: 'View') { |mi|
         | 
| 152 | 
            +
                    m = menu {
         | 
| 153 | 
            +
                      menu_item(label: 'Show High Scores') {
         | 
| 154 | 
            +
                        on(:activate) do
         | 
| 155 | 
            +
                          show_high_score_dialog
         | 
| 156 | 
            +
                        end
         | 
| 157 | 
            +
                      }
         | 
| 158 | 
            +
                      
         | 
| 159 | 
            +
                      menu_item(label: 'Clear High Scores') {
         | 
| 160 | 
            +
                        on(:activate) do
         | 
| 161 | 
            +
                          @game.clear_high_scores!
         | 
| 162 | 
            +
                        end
         | 
| 163 | 
            +
                      }
         | 
| 164 | 
            +
                    }
         | 
| 165 | 
            +
                    mi.submenu = m.gtk
         | 
| 166 | 
            +
                  }
         | 
| 167 | 
            +
                  
         | 
| 168 | 
            +
                  menu_item(label: 'Options') { |mi|
         | 
| 169 | 
            +
                    m = menu {
         | 
| 170 | 
            +
                      rmi = radio_menu_item(nil, 'Instant Down on Up') {
         | 
| 171 | 
            +
                        on(:activate) do
         | 
| 172 | 
            +
                          @game.instant_down_on_up!
         | 
| 173 | 
            +
                        end
         | 
| 174 | 
            +
                      }
         | 
| 175 | 
            +
                      
         | 
| 176 | 
            +
                      default_rmi = radio_menu_item(rmi.group, 'Rotate Right on Up') {
         | 
| 177 | 
            +
                        on(:activate) do
         | 
| 178 | 
            +
                          @game.rotate_right_on_up!
         | 
| 179 | 
            +
                        end
         | 
| 180 | 
            +
                      }
         | 
| 181 | 
            +
                      default_rmi.activate
         | 
| 182 | 
            +
                      
         | 
| 183 | 
            +
                      radio_menu_item(rmi.group, 'Rotate Left on Up') {
         | 
| 184 | 
            +
                        on(:activate) do
         | 
| 185 | 
            +
                          @game.rotate_left_on_up!
         | 
| 186 | 
            +
                        end
         | 
| 187 | 
            +
                      }
         | 
| 188 | 
            +
                    }
         | 
| 189 | 
            +
                    mi.submenu = m.gtk
         | 
| 190 | 
            +
                  }
         | 
| 191 | 
            +
                  
         | 
| 192 | 
            +
                  menu_item(label: 'Options') { |mi|
         | 
| 193 | 
            +
                    m = menu {
         | 
| 194 | 
            +
                      menu_item(label: 'About') {
         | 
| 195 | 
            +
                        on(:activate) do
         | 
| 196 | 
            +
                          show_about_dialog
         | 
| 197 | 
            +
                        end
         | 
| 198 | 
            +
                      }
         | 
| 199 | 
            +
                    }
         | 
| 200 | 
            +
                    mi.submenu = m.gtk
         | 
| 201 | 
            +
                  }
         | 
| 202 | 
            +
                }
         | 
| 203 | 
            +
              end
         | 
| 204 | 
            +
              
         | 
| 205 | 
            +
              def score_board
         | 
| 206 | 
            +
                box(:vertical) {
         | 
| 207 | 
            +
                  label
         | 
| 208 | 
            +
                  @preview_playfield_blocks = playfield(playfield_width: Model::Game::PREVIEW_PLAYFIELD_WIDTH, playfield_height: Model::Game::PREVIEW_PLAYFIELD_HEIGHT, block_size: BLOCK_SIZE)
         | 
| 209 | 
            +
                  
         | 
| 210 | 
            +
                  label
         | 
| 211 | 
            +
                  label('Score')
         | 
| 212 | 
            +
                  @score_label = label
         | 
| 213 | 
            +
             | 
| 214 | 
            +
                  label
         | 
| 215 | 
            +
                  label('Lines')
         | 
| 216 | 
            +
                  @lines_label = label
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                  label
         | 
| 219 | 
            +
                  label('Level')
         | 
| 220 | 
            +
                  @level_label = label
         | 
| 221 | 
            +
                  label
         | 
| 222 | 
            +
                }
         | 
| 87 223 | 
             
              end
         | 
| 88 224 |  | 
| 89 225 | 
             
              def playfield(playfield_width: , playfield_height: , block_size: , &extra_content)
         | 
| @@ -162,6 +298,41 @@ class Tetris | |
| 162 298 | 
             
                @game.restart!
         | 
| 163 299 | 
             
                false
         | 
| 164 300 | 
             
              end
         | 
| 301 | 
            +
              
         | 
| 302 | 
            +
              def show_high_score_dialog
         | 
| 303 | 
            +
                game_paused = !!@game.paused
         | 
| 304 | 
            +
                @game.paused = true
         | 
| 305 | 
            +
                
         | 
| 306 | 
            +
                if @game.high_scores.empty?
         | 
| 307 | 
            +
                  high_scores_string = "No games have been scored yet."
         | 
| 308 | 
            +
                else
         | 
| 309 | 
            +
                  high_scores_string = @game.high_scores.map do |high_score|
         | 
| 310 | 
            +
                    "#{high_score.name} | Score: #{high_score.score} | Lines: #{high_score.lines} | Level: #{high_score.level}"
         | 
| 311 | 
            +
                  end.join("\n")
         | 
| 312 | 
            +
                end
         | 
| 313 | 
            +
                
         | 
| 314 | 
            +
                message_dialog(@main_window) { |md|
         | 
| 315 | 
            +
                  title 'High Scores'
         | 
| 316 | 
            +
                  text high_scores_string
         | 
| 317 | 
            +
                  
         | 
| 318 | 
            +
                  on(:response) do
         | 
| 319 | 
            +
                    md.destroy
         | 
| 320 | 
            +
                  end
         | 
| 321 | 
            +
                }.show
         | 
| 322 | 
            +
                
         | 
| 323 | 
            +
                @game.paused = game_paused
         | 
| 324 | 
            +
              end
         | 
| 325 | 
            +
              
         | 
| 326 | 
            +
              def show_about_dialog
         | 
| 327 | 
            +
                message_dialog(@main_window) { |md|
         | 
| 328 | 
            +
                  title 'About'
         | 
| 329 | 
            +
                  text "Glimmer Tetris\n\nGlimmer DSL for GTK\n\nElaborate Sample\n\nCopyright (c) 2021-2022 Andy Maleh"
         | 
| 330 | 
            +
                  
         | 
| 331 | 
            +
                  on(:response) do
         | 
| 332 | 
            +
                    md.destroy
         | 
| 333 | 
            +
                  end
         | 
| 334 | 
            +
                }.show
         | 
| 335 | 
            +
              end
         | 
| 165 336 | 
             
            end
         | 
| 166 337 |  | 
| 167 338 | 
             
            Tetris.new.launch
         |