shoes-swt 4.0.0.pre12 → 4.0.0.rc1

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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/bin/shoes-swt +1 -0
  3. data/lib/shoes/swt.rb +3 -1
  4. data/lib/shoes/swt/animation.rb +1 -0
  5. data/lib/shoes/swt/app.rb +12 -11
  6. data/lib/shoes/swt/arc.rb +1 -0
  7. data/lib/shoes/swt/arc_painter.rb +4 -3
  8. data/lib/shoes/swt/arrow.rb +1 -0
  9. data/lib/shoes/swt/arrow_painter.rb +10 -5
  10. data/lib/shoes/swt/background.rb +1 -0
  11. data/lib/shoes/swt/border.rb +1 -0
  12. data/lib/shoes/swt/button.rb +1 -0
  13. data/lib/shoes/swt/check.rb +1 -0
  14. data/lib/shoes/swt/check_button.rb +1 -0
  15. data/lib/shoes/swt/click_listener.rb +1 -0
  16. data/lib/shoes/swt/color.rb +1 -0
  17. data/lib/shoes/swt/color_factory.rb +1 -0
  18. data/lib/shoes/swt/common/clickable.rb +1 -0
  19. data/lib/shoes/swt/common/container.rb +1 -0
  20. data/lib/shoes/swt/common/fill.rb +2 -1
  21. data/lib/shoes/swt/common/focus.rb +5 -0
  22. data/lib/shoes/swt/common/image_handling.rb +11 -5
  23. data/lib/shoes/swt/common/painter.rb +21 -1
  24. data/lib/shoes/swt/common/painter_updates_position.rb +1 -0
  25. data/lib/shoes/swt/common/remove.rb +16 -3
  26. data/lib/shoes/swt/common/resource.rb +1 -0
  27. data/lib/shoes/swt/common/selection_listener.rb +1 -0
  28. data/lib/shoes/swt/common/stroke.rb +1 -0
  29. data/lib/shoes/swt/common/translate.rb +1 -0
  30. data/lib/shoes/swt/common/update_position.rb +1 -0
  31. data/lib/shoes/swt/common/visibility.rb +7 -2
  32. data/lib/shoes/swt/dialog.rb +1 -0
  33. data/lib/shoes/swt/disposed_protection.rb +1 -0
  34. data/lib/shoes/swt/download.rb +1 -0
  35. data/lib/shoes/swt/font.rb +1 -0
  36. data/lib/shoes/swt/generate_backend.rb +10 -10
  37. data/lib/shoes/swt/gradient.rb +24 -6
  38. data/lib/shoes/swt/image.rb +6 -10
  39. data/lib/shoes/swt/image_painter.rb +26 -0
  40. data/lib/shoes/swt/image_pattern.rb +1 -0
  41. data/lib/shoes/swt/input_box.rb +1 -0
  42. data/lib/shoes/swt/key_listener.rb +6 -5
  43. data/lib/shoes/swt/line.rb +1 -0
  44. data/lib/shoes/swt/line_painter.rb +3 -2
  45. data/lib/shoes/swt/link.rb +1 -0
  46. data/lib/shoes/swt/link_segment.rb +1 -0
  47. data/lib/shoes/swt/list_box.rb +1 -0
  48. data/lib/shoes/swt/mouse_move_listener.rb +1 -0
  49. data/lib/shoes/swt/oval.rb +1 -0
  50. data/lib/shoes/swt/oval_painter.rb +4 -3
  51. data/lib/shoes/swt/packager.rb +1 -0
  52. data/lib/shoes/swt/progress.rb +1 -0
  53. data/lib/shoes/swt/radio.rb +4 -3
  54. data/lib/shoes/swt/radio_group.rb +1 -0
  55. data/lib/shoes/swt/rect.rb +1 -2
  56. data/lib/shoes/swt/rect_painter.rb +3 -2
  57. data/lib/shoes/swt/redrawing_aspect.rb +16 -12
  58. data/lib/shoes/swt/shape.rb +5 -3
  59. data/lib/shoes/swt/shape_painter.rb +12 -0
  60. data/lib/shoes/swt/shoes_layout.rb +1 -0
  61. data/lib/shoes/swt/slot.rb +24 -13
  62. data/lib/shoes/swt/sound.rb +1 -1
  63. data/lib/shoes/swt/star.rb +1 -0
  64. data/lib/shoes/swt/star_painter.rb +2 -1
  65. data/lib/shoes/swt/swt_button.rb +1 -0
  66. data/lib/shoes/swt/text_block.rb +1 -0
  67. data/lib/shoes/swt/text_block/centered_text_segment.rb +1 -0
  68. data/lib/shoes/swt/text_block/cursor_painter.rb +1 -0
  69. data/lib/shoes/swt/text_block/fitter.rb +1 -0
  70. data/lib/shoes/swt/text_block/painter.rb +1 -0
  71. data/lib/shoes/swt/text_block/text_font_factory.rb +2 -0
  72. data/lib/shoes/swt/text_block/text_segment.rb +1 -0
  73. data/lib/shoes/swt/text_block/text_segment_collection.rb +1 -0
  74. data/lib/shoes/swt/text_block/text_style_factory.rb +1 -0
  75. data/lib/shoes/swt/timer.rb +1 -0
  76. data/lib/shoes/swt/tooling/leak_hunter.rb +1 -0
  77. data/lib/shoes/swt/version.rb +1 -1
  78. metadata +7 -6
