Рубрики
Без рубрики

Приключения электрона: Эпизод 82: Мерцающий DSL

Я просмотрел все многообещающие электронные альтернативы, но до конца еще далеко… С тегами ruby, java, jruby.

Электронные Приключения (89 Серий)

Я просмотрел все многообещающие электронные альтернативы, но все еще есть дно, которое нужно очистить. Итак, для этого эпизода – Мерцающий DSL .

Glimmer DSL – это рубиновый DSL для создания пользовательских интерфейсов. В качестве предупреждающего знака, он не пытается быть хорошим DSL для одной библиотеки пользовательского интерфейса, он пытается сделать 6. Теперь три из них – это просто Opal HTML, CSS и XML, и мы уже можем делать это в Electron, так что давайте посмотрим на остальные три.

мерцание-dsl-tk

Насколько я могу судить, установить Tk на Mac каким-либо разумным способом невозможно. У меня tcl-tk установлен в заваривать , но gem устанавливает glimmer-dsl-tk не видит этого.

Вот файл Gemfile , который выходит из строя:

source "https://rubygems.org"

gem "glimmer-dsl-tk", "~> 0.0.32"

Если вы работаете в Linux, вы, вероятно, могли бы попробовать.

мерцание-dsl-libui

Lib UI – это “портативная библиотека графического интерфейса для C”. Он поставляется с таким количеством отказов от ответственности, что это неполная альфа-версия.

Поэтому мы готовим следующее Файл Gemfile а затем запустите установка пакета :

source "https://rubygems.org"

gem "glimmer-dsl-libui", "~> 0.2.16"

Привет, мир не так уж плох:

#!/usr/bin/env ruby

require "glimmer-dsl-libui"

include Glimmer

window("Hello, world!", 800, 600).show

За исключением того, что он отказывается активировать это окно в OSX, поэтому оно находится в фоновом режиме.

Я продолжил пытаться написать простое приложение для счетчиков с +1 и -1 кнопки и показывали общее количество, но libui сегментировался, если я смотрел на это забавно. Между отсутствием документации, отсутствием обратной связи в ОТВЕТ, постоянными сегментами и тем, что сама библиотека открыта из-за того, что она действительно неполная, я просто бросил ее на этом этапе.

мерцание-dsl-swt

Что ж, есть еще одна вещь, которую нужно попробовать. Последней поддерживаемой библиотекой является Java SWT, для которой нам нужно будет использовать JRuby. Это уже проблематично, так как JRuby очень медленно запускается и поддерживает намного меньше библиотек, чем обычный Ruby, но этого может быть достаточно.

Мы можем начать с этого ..версия ruby (если вы используете rbenv для управления несколькими версиями Ruby:)

jruby-9.3.1.0

И это Файл Gemfile :

source "https://rubygems.org"

gem "glimmer-dsl-swt", "~> 4.21"

Установка заняла некоторое время, и мне не сказали, что мне нужно передать специальные опции jruby, иначе я получу сбой. Со специальной опцией -J-XstartOnFirstThread , вот Привет, мир:

#!/usr/bin/env ruby -J-XstartOnFirstThread

require "glimmer-dsl-swt"

include Glimmer

shell {
  text "Glimmer"
  label {
    text "Hello, World!"
  }
}.open

Как вы, возможно, заметили, это не имеет ничего общего с версией пользовательского интерфейса Glimmer Lib. Мне действительно непонятно, почему Glimmer пытается быть одним проектом с несколькими библиотеками пользовательского интерфейса, которые имеют так мало общего, но я думаю, что концепция DSL может быть в чем-то похожа.

Приложение счетчика в мерцании-dsl-swt

После изучения примеров в документации мне удалось это сделать:

#!/usr/bin/env ruby -J-XstartOnFirstThread

require 'glimmer-dsl-swt'

class CounterApp
  include Glimmer::UI::CustomShell

  attr_accessor :count

  before_body do
    @count = 0
  end

  body {
    shell {
      text "Hello, Button!"
      row_layout :vertical

      label {
        text <= [self, :count, on_read: lambda{|v| "Count: #{v}" }]
      }

      group {
        row_layout :horizontal

        button {
          text "+1"
          on_widget_selected { self.count += 1 }
        }

        button {
          text "-1"
          on_widget_selected { self.count -= 1 }
        }
      }
    }
  }
end

CounterApp.launch

Вся реактивность должна быть явной. Мы делаем [сам,: подсчет, on_read: лямбда{|v| "Count: #{v}"}] чтобы сказать ему, чтобы он наблюдал за изменениями в self.count , и пусть они с лямбдой даны.

И нам нужно обновить self.count вместо того, чтобы @количество , поэтому код наблюдателя уведомляется.

Все начинается нормально, к сожалению, затем все идет плохо, когда количество превышает одну цифру:

Вы заметили, что вырезано “18”? Размер этикетки определяется только при создании этикетки. Обновления изменяют содержимое этикетки, но не меняют размер этикетки. Можно обойти это, включив дополнительные пробелы в конце, но, честно говоря, это то, для чего мы оставили мир HTML+CSS? Я так не думаю.

Результаты

В случае, если это еще не очевидно, не используйте ничего из этого. Пока это сильный претендент на мировое первенство.

В следующем эпизоде мы попробуем JavaFX для JRuby и посмотрим, лучше ли это, чем Glimmer и SWT.

Как обычно, весь код для эпизода здесь .

Электронные Приключения (89 Серий)

Оригинал: “https://dev.to/taw/electron-adventures-episode-82-glimmer-dsl-3i1a”