glimmer-dsl-libui 0.4.2 → 0.4.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.4.3
@@ -2,30 +2,33 @@
2
2
 
3
3
  require 'glimmer-dsl-libui'
4
4
 
5
- include Glimmer
6
-
7
- window('Basic Entry', 300, 50) {
8
- horizontal_box {
9
- e = entry {
10
- # stretchy true # Smart default option for appending to horizontal_box
11
-
12
- on_changed do
13
- puts e.text
14
- $stdout.flush # For Windows
15
- end
16
- }
17
-
18
- button('Button') {
19
- stretchy false # stretchy property is available when control is nested under horizontal_box
5
+ class BasicEntry
6
+ include Glimmer
7
+
8
+ attr_accessor :entry_text
9
+
10
+ def launch
11
+ window('Basic Entry', 300, 50) {
12
+ horizontal_box {
13
+ entry {
14
+ # stretchy true # Smart default option for appending to horizontal_box
15
+ text <=> [self, :entry_text, after_write: ->(text) {puts text; $stdout.flush}] # bidirectional data-binding between text property and entry_text attribute, printing after write to model.
16
+ }
17
+
18
+ button('Button') {
19
+ stretchy false # stretchy property is available when control is nested under horizontal_box
20
+
21
+ on_clicked do
22
+ msg_box('You entered', entry_text)
23
+ end
24
+ }
25
+ }
20
26
 
21
- on_clicked do
22
- text = e.text
23
- msg_box('You entered', text)
27
+ on_closing do
28
+ puts 'Bye Bye'
24
29
  end
25
- }
26
- }
27
-
28
- on_closing do
29
- puts 'Bye Bye'
30
+ }.show
30
31
  end
31
- }.show
32
+ end
33
+
34
+ BasicEntry.new.launch
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+
5
+ include Glimmer
6
+
7
+ window('Basic Entry', 300, 50) {
8
+ horizontal_box {
9
+ e = entry {
10
+ # stretchy true # Smart default option for appending to horizontal_box
11
+
12
+ on_changed do
13
+ puts e.text
14
+ $stdout.flush # For Windows
15
+ end
16
+ }
17
+
18
+ button('Button') {
19
+ stretchy false # stretchy property is available when control is nested under horizontal_box
20
+
21
+ on_clicked do
22
+ text = e.text
23
+ msg_box('You entered', text)
24
+ end
25
+ }
26
+ }
27
+
28
+ on_closing do
29
+ puts 'Bye Bye'
30
+ end
31
+ }.show
data/examples/form.rb CHANGED
@@ -2,36 +2,48 @@
2
2
 
3
3
  require 'glimmer-dsl-libui'
4
4
 