@@ -1,11 +1,16 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  module Common
5
6
  module Visibility
6
7
  def update_visibility
7
- if @real && @real.respond_to?(:set_visible)
8
- @real.set_visible(@dsl.visible?)
8
+ if defined?(@real) && @real.respond_to?(:set_visible)
9
+ # hidden_from_view? handles all visiblity conditions, including
10
+ # being outside a slot. SWT as backend doesn't get that for free
11
+ # because we can't use Composites as they lack transparency...
12
+ visible = !@dsl.hidden_from_view?
13
+ @real.set_visible(visible)
9
14
  end
10
15
  end
11
16
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Dialog
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  module DisposedProtection
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Download
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  module Font
@@ -7,21 +7,21 @@ class Shoes
7
7
  class << self
8
8
  def validate
9
9
  if RUBY_ENGINE != "jruby"
10
- puts <<-EOS
10
+ puts <<~EOS
11
11
 
12
- *******************************************************************************
13
- The shoes-swt backend requires a 9.X version of JRuby.
12
+ *******************************************************************************
13
+ The shoes-swt backend requires a 9.X version of JRuby.
14
14
 
15
- You are running the following Ruby instead:
15
+ You are running the following Ruby instead:
16
16
 
17
- #{RUBY_DESCRIPTION}
17
+ #{RUBY_DESCRIPTION}
18
18
 
19
- Please download JRuby from http://jruby.org (or your favorite Ruby version
20
- manager), then check our https://github.com/shoes/shoes4#installing-shoes-4 to
21
- get Shoes installed.
19
+ Please download JRuby from http://jruby.org (or your favorite Ruby version
20
+ manager), then check our https://github.com/shoes/shoes4#installing-shoes-4 to
21
+ get Shoes installed.
22
22
 
23
- Sorry for the inconvenience!
24
- *******************************************************************************
23
+ Sorry for the inconvenience!
24
+ *******************************************************************************
25
25
 
26
26
  EOS
27
27
  exit 1
@@ -1,4 +1,16 @@
1
1
  # frozen_string_literal: true
2
+
3
+ # Gradients are a little confusing, but don't let all the math below scare you.
4
+ # Here's the (relatively) simple explanation of what's going on.
5
+ #
6
+ # ::SWT::Pattern, the underlying class we use, defines a gradient by a starting
7
+ # and ending point. We account the angle into it by changing these points.
8
+ #
9
+ # To look right, the start/end points must be outside our shape! If not, then
10
+ # we get a hard line where the color resets without fading, which looks bad.
11
+ # Given that, we must keep those points outside our bounds of the element,
12
+ # which are reported via the redraw_left, redraw_top, etc. methods.
13
+
2
14
  class Shoes
