# Copyright (c) 2007-2021 Andy Maleh # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # This class declares a `greeting_label` custom widget (by convention) class GreetingLabel include Glimmer::UI::CustomWidget # multiple options without default values options :name, :colors # single option with default value option :greeting, default: 'Hello' # internal attribute (not a custom widget option) attr_accessor :color before_body { @font = {height: 24, style: :bold} @color = :black } after_body { return if colors.nil? Thread.new { colors.cycle { |color| async_exec { self.color = color } sleep(1) } } } body { # pass received swt_style through to label to customize (e.g. :center to center text) label(swt_style) { text "#{greeting}, #{name}!" font @font foreground bind(self, :color) } } end # including Glimmer enables the Glimmer DSL syntax, including auto-discovery of the `greeting_label` custom widget include Glimmer shell { fill_layout :vertical minimum_size 215, 215 text 'Hello, Custom Widget!' # custom widget options are passed in a hash greeting_label(name: 'Sean') # pass :center SWT style followed by custom widget options hash greeting_label(:center, name: 'Laura', greeting: 'Aloha') # greeting_label(:right, name: 'Rick') { # you can nest attributes under custom widgets just like any standard widget foreground :red } # the colors option cycles between colors for the label foreground every second greeting_label(:center, name: 'Mary', greeting: 'Aloha', colors: [:red, :dark_green, :blue]) }.open