2012-11-04 23 views
8

Tôi đang tìm thư viện để viết GUI trên GLFW và OpenGL. Tôi đang làm điều này bởi vì tôi không hài lòng với các ràng buộc thư viện UI phổ biến mà tôi cảm thấy quá cấp bách và tôi cũng muốn kiểm soát chặt chẽ giao diện của giao diện người dùng của mình. Tôi muốn một cách tiếp cận khai báo để định nghĩa giao diện người dùng. Tôi đang thử nghiệm với chuối phản ứng (và phản ứng tạm thời-chuối-wx) để xem nó có đáp ứng được nhu cầu của tôi hay không. Tôi có một vấn đề với việc xác định các vật dụng đệ quy. Đây là trường hợp thử nghiệm đơn giản nhất của tôi:Xử lý các tiện ích GUI đệ quy cùng với chuối phản ứng

  • Tiện ích văn bản hiển thị bộ đếm.
  • Tiện ích con nút tăng bộ đếm.
  • Một nút widget mà không hoạt động (vì vậy nó là màu xám và không đáp ứng với đầu vào tại tất cả) khi bộ đếm là 0 và nếu không hoạt động và reset bộ đếm đến 0.

Các widget đầu tiên và thứ ba có một mối quan hệ đệ quy. Tiện ích đầu tiên trực quan là số stepper của số union của các sự kiện được cấp từ hai nút. Tuy nhiên, nút đặt lại là số fmap của bộ đếm và sau đó luồng sự kiện dựa trên nút đặt lại! Điều gì sẽ được thực hiện?

Ngoài câu hỏi này, tôi lo ngại về xử lý sự kiện: Vì tôi muốn xử lý đầu vào thiết bị và tiêu điểm đầu vào bên trong mã của tôi thay vì dựa vào khung, tôi thấy khó khăn trong việc sắp xếp các sự kiện một cách chính xác theo cách có thể mở rộng. Lý tưởng nhất là tôi sẽ định nghĩa một data đóng gói cấu trúc phân cấp của một widget, một cách để cài đặt các sự kiện gọi lại giữa các phần tử và sau đó viết một hàm đi qua cấu trúc dữ liệu đó để xác định đầu vào thiết bị và đầu ra đồ họa. Tôi không chắc chắn cách lấy luồng sự kiện và tách luồng sự kiện dễ dàng như các luồng sự kiện có thể được hợp nhất.

Trả lời

5

Đuổi được cho phép, miễn là đệ quy lẫn nhau giữa một số BehaviorEvent. Điều tốt đẹp về Behavior s là lấy mẫu chúng tại thời điểm cập nhật sẽ trả về giá trị cũ.

Ví dụ, ví dụ bạn có thể được diễn tả như sau

eClick1, eClick2 :: Event t() 

bCounter :: Behavior t Int 
bCounter = accumB 0 $ mconcat [eIncrement, eReset] 

eIncrement = (+1)  <$ eClick1 
eReset  = (const 0) <$ whenE ((> 0) <$> bCounter) eClick2 

Xem thêm các câu hỏi "Can reactive-banana handle cycles in the network?"


Đối với câu hỏi thứ hai của bạn, bạn dường như tìm kiếm các chức năng filterE và nó anh em họ filterApplywhenE?


Đối với mục tiêu tổng thể của bạn, tôi nghĩ nó khá tham vọng. Từ những gì ít kinh nghiệm tôi đã đạt được cho đến nay, có vẻ như với tôi rằng ràng buộc với một khuôn khổ hiện có cảm thấy khá khác nhau từ làm cho một "sạch-nhà nước" khuôn khổ trong FRP. Nhiều khả năng, vẫn còn một số trừu tượng chưa được khám phá (nhưng thú vị!) Ẩn giấu ở đó. Tôi đã từng bắt đầu viết một ứng dụng có tên là BlackBoard có chứa một trừu tượng tốt đẹp về các bản vẽ thay đổi theo thời gian. Tuy nhiên, nếu bạn quan tâm nhiều hơn đến kết quả chứ không phải là cuộc phiêu lưu, tôi sẽ đề xuất một cách tiếp cận bảo thủ: tạo bộ công cụ GUI theo phong cách bắt buộc và móc chuối hoạt động trên đầu trang để có được lợi ích của FRP.

Trong trường hợp bạn chỉ muốn bất kỳ giao diện nào GUI, tôi hiện đang tập trung vào trình duyệt web dưới dạng GUI. Đây là một số preliminary experiments with Ji. Lợi ích chính của wxHaskell là dễ dàng hơn trong việc thiết lập và chạy và mọi nỗ lực thiết kế API sẽ mang lại lợi ích cho một đối tượng rất rộng.

+0

Điều gì xảy ra nếu bạn ở trong đơn vị Sự kiện? Tôi đã quan tâm bởi vì nó không có MonadFix cho đệ quy giá trị, do đó, đệ quy tương tự này không thể được thể hiện trong sự hiện diện của chuyển đổi sự kiện năng động. Cấp cho tôi vẫn không hoàn toàn thoải mái với tất cả các ví dụ công cộng. – danharaj

+0

Đối với câu hỏi thứ hai của tôi: 'filterE' et al. làm việc theo hướng sai cho khả năng mở rộng, tôi nghĩ vậy. Họ kéo từ một sự kiện, và điều đó có vẻ cồng kềnh. Ví dụ, chúng ta có cấu trúc cây của các widget gui với một con trỏ để lấy tiêu điểm bàn phím. Chúng ta muốn biến các sự kiện 'eDeviceInput' thành các sự kiện dựa trên con trỏ đó. Với 'filterE', mọi luồng sự kiện người nhận sẽ phải thực hiện bộ lọc riêng của nó trên cây widget và cũng biết vị trí của nó trong cây, làm cho các phép biến đổi bố cục và chuyển đổi sự kiện động cồng kềnh. – danharaj

+0

Loại 'Sự kiện 'không phải là một đơn nguyên. Bạn có thể có nghĩa là đơn vị 'Moment'? Đó là một ví dụ của 'MonadFix' như bạn mong đợi. –

Các vấn đề liên quan