nyle 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/CHANGELOG.md +71 -0
- data/README.md +1 -7
- data/doc/Nyle_reference.pdf +0 -0
- data/lib/nyle.rb +42 -0
- data/lib/nyle/frame.rb +19 -8
- data/lib/nyle/screen.rb +15 -20
- data/lib/nyle/version.rb +1 -1
- data/nyle.gemspec +2 -2
- data/samples/image/n_fl_tree32.png +0 -0
- data/samples/nyle_basics.rb +2 -2
- data/samples/nyle_basics2.rb +2 -2
- data/samples/nyle_block.rb +3 -3
- data/samples/nyle_click.rb +34 -0
- data/samples/nyle_clock.rb +57 -0
- data/samples/nyle_colors.rb +269 -263
- data/samples/nyle_falling.rb +3 -3
- data/samples/nyle_flight.rb +87 -0
- data/samples/nyle_pixel.rb +33 -0
- data/samples/nyle_sketch.rb +76 -25
- data/samples/nyle_sugar.rb +63 -0
- data/samples/readme_samples.txt +8 -1
- metadata +11 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 693c8de3045e3e2da3cf72a117fff8a29cad2e0952626e9af1dfe11f2d23576d
|
4
|
+
data.tar.gz: de724f1bf413b8dce0c3ae243ad108119179872905fbd975f5d175cd9db41f4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 530eec7b56aa8713b663a770d9adc2f62dc1655b0286820d829598728fe132957d050044f9e21b3b2aaca1f041fc1bbd39e3eb8364f58698a61e18b9fd8d6afe
|
7
|
+
data.tar.gz: a83a81cb91efe31be12b009010b470cf722db8f109fe7fefe0a590153a66d1791ec562f09a04ae3f58f19abcf7b5e8e782cedd60d187b6543fe3cdc2cdfa4ee8
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
### 0.6.0 (2018/12/01)
|
3
|
+
#### New features
|
4
|
+
* add `Nyle.pixel` method
|
5
|
+
* add `Nyle.pixel?` method
|
6
|
+
* add `Nyle.save` method
|
7
|
+
* enhance `Nyle::Frame#set_current` to use container widget of GTK3
|
8
|
+
|
9
|
+
#### Bug fixes, etc.
|
10
|
+
* add defintion of key names
|
11
|
+
* define constant of mouse buttons
|
12
|
+
* move key/mouse state process to :draw signal handler in `Nyle::Screen`
|
13
|
+
|
14
|
+
#### Reference manual
|
15
|
+
* revise
|
16
|
+
|
17
|
+
#### Samples
|
18
|
+
* use `MOUSE_L` `MOUSE_R`
|
19
|
+
* add `nyle_click.rb`
|
20
|
+
* add `nyle_clock.rb`
|
21
|
+
* add `nyle_flight.rb`
|
22
|
+
* add `nyle_pixel.rb`
|
23
|
+
* add `nyle_sugar.rb`
|
24
|
+
|
25
|
+
|
26
|
+
### 0.5.2 (2018/11/11)
|
27
|
+
#### New features
|
28
|
+
* release as RubyGems
|
29
|
+
* add `Nyle.draw_shape` method
|
30
|
+
* add `a`(alpha value) option in `Nyle.draw_*`
|
31
|
+
* add `Nyle::Scneen#suspend` method and `Nyle::Scneen#resume` method
|
32
|
+
* give `?` letter to method which returns true ot false
|
33
|
+
|
34
|
+
|
35
|
+
### 0.4.0 (2018/11/04)
|
36
|
+
#### New features
|
37
|
+
|
38
|
+
* add `Nyle.load_image_tiles` method
|
39
|
+
* add `Nyle.screen_width` method
|
40
|
+
* add `Nyle.screen_height` method
|
41
|
+
* add `cw` and `ch` option in `Nyle.load_image` method
|
42
|
+
|
43
|
+
#### Bug fixes, etc.
|
44
|
+
* delete `set_default_size` (using gtk3-3.3.0)
|
45
|
+
|
46
|
+
#### Samples
|
47
|
+
* adjust calling `Nyle.load_image` method at `initialize`
|
48
|
+
|
49
|
+
|
50
|
+
### 0.3.0 (2018/11/02)
|
51
|
+
#### Bug fixes, etc.
|
52
|
+
|
53
|
+
* change `_set_cr(widget.window.create_cairo_context)` to `_set_cr(cairo_context)`
|
54
|
+
(`Class Nyle::Screen` `signal_connect(:draw)`)
|
55
|
+
* change `set_default_size` to `set_size_request` (except on Windows)
|
56
|
+
(`Class Nyle::frame` `initialize`)
|
57
|
+
* add `Nyle.os` (for internal)
|
58
|
+
* delete `NYLE_SCALE` environment variable
|
59
|
+
|
60
|
+
|
61
|
+
### 0.2.0 (2018/11/01)
|
62
|
+
* Bug fixes, etc.
|
63
|
+
|
64
|
+
|
65
|
+
### 0.1.0 (2018/10/28)
|
66
|
+
* release
|
67
|
+
|
68
|
+
|
69
|
+
### 0.0.1 (2018/09/16)
|
70
|
+
* trial release
|
71
|
+
|
data/README.md
CHANGED
@@ -5,7 +5,6 @@
|
|
5
5
|
## Requirements
|
6
6
|
|
7
7
|
* Ruby/GTK3
|
8
|
-
* rsvg2 (for Windows only)
|
9
8
|
|
10
9
|
## Installation
|
11
10
|
|
@@ -13,11 +12,6 @@ Install it yourself as:
|
|
13
12
|
|
14
13
|
$ gem install nyle
|
15
14
|
|
16
|
-
Or for Windows
|
17
|
-
|
18
|
-
$ gem install nyle
|
19
|
-
$ gem rsvg2
|
20
|
-
|
21
15
|
## Usage
|
22
16
|
|
23
17
|
```ruby
|
@@ -30,7 +24,7 @@ Reference manual: https://github.com/spoolkitamura/nyle/tree/master/doc/Nyle_ref
|
|
30
24
|
|
31
25
|
## Samples
|
32
26
|
|
33
|
-
|
27
|
+
Sample programs: https://github.com/spoolkitamura/nyle/tree/master/samples
|
34
28
|
|
35
29
|
## License
|
36
30
|
|
data/doc/Nyle_reference.pdf
CHANGED
Binary file
|
data/lib/nyle.rb
CHANGED
@@ -15,6 +15,15 @@ require 'nyle/version'
|
|
15
15
|
require 'nyle/frame'
|
16
16
|
require 'nyle/screen'
|
17
17
|
|
18
|
+
Gdk::Keyval.constants.each do |c|
|
19
|
+
#puts "#{c} #{Gdk::Keyval.const_get(c)}"
|
20
|
+
eval("#{c} = #{Gdk::Keyval.const_get(c)}") # key name definication to omit 'Gdk::Keyval::'
|
21
|
+
end
|
22
|
+
|
23
|
+
MOUSE_L = 1
|
24
|
+
MOUSE_M = 2
|
25
|
+
MOUSE_R = 3
|
26
|
+
|
18
27
|
module Nyle
|
19
28
|
class Error < StandardError; end
|
20
29
|
|
@@ -133,6 +142,13 @@ module Nyle
|
|
133
142
|
module_function def mask_shift? ; Nyle.module_eval{ @__mask_shift } ; end
|
134
143
|
module_function def os ; Nyle.module_eval{ @__os } ; end
|
135
144
|
|
145
|
+
module_function def save
|
146
|
+
cr = Nyle.module_eval{ @__cr }
|
147
|
+
cr.save do
|
148
|
+
yield
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
136
152
|
module_function def draw_line(x1, y1, x2, y2, weight: 2, cap: :BUTT, color: :BLACK, a: 1.0)
|
137
153
|
cr = Nyle.module_eval{ @__cr }
|
138
154
|
cr.save do
|
@@ -295,6 +311,32 @@ module Nyle
|
|
295
311
|
cr.target.write_to_png(filename)
|
296
312
|
end
|
297
313
|
|
314
|
+
module INNER
|
315
|
+
# for Nyle.pixel* methods
|
316
|
+
class << self
|
317
|
+
private def _pixel(x, y)
|
318
|
+
cr = Nyle.module_eval{ @__cr }
|
319
|
+
surface = cr.target
|
320
|
+
address = surface.width * (y * 4) + (x * 4)
|
321
|
+
color = surface.data.byteslice(address, 4).unpack("H*").first.upcase # e.g. '\xcc\x77\x00\xff -> ['cc7700ff'] -> 'CC7700FF'
|
322
|
+
color = '#' +
|
323
|
+
color.slice(4, 2) +
|
324
|
+
color.slice(2, 2) +
|
325
|
+
color.slice(0, 2) +
|
326
|
+
color.slice(6, 2) # BBGGRRAA -> #RRGGBBAA
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
module_function def pixel(x, y)
|
332
|
+
Nyle::INNER.module_eval{ _pixel(x, y) }
|
333
|
+
end
|
334
|
+
|
335
|
+
module_function def pixel?(x, y, color)
|
336
|
+
c = Nyle::INNER.module_eval{ _pixel(x, y) }
|
337
|
+
return (c == Cairo::Color.parse(color).to_s ? true : false)
|
338
|
+
end
|
339
|
+
|
298
340
|
module_function def translate(tx, ty)
|
299
341
|
cr = Nyle.module_eval{ @__cr }
|
300
342
|
cr.translate(tx, ty)
|
data/lib/nyle/frame.rb
CHANGED
@@ -24,10 +24,6 @@ module Nyle
|
|
24
24
|
@interval_time = 15 if @interval_time < 5 or @interval_time > 60
|
25
25
|
GLib::Timeout.add(@interval_time) do
|
26
26
|
if @current_screen
|
27
|
-
Nyle.module_eval {
|
28
|
-
_update_mouse_state
|
29
|
-
_update_key_state
|
30
|
-
}
|
31
27
|
update
|
32
28
|
@current_screen.queue_draw unless @current_screen.destroyed?
|
33
29
|
end
|
@@ -80,10 +76,25 @@ module Nyle
|
|
80
76
|
_set_current(screen)
|
81
77
|
end
|
82
78
|
|
83
|
-
private def _set_current(
|
84
|
-
|
85
|
-
|
86
|
-
|
79
|
+
private def _set_current(widget)
|
80
|
+
if widget.is_a?(Nyle::Screen)
|
81
|
+
self.remove(@current_screen) if @current_screen
|
82
|
+
@current_screen = widget
|
83
|
+
self.add(@current_screen) # add instance which is kind of Nyle::Screen
|
84
|
+
else
|
85
|
+
screen = nil
|
86
|
+
widget.each do |child|
|
87
|
+
if child.is_a?(Nyle::Screen)
|
88
|
+
screen = child # get instance which is kind of Nyle::Screen from container
|
89
|
+
break
|
90
|
+
end
|
91
|
+
end
|
92
|
+
if screen
|
93
|
+
self.remove(@current_screen) if @current_screen
|
94
|
+
@current_screen = screen
|
95
|
+
self.add(widget) # add container
|
96
|
+
end
|
97
|
+
end
|
87
98
|
w = @current_screen.width
|
88
99
|
h = @current_screen.height
|
89
100
|
Nyle.module_eval {
|
data/lib/nyle/screen.rb
CHANGED
@@ -13,7 +13,6 @@ module Nyle
|
|
13
13
|
|
14
14
|
# Screen
|
15
15
|
class Screen < Gtk::DrawingArea
|
16
|
-
include Gdk::Keyval # Include key definication to omit 'Gdk::Keyval::' for subclass
|
17
16
|
attr_reader :width, :height, :status
|
18
17
|
def initialize(width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT, bgcolor: :WHITE, trace: false)
|
19
18
|
super()
|
@@ -24,25 +23,20 @@ module Nyle
|
|
24
23
|
@running_count = 0
|
25
24
|
@status = nil
|
26
25
|
|
26
|
+
@fill_done = false
|
27
|
+
|
27
28
|
# Draw to 'CairoContext' of ImageSurface once, and copy to 'CairoContext' of DrawingArea
|
28
|
-
|
29
|
-
|
30
|
-
# [WARN] Segmentation Fault happen after a while
|
31
|
-
#data = sprintf("%02X%02X%02X%02X", Cairo::Color.parse(@bgcolor).b * 255,
|
32
|
-
# Cairo::Color.parse(@bgcolor).g * 255,
|
33
|
-
# Cairo::Color.parse(@bgcolor).r * 255, 255) # Hex (e.g. CC7700FF; b=CC, g=77, r=00, a=FF)
|
34
|
-
#data = [data].pack("H*") # Pack as binary (e.g. \xCC\x77\x00\xFF)
|
35
|
-
#@canvas = Cairo::ImageSurface.new(data * @width * @height, :ARGB32, @width, @height, @width * 4)
|
36
|
-
@canvas = Cairo::ImageSurface.new(@width, @height)
|
37
|
-
else
|
38
|
-
# transparent background
|
39
|
-
@canvas = Cairo::ImageSurface.new(@width, @height)
|
40
|
-
end
|
29
|
+
@canvas = Cairo::ImageSurface.new(@width, @height)
|
30
|
+
|
41
31
|
self.signal_connect(:configure_event) do |widget, event|
|
42
32
|
; # For resizing and so on
|
43
33
|
end
|
44
34
|
|
45
35
|
self.signal_connect(:draw) do |widget, cairo_context|
|
36
|
+
Nyle.module_eval {
|
37
|
+
_update_mouse_state
|
38
|
+
_update_key_state
|
39
|
+
}
|
46
40
|
# Draw to 'CairoContext' of ImageSurface
|
47
41
|
Cairo::Context.new(@canvas) do |cr|
|
48
42
|
Nyle.module_eval {
|
@@ -51,6 +45,12 @@ module Nyle
|
|
51
45
|
unless @trace # If not trace, fill screen each time
|
52
46
|
Nyle.cr.set_source_color(@bgcolor)
|
53
47
|
Nyle.cr.paint
|
48
|
+
else
|
49
|
+
unless @fill_done
|
50
|
+
Nyle.cr.set_source_color(@bgcolor) # fill once
|
51
|
+
Nyle.cr.paint
|
52
|
+
@fill_done = true
|
53
|
+
end
|
54
54
|
end
|
55
55
|
update
|
56
56
|
draw
|
@@ -73,7 +73,7 @@ module Nyle
|
|
73
73
|
# Signal handler for mouse position
|
74
74
|
self.signal_connect(:motion_notify_event) do |widget, event|
|
75
75
|
Nyle.module_eval {
|
76
|
-
_set_mouse_pos(event.x, event.y)
|
76
|
+
_set_mouse_pos(event.x.to_i, event.y.to_i)
|
77
77
|
}
|
78
78
|
false
|
79
79
|
end
|
@@ -83,11 +83,6 @@ module Nyle
|
|
83
83
|
def show_all(title = DEFAULT_TITLE)
|
84
84
|
f = Nyle::Frame.new(@width, @height, {title: title})
|
85
85
|
f.set_current(self)
|
86
|
-
|
87
|
-
# Workaround for Segmentation Fault when ImageSureface instance create by using RGBA32 data at Screen.initialize
|
88
|
-
f.override_background_color(:normal, Gdk::RGBA::new(Cairo::Color.parse(@bgcolor).r,
|
89
|
-
Cairo::Color.parse(@bgcolor).g,
|
90
|
-
Cairo::Color.parse(@bgcolor).b, 1.0))
|
91
86
|
f.show_all
|
92
87
|
f
|
93
88
|
end
|
data/lib/nyle/version.rb
CHANGED
data/nyle.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Koki Kitamura"]
|
10
10
|
spec.email = ["spool.kitamura@nifty.ne.jp"]
|
11
11
|
|
12
|
-
spec.summary = %q{minimal graphics framework using Ruby/GTK3
|
13
|
-
spec.description = %q{'Nyle' is a minimal graphics framework using Ruby/GTK3
|
12
|
+
spec.summary = %q{minimal graphics framework using Ruby/GTK3 and Cairo}
|
13
|
+
spec.description = %q{'Nyle' is a minimal graphics framework using Ruby/GTK3 and Cairo}
|
14
14
|
spec.homepage = "https://github.com/spoolkitamura/nyle"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
Binary file
|
data/samples/nyle_basics.rb
CHANGED
@@ -32,7 +32,7 @@ class Screen < Nyle::Screen
|
|
32
32
|
Nyle.draw_rect(540, 200, 60, 30, {color: :ORANGE, fill: true, round: 5, a: 0.6})
|
33
33
|
|
34
34
|
Nyle.draw_rect( 45, 250, 50, 30, {weight: 3, color: :GOLD})
|
35
|
-
Nyle.
|
35
|
+
Nyle.save do
|
36
36
|
for i in (1..5) do
|
37
37
|
# rectangle (coordinate transformation)
|
38
38
|
Nyle.rotate(Math::PI / 80)
|
@@ -55,7 +55,7 @@ class Screen < Nyle::Screen
|
|
55
55
|
puts "[ctrl] + [shift]" if Nyle.mask_control? and Nyle.mask_shift?
|
56
56
|
|
57
57
|
# mouse status
|
58
|
-
|
58
|
+
[MOUSE_L, MOUSE_M, MOUSE_R].each do |k|
|
59
59
|
puts "Nyle.mouse_press?(#{k})" if Nyle.mouse_press?(k)
|
60
60
|
end
|
61
61
|
|
data/samples/nyle_basics2.rb
CHANGED
@@ -33,7 +33,7 @@ class Screen < Nyle::Screen
|
|
33
33
|
draw_rect(540, 200, 60, 30, {color: :ORANGE, fill: true, round: 5, a: 0.6})
|
34
34
|
|
35
35
|
draw_rect( 45, 250, 50, 30, {weight: 3, color: :GOLD})
|
36
|
-
|
36
|
+
save do
|
37
37
|
for i in (1..5) do
|
38
38
|
# rectangle (coordinate transformation)
|
39
39
|
rotate(Math::PI / 80)
|
@@ -56,7 +56,7 @@ class Screen < Nyle::Screen
|
|
56
56
|
puts "[ctrl] + [shift]" if mask_control? and mask_shift?
|
57
57
|
|
58
58
|
# mouse status
|
59
|
-
|
59
|
+
[MOUSE_L, MOUSE_M, MOUSE_R].each do |k|
|
60
60
|
puts "mouse_press?(#{k})" if mouse_press?(k)
|
61
61
|
end
|
62
62
|
|
data/samples/nyle_block.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
require 'nyle'
|
3
|
+
|
4
|
+
class Screen < Nyle::Screen
|
5
|
+
def initialize
|
6
|
+
super
|
7
|
+
@image1 = Nyle.load_image("./image/n_f_strawberry.png")
|
8
|
+
calc_xy
|
9
|
+
end
|
10
|
+
|
11
|
+
def draw
|
12
|
+
Nyle.draw_image(@x, @y, @image1)
|
13
|
+
calc_xy if clicked?
|
14
|
+
Nyle.quit if Nyle.key_press?(KEY_Escape)
|
15
|
+
end
|
16
|
+
|
17
|
+
def calc_xy
|
18
|
+
@x = rand(Nyle.screen_width - @image1.width)
|
19
|
+
@y = rand(Nyle.screen_height - @image1.height)
|
20
|
+
end
|
21
|
+
|
22
|
+
def clicked?
|
23
|
+
Nyle.mouse_press?(MOUSE_L) and
|
24
|
+
Nyle.mouse_x >= @x and
|
25
|
+
Nyle.mouse_x <= @x + @image1.width and
|
26
|
+
Nyle.mouse_y >= @y and
|
27
|
+
Nyle.mouse_y <= @y + @image1.height
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
Screen.new.show_all
|
33
|
+
Gtk.main
|
34
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
require 'nyle'
|
3
|
+
|
4
|
+
class Screen < Nyle::Screen
|
5
|
+
def initialize
|
6
|
+
super(240, 240, {bgcolor: :FOREST_GREEN})
|
7
|
+
@radius = 0.42
|
8
|
+
end
|
9
|
+
|
10
|
+
def draw
|
11
|
+
Nyle.scale(Nyle.screen_width, Nyle.screen_height);
|
12
|
+
Nyle.translate(0.5, 0.5);
|
13
|
+
|
14
|
+
Nyle.draw_circle(0, 0, @radius, {color: :WHITE, fill: true})
|
15
|
+
Nyle.draw_circle(0, 0, @radius, {weight: 0.05})
|
16
|
+
|
17
|
+
# clock ticks
|
18
|
+
for i in (0...12) do
|
19
|
+
inset = (i % 3 == 0 ? 0.05 : 0.03)
|
20
|
+
Nyle.draw_line((@radius - inset) * Math::cos(i * Math::PI / 6),
|
21
|
+
(@radius - inset) * Math::sin(i * Math::PI / 6),
|
22
|
+
(@radius) * Math::cos(i * Math::PI / 6),
|
23
|
+
(@radius) * Math::sin(i * Math::PI / 6), {cap: :ROUND, weight: inset})
|
24
|
+
end
|
25
|
+
|
26
|
+
# store the current time
|
27
|
+
tm = Time.now
|
28
|
+
# puts "#{tm.hour} #{tm.min} #{tm.sec}"
|
29
|
+
|
30
|
+
# compute the angles of the indicators of our clock
|
31
|
+
hours = tm.hour * Math::PI / 6;
|
32
|
+
minutes = tm.min * Math::PI / 30;
|
33
|
+
seconds = tm.sec * Math::PI / 30;
|
34
|
+
|
35
|
+
# draw the hours hand
|
36
|
+
Nyle.draw_line(0, 0, Math::sin(hours + minutes / 12) * (@radius * 0.5),
|
37
|
+
-Math::cos(hours + minutes / 12) * (@radius * 0.5), {cap: :ROUND, color: :FOREST_GREEN, weight: 0.05})
|
38
|
+
|
39
|
+
# draw the minutes hand
|
40
|
+
Nyle.draw_line(0, 0, Math::sin(minutes + seconds / 60) * (@radius * 0.8),
|
41
|
+
-Math::cos(minutes + seconds / 60) * (@radius * 0.8), {cap: :ROUND, color: :BLUE, weight: 0.05})
|
42
|
+
|
43
|
+
# draw the seconds hand
|
44
|
+
Nyle.draw_line(0, 0, Math::sin(seconds) * (@radius * 0.9),
|
45
|
+
-Math::cos(seconds) * (@radius * 0.9), {cap: :ROUND, color: :RED, weight: 0.05 / 3})
|
46
|
+
|
47
|
+
# draw a little dot in the middle
|
48
|
+
Nyle.draw_circle(0, 0, 0.05 / 2, {fill: true})
|
49
|
+
|
50
|
+
Nyle.quit if Nyle.key_press?(KEY_Escape)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
Screen.new.show_all
|
56
|
+
Gtk.main
|
57
|
+
|