3
15
  module Swt
4
16
  class Gradient
@@ -7,6 +19,8 @@ class Shoes
7
19
  def initialize(dsl)
8
20
  @dsl = dsl
9
21
  @patterns = []
22
+ @color1 = nil
23
+ @color2 = nil
10
24
  end
11
25
 
12
26
  def dispose
@@ -42,12 +56,16 @@ class Shoes
42
56
 
43
57
  private
44
58
 
45
- def create_pattern(dsl)
46
- width = dsl.element_width * 0.5
47
- height = dsl.element_height * 0.5
48
- angle = normalize_angle(-dsl.angle)
49
- left, top, width, height = determine_args_based_on_angle(angle, dsl.element_left,
50
- dsl.element_top, width, height)
59
+ def create_pattern(gui)
60
+ dsl = gui.dsl
61
+ width = dsl.redraw_width * 0.5
62
+ height = dsl.redraw_height * 0.5
63
+ angle = normalize_angle(-(dsl.angle || 0))
64
+ left, top, width, height = determine_args_based_on_angle(angle,
65
+ dsl.redraw_left,
66
+ dsl.redraw_top,
67
+ width,
68
+ height)
51
69
 
52
70
  pattern = ::Swt::Pattern.new Shoes.display, left, top, width, height,
53
71
  color1.real, color2.real
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'fileutils'
3
4
 
4
5
  class Shoes
@@ -14,13 +15,16 @@ class Shoes
14
15
  include Common::ImageHandling
15
16
  include ::Shoes::BackendDimensionsDelegations
16
17
 
17
- attr_reader :app, :real, :dsl, :painter
18
+ attr_reader :app, :real, :dsl, :painter, :full_width, :full_height
18
19
 
19
20
  def initialize(dsl, app)
20
21
  @dsl = dsl
21
22
  @app = app
23
+ @tmpname_or_data = nil
22
24
  update_image
23
- add_paint_listener
25
+
26
+ @painter = ImagePainter.new(self)
27
+ app.add_paint_listener(@painter)
24
28
  end
25
29
 
26
30
  def update_image
@@ -116,14 +120,6 @@ class Shoes
116
120
  end
117
121
  data
118
122
  end
119
-
120
- def add_paint_listener
121
- @painter = lambda do |event|
122
- graphics_context = event.gc
123
- graphics_context.drawImage @real, 0, 0, @full_width, @full_height, dsl.element_left, dsl.element_top, dsl.element_width, dsl.element_height unless @dsl.hidden
124
- end
125
- app.add_paint_listener(@painter)
126
- end
127
123
  end
128
124
  end
129
125
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Shoes
4
+ module Swt
5
+ class ImagePainter
6
+ include Common::Resource
7
+
8
+ def initialize(image)
9
+ @image = image
10
+ @dsl = image.dsl
11
+ end
12
+
13
+ def paint_control(event)
14
+ return if @dsl.hidden
15
+
16
+ graphics_context = event.gc
17
+ clip_context_to(graphics_context, @dsl.parent) do
18
+ graphics_context.drawImage(@image.real, 0, 0,
19
+ @image.full_width, @image.full_height,
20
+ @dsl.element_left, @dsl.element_top,
21
+ @dsl.element_width, @dsl.element_height)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class ImagePattern
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  # Class is used by edit_box and edit_line
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class KeyListener
@@ -9,13 +10,13 @@ class Shoes
9
10
  end
10
11
 
11
12
  SPECIAL_KEY_NAMES = Hash[
12
- %w(TAB PAGE_UP PAGE_DOWN HOME END F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12
13
- F13 F14 F15).map do |key|
13
+ %w[TAB PAGE_UP PAGE_DOWN HOME END F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12
14
+ F13 F14 F15].map do |key|
14
15
  [get_swt_constant(key), key.downcase]
15
16
  end
16
17
  ]
17
18
 
