/program-gadgets/program-gadgets.factor

http://github.com/rswarbrick/giplayer · Factor · 77 lines · 64 code · 11 blank · 2 comment · 2 complexity · 3421d2f3230b8b45581e035d00c142d3 MD5 · raw file

  1. USING: kernel accessors sequences arrays math math.bitwise
  2. giplayer.listings math.parser math.order
  3. models ui ui.gadgets ui.gadgets.packs ui.gadgets.labels
  4. ui.gadgets.panes ui.gadgets.borders ui.gadgets.scrollers
  5. ui.tools.common ui.pens.solid
  6. io.styles io locals colors fonts calendar.format ;
  7. IN: giplayer.program-gadgets
  8. TUPLE: programme-list < pack ;
  9. : <noprogrammes-gadget> ( -- gadget )
  10. "No programmes found" <label> ;
  11. : <programme-list> ( listing-model -- gadget )
  12. programme-list new
  13. swap >>model
  14. 1 >>fill
  15. { 0 10 } >>gap
  16. <noprogrammes-gadget> add-gadget
  17. <scroller> ;
  18. : kth-page ( pagelen k seq -- subseq )
  19. 3dup [ * ] [ length ] bi* <
  20. [
  21. [ [ * ] [ 1 + * ] 2bi ] dip [ length ] keep
  22. [ min ] dip subseq
  23. ] [ 3drop { } clone ] if ;
  24. ! Hash the station name to a 32 bit integer, then take 21 bits to get
  25. ! 3 numbers 0-128. Now add 128 to each (and divide to put into [0,1]).
  26. : programme-colour ( l -- colour )
  27. channel>> reverse hashcode
  28. { HEX: 7f HEX: 3fff HEX: 1fffff } [ mask ] with map
  29. { 0 -7 -14 } [ shift 128 + 256 /f ] 2map
  30. first3 1 <rgba> ;
  31. : output-categories ( l -- )
  32. { { wrap-margin 500 } { inset { 10 0 } } } swap
  33. categories>> [
  34. [
  35. "\n" append { { font-size 12 } } format
  36. ] each
  37. ] curry with-nesting ;
  38. :: output-programme ( l -- )
  39. { { wrap-margin 500 } { inset { 5 0 } } }
  40. [
  41. l name>> { { font-size 17 } } format
  42. l channel>> " (from " ")" surround
  43. { { font-size 15 } } format
  44. ] with-nesting
  45. nl
  46. { { wrap-margin 500 } { inset { 10 0 } } }
  47. [
  48. l episode>> { { font-size 15 } } format
  49. nl
  50. "Added: " l timeadded>> file-time-string append
  51. { { font-size 15 } } format
  52. ] with-nesting
  53. nl
  54. { { wrap-margin 500 } { inset { 20 6 } } }
  55. [ l description>> { { font-size 14 } } format ] with-nesting
  56. nl
  57. l output-categories ;
  58. : <program-gadget> ( listing -- gadget )
  59. dup [ output-programme ] make-pane
  60. swap programme-colour <solid> >>interior ;
  61. : pl-child-gadgets ( model -- gadgets )
  62. value>> dup empty?
  63. [ drop <noprogrammes-gadget> 1array ]
  64. [ [ 10 0 ] dip kth-page [ <program-gadget> ] map ] if ;
  65. M: programme-list model-changed
  66. [ clear-gadget ] keep swap pl-child-gadgets add-gadgets drop ;