Eaglev0.1.0

UI toolkit

Panels, buttons, sliders, checkboxes, text input, grids and themes.

Click around; Tab cycles focus

Source: examples/ui/main.cr

examples/ui/main.cr

require "../../src/eagle"
include Eagle

# UI showcase: containers, buttons, sliders, text input, themes, TrueType font.
class UIDemo < App
  @status = Label.new("Ready.")
  @ttf : Font? = nil

  def load
    ttf_path = ["/System/Library/Fonts/Supplemental/Arial.ttf", "/System/Library/Fonts/Geneva.ttf", "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"].find { |p| File.exists?(p) }
    if ttf_path
      @ttf = Font.load(ttf_path, 18)
      Theme.default.font = @ttf
    end
    layer = CanvasLayer.new
    SceneTree.root.add(layer)

    panel = Panel.new(size: v2(440, 0))
    panel.anchor = Anchor::Center
    panel.fit_content = true
    vbox = VBox.new(size: v2(420, 0))
    vbox.position = v2(10, 10)
    vbox.fit_content = true
    panel.add(vbox)
    layer.add(panel)

    title = Label.new("Eagle UI", align: TextAlign::Center)
    title.font_scale = 1.4
    vbox.add(title)
    vbox.add(Label.new("Widgets laid out by a VBox inside a centred Panel.", color: Color.gray(0.7)))

    row = HBox.new
    row.add(Button.new("Primary") { @status.text = "Primary pressed" })
    row.add(Button.new("Toggle").tap { |b| b.toggle_mode = true; b.on_toggled { |on| @status.text = "Toggle #{on ? "on" : "off"}" } })
    d = Button.new("Disabled"); d.disabled = true
    row.add(d)
    vbox.add(row)

    vbox.add(CheckBox.new("Enable shadows", true).tap { |c| c.on_toggled { |v| @status.text = "Shadows #{v}" } })
    slider_row = HBox.new
    slabel = Label.new("Volume 50%")
    slider = Slider.new(0, 100, 50, step: 1)
    slider.size_flags = SizeFlags::ExpandX
    slider.on_value_changed { |v| slabel.text = "Volume #{v.to_i}%"; @status.text = "Volume #{v.to_i}" }
    slider_row.add(slider, slabel)
    vbox.add(slider_row)

    bar = ProgressBar.new(0.0)
    vbox.add(bar)
    Tween.value(0, 1, 3.0, ease: :quad_in_out) { |v| bar.value = v }.loop = true

    input = TextInput.new("", "Type your name and press Enter")
    input.on_submitted { |t| @status.text = "Hello, #{t}!" }
    vbox.add(input)

    grid = GridContainer.new(3)
    9.times { |i| grid.add(Button.new("#{i + 1}") { @status.text = "Grid #{i + 1}" }) }
    vbox.add(grid)

    theme_row = HBox.new
    theme_row.add(Button.new("Dark") { panel.theme = nil; @status.text = "Dark theme" })
    theme_row.add(Button.new("Light") { panel.theme = Theme.default.light; @status.text = "Light theme" })
    vbox.add(theme_row)
    vbox.add(@status)
  end

  def draw(g : Graphics)
    g.print("fps #{Clock.fps.round}  draw calls #{g.draw_calls}  focused: #{Control.focused.try(&.class.name) || "-"}", 10, Window.height - 24, Color::GRAY)
  end
end

Eagle.run(UIDemo, title: "Eagle UI", width: 900, height: 640)