glimmer-dsl-libui 0.2.2 → 0.2.3
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 +13 -0
- data/README.md +104 -7
- data/VERSION +1 -1
- data/examples/basic_draw_text.rb +67 -0
- data/examples/midi_player.rb +1 -1
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/control_expression.rb +0 -1
- data/lib/glimmer/dsl/libui/property_expression.rb +3 -1
- data/lib/glimmer/dsl/libui/string_expression.rb +48 -0
- data/lib/glimmer/libui/attributed_string.rb +90 -0
- data/lib/glimmer/libui/control_proxy/area_proxy.rb +1 -1
- data/lib/glimmer/libui/control_proxy/font_button_proxy.rb +3 -3
- data/lib/glimmer/libui/control_proxy/path_proxy.rb +0 -2
- data/lib/glimmer/libui/control_proxy/text_proxy.rb +158 -0
- data/lib/glimmer/libui.rb +15 -5
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7033d9033941a3dac53c927ae7ddfdd27127eb4286a936d36e86acb226e57f99
|
4
|
+
data.tar.gz: e88c6c0fd4dd246e4f4f7d9f38cc3c8d10f31e0c3cbbd329de4bdd70b4618cf0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97140fa3ac706b51f054a047d310172c7469eadca3b90307ff8174443c7f9655a6369e59e6f0ce68c52e7dc1189e5c53abd6654b89e0d5b52f2eed638f347d32
|
7
|
+
data.tar.gz: 24687499c2bd93b4514d6e7d472e57a788d50315b944bc7289a871b7286b91e46e43fd7651b28b0f1ac4a074f80efdae385a1f3b6d3cdbeaab2cbf46cc0f4c30
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.2.3
|
4
|
+
|
5
|
+
- Update examples/midi_player.rb to read sounds locally from gem
|
6
|
+
- Support examples/basic_draw_text.rb
|
7
|
+
- Support dynamic `text` control to be called in `area` `on_draw` listener
|
8
|
+
- Support `text` control `default_font` property
|
9
|
+
- Support `string` control nestable under `text` to represent an attributed/unattributed string (depending on nestable properties)
|
10
|
+
- Support `string` control property `color`
|
11
|
+
- Support enum symbols for `align` property of `text` control
|
12
|
+
- Support enum symbols for `:italic` font descriptor key (in addition to numbers)
|
13
|
+
- Support enum symbols for `:stretch` font descriptor key (in addition to numbers)
|
14
|
+
- Support enum symbols for `:weight` font descriptor key (in addition to numbers)
|
15
|
+
|
3
16
|
## 0.2.2
|
4
17
|
|
5
18
|
- Automatically add `vertical_box` parent to `area` if it did not have a box parent (otherwise, it seems not to show up on Linux, even when directly under `grid`)
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for LibUI 0.2.
|
1
|
+
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for LibUI 0.2.3
|
2
2
|
## Prerequisite-Free Ruby Desktop Development GUI Library
|
3
3
|
[](http://badge.fury.io/rb/glimmer-dsl-libui)
|
4
4
|
[](https://codeclimate.com/github/AndyObtiva/glimmer-dsl-libui/maintainability)
|
@@ -197,7 +197,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
197
197
|
|
198
198
|
## Table of Contents
|
199
199
|
|
200
|
-
- [Glimmer DSL for LibUI 0.2.
|
200
|
+
- [Glimmer DSL for LibUI 0.2.3](#-glimmer-dsl-for-libui-023)
|
201
201
|
- [Glimmer GUI DSL Concepts](#glimmer-gui-dsl-concepts)
|
202
202
|
- [Usage](#usage)
|
203
203
|
- [Girb (Glimmer IRB)](#girb-glimmer-irb)
|
@@ -244,6 +244,7 @@ Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interes
|
|
244
244
|
- [Login](#login)
|
245
245
|
- [Timer](#timer)
|
246
246
|
- [Color The Circles](#color-the-circles)
|
247
|
+
- [Basic Draw Text](#basic-draw-text)
|
247
248
|
- [Contributing to glimmer-dsl-libui](#contributing-to-glimmer-dsl-libui)
|
248
249
|
- [Help](#help)
|
249
250
|
- [Issues](#issues)
|
@@ -331,7 +332,7 @@ gem install glimmer-dsl-libui
|
|
331
332
|
Or install via Bundler `Gemfile`:
|
332
333
|
|
333
334
|
```ruby
|
334
|
-
gem 'glimmer-dsl-libui', '~> 0.2.
|
335
|
+
gem 'glimmer-dsl-libui', '~> 0.2.3'
|
335
336
|
```
|
336
337
|
|
337
338
|
Add `require 'glimmer-dsl-libui'` at the top, and then `include Glimmer` into the top-level main object for testing or into an actual class for serious usage.
|
@@ -1276,9 +1277,7 @@ window('Notepad', 500, 300) {
|
|
1276
1277
|
|
1277
1278
|
### Midi Player
|
1278
1279
|
|
1279
|
-
|
1280
|
-
- Install [TiMidity](http://timidity.sourceforge.net) and ensure `timidity` command is in `PATH` (can be installed via [Homebrew](https://brew.sh) on Mac or [apt-get](https://help.ubuntu.com/community/AptGet/Howto) on Linux).
|
1281
|
-
- Add `*.mid` files to `~/Music` directory (you may copy the ones included in [sounds](sounds) directory)
|
1280
|
+
To run this example, install [TiMidity](http://timidity.sourceforge.net) and ensure `timidity` command is in `PATH` (can be installed via [Homebrew](https://brew.sh) on Mac or [apt-get](https://help.ubuntu.com/community/AptGet/Howto) on Linux).
|
1282
1281
|
|
1283
1282
|
[examples/midi_player.rb](examples/midi_player.rb)
|
1284
1283
|
|
@@ -1417,7 +1416,7 @@ class TinyMidiPlayer
|
|
1417
1416
|
|
1418
1417
|
def initialize
|
1419
1418
|
@pid = nil
|
1420
|
-
@music_directory = File.expand_path(
|
1419
|
+
@music_directory = File.expand_path('../sounds', __dir__)
|
1421
1420
|
@midi_files = Dir.glob(File.join(@music_directory, '**/*.mid'))
|
1422
1421
|
.sort_by { |path| File.basename(path) }
|
1423
1422
|
at_exit { stop_midi }
|
@@ -4538,6 +4537,8 @@ window('Login') {
|
|
4538
4537
|
|
4539
4538
|
### Timer
|
4540
4539
|
|
4540
|
+
To run this example, install [TiMidity](http://timidity.sourceforge.net) and ensure `timidity` command is in `PATH` (can be installed via [Homebrew](https://brew.sh) on Mac or [apt-get](https://help.ubuntu.com/community/AptGet/Howto) on Linux).
|
4541
|
+
|
4541
4542
|
[examples/timer.rb](examples/timer.rb)
|
4542
4543
|
|
4543
4544
|
Run with this command from the root of the project if you cloned the project:
|
@@ -4939,6 +4940,102 @@ end
|
|
4939
4940
|
ColorTheCircles.new.launch
|
4940
4941
|
```
|
4941
4942
|
|
4943
|
+
### Basic Draw Text
|
4944
|
+
|
4945
|
+
[examples/basic_draw_text.rb](examples/basic_draw_text.rb)
|
4946
|
+
|
4947
|
+
Run with this command from the root of the project if you cloned the project:
|
4948
|
+
|
4949
|
+
```
|
4950
|
+
ruby -r './lib/glimmer-dsl-libui' examples/basic_draw_text.rb
|
4951
|
+
```
|
4952
|
+
|
4953
|
+
Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui):
|
4954
|
+
|
4955
|
+
```
|
4956
|
+
ruby -r glimmer-dsl-libui -e "require 'examples/basic_draw_text'"
|
4957
|
+
```
|
4958
|
+
|
4959
|
+
Mac
|
4960
|
+
|
4961
|
+

|
4962
|
+
|
4963
|
+
Linux
|
4964
|
+
|
4965
|
+

|
4966
|
+
|
4967
|
+
New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
|
4968
|
+
|
4969
|
+
```ruby
|
4970
|
+
require 'glimmer-dsl-libui'
|
4971
|
+
|
4972
|
+
# Michael Ende (1929-1995)
|
4973
|
+
# The Neverending Story is a fantasy novel by German writer Michael Ende,
|
4974
|
+
# The English version, translated by Ralph Manheim, was published in 1983.
|
4975
|
+
class BasicDrawText
|
4976
|
+
include Glimmer
|
4977
|
+
|
4978
|
+
def alternating_color_string(&block)
|
4979
|
+
@index ||= 0
|
4980
|
+
@index += 1
|
4981
|
+
string {
|
4982
|
+
if @index.odd?
|
4983
|
+
color r: 0.5, g: 0, b: 0.25, a: 0.7
|
4984
|
+
else
|
4985
|
+
color r: 0, g: 0.5, b: 0, a: 0.7
|
4986
|
+
end
|
4987
|
+
|
4988
|
+
block.call + "\n\n"
|
4989
|
+
}
|
4990
|
+
end
|
4991
|
+
|
4992
|
+
def launch
|
4993
|
+
window('Michael Ende (1929-1995) The Neverending Story', 600, 400) {
|
4994
|
+
margined true
|
4995
|
+
|
4996
|
+
area {
|
4997
|
+
on_draw do |area_draw_params|
|
4998
|
+
text(0, 0, area_draw_params[:area_width]) {
|
4999
|
+
align 0
|
5000
|
+
default_font family: 'Georgia', size: 13, weight: 500, italic: 0, stretch: 4
|
5001
|
+
|
5002
|
+
alternating_color_string {
|
5003
|
+
' At last Ygramul sensed that something was coming toward ' \
|
5004
|
+
'her. With the speed of lightning, she turned about, confronting ' \
|
5005
|
+
'Atreyu with an enormous steel-blue face. Her single eye had a ' \
|
5006
|
+
'vertical pupil, which stared at Atreyu with inconceivable malignancy. '
|
5007
|
+
}
|
5008
|
+
alternating_color_string {
|
5009
|
+
' A cry of fear escaped Bastian. '
|
5010
|
+
}
|
5011
|
+
alternating_color_string {
|
5012
|
+
' A cry of terror passed through the ravine and echoed from ' \
|
5013
|
+
'side to side. Ygramul turned her eye to left and right, to see if ' \
|
5014
|
+
'someone else had arrived, for that sound could not have been ' \
|
5015
|
+
'made by the boy who stood there as though paralyzed with ' \
|
5016
|
+
'horror. '
|
5017
|
+
}
|
5018
|
+
alternating_color_string {
|
5019
|
+
' Could she have heard my cry? Bastion wondered in alarm. ' \
|
5020
|
+
"But that's not possible. "
|
5021
|
+
}
|
5022
|
+
alternating_color_string {
|
5023
|
+
' And then Atreyu heard Ygramuls voice. It was very high ' \
|
5024
|
+
'and slightly hoarse, not at all the right kind of voice for that ' \
|
5025
|
+
'enormous face. Her lips did not move as she spoke. It was the ' \
|
5026
|
+
'buzzing of a great swarm of hornets that shaped itself into ' \
|
5027
|
+
'words. '
|
5028
|
+
}
|
5029
|
+
}
|
5030
|
+
end
|
5031
|
+
}
|
5032
|
+
}.show
|
5033
|
+
end
|
5034
|
+
end
|
5035
|
+
|
5036
|
+
BasicDrawText.new.launch
|
5037
|
+
```
|
5038
|
+
|
4942
5039
|
## Contributing to glimmer-dsl-libui
|
4943
5040
|
|
4944
5041
|
- Check out the latest master to make sure the feature hasn't been
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
# Michael Ende (1929-1995)
|
4
|
+
# The Neverending Story is a fantasy novel by German writer Michael Ende,
|
5
|
+
# The English version, translated by Ralph Manheim, was published in 1983.
|
6
|
+
class BasicDrawText
|
7
|
+
include Glimmer
|
8
|
+
|
9
|
+
def alternating_color_string(&block)
|
10
|
+
@index ||= 0
|
11
|
+
@index += 1
|
12
|
+
string {
|
13
|
+
if @index.odd?
|
14
|
+
color r: 0.5, g: 0, b: 0.25, a: 0.7
|
15
|
+
else
|
16
|
+
color r: 0, g: 0.5, b: 0, a: 0.7
|
17
|
+
end
|
18
|
+
|
19
|
+
block.call + "\n\n"
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def launch
|
24
|
+
window('Michael Ende (1929-1995) The Neverending Story', 600, 400) {
|
25
|
+
margined true
|
26
|
+
|
27
|
+
area {
|
28
|
+
on_draw do |area_draw_params|
|
29
|
+
text(0, 0, area_draw_params[:area_width]) {
|
30
|
+
align 0
|
31
|
+
default_font family: 'Georgia', size: 13, weight: 500, italic: 0, stretch: 4
|
32
|
+
|
33
|
+
alternating_color_string {
|
34
|
+
' At last Ygramul sensed that something was coming toward ' \
|
35
|
+
'her. With the speed of lightning, she turned about, confronting ' \
|
36
|
+
'Atreyu with an enormous steel-blue face. Her single eye had a ' \
|
37
|
+
'vertical pupil, which stared at Atreyu with inconceivable malignancy. '
|
38
|
+
}
|
39
|
+
alternating_color_string {
|
40
|
+
' A cry of fear escaped Bastian. '
|
41
|
+
}
|
42
|
+
alternating_color_string {
|
43
|
+
' A cry of terror passed through the ravine and echoed from ' \
|
44
|
+
'side to side. Ygramul turned her eye to left and right, to see if ' \
|
45
|
+
'someone else had arrived, for that sound could not have been ' \
|
46
|
+
'made by the boy who stood there as though paralyzed with ' \
|
47
|
+
'horror. '
|
48
|
+
}
|
49
|
+
alternating_color_string {
|
50
|
+
' Could she have heard my cry? Bastion wondered in alarm. ' \
|
51
|
+
"But that's not possible. "
|
52
|
+
}
|
53
|
+
alternating_color_string {
|
54
|
+
' And then Atreyu heard Ygramuls voice. It was very high ' \
|
55
|
+
'and slightly hoarse, not at all the right kind of voice for that ' \
|
56
|
+
'enormous face. Her lips did not move as she spoke. It was the ' \
|
57
|
+
'buzzing of a great swarm of hornets that shaped itself into ' \
|
58
|
+
'words. '
|
59
|
+
}
|
60
|
+
}
|
61
|
+
end
|
62
|
+
}
|
63
|
+
}.show
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
BasicDrawText.new.launch
|
data/examples/midi_player.rb
CHANGED
@@ -9,7 +9,7 @@ class TinyMidiPlayer
|
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@pid = nil
|
12
|
-
@music_directory = File.expand_path(
|
12
|
+
@music_directory = File.expand_path('../sounds', __dir__)
|
13
13
|
@midi_files = Dir.glob(File.join(@music_directory, '**/*.mid'))
|
14
14
|
.sort_by { |path| File.basename(path) }
|
15
15
|
at_exit { stop_midi }
|
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|
@@ -22,6 +22,7 @@
|
|
22
22
|
require 'glimmer/dsl/expression'
|
23
23
|
require 'glimmer/libui/control_proxy'
|
24
24
|
require 'glimmer/libui/shape'
|
25
|
+
require 'glimmer/libui/attributed_string'
|
25
26
|
|
26
27
|
module Glimmer
|
27
28
|
module DSL
|
@@ -30,7 +31,8 @@ module Glimmer
|
|
30
31
|
def can_interpret?(parent, keyword, *args, &block)
|
31
32
|
(
|
32
33
|
parent.is_a?(Glimmer::LibUI::ControlProxy) or
|
33
|
-
parent.is_a?(Glimmer::LibUI::Shape)
|
34
|
+
parent.is_a?(Glimmer::LibUI::Shape) or
|
35
|
+
parent.is_a?(Glimmer::LibUI::AttributedString)
|
34
36
|
) and
|
35
37
|
block.nil? and
|
36
38
|
parent.respond_to?(keyword, *args)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright (c) 2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/dsl/static_expression'
|
23
|
+
require 'glimmer/dsl/parent_expression'
|
24
|
+
require 'glimmer/libui/control_proxy/text_proxy'
|
25
|
+
require 'glimmer/libui/attributed_string'
|
26
|
+
|
27
|
+
module Glimmer
|
28
|
+
module DSL
|
29
|
+
module Libui
|
30
|
+
class StringExpression < StaticExpression
|
31
|
+
include ParentExpression
|
32
|
+
|
33
|
+
def can_interpret?(parent, keyword, *args, &block)
|
34
|
+
super and
|
35
|
+
parent.is_a?(Glimmer::LibUI::ControlProxy::TextProxy)
|
36
|
+
end
|
37
|
+
|
38
|
+
def interpret(parent, keyword, *args, &block)
|
39
|
+
Glimmer::LibUI::AttributedString.new(keyword, parent, args, &block)
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_content(parent, keyword, *args, &block)
|
43
|
+
parent.post_add_content
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# Copyright (c) 2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/libui/control_proxy'
|
23
|
+
require 'glimmer/libui/control_proxy/area_proxy'
|
24
|
+
require 'glimmer/libui/parent'
|
25
|
+
require 'glimmer/libui/control_proxy/transformable'
|
26
|
+
|
27
|
+
module Glimmer
|
28
|
+
module LibUI
|
29
|
+
class AttributedString
|
30
|
+
attr_accessor :string
|
31
|
+
attr_reader :block, :keyword, :parent_proxy, :args
|
32
|
+
|
33
|
+
def initialize(keyword, parent_proxy, args, &block)
|
34
|
+
@keyword = keyword
|
35
|
+
@parent_proxy = parent_proxy
|
36
|
+
@args = args
|
37
|
+
@string = @args.first || ''
|
38
|
+
@block = block
|
39
|
+
post_add_content if @block.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
def font(value = nil)
|
43
|
+
# UI.attributed_string_set_attribute(@parent_proxy.attributed_string, color_attribute, start, start + @string.size)
|
44
|
+
end
|
45
|
+
|
46
|
+
def color(value = nil)
|
47
|
+
if value.nil?
|
48
|
+
@color
|
49
|
+
else
|
50
|
+
@color = Glimmer::LibUI.interpret_color(value)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def background(value = nil)
|
55
|
+
# UI.attributed_string_set_attribute(@parent_proxy.attributed_string, color_attribute, start, start + @string.size)
|
56
|
+
end
|
57
|
+
|
58
|
+
def underline(value = nil)
|
59
|
+
# UI.attributed_string_set_attribute(@parent_proxy.attributed_string, color_attribute, start, start + @string.size)
|
60
|
+
end
|
61
|
+
|
62
|
+
def post_add_content
|
63
|
+
block_result = block&.call
|
64
|
+
@string = block_result if block_result.is_a?(String)
|
65
|
+
@parent_proxy&.post_initialize_child(self)
|
66
|
+
end
|
67
|
+
|
68
|
+
def draw(area_draw_params)
|
69
|
+
@start = ::LibUI.attributed_string_len(@parent_proxy.attributed_string)
|
70
|
+
::LibUI.attributed_string_append_unattributed(@parent_proxy.attributed_string, @string)
|
71
|
+
unless color.nil?
|
72
|
+
color_attribute = ::LibUI.new_color_attribute(@color[:r], @color[:g], @color[:b], @color[:a] || 1.0)
|
73
|
+
::LibUI.attributed_string_set_attribute(@parent_proxy.attributed_string, color_attribute, @start, @start + @string.size)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def destroy
|
78
|
+
@parent_proxy&.children&.delete(self)
|
79
|
+
end
|
80
|
+
|
81
|
+
def redraw
|
82
|
+
area_proxy&.queue_redraw_all
|
83
|
+
end
|
84
|
+
|
85
|
+
def area_proxy
|
86
|
+
@parent_proxy.parent_proxy
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -180,7 +180,7 @@ module Glimmer
|
|
180
180
|
end
|
181
181
|
|
182
182
|
def ext_key_to_symbol(ext_key_value)
|
183
|
-
Glimmer::LibUI.
|
183
|
+
Glimmer::LibUI.enum_value_to_symbol(:ext_key, ext_key_value)
|
184
184
|
end
|
185
185
|
|
186
186
|
def modifiers_to_symbols(modifiers_value)
|
@@ -34,9 +34,9 @@ module Glimmer
|
|
34
34
|
{
|
35
35
|
family: @font_descriptor.Family.to_s,
|
36
36
|
size: @font_descriptor.Size,
|
37
|
-
weight: @font_descriptor.Weight,
|
38
|
-
italic: @font_descriptor.Italic,
|
39
|
-
stretch: @font_descriptor.Stretch
|
37
|
+
weight: Glimmer::LibUI.enum_value_to_symbol(:text_weight, @font_descriptor.Weight),
|
38
|
+
italic: Glimmer::LibUI.enum_value_to_symbol(:text_italic, @font_descriptor.Italic),
|
39
|
+
stretch: Glimmer::LibUI.enum_value_to_symbol(:text_stretch, @font_descriptor.Stretch),
|
40
40
|
}
|
41
41
|
end
|
42
42
|
|
@@ -34,13 +34,11 @@ module Glimmer
|
|
34
34
|
include Parent
|
35
35
|
prepend Transformable
|
36
36
|
|
37
|
-
# TODO support mode without parent proxy
|
38
37
|
def initialize(keyword, parent, args, &block)
|
39
38
|
@keyword = keyword
|
40
39
|
@parent_proxy = parent
|
41
40
|
@args = args
|
42
41
|
@block = block
|
43
|
-
@enabled = true
|
44
42
|
post_add_content if @block.nil?
|
45
43
|
end
|
46
44
|
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# Copyright (c) 2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/libui/control_proxy'
|
23
|
+
require 'glimmer/libui/control_proxy/area_proxy'
|
24
|
+
require 'glimmer/libui/parent'
|
25
|
+
require 'glimmer/libui/control_proxy/transformable'
|
26
|
+
|
27
|
+
module Glimmer
|
28
|
+
module LibUI
|
29
|
+
class ControlProxy
|
30
|
+
# Proxy for LibUI text objects
|
31
|
+
#
|
32
|
+
# Follows the Proxy Design Pattern
|
33
|
+
class TextProxy < ControlProxy
|
34
|
+
include Parent
|
35
|
+
prepend Transformable
|
36
|
+
|
37
|
+
def initialize(keyword, parent, args, &block)
|
38
|
+
@keyword = keyword
|
39
|
+
@parent_proxy = parent
|
40
|
+
@args = args
|
41
|
+
@block = block
|
42
|
+
post_add_content if @block.nil?
|
43
|
+
end
|
44
|
+
|
45
|
+
def post_add_content
|
46
|
+
super
|
47
|
+
if @parent_proxy.nil? && AreaProxy.current_area_draw_params
|
48
|
+
draw(AreaProxy.current_area_draw_params)
|
49
|
+
destroy
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def draw(area_draw_params)
|
54
|
+
children.dup.each {|child| child.draw(area_draw_params)}
|
55
|
+
build_control
|
56
|
+
::LibUI.draw_text(area_draw_params[:context], @libui, x, y)
|
57
|
+
::LibUI.draw_free_text_layout(@libui)
|
58
|
+
end
|
59
|
+
|
60
|
+
def destroy
|
61
|
+
@parent_proxy&.children&.delete(self)
|
62
|
+
ControlProxy.control_proxies.delete(self)
|
63
|
+
end
|
64
|
+
|
65
|
+
def redraw
|
66
|
+
@parent_proxy&.queue_redraw_all
|
67
|
+
end
|
68
|
+
|
69
|
+
def x(value = nil)
|
70
|
+
if value.nil?
|
71
|
+
@x ||= args[0] || 0
|
72
|
+
else
|
73
|
+
@x = value
|
74
|
+
end
|
75
|
+
end
|
76
|
+
alias x= x
|
77
|
+
alias set_x x
|
78
|
+
|
79
|
+
def y(value = nil)
|
80
|
+
if value.nil?
|
81
|
+
@y ||= args[1] || 0
|
82
|
+
else
|
83
|
+
@y = value
|
84
|
+
end
|
85
|
+
end
|
86
|
+
alias y= y
|
87
|
+
alias set_y y
|
88
|
+
|
89
|
+
def width(value = nil)
|
90
|
+
if value.nil?
|
91
|
+
@width ||= args[2] || (AreaProxy.current_area_draw_params && AreaProxy.current_area_draw_params[:width])
|
92
|
+
else
|
93
|
+
@width = value
|
94
|
+
end
|
95
|
+
end
|
96
|
+
alias width= width
|
97
|
+
alias set_width width
|
98
|
+
|
99
|
+
def attributed_string
|
100
|
+
@attributed_string ||= ::LibUI.new_attributed_string('')
|
101
|
+
end
|
102
|
+
|
103
|
+
def default_font(value = nil)
|
104
|
+
if value.nil?
|
105
|
+
@default_font ||= {}
|
106
|
+
else
|
107
|
+
@default_font = value
|
108
|
+
end
|
109
|
+
end
|
110
|
+
alias default_font= default_font
|
111
|
+
alias set_default_font default_font
|
112
|
+
|
113
|
+
def default_font_descriptor
|
114
|
+
@default_font_descriptor ||= ::LibUI::FFI::FontDescriptor.malloc
|
115
|
+
@default_font_descriptor.Family = default_font[:family] || 'Helvetica'
|
116
|
+
@default_font_descriptor.Size = default_font[:size] || 12.0
|
117
|
+
@default_font_descriptor.Weight = Glimmer::LibUI.enum_symbol_to_value(:text_weight, default_font[:weight], default_symbol: :normal)
|
118
|
+
@default_font_descriptor.Italic = Glimmer::LibUI.enum_symbol_to_value(:text_italic, default_font[:italic], default_symbol: :normal)
|
119
|
+
@default_font_descriptor.Stretch = Glimmer::LibUI.enum_symbol_to_value(:text_stretch, default_font[:stretch], default_symbol: :normal)
|
120
|
+
@default_font_descriptor
|
121
|
+
end
|
122
|
+
|
123
|
+
def align(value = nil)
|
124
|
+
if value.nil?
|
125
|
+
@align ||= {}
|
126
|
+
else
|
127
|
+
@align = value
|
128
|
+
end
|
129
|
+
end
|
130
|
+
alias align= align
|
131
|
+
alias set_align align
|
132
|
+
|
133
|
+
def draw_text_layout_params
|
134
|
+
@draw_text_layout_params ||= ::LibUI::FFI::DrawTextLayoutParams.malloc
|
135
|
+
@draw_text_layout_params.String = attributed_string
|
136
|
+
@draw_text_layout_params.DefaultFont = default_font_descriptor
|
137
|
+
@draw_text_layout_params.Width = width
|
138
|
+
@draw_text_layout_params.Align = Glimmer::LibUI.enum_symbol_to_value(:draw_text_align, align, default_symbol: :center)
|
139
|
+
@draw_text_layout_params
|
140
|
+
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
def build_control
|
145
|
+
@libui = ::LibUI.draw_new_text_layout(draw_text_layout_params)
|
146
|
+
end
|
147
|
+
|
148
|
+
def init_draw_brush(draw_brush, draw_brush_args)
|
149
|
+
draw_brush.Type = Glimmer::LibUI.enum_symbol_to_value(:draw_brush_type, draw_brush_args[:type])
|
150
|
+
draw_brush.R = (draw_brush_args[:r] || draw_brush_args[:red]).to_f / 255.0
|
151
|
+
draw_brush.G = (draw_brush_args[:g] || draw_brush_args[:green]).to_f / 255.0
|
152
|
+
draw_brush.B = (draw_brush_args[:b] || draw_brush_args[:blue]).to_f / 255.0
|
153
|
+
draw_brush.A = (draw_brush_args[:a] || draw_brush_args[:alpha])
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
data/lib/glimmer/libui.rb
CHANGED
@@ -96,18 +96,28 @@ module Glimmer
|
|
96
96
|
value
|
97
97
|
end
|
98
98
|
|
99
|
-
# Returns ruby underscored symbols for enum values starting with enum name (camelcase, e.g. 'ext_key')
|
100
99
|
def enum_symbols(enum_name)
|
100
|
+
enum_symbol_values(enum_name).keys
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns ruby underscored symbols for enum values starting with enum name (camelcase, e.g. 'ext_key')
|
104
|
+
def enum_symbol_values(enum_name)
|
101
105
|
enum_name = enum_name.to_s.underscore.to_sym
|
102
106
|
@enum_symbols ||= {}
|
103
|
-
@enum_symbols[enum_name] ||= ::LibUI.constants.select { |c| c.to_s.start_with?(enum_name.to_s.camelcase(:upper)) }.map { |c| c.to_s.underscore.sub("#{enum_name}_", '').to_sym }
|
107
|
+
@enum_symbols[enum_name] ||= ::LibUI.constants.select { |c| c.to_s.start_with?(enum_name.to_s.camelcase(:upper)) }.map { |c| [c.to_s.underscore.sub("#{enum_name}_", '').to_sym, ::LibUI.const_get(c)] }.to_h
|
108
|
+
end
|
109
|
+
|
110
|
+
def enum_value_to_symbol(enum_name, enum_value)
|
111
|
+
enum_symbol_values(enum_name).invert[enum_value]
|
104
112
|
end
|
105
113
|
|
106
|
-
def enum_symbol_to_value(enum_name, enum_symbol, default_index: 0)
|
114
|
+
def enum_symbol_to_value(enum_name, enum_symbol, default_symbol: nil, default_index: 0)
|
107
115
|
if enum_symbol.is_a?(Integer)
|
108
116
|
enum_symbol
|
109
117
|
elsif enum_symbols(enum_name).include?(enum_symbol.to_s.to_sym)
|
110
|
-
|
118
|
+
enum_symbol_values(enum_name)[enum_symbol]
|
119
|
+
elsif default_symbol
|
120
|
+
enum_symbol_to_value(enum_name, default_symbol)
|
111
121
|
else
|
112
122
|
enum_symbol_to_value(enum_name, enum_symbols(enum_name)[default_index])
|
113
123
|
end
|
@@ -130,7 +140,7 @@ module Glimmer
|
|
130
140
|
|
131
141
|
# Calls block on the main GUI event loop after time_in_seconds delay, repeating indefinitely by default
|
132
142
|
# If `repeat:` keyword arg is passed with an Integer value, it repeats for that number of times
|
133
|
-
# If `repeat:` keyword arg is passed with false or 0, then the block is only called
|
143
|
+
# If `repeat:` keyword arg is passed with false or 0, then the block is only called once
|
134
144
|
# If block returns false at any point, the timer is stopped from further repetitions regardless of `repeat:` keyword arg value
|
135
145
|
# If block returns true at any point, the timer continues for another repetition regardless of `repeat:` keyword arg value
|
136
146
|
def timer(time_in_seconds = 0.1, repeat: true, &block)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-libui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|
@@ -215,6 +215,7 @@ files:
|
|
215
215
|
- examples/basic_area.rb
|
216
216
|
- examples/basic_area2.rb
|
217
217
|
- examples/basic_button.rb
|
218
|
+
- examples/basic_draw_text.rb
|
218
219
|
- examples/basic_entry.rb
|
219
220
|
- examples/basic_table.rb
|
220
221
|
- examples/basic_table_button.rb
|
@@ -254,9 +255,11 @@ files:
|
|
254
255
|
- lib/glimmer/dsl/libui/property_expression.rb
|
255
256
|
- lib/glimmer/dsl/libui/save_file_expression.rb
|
256
257
|
- lib/glimmer/dsl/libui/shape_expression.rb
|
258
|
+
- lib/glimmer/dsl/libui/string_expression.rb
|
257
259
|
- lib/glimmer/dsl/libui/tab_item_expression.rb
|
258
260
|
- lib/glimmer/fiddle_consumer.rb
|
259
261
|
- lib/glimmer/libui.rb
|
262
|
+
- lib/glimmer/libui/attributed_string.rb
|
260
263
|
- lib/glimmer/libui/control_proxy.rb
|
261
264
|
- lib/glimmer/libui/control_proxy/area_proxy.rb
|
262
265
|
- lib/glimmer/libui/control_proxy/area_proxy/scrolling_area_proxy.rb
|
@@ -310,6 +313,7 @@ files:
|
|
310
313
|
- lib/glimmer/libui/control_proxy/radio_buttons_proxy.rb
|
311
314
|
- lib/glimmer/libui/control_proxy/tab_item_proxy.rb
|
312
315
|
- lib/glimmer/libui/control_proxy/table_proxy.rb
|
316
|
+
- lib/glimmer/libui/control_proxy/text_proxy.rb
|
313
317
|
- lib/glimmer/libui/control_proxy/transformable.rb
|
314
318
|
- lib/glimmer/libui/control_proxy/window_proxy.rb
|
315
319
|
- lib/glimmer/libui/parent.rb
|