glimmer_wordle 1.0.0 → 1.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18a1772cb458e49ced9e103096f736c307ae5b4e100457ea5e19ba04e4f4d28a
4
- data.tar.gz: 9e341e855c03fb9a587f0b537988b60fe8771e9e4d3ba19d38a9678f98bee849
3
+ metadata.gz: b5315f737af82dff39d911a59688cefcbf9f4b1d2aaca7c5efcc3c44df01d1ca
4
+ data.tar.gz: 65499b9acdfb6e21b9aafe4df8825e2d082c2ef2cbc20d48c526eb3216a74eb2
5
5
  SHA512:
6
- metadata.gz: 370bc2a11daa444256e6dcd7fb43129d3f09fe17fdd0f6db4b972ce2455e1437ad3473682ac54c71cbf208c81f6490a93a6d1978d3b0fe4ede55b6ab7ae39e3d
7
- data.tar.gz: 53ee100edcbacaa594ed6adf5b97a8041d44f1a25f281722093c1c9159df445c8bb4deb5b292186dfa5910e22e70665668378a4a514e8a3e587ba92f820cc564
6
+ metadata.gz: b589f94aac13a96e7b9cdef7865b13c472f5976ee28ea754d44fff61056f35fe91c27a30c0b1e7a49cd81aed03cebd506655ace00c4067ceb163d30f800dc52f
7
+ data.tar.gz: 2c08a7f262aa07d5c3053546f8da56ed75a2631d6d6811ffcba1a76322ec17f492c6691da2b1427843bcd679162b4b0e9ed7e4384eaaf134b8a4bf88d4dc5659
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- # <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=85 /> Wordle
2
- ## Word Game
1
+ # <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=85 /> Glimmer Wordle 1.1.2
2
+ ## Play Wordle Endlessly with No Limit!
3
3
  [![Gem Version](https://badge.fury.io/rb/glimmer_wordle.svg)](http://badge.fury.io/rb/glimmer_wordle)
4
4
 
5
5
  [Wordle](https://en.wikipedia.org/wiki/Wordle) word game desktop GUI app written [test-first](https://github.com/AndyObtiva/wordle/blob/master/spec/app/model/five_letter_word_spec.rb) using [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) (JRuby Desktop Development GUI Framework) as inspiration by [Kevin Newton's blog post](https://kddnewton.com/2022/01/29/solving-wordle-in-ruby.html).
@@ -14,9 +14,9 @@
14
14
 
15
15
  ### Download
16
16
 
17
- [<img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /> Download Glimmer Wordle DMG for Mac ARM64 Monterey and Older](https://www.dropbox.com/s/t77si617tsaxe0c/Glimmer%20Wordle-arm64-1.0.0.dmg?dl=1)
17
+ [<img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /> Download Glimmer Wordle 1.1.2 DMG for Mac ARM64 Monterey and Older](https://www.dropbox.com/s/rmanrz81qfrpqq5/Glimmer%20Wordle-arm64-1.1.2.dmg?dl=1)
18
18
 
19
- [<img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /> Download Glimmer Wordle DMG for Mac x86_64 Catalina and Older](https://www.dropbox.com/s/amlrm4nufdlzlb1/Glimmer%20Wordle-1.0.0.dmg?dl=1)
19
+ [<img src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /> Download Glimmer Wordle 1.1.2 DMG for Mac x86_64 Catalina and Older](https://www.dropbox.com/s/ysureb9o1dky7w0/Glimmer%20Wordle-1.1.2.dmg?dl=1)
20
20
 
21
21
  ### Install Ruby Gem
22
22
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.1.2
@@ -4,9 +4,9 @@ class Wordle
4
4
  include Glimmer::UI::CustomShell
5
5
 
6
6
  COLOR_TO_BACKGROUND_COLOR_MAP = {
7
- green: :dark_green,
8
- yellow: :dark_yellow,
9
- gray: :dark_gray,
7
+ green: rgb(106, 170, 100),
8
+ yellow: rgb(201, 180, 88),
9
+ gray: rgb(120, 124, 126),
10
10
  }
11
11
 
12
12
  COLOR_TO_TEXT_COLOR_MAP = {
@@ -15,10 +15,20 @@ class Wordle
15
15
  gray: :white,
16
16
  }
17
17
 
18
- ALPHABET_ROW1 = %w[Q W E R T Y U I O P]
19
- ALPHABET_ROW2 = %w[A S D F G H J K L]
20
- ALPHABET_ROW3 = %w[Z X C V B N M]
21
-
18
+ ALPHABET_LAYOUTS = {
19
+ alphabetical: [
20
+ %w[A B C D E F G H I J],
21
+ %w[K L M N O P Q R S],
22
+ %w[T U V W X Y Z],
23
+ ],
24
+ qwerty: [
25
+ %w[Q W E R T Y U I O P],
26
+ %w[A S D F G H J K L],
27
+ %w[Z X C V B N M],
28
+ ],
29
+ }
30
+
31
+ CONFIG_FILE = File.join(Dir.home, '.glimmer_wordle')
22
32
 
23
33
  before_body do
24
34
  @display = display {
@@ -31,6 +41,10 @@ class Wordle
31
41
  on_swt_keydown do |key_event|
32
42
  if key_event.keyCode == 8
33
43
  do_backspace
44
+ elsif key_event.keyCode == swt(:arrow_left)
45
+ do_left
46
+ elsif key_event.keyCode == swt(:arrow_right)
47
+ do_right
34
48
  elsif key_event.keyCode == swt(:cr)
35
49
  if @five_letter_word.status == :in_progress
36
50
  do_guess
@@ -43,6 +57,8 @@ class Wordle
43
57
  end
44
58
  }
45
59
  @five_letter_word = Model::FiveLetterWord.new
60
+ config = load_config
61
+ @alphabet_layout = config[:alphabet_layout] || :alphabetical
46
62
  end
47
63
 
48
64
  ## Add widget content inside custom shell body
@@ -65,7 +81,7 @@ class Wordle
65
81
 
66
82
  app_menu_bar
67
83
 
68
- alphabets
84
+ alphabet_container
69
85
 
70
86
  label {
71
87
  layout_data :center, :center, true, false
@@ -100,11 +116,47 @@ class Wordle
100
116
  }
101
117
  }
102
118
 
119
+ menu {
120
+ text '&View'
121
+
122
+ menu {
123
+ text 'Alphabet &Layout'
124
+
125
+ menu_item(:radio) {
126
+ text '&Alphabetical'
127
+ selection @alphabet_layout == :alphabetical
128
+
129
+ on_widget_selected {
130
+ self.alphabet_layout = :alphabetical
131
+ rebuild_alphabet_container
132
+ }
133
+ }
134
+
135
+ menu_item(:radio) {
136
+ text '&Qwerty'
137
+ selection @alphabet_layout == :qwerty
138
+
139
+ on_widget_selected {
140
+ self.alphabet_layout = :qwerty
141
+ rebuild_alphabet_container
142
+ }
143
+ }
144
+ }
145
+ }
146
+
103
147
  menu {
104
148
  text '&Help'
105
149
 
106
150
  menu_item {
107
- text '&About...'
151
+ text '&Instructions'
152
+
153
+ on_widget_selected {
154
+ display_instructions_dialog
155
+ }
156
+ }
157
+
158
+ menu_item {
159
+ text '&About'
108
160
 
109
161
  on_widget_selected {
110
162
  display_about_dialog
@@ -114,6 +166,21 @@ class Wordle
114
166
  }
115
167
  end
116
168
 
169
+ def display_instructions_dialog
170
+ message_box(body_root) {
171
+ text 'Instructions'
172
+ message <<~MULTI_LINE_STRING
173
+ Make 6 guesses for a 5-letter word.
174
+
175
+ If you enter a letter that is part of the word, and at the right location, it becomes green,
176
+
177
+ If you enter a letter that is part of the word, but at the wrong location, it becomes yellow.
178
+
179
+ If you enter a letter that is not part of the word, it become red.
180
+ MULTI_LINE_STRING
181
+ }.open
182
+ end
183
+
117
184
  def display_about_dialog
118
185
  message_box(body_root) {
119
186
  text 'About'
@@ -121,22 +188,38 @@ class Wordle
121
188
  }.open
122
189
  end
123
190
 
191
+ def alphabet_container
192
+ @alphabet_container = composite {
193
+ layout_data(:center, :center, true, false)
194
+
195
+ grid_layout {
196
+ margin_width 0
197
+ margin_height 0
198
+ vertical_spacing 0
199
+ }
200
+
201
+ background :white
202
+
203
+ alphabets
204
+ }
205
+ end
206
+
124
207
  def alphabets
125
- alphabet_row(ALPHABET_ROW1) {
208
+ alphabet_row(ALPHABET_LAYOUTS[@alphabet_layout][0]) {
126
209
  layout_data(:center, :center, true, false) {
127
210
  width_hint 318
128
211
  height_hint 50
129
212
  }
130
213
  }
131
214
 
132
- alphabet_row(ALPHABET_ROW2) {
215
+ alphabet_row(ALPHABET_LAYOUTS[@alphabet_layout][1]) {
133
216
  layout_data(:center, :center, true, false) {
134
217
  width_hint 288
135
218
  height_hint 50
136
219
  }
137
220
  }
138
221
 
139
- alphabet_row(ALPHABET_ROW3) {
222
+ alphabet_row(ALPHABET_LAYOUTS[@alphabet_layout][2]) {
140
223
  layout_data(:center, :center, true, false) {
141
224
  width_hint 222
142
225
  height_hint 50
@@ -169,6 +252,10 @@ class Wordle
169
252
  }
170
253
  end
171
254
 
255
+ def alphabet_layout_alphabets
256
+ ALPHABET_LAYOUTS[@alphabet_layout].reduce(:+)
257
+ end
258
+
172
259
  def word_guesser
173
260
  @canvasses ||= []
174
261
  margin_x = 5
@@ -214,13 +301,11 @@ class Wordle
214
301
 
215
302
  def do_backspace
216
303
  @letter = @letters.find {|letter| letter.string == ''}
217
- index = @letter ? @letters.index(@letter) - 1 : 4
304
+ index = @letter ? [@letters.index(@letter) - 1, 0].max : 4
218
305
  @letter = @letters[index]
219
306
  @letter.string = ''
220
- if index > 0
221
- @borders.each { |caret| caret.foreground = :gray}
222
- @borders[index - 1].foreground = :title_background
223
- end
307
+ @borders.each { |caret| caret.foreground = :gray}
308
+ @borders[index].foreground = :title_background
224
309
  end
225
310
 
226
311
  def do_guess
@@ -261,26 +346,47 @@ class Wordle
261
346
  body_root.pack(true)
262
347
  end
263
348
 
349
+ def highlighted_letter_index
350
+ @borders.each_with_index.find {|border, i| border.foreground.first == color(:title_background).swt_color }.last
351
+ end
352
+
264
353
  def do_type(character)
265
- @letter = @letters.find {|letter| letter.string == ''}
266
- index = @letters.index(@letter)
267
- if @letter
354
+ index = highlighted_letter_index
355
+ @letter = @letters[index]
356
+ @letter.string = character.upcase
357
+ if @letters.any? {|letter| letter.string == ''}
268
358
  @borders.each { |caret| caret.foreground = :gray}
269
359
  @borders[index == 4 ? 4 : index + 1].foreground = :title_background
270
- @letter.string = character.upcase
271
360
  end
272
361
  end
273
362
 
363
+ def do_left
364
+ index = [highlighted_letter_index - 1, 0].max
365
+ @borders.each { |caret| caret.foreground = :gray}
366
+ @borders[index].foreground = :title_background
367
+ end
368
+
369
+ def do_right
370
+ index = [highlighted_letter_index + 1, @letters.count - 1].min
371
+ @borders.each { |caret| caret.foreground = :gray}
372
+ @borders[index].foreground = :title_background
373
+ end
374
+
274
375
  def do_restart
275
- (ALPHABET_ROW1 + ALPHABET_ROW2 + ALPHABET_ROW3).each_with_index do |alphabet_character, i|
376
+ @share_text_dialog&.close
377
+ alphabet_layout_alphabets.each_with_index do |alphabet_character, i|
276
378
  @alphabet_borders[i].foreground = :gray
277
379
  @alphabet_rectangles[i].background = :white
278
380
  @alphabet_letters[i].foreground = :black
279
381
  end
280
- @restart_button.dispose
382
+ @restart_button&.dispose
281
383
  @canvasses.dup.each(&:dispose)
282
384
  @canvasses.clear
283
- body_root.content { word_guesser }
385
+ @guess_button&.dispose
386
+ body_root.content {
387
+ word_guesser
388
+ guess_button
389
+ }
284
390
  body_root.layout(true, true)
285
391
  body_root.pack(true)
286
392
  @five_letter_word.refresh
@@ -297,7 +403,7 @@ class Wordle
297
403
  end
298
404
 
299
405
  def update_alphabet_background_colors
300
- (ALPHABET_ROW1 + ALPHABET_ROW2 + ALPHABET_ROW3).each_with_index do |alphabet_character, i|
406
+ alphabet_layout_alphabets.each_with_index do |alphabet_character, i|
301
407
  result_color = @five_letter_word.colored_alphabets[alphabet_character.downcase]
302
408
  if result_color
303
409
  background_color = COLOR_TO_BACKGROUND_COLOR_MAP[result_color]
@@ -321,27 +427,16 @@ class Wordle
321
427
  end
322
428
 
323
429
  def display_share_text_dialog
324
- result = ''
325
- @five_letter_word.guess_results.each do |row|
326
- row.each do |result_color|
327
- case result_color
328
- when :green
329
- result << "🟩"
330
- when :yellow
331
- result << "🟨"
332
- when :gray
333
- result << "⬜"
334
- end
335
- end
336
- result << "\n"
337
- end
338
-
430
+ result = "#{@five_letter_word.answer.upcase}\n\n#{emoji_result}"
431
+
339
432
  Clipboard.copy(result)
340
433
 
341
- dialog(body_root) {
434
+ @share_text_dialog = dialog(body_root) {
342
435
  grid_layout
343
436
  text 'Share Result'
344
437
 
438
+ app_menu_bar
439
+
345
440
  label {
346
441
  layout_data :center, :center, true, false
347
442
  text 'Result is copied to clipboard!'
@@ -354,7 +449,67 @@ class Wordle
354
449
  alignment :center
355
450
  text result
356
451
  }
357
- }.open
452
+ }
453
+ @share_text_dialog.open
454
+ end
455
+
456
+ def dispose_alphabet_container_children
457
+ @alphabet_rectangles.clear
458
+ @alphabet_borders.clear
459
+ @alphabet_letters.clear
460
+ @alphabet_container.children.each(&:dispose)
461
+ end
462
+
463
+ def rebuild_alphabet_container
464
+ dispose_alphabet_container_children
465
+ @alphabet_container.content {
466
+ alphabets
467
+ }
468
+ @alphabet_container.layout(true, true)
469
+ @alphabet_container.pack(true)
470
+ update_alphabet_background_colors
471
+ end
472
+
473
+ def alphabet_layout=(value)
474
+ @alphabet_layout = value
475
+ save_config
476
+ end
477
+
478
+ def new_config
479
+ {
480
+ alphabet_layout: @alphabet_layout
481
+ }
482
+ end
483
+
484
+ def save_config
485
+ File.write(CONFIG_FILE, YAML.dump(new_config))
486
+ rescue => e
487
+ puts e.full_message
488
+ end
489
+
490
+ def load_config
491
+ File.exist?(CONFIG_FILE) ? YAML.load(File.read(CONFIG_FILE)) : {}
492
+ rescue => e
493
+ puts e.full_message
494
+ {}
495
+ end
496
+
497
+ def emoji_result
498
+ result = ''
499
+ @five_letter_word.guess_results.each do |row|
500
+ row.each do |result_color|
501
+ case result_color
502
+ when :green
503
+ result << "🟩"
504
+ when :yellow
505
+ result << "🟨"
506
+ when :gray
507
+ result << "⬜"
508
+ end
509
+ end
510
+ result << "\n"
511
+ end
512
+ result
358
513
  end
359
514
  end
360
515
  end
data/app/wordle.rb CHANGED
@@ -7,6 +7,7 @@ rescue
7
7
  # this runs when packaged as a gem (no bundler)
8
8
  require 'glimmer-dsl-swt'
9
9
  # add more gems if needed
10
+ require 'clipboard'
10
11
  end
11
12
 
12
13
  Clipboard.implementation = Clipboard::Java
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer_wordle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-07 00:00:00.000000000 Z
11
+ date: 2022-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 4.22.2.3
18
+ version: 4.22.2.6
19
19
  name: glimmer-dsl-swt
20
20
  prerelease: false
21
21
  type: :runtime
@@ -23,7 +23,7 @@ dependencies:
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 4.22.2.3
26
+ version: 4.22.2.6
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  description: Glimmer Wordle - Word Game Desktop GUI App Written in Glimmer DSL for
98
- SWT (requires JRuby)
98
+ SWT (requires JRuby) - Play Wordle Endlessly with No Limit!
99
99
  email: andy.am@gmail.com
100
100
  executables:
101
101
  - glimmer_wordle