Glimmer DSL for LibUI 0.5.10 (Fukuoka Award Winning Ruby Desktop Development GUI Library) has just been released with the following changes:
Support nesting area mouse listeners underneath shapes directly given the newly added support for the include?(x, y) method, which can be used to detect if a mouse event fired for a specific shape
examples/shape_coloring.rb
In summary, you can now use area mouse listeners within shapes directly and Glimmer DSL for LibUI will ensure that they do not fire unless the mouse x,y coordinates land within the shape regions (it does so by leveraging the Perfect Shape gem)
In fact, that has been demonstrated in the new example: Shape Coloring
# From: https://github.com/AndyObtiva/glimmer-dsl-libui#shape-coloring require 'glimmer-dsl-libui' class ShapeColoring include Glimmer::LibUI::Application COLOR_SELECTION = Glimmer::LibUI.interpret_color(:red) before_body { @shapes = [] } body { window('Shape Coloring', 200, 200) { margined false grid { label("Click a shape to select and\nchange color via color button") { left 0 top 0 hexpand true halign :center vexpand false } color_button { |cb| left 0 top 1 hexpand true vexpand false on_changed do @selected_shape&.fill = cb.color end } area { left 0 top 2 hexpand true vexpand true rectangle(0, 0, 600, 400) { # background shape fill :white } @shapes << colorable(:rectangle, 20, 20, 40, 20) { |shape| fill :lime } @shapes << colorable(:square, 80, 20, 20) { |shape| fill :blue } @shapes << colorable(:circle, 75, 70, 20, 20) { |shape| fill :green } @shapes << colorable(:arc, 120, 70, 40, 0, 145) { |shape| fill :orange } @shapes << colorable(:polygon, 120, 10, 120, 50, 150, 10, 150, 50) { fill :cyan } @shapes << colorable(:polybezier, 20, 40, 30, 100, 50, 80, 80, 110, 40, 120, 20, 120, 30, 91) { fill :pink } } } } } def colorable(shape_symbol, *args, &content) send(shape_symbol, *args) do |shape| on_mouse_up do |area_mouse_event| old_stroke = Glimmer::LibUI.interpret_color(shape.stroke).slice(:r, :g, :b) @shapes.each {|sh| sh.stroke = nil} @selected_shape = nil unless old_stroke == COLOR_SELECTION shape.stroke = COLOR_SELECTION.merge(thickness: 2) @selected_shape = shape end end content.call(shape) end end end ShapeColoring.launch
Happy Glimmering!
Top comments (0)