18
- %w(UP DOWN LEFT RIGHT).each do |key|
19
+ %w[UP DOWN LEFT RIGHT].each do |key|
19
20
  SPECIAL_KEY_NAMES[get_swt_constant "ARROW_#{key}"] = key.downcase
20
21
  end
21
22
 
@@ -26,7 +27,7 @@ class Shoes
26
27
 
27
28
  SPECIAL_KEY_NAMES.freeze
28
29
 
29
- MODIFIER_KEYS = %w(CTRL SHIFT ALT CAPS_LOCK COMMAND).map do |key|
30
+ MODIFIER_KEYS = %w[CTRL SHIFT ALT CAPS_LOCK COMMAND].map do |key|
30
31
  get_swt_constant key
31
32
  end
32
33
 
@@ -49,7 +50,7 @@ class Shoes
49
50
  end
50
51
 
51
52
  BUTTON_EXCLUDES = ["\n", " "].freeze
52
- COMBO_EXCLUDES = %w(up down) + BUTTON_EXCLUDES
53
+ COMBO_EXCLUDES = %w[up down] + BUTTON_EXCLUDES
53
54
 
54
55
  # For a variety of SWT controls, certain characters should not be passed
55
56
  # to Shoes key listeners, since they're already handled by the controls.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Line
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class LinePainter < Common::Painter
5
6
  def draw(gc)
6
7
  gc.draw_line(@obj.translate_left + @obj.element_left,
7
- @obj.translate_top + @obj.element_top,
8
+ @obj.translate_top + drawing_top,
8
9
  @obj.translate_left + @obj.element_right + 1,
9
- @obj.translate_top + @obj.element_bottom + 1)
10
+ @obj.translate_top + drawing_bottom + 1)
10
11
  end
11
12
 
12
13
  # Don't do fill setup
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Link
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class LinkSegment
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class ListBox
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class MouseMoveListener
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Oval
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class OvalPainter < Common::Painter
5
6
  def clipping
6
7
  clipping = ::Swt::Path.new(Shoes.display)
