LibUI 코드 영역용 Glimmer DSL(Ruby Tooling Future)

17116 단어 libuidesktopguiruby
Brandon Weaver이(가) 최근에 Glimmer Gitter에서 Glimmer DSL for LibUI에 대해 질문하기 위해 저에게 연락했습니다. 그는 또한 Marc-André Lafortune(제가 몬트리올에서 알고 있는 동료 루비스트)가 작성한 노드 패턴 도구인 hosted on Heroku에 대해서도 언급했습니다. BrandonGlimmer DSL for LibUI 구문 강조 보석을 활용하여 rouge을 사용하여 순수한 Ruby에서 비슷한 것을 구현할 수 있다는 가능성에 흥분했다고 말했습니다. 그는 이전에 Matz(Ruby 창시자)가 언급한 제목으로 Ruby Tooling 주제에 대해 블로그에 올렸습니다.

이제 좋은 소식이 있습니다! Glimmer DSL for LibUI의 최신 버전은 Ruby Tooling 비전 추구를 용이하게 하기 위해 다음 기능에 대한 지원을 추가했습니다.

  • Class-Based Custom Controls : 별도의 클래스에서 깔끔하게 유지 관리되는 재사용 가능한 구성 요소로 사용자 정의 컨트롤(일명 위젯)을 빌드할 수 있습니다.
  • Class-Based Custom Windows/Applications : 더 적은 상용구 코드로 애플리케이션 및 재사용 가능한 사용자 지정 창을 쉽게 구축할 수 있습니다.

  • code_area 사용자 정의 제어: area 제어에서 구문 강조 코드를 렌더링합니다.

  • Glimmer DSL for LibUI 의 뛰어난 생산성 이점을 감안할 때 저는 code_area gem을 사용하여 rouge 사용자 지정 컨트롤을 1시간도 안 되어 조립할 수 있었습니다.

    다음은 code_area 컨트롤의 모양입니다.



    code_area Glimmer DSL for LibUI에서 수많은 Ruby Tooling의 흥미로운 가능성을 열어줍니다. 이는 Ruby 커뮤니티 회원이 퍼스트 무버가 되어 Ruby에서 스크립팅할 수 있는 Ruby 툴링 라이브러리를 구축할 수 있는 기회입니다(현재 인기 있는 편집기와 다름).

    다음은 examples/basic_code_area.rb 코드입니다.

    # From: https://github.com/AndyObtiva/glimmer-dsl-libui#basic-code-area
    
    require 'glimmer-dsl-libui'
    
    class BasicCodeArea
      include Glimmer::LibUI::Application
    
      before_body do
        @code = <<~CODE
          # Greets target with greeting
          def greet(greeting: 'Hello', target: 'World')
    
            puts "\#{greeting}, \#{target}!"
          end
    
          greet
          greet(target: 'Robert')
          greet(greeting: 'Aloha')
          greet(greeting: 'Aloha', target: 'Nancy')
          greet(greeting: 'Howdy', target: 'Doodle')
        CODE
      end
    
      body {
        window('Basic Code Area', 400, 300) {
          margined true
    
          code_area(language: 'ruby', code: @code)
        }
      }
    end
    
    BasicCodeArea.launch
    


    클래스 기반 사용자 지정 컨트롤( address_formaddress_view )을 빌드하는 방법은 다음과 같습니다.

    # From: https://github.com/AndyObtiva/glimmer-dsl-libui#class-based-custom-controls
    
    require 'glimmer-dsl-libui'
    require 'facets'
    
    Address = Struct.new(:street, :p_o_box, :city, :state, :zip_code)
    
    class FormField
      include Glimmer::LibUI::CustomControl
    
      options :model, :attribute
    
      body {
        entry { |e|
          label attribute.to_s.underscore.split('_').map(&:capitalize).join(' ')
          text <=> [model, attribute]
        }
      }
    end
    
    class AddressForm
      include Glimmer::LibUI::CustomControl
    
      options :address
    
      body {
        form {
          form_field(model: address, attribute: :street)
          form_field(model: address, attribute: :p_o_box)
          form_field(model: address, attribute: :city)
          form_field(model: address, attribute: :state)
          form_field(model: address, attribute: :zip_code)
        }
      }
    end
    
    class LabelPair
      include Glimmer::LibUI::CustomControl
    
      options :model, :attribute, :value
    
      body {
        horizontal_box {
          label(attribute.to_s.underscore.split('_').map(&:capitalize).join(' '))
          label(value.to_s) {
            text <= [model, attribute]
          }
        }
      }
    end
    
    class AddressView
      include Glimmer::LibUI::CustomControl
    
      options :address
    
      body {
        vertical_box {
          address.each_pair do |attribute, value|
            label_pair(model: address, attribute: attribute, value: value)
          end
        }
      }
    end
    
    class ClassBasedCustomControls
      include Glimmer::LibUI::Application # alias: Glimmer::LibUI::CustomWindow
    
      before_body do
        @address1 = Address.new('123 Main St', '23923', 'Denver', 'Colorado', '80014')
        @address2 = Address.new('2038 Park Ave', '83272', 'Boston', 'Massachusetts', '02101')
      end
    
      body {
        window('Class-Based Custom Keyword') {
          margined true
    
          horizontal_box {
            vertical_box {
              label('Address 1') {
                stretchy false
              }
    
              address_form(address: @address1)
    
              horizontal_separator {
                stretchy false
              }
    
              label('Address 1 (Saved)') {
                stretchy false
              }
    
              address_view(address: @address1)
            }
    
            vertical_separator {
              stretchy false
            }
    
            vertical_box {
              label('Address 2') {
                stretchy false
              }
    
              address_form(address: @address2)
    
              horizontal_separator {
                stretchy false
              }
    
              label('Address 2 (Saved)') {
                stretchy false
              }
    
              address_view(address: @address2)
            }
          }
        }
      }
    end
    
    ClassBasedCustomControls.launch
    


    그리고 재사용 가능한 사용자 지정 컨트롤의 모습은 다음과 같습니다(2개의 주소 형식과 2개의 주소 보기).



    해피Glimmering !

    좋은 웹페이지 즐겨찾기