5
- include Glimmer
6
-
7
- window('Form') {
8
- margined true
5
+ class Form
6
+ include Glimmer
9
7
 
10
- vertical_box {
11
- form {
12
- @first_name_entry = entry {
13
- label 'First Name' # label property is available when control is nested under form
14
- }
15
-
16
- @last_name_entry = entry {
17
- label 'Last Name' # label property is available when control is nested under form
18
- }
19
-
20
- @phone_entry = entry {
21
- label 'Phone' # label property is available when control is nested under form
22
- }
8
+ attr_accessor :first_name, :last_name, :phone, :email
9
+
10
+ def launch
11
+ window('Form') {
12
+ margined true
23
13
 
24
- @email_entry = entry {
25
- label 'Email' # label property is available when control is nested under form
14
+ vertical_box {
15
+ form {
16
+ entry {
17
+ label 'First Name' # label property is available when control is nested under form
18
+ text <=> [self, :first_name] # bidirectional data-binding of entry text property to self first_name attribute
19
+ }
20
+
21
+ entry {
22
+ label 'Last Name' # label property is available when control is nested under form
23
+ text <=> [self, :last_name]
24
+ }
25
+
26
+ entry {
27
+ label 'Phone' # label property is available when control is nested under form
28
+ text <=> [self, :phone]
29
+ }
30
+
31
+ entry {
32
+ label 'Email' # label property is available when control is nested under form
33
+ text <=> [self, :email]
34
+ }
35
+ }
36
+
37
+ button('Display Info') {
38
+ stretchy false
39
+
40
+ on_clicked do
41
+ msg_box('Info', "#{first_name} #{last_name} has phone #{phone} and email #{email}")
42
+ end
43
+ }
26
44
  }
27
- }
28
-
29
- button('Display Info') {
30
- stretchy false
31
-
32
- on_clicked do
33
- msg_box('Info', "#{@first_name_entry.text} #{@last_name_entry.text} has phone #{@phone_entry.text} and email #{@email_entry.text}")
34
- end
35
- }
36
- }
37
- }.show
45
+ }.show
46
+ end
47
+ end
48
+
49
+ Form.new.launch
data/examples/form2.rb ADDED
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+
5
+ include Glimmer
6
+
7
+ window('Form') {
8
+ margined true
9
+
10
+ vertical_box {
11
+ form {
12
+ @first_name_entry = entry {
13
+ label 'First Name' # label property is available when control is nested under form
14
+ }
15
+
16
+ @last_name_entry = entry {
17
+ label 'Last Name' # label property is available when control is nested under form
18
+ }
19
+
20
+ @phone_entry = entry {
21
+ label 'Phone' # label property is available when control is nested under form
22
+ }
23
+
24
+ @email_entry = entry {
25
+ label 'Email' # label property is available when control is nested under form
26
+ }
27
+ }
28
+
29
+ button('Display Info') {
30
+ stretchy false
31
+
32
+ on_clicked do
33
+ msg_box('Info', "#{@first_name_entry.text} #{@last_name_entry.text} has phone #{@phone_entry.text} and email #{@email_entry.text}")
34
+ end
35
+ }
36
+ }
37
+ }.show
@@ -2,94 +2,109 @@
2
2
 
3
3
  require 'glimmer-dsl-libui'
4
4
 
5
- include Glimmer
6
-
7
- data = [
8
- ['Lisa Sky', 'lisa@sky.com', '720-523-4329', 'Denver', 'CO', '80014'],
9
- ['Jordan Biggins', 'jordan@biggins.com', '617-528-5399', 'Boston', 'MA', '02101'],
10
- ['Mary Glass', 'mary@glass.com', '847-589-8788', 'Elk Grove Village', 'IL', '60007'],
11
- ['Darren McGrath', 'darren@mcgrath.com', '206-539-9283', 'Seattle', 'WA', '98101'],
12
- ['Melody Hanheimer', 'melody@hanheimer.com', '213-493-8274', 'Los Angeles', 'CA', '90001'],
13
- ]
14
-
15
- window('Contacts', 600, 600) { |w|
16
- margined true
5
+ class FormTable
6
+ include Glimmer
17
7
 
18
- vertical_box {
19
- form {
20
- stretchy false
21
-
22
- @name_entry = entry {
23
- label 'Name'
24
- }
25
-
26
- @email_entry = entry {
27
- label 'Email'
28
- }
29
-
30
- @phone_entry = entry {
31
- label 'Phone'
32
- }
33
-
34
- @city_entry = entry {
35
- label 'City'
36
- }
37
-
38
- @state_entry = entry {
39
- label 'State'
40
- }
41
- }
42
-
43
- button('Save Contact') {
44
- stretchy false
45
-
46
- on_clicked do
47
- new_row = [@name_entry.text, @email_entry.text, @phone_entry.text, @city_entry.text, @state_entry.text]
48
- if new_row.include?('')
49
- msg_box_error(w, 'Validation Error!', 'All fields are required! Please make sure to enter a value for all fields.')
50
- else
51
- data << new_row # automatically inserts a row into the table due to implicit data-binding
52
- @unfiltered_data = data.dup
53
- @name_entry.text = ''
54
- @email_entry.text = ''
55
- @phone_entry.text = ''
56
- @city_entry.text = ''
57
- @state_entry.text = ''
58
- end
59
- end
60
- }
61
-
62
- search_entry { |se|
63
- stretchy false
8
+ attr_accessor :name, :email, :phone, :city, :state, :filter_value
9
+
10
+ def initialize
11
+ @data = [
12
+ ['Lisa Sky', 'lisa@sky.com', '720-523-4329', 'Denver', 'CO', '80014'],
13
+ ['Jordan Biggins', 'jordan@biggins.com', '617-528-5399', 'Boston', 'MA', '02101'],
14
+ ['Mary Glass', 'mary@glass.com', '847-589-8788', 'Elk Grove Village', 'IL', '60007'],
15
+ ['Darren McGrath', 'darren@mcgrath.com', '206-539-9283', 'Seattle', 'WA', '98101'],
16
+ ['Melody Hanheimer', 'melody@hanheimer.com', '213-493-8274', 'Los Angeles', 'CA', '90001'],
17
+ ]
18
+ end
19
+
20
+ def launch
21
+ window('Contacts', 600, 600) { |w|
22
+ margined true
64
23
 
65
- on_changed do
66
- filter_value = se.text
67
- @unfiltered_data ||= data.dup
68
- # Unfilter first to remove any previous filters
69
- data.replace(@unfiltered_data) # affects table indirectly through implicit data-binding
70
- # Now, apply filter if entered
71
- unless filter_value.empty?
72
- data.filter! do |row_data| # affects table indirectly through implicit data-binding
73
- row_data.any? do |cell|
74
- cell.to_s.downcase.include?(filter_value.downcase)
24
+ vertical_box {
25
+ form {
26
+ stretchy false
27
+
28
+ entry {
29
+ label 'Name'
30
+ text <=> [self, :name]
31
+ }
32
+
33
+ entry {
34
+ label 'Email'
35
+ text <=> [self, :email]
36
+ }
37
+
38
+ entry {
39
+ label 'Phone'
40
+ text <=> [self, :phone]
41
+ }
42
+
43
+ entry {
44
+ label 'City'
45
+ text <=> [self, :city]
46
+ }
47
+
48
+ entry {
49
+ label 'State'
50
+ text <=> [self, :state]
51
+ }
52
+ }
53
+
54
+ button('Save Contact') {
55
+ stretchy false
56
+
57
+ on_clicked do
58
+ new_row = [name, email, phone, city, state]
59
+ if new_row.include?('')
60
+ msg_box_error(w, 'Validation Error!', 'All fields are required! Please make sure to enter a value for all fields.')
61
+ else
62
+ @data << new_row # automatically inserts a row into the table due to implicit data-binding
63
+ @unfiltered_data = @data.dup
64
+ self.name = '' # automatically clears name entry through explicit data-binding
65
+ self.email = ''
66
+ self.phone = ''
67
+ self.city = ''
68
+ self.state = ''
75
69
  end
76
70
  end
77
- end
78
- end
79
- }
71
+ }
72
+
73
+ search_entry {
74
+ stretchy false
75
+ text <=> [self, :filter_value, # bidirectional data-binding of text to self.filter_value with after_write option
76
+ after_write: ->(filter_value) { # execute after write to self.filter_value
77
+ @unfiltered_data ||= @data.dup
78
+ # Unfilter first to remove any previous filters
79
+ @data.replace(@unfiltered_data) # affects table indirectly through implicit data-binding
80
+ # Now, apply filter if entered
81
+ unless filter_value.empty?
82
+ @data.filter! do |row_data| # affects table indirectly through implicit data-binding
83
+ row_data.any? do |cell|
84
+ cell.to_s.downcase.include?(filter_value.downcase)
85
+ end
86
+ end
87
+ end
88
+ }
89
+ ]
90
+ }
91
+
92
+ table {
93
+ text_column('Name')
94
+ text_column('Email')
95
+ text_column('Phone')
96
+ text_column('City')
97
+ text_column('State')
80
98
 
81
- table {
82
- text_column('Name')
83
- text_column('Email')
84
- text_column('Phone')
85
- text_column('City')
86
- text_column('State')
99
+ cell_rows @data # implicit data-binding
100
+
101
+ on_changed do |row, type, row_data|
102
+ puts "Row #{row} #{type}: #{row_data}"
103
+ end
104
+ }
105
+ }
106
+ }.show
107
+ end
108
+ end
87
109
 
88
- cell_rows data # implicit data-binding
89
-
90
- on_changed do |row, type, row_data|
91
- puts "Row #{row} #{type}: #{row_data}"
92
- end
93
- }
94
- }
95
- }.show
110
+ FormTable.new.launch
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+
5
+ include Glimmer
6
+
7
+ data = [
8
+ ['Lisa Sky', 'lisa@sky.com', '720-523-4329', 'Denver', 'CO', '80014'],
9
+ ['Jordan Biggins', 'jordan@biggins.com', '617-528-5399', 'Boston', 'MA', '02101'],
10
+ ['Mary Glass', 'mary@glass.com', '847-589-8788', 'Elk Grove Village', 'IL', '60007'],
11
+ ['Darren McGrath', 'darren@mcgrath.com', '206-539-9283', 'Seattle', 'WA', '98101'],
12
+ ['Melody Hanheimer', 'melody@hanheimer.com', '213-493-8274', 'Los Angeles', 'CA', '90001'],
13
+ ]
14
+
15
+ window('Contacts', 600, 600) { |w|
16
+ margined true
17
+
18
+ vertical_box {
19
+ form {
20
+ stretchy false
21
+
22
+ @name_entry = entry {
23
+ label 'Name'
24
+ }
25
+
26
+ @email_entry = entry {
27
+ label 'Email'
28
+ }
29
+
30
+ @phone_entry = entry {
31
+ label 'Phone'
32
+ }
33
+
34
+ @city_entry = entry {
35
+ label 'City'
36
+ }
37
+
38
+ @state_entry = entry {
39
+ label 'State'
40
+ }
41
+ }
42
+
43
+ button('Save Contact') {
44
+ stretchy false
45
+
46
+ on_clicked do
47
+ new_row = [@name_entry.text, @email_entry.text, @phone_entry.text, @city_entry.text, @state_entry.text]
48
+ if new_row.include?('')
49
+ msg_box_error(w, 'Validation Error!', 'All fields are required! Please make sure to enter a value for all fields.')
50
+ else
51
+ data << new_row # automatically inserts a row into the table due to implicit data-binding
52
+ @unfiltered_data = data.dup
53
+ @name_entry.text = ''
54
+ @email_entry.text = ''
55
+ @phone_entry.text = ''
56
+ @city_entry.text = ''
57
+ @state_entry.text = ''
58
+ end
59
+ end
60
+ }
61
+
62
+ search_entry { |se|
63
+ stretchy false
64
+
65
+ on_changed do
66
+ filter_value = se.text
67
+ @unfiltered_data ||= data.dup
68
+ # Unfilter first to remove any previous filters
69
+ data.replace(@unfiltered_data) # affects table indirectly through implicit data-binding
70
+ # Now, apply filter if entered
71
+ unless filter_value.empty?
72
+ data.filter! do |row_data| # affects table indirectly through implicit data-binding
73
+ row_data.any? do |cell|
74
+ cell.to_s.downcase.include?(filter_value.downcase)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ }
80
+
81
+ table {
82
+ text_column('Name')
83
+ text_column('Email')
84
+ text_column('Phone')
85
+ text_column('City')
86
+ text_column('State')
87
+
88
+ cell_rows data # implicit data-binding
89
+
90
+ on_changed do |row, type, row_data|
91
+ puts "Row #{row} #{type}: #{row_data}"
92
+ end
93
+ }
94
+ }
95
+ }.show
data/examples/login.rb CHANGED
@@ -1,45 +1,51 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'glimmer-dsl-libui'
4
2
 
5
- include Glimmer
6
-
7
- window('Login') {
8
- margined true
3
+ class Login
4
+ include Glimmer
9
5
 
10
- vertical_box {
11
- form {
12
- @username_entry = entry {
13
- label 'Username:'
14
- }
15
-
16
- @password_entry = password_entry {
17
- label 'Password:'
18
- }
19
- }
20
-
21
- horizontal_box {
22
- @login_button = button('Login') {
23
- on_clicked do
24
- @username_entry.enabled = false
25
- @password_entry.enabled = false
26
- @login_button.enabled = false
27
- @logout_button.enabled = true
28
- end
29
- }
6
+ attr_accessor :username, :password, :logged_in
7
+
8
+ def launch
9
+ window('Login') {
10
+ margined true
30
11
 
31
- @logout_button = button('Logout') {
32
- enabled false
12
+ vertical_box {
13
+ form {
14
+ entry {
15
+ label 'Username:'
16
+ text <=> [self, :username]
17
+ enabled <= [self, :logged_in, on_read: :!] # `on_read: :!` negates read value
18
+ }
19
+
20
+ password_entry {
21
+ label 'Password:'
22
+ text <=> [self, :password]
23
+ enabled <= [self, :logged_in, on_read: :!]
24
+ }
25
+ }
33
26
 
34
- on_clicked do
35
- @username_entry.text = ''
36
- @password_entry.text = ''
37
- @username_entry.enabled = true
38
- @password_entry.enabled = true
39
- @login_button.enabled = true
40
- @logout_button.enabled = false
41
- end
27
+ horizontal_box {
28
+ button('Login') {
29
+ enabled <= [self, :logged_in, on_read: :!]
30
+
31
+ on_clicked do
32
+ self.logged_in = true
33
+ end
34
+ }
35
+
36
+ button('Logout') {
37
+ enabled <= [self, :logged_in]
38
+
39
+ on_clicked do
40
+ self.logged_in = false
41
+ self.username = ''
42
+ self.password = ''
43
+ end
44
+ }
45
+ }
42
46
  }
43
- }
44
- }
45
- }.show
47
+ }.show
48
+ end
49
+ end
50
+
51
+ Login.new.launch
@@ -0,0 +1,55 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ class Login
4
+ include Glimmer
5
+
6
+ attr_accessor :username, :password, :logged_in
7
+
8
+ def logged_out
9
+ !logged_in
10
+ end
11
+
12
+ def launch
13
+ window('Login') {
14
+ margined true
15
+
16
+ vertical_box {
17
+ form {
18
+ entry {
19
+ label 'Username:'
20
+ text <=> [self, :username]
21
+ enabled <= [self, :logged_out, computed_by: :logged_in] # computed_by option ensures being notified of changes to logged_in
22
+ }
23
+
24
+ password_entry {
25
+ label 'Password:'
26
+ text <=> [self, :password]
27
+ enabled <= [self, :logged_out, computed_by: :logged_in]
28
+ }
29
+ }
30
+
31
+ horizontal_box {
32
+ button('Login') {
33
+ enabled <= [self, :logged_out, computed_by: :logged_in]
34
+
35
+ on_clicked do
36
+ self.logged_in = true
37
+ end
38
+ }
39
+
40
+ button('Logout') {
41
+ enabled <= [self, :logged_in]
42
+
43
+ on_clicked do
44
+ self.logged_in = false
45
+ self.username = ''
46
+ self.password = ''
47
+ end
48
+ }
49
+ }
50
+ }
51
+ }.show
52
+ end
53
+ end
54
+
55
+ Login.new.launch