7
- clipping.add_arc(@obj.element_left, @obj.element_top,
8
+ clipping.add_arc(@obj.element_left, drawing_top,
8
9
  @obj.element_width, @obj.element_height, 0, 360)
9
10
  clipping
10
11
  end
11
12
 
12
13
  def fill(graphics_context)
13
14
  graphics_context.fill_oval(@obj.translate_left + @obj.element_left,
14
- @obj.translate_top + @obj.element_top,
15
+ @obj.translate_top + drawing_top,
15
16
  @obj.element_width,
16
17
  @obj.element_height)
17
18
  end
@@ -19,7 +20,7 @@ class Shoes
19
20
  def draw(graphics_context)
20
21
  sw = graphics_context.get_line_width
21
22
  graphics_context.draw_oval(@obj.translate_left + @obj.element_left + sw / 2,
22
- @obj.translate_top + @obj.element_top + sw / 2,
23
+ @obj.translate_top + drawing_top + sw / 2,
23
24
  @obj.element_width - sw,
24
25
  @obj.element_height - sw)
25
26
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Packager
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Progress
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  # In Swt a radio button is actually just a
5
6
  # button, so a lot of these methods are
6
7
  # borrowed from button.rb
7
8
  class Radio < CheckButton
8
- attr_accessor :group
9
+ attr_reader :group
9
10
 
10
11
  # Create a radio button
11
12
  #
@@ -19,9 +20,9 @@ class Shoes
19
20
 
20
21
  def group=(value)
21
22
  group_lookup = RadioGroup.group_lookup
22
- group_lookup[@group].remove(self) unless @group.nil?
23
+ group_lookup[group].remove(self) unless group.nil?
23
24
  @group = value || RadioGroup::DEFAULT_RADIO_GROUP
24
- group_lookup[@group].add self
25
+ group_lookup[group].add self
25
26
  end
26
27
  end
27
28
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  # In Swt radio groups are managed by composites which occupy space
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Rect
@@ -12,8 +13,6 @@ class Shoes
12
13
  include Common::Translate
13
14
  include ::Shoes::BackendDimensionsDelegations
14
15
 
15
- def_delegators :dsl, :angle
16
-
17
16
  attr_reader :dsl, :app, :transform, :painter
18
17
 
19
18
  def initialize(dsl, app)
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class RectPainter < Common::Painter
5
6
  def fill(gc)
6
7
  gc.fill_round_rectangle(@obj.translate_left + @obj.element_left + inset,
7
- @obj.translate_top + @obj.element_top + inset,
8
+ @obj.translate_top + drawing_top + inset,
8
9
  @obj.element_width - inset * 2,
9
10
  @obj.element_height - inset * 2,
10
11
  @obj.corners * 2,
@@ -14,7 +15,7 @@ class Shoes
14
15
  def draw(gc)
15
16
  stroke_width = gc.get_line_width
16
17
  gc.draw_round_rectangle(@obj.translate_left + @obj.element_left + stroke_width / 2,
17
- @obj.translate_top + @obj.element_top + stroke_width / 2,
18
+ @obj.translate_top + drawing_top + stroke_width / 2,
18
19
  @obj.element_width - stroke_width,
19
20
  @obj.element_height - stroke_width,
20
21
  @obj.corners * 2, @obj.corners * 2)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # This file uses the after_do gem, which you probably haven't heard of (yet)
3
4
  # It basically works like Class.after :method do ... end
4
5
  # So for every instance of Class, after method is executed the block you
@@ -22,18 +23,21 @@ class Shoes
22
23
  MouseMoveListener => [:eval_move_block],
23
24
  TextBlock::CursorPainter => [:move_textcursor],
24
25
  Timer => [:eval_block],
25
- ::Shoes::Common::Changeable => [:call_change_listeners]
26
+ Slot => [:update_scroll],
27
+ ::Shoes::Common::Changeable => [:call_change_listeners],
26
28
  }.freeze
27
29
 
28
30
  # These need to trigger a redraw
29
- SAME_POSITION = { Common::Visibility => [:update_visibility],
30
- Image => [:create_image],
31
- ::Shoes::Common::Hover => [:eval_hover_block],
32
- ::Shoes::Common::Style => [:update_style],
33
- ::Shoes::Common::Remove => [:remove],
34
- ::Shoes::Slot => [:mouse_hovered,
35
- :mouse_left],
36
- ::Shoes::TextBlock => [:replace] }.freeze
31
+ SAME_POSITION =
32
+ {
33
+ Common::Visibility => [:update_visibility],
34
+ Image => [:create_image],
35
+ ::Shoes::Common::Hover => [:eval_hover_block],
36
+ ::Shoes::Common::Style => [:update_style],
37
+ ::Shoes::Common::Remove => [:remove],
38
+ ::Shoes::Slot => [:mouse_hovered, :mouse_left],
39
+ ::Shoes::TextBlock => [:replace],
40
+ }.freeze
37
41
 
38
42
  CHANGED_POSITION = { ::Shoes::DimensionsDelegations => [:adjust_current_position],
39
43
  ::Shoes::Common::Positioning => [:_position, :displace],
@@ -85,8 +89,8 @@ class Shoes
85
89
 
86
90
  def redraw_element(element, include_children = true)
87
91
  target = redraw_target(element)
88
- redraw_area target.element_left, target.element_top,
89
- target.element_width, target.element_height,
92
+ redraw_area target.redraw_left, target.redraw_top,
93
+ target.redraw_width, target.redraw_height,
90
94
  include_children
91
95
  end
92
96
 
@@ -98,7 +102,7 @@ class Shoes
98
102
 
99
103
  def redraw_target(element)
100
104
  # During DSL initialization element.gui is nil, so if a SWT backend
101
- # object causes a redraw in its initailize (like Shoes::Swt::Image),
105
+ # object causes a redraw in its initialize (like Shoes::Swt::Image),
102
106
  # we won't have gui set yet. Annoying, but fine.
103
107
  if element.gui
104
108
  element.gui.redraw_target