2012-11-04 4 views
8

GLFW 및 OpenGL 위에 GUI를 작성하는 라이브러리를 사냥하고 있습니다. 필자는 너무 긴급하다고 느끼는 일반적인 UI 라이브러리 바인딩에 만족하지 않고 UI의 모양과 느낌을 엄격하게 제어하고 싶기 때문에이 작업을 수행하고 있습니다. UI 정의에 대한 선언적 접근 방식을 원합니다. 나는 그것이 나의 필요를 충족시키는 지 알아보기 위해 reactive-banana (그리고 일시적으로 반응하는 바나나 -wx)를 실험하고있다. 재귀 위젯을 정의하는 데 문제가 있습니다. 가장 간단한 테스트 케이스는 다음과 같습니다.반응식 바나나가있는 상호 재귀 GUI 위젯 처리

  • 카운터를 표시하는 텍스트 위젯입니다.
  • 카운터를 증가시키는 버튼 위젯. 카운터는 달리 액티브 0 일 때 (이 회색으로 표시되고, 모든 입력에 응답하지 않도록) 비활성 0.

첫 번째와 세 번째 위젯 카운터를 리셋

  • 버튼 위젯 재귀 관계가있다. 첫 번째 위젯은 직관적으로 두 개의 버튼에서 제공되는 union 개의 이벤트 중 stepper입니다. 그러나 재설정 버튼은 카운터의 fmap이며, 이벤트 스트림은 재설정 버튼을 사용합니다! 무슨 일을해야할까요?

    이 질문을 넘어서는 프레임 워크에 의존하는 대신 장치 입력 및 포커스를 코드 내에서 처리하기 때문에 확장 가능한 방식으로 올바르게 이벤트를 전달하는 것이 어려워집니다. 이상적으로 위젯의 계층 적 구조를 캡슐화하는 data을 정의하고 요소 사이에 이벤트 콜백을 설치 한 다음 장치 입력 처리 및 그래픽 출력을 정의하기 위해 해당 데이터 구조를 통과하는 함수를 작성합니다. 이벤트 스트림을 병합하는 방법을 잘 모르겠습니다. 이벤트 스트림을 병합하면 쉽게 분리 할 수 ​​있습니다.

  • 답변

    5

    BehaviorEvent 사이의 상호 재귀 인 경우 재귀가 허용됩니다. Behavior의 좋은 점은 업데이트 할 때 샘플링하면 이전 값이 반환된다는 것입니다.

    eClick1, eClick2 :: Event t() 
    
    bCounter :: Behavior t Int 
    bCounter = accumB 0 $ mconcat [eIncrement, eReset] 
    
    eIncrement = (+1)  <$ eClick1 
    eReset  = (const 0) <$ whenE ((> 0) <$> bCounter) eClick2 
    

    도 참조 질문에 다음과 같이

    예를 들어, 예 "Can reactive-banana handle cycles in the network?" 두 번째 질문에 대해서는


    , 당신은 기능 filterE하고 찾고있는 것 같다 표현 될 수있다 사촌 filterApplywhenE?


    전반적인 목표는 상당히 야심적입니다. 지금까지 얻은 적은 경험으로 볼 때 기존 프레임 워크에 대한 바인딩이 FRP에서 "클린 스테이트"프레임 워크를 만드는 것과 상당히 다른 것으로 느껴집니다. 거의 확실하게 거기에 숨어있는 아직 발견되지 않은 (그러나 흥미로운!) 추상화가 있습니다. 한 번 BlackBoard이라는 응용 프로그램을 작성하기 시작했습니다.이 응용 프로그램에는 시시각각 변화하는 도면에 대한 멋진 추상화가 포함되어 있습니다.

    그러나 모험 이라기보다는 결과에 더 신경 쓰면 보수적 인 접근 방식을 권장합니다. GUI 툴킷을 명령형으로 만들고 반응식 바나나를 연결하여 FRP의 이점을 얻으십시오.

    의 GUI가 인 경우, 현재 웹 브라우저에 GUI로 집중하고 있습니다. 여기 일부는 preliminary experiments with Ji입니다. wxHaskell의 주요 장점은 시작하고 실행하는 것이 훨씬 쉽고 모든 API 디자인 작업이 매우 광범위한 사용자에게 도움이된다는 것입니다.

    +0

    이벤트 모나드에 있다면 어떨까요? MonadFix에 값 재귀가 없기 때문에이 재귀를 동적 이벤트 전환이있을 때 표현할 수 없었기 때문에 걱정이되었습니다. 필자는 모든 대중적인 예를 여전히 편안하게 생각하지는 않는다. – danharaj

    +0

    내 두 번째 질문은'filterE' 외. 확장성에있어 잘못된 방향으로 작업한다고 생각합니다. 그들은 사건에서 당겨서, 그것은 성가신 것처럼 보입니다. 예를 들어 키보드 집중을위한 커서가있는 GUI 위젯 트리 구조가 있다고 가정 해보십시오. 우리는'eDeviceInput' 이벤트를 그 커서에 기반한 이벤트로 바꾸기를 원합니다. 'filterE'를 사용하면 모든 수신자 이벤트 스트림이 위젯 트리에서 고유 한 필터를 수행하고 트리에있는 곳을 알아야하므로 레이아웃 변환과 동적 이벤트 전환이 번거로워집니다. – danharaj

    +0

    '이벤트'유형이 모나드가 아닙니다. 아마도 '순간'모나드를 의미할까요? MonadFix의 예입니다. –