class MetaExample

Constants

ADDITIONAL_BASIC_EXAMPLES

Attributes

code_text[RW]

Public Class Methods

new() click to toggle source
# File examples/meta_example.rb, line 12
def initialize
  @selected_example_index = examples_with_versions.index(basic_examples_with_versions.first)
  @code_text = File.read(file_path_for(selected_example))
end

Public Instance Methods

advanced_examples() click to toggle source
# File examples/meta_example.rb, line 31
def advanced_examples
  (examples - basic_examples).sort
end
advanced_examples_with_versions() click to toggle source
# File examples/meta_example.rb, line 43
def advanced_examples_with_versions
  append_versions(advanced_examples)
end
append_versions(examples) click to toggle source
# File examples/meta_example.rb, line 47
def append_versions(examples)
  examples.map { |example| version_count_for(example) > 1 ? "#{example} (#{version_count_for(example)} versions)" : example }
end
basic_examples() click to toggle source
# File examples/meta_example.rb, line 27
def basic_examples
  examples.select {|example| example.start_with?('Basic') || ADDITIONAL_BASIC_EXAMPLES.include?(example) }.sort
end
basic_examples_with_versions() click to toggle source
# File examples/meta_example.rb, line 39
def basic_examples_with_versions
  append_versions(basic_examples)
end
examples() click to toggle source
# File examples/meta_example.rb, line 17
def examples
  if @examples.nil?
    example_files = Dir.glob(File.join(File.expand_path('.', __dir__), '*.rb'))
    example_file_names = example_files.map { |f| File.basename(f, '.rb') }
    example_file_names = example_file_names.reject { |f| f == 'meta_example' || f.match(/\d$/) }
    @examples = example_file_names.map { |f| f.underscore.titlecase }
  end
  @examples
end
examples_with_versions() click to toggle source
# File examples/meta_example.rb, line 35
def examples_with_versions
  append_versions(examples)
end
file_path_for(example) click to toggle source
# File examples/meta_example.rb, line 51
def file_path_for(example)
  File.join(File.expand_path('.', __dir__), "#{example.underscore}.rb")
end
glimmer_dsl_libui_file() click to toggle source
# File examples/meta_example.rb, line 59
def glimmer_dsl_libui_file
  File.expand_path('../lib/glimmer-dsl-libui', __dir__)
end
launch() click to toggle source
# File examples/meta_example.rb, line 84
def launch
  window('Meta-Example', 1000, 500) {
    margined true
    
    horizontal_box {
      vertical_box {
        stretchy false
        
        tab {
          stretchy false
          
          tab_item('Basic') {
            vertical_box {
              @basic_example_radio_buttons = radio_buttons {
                stretchy false
                items basic_examples_with_versions
                selected basic_examples_with_versions.index(examples_with_versions[@selected_example_index])
                
                on_selected do
                  @selected_example_index = examples_with_versions.index(basic_examples_with_versions[@basic_example_radio_buttons.selected])
                  example = selected_example
                  self.code_text = File.read(file_path_for(example))
                  @version_spinbox.value = 1
                  @advanced_example_radio_buttons.selected = -1
                end
              }
              
              label # filler
              label # filler
            }
          }
          
          tab_item('Advanced') {
            vertical_box {
              @advanced_example_radio_buttons = radio_buttons {
                stretchy false
                items advanced_examples_with_versions
                selected -1
                
                on_selected do
                  @selected_example_index = examples_with_versions.index(advanced_examples_with_versions[@advanced_example_radio_buttons.selected])
                  example = selected_example
                  self.code_text = File.read(file_path_for(example))
                  @version_spinbox.value = 1
                  @basic_example_radio_buttons.selected = -1
                end
              }
              
              label # filler
              label # filler
            }
          }
        }
        
        horizontal_box {
          label('Version') {
            stretchy false
          }
          
          @version_spinbox = spinbox(1, 100) {
            value 1
            
            on_changed do
              example = selected_example
              if @version_spinbox.value > version_count_for(example)
                @version_spinbox.value -= 1
              else
                version_number = @version_spinbox.value == 1 ? '' : @version_spinbox.value
                example = "#{selected_example}#{version_number}"
                self.code_text = File.read(file_path_for(example))
              end
            end
          }
        }
        
        horizontal_box {
          stretchy false
          
          button('Launch') {
            on_clicked do
              begin
                parent_dir = File.join(Dir.home, '.glimmer-dsl-libui', 'examples')
                FileUtils.mkdir_p(parent_dir)
                example_file = File.join(parent_dir, "#{selected_example.underscore}.rb")
                File.write(example_file, code_text)
                example_supporting_directory = File.expand_path(selected_example.underscore, __dir__)
                FileUtils.cp_r(example_supporting_directory, parent_dir) if Dir.exist?(example_supporting_directory)
                FileUtils.cp_r(File.expand_path('../icons', __dir__), File.dirname(parent_dir))
                FileUtils.cp_r(File.expand_path('../sounds', __dir__), File.dirname(parent_dir))
                run_example(example_file)
              rescue => e
                puts e.full_message
                puts 'Unable to write code changes! Running original example...'
                run_example(file_path_for(selected_example))
              end
            end
          }
          button('Reset') {
            on_clicked do
              version_number = @version_spinbox.value == 1 ? '' : @version_spinbox.value
              example = "#{selected_example}#{version_number}"
              self.code_text = File.read(file_path_for(example))
            end
          }
        }
      }
      
      @code_entry = non_wrapping_multiline_entry {
        text <=> [self, :code_text]
      }
    }
  }.show
end
run_example(example) click to toggle source
# File examples/meta_example.rb, line 67
def run_example(example)
  Thread.new do
    command = "#{RbConfig.ruby} -r #{glimmer_dsl_libui_file} #{example} 2>&1"
    result = ''
    IO.popen(command) do |f|
      sleep(0.00001) # yield to main thread
      f.each_line do |line|
        result << line
        puts line
        $stdout.flush # for Windows
        sleep(0.00001) # yield to main thread
      end
    end
    Glimmer::LibUI.queue_main { msg_box('Error Running Example', result) } if result.downcase.include?('error')
  end
end
selected_example() click to toggle source
# File examples/meta_example.rb, line 63
def selected_example
  examples[@selected_example_index]
end
version_count_for(example) click to toggle source
# File examples/meta_example.rb, line 55
def version_count_for(example)
  Dir.glob(File.join(File.expand_path('.', __dir__), "#{example.underscore}*.rb")).select {|file| file.match(/#{example.underscore}\d\.rb$/)}.count + 1
end