TabManager.coffee 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. define [
  2. "libs/mustache"
  3. ], () ->
  4. class TabManager
  5. templates:
  6. tab: $("#tabTemplate").html()
  7. content: $("#tabContentTemplate").html()
  8. constructor: () ->
  9. @locked_open = false
  10. @locked_closed = false
  11. @state = "closed"
  12. $("#toolbar").on "mouseenter", () => @onMouseOver()
  13. $("#toolbar").on "mouseleave", (e) => @onMouseOut(e)
  14. @tabs = []
  15. addTab: (options) ->
  16. @tabs.push options
  17. options.show ||= options.id
  18. tabEl = $(Mustache.to_html @templates.tab, options)
  19. tabEl.find("a").attr("href", "#" + options.show)
  20. if options.content?
  21. contentEl = $(Mustache.to_html @templates.content, options)
  22. contentEl.append(options.content)
  23. $("#tab-content").append(contentEl)
  24. if options.active
  25. tabEl.addClass("active")
  26. contentEl?.addClass("active")
  27. if options.after?
  28. tabEl.insertAfter($("##{options.after}-tab-li"))
  29. else
  30. $("#tabs").append(tabEl)
  31. $("body").scrollTop(0)
  32. tabEl.on "shown", () =>
  33. $("body").scrollTop(0)
  34. options.onShown() if options.onShown?
  35. for other_tab in @tabs
  36. if other_tab.id != options.id and other_tab.active and other_tab.onHidden?
  37. other_tab.onHidden()
  38. other_tab.active = false
  39. options.active = true
  40. if options.lock
  41. @lockOpen()
  42. else
  43. @unlockOpen()
  44. if options.contract
  45. @contract()
  46. show: (tab) ->
  47. $("##{tab}-tab-li > a").tab("show")
  48. lockOpen: () ->
  49. @locked_open = true
  50. $("#toolbar").css({
  51. width: 180
  52. })
  53. unlockOpen: () ->
  54. @locked_open = false
  55. contract: () ->
  56. $("#toolbar").css({
  57. width: 40
  58. })
  59. # cooldown so we don't immediately reopen
  60. original_locked_closed = @locked_closed
  61. @locked_closed = true
  62. setTimeout () =>
  63. @locked_closed = original_locked_closed
  64. , 200
  65. onMouseOver: () ->
  66. if !@locked_closed and @state == "closed"
  67. @openMenu()
  68. onMouseOut: (e) ->
  69. @cancelOpen()
  70. if !@locked_open and @state == "open"
  71. @closeMenu()
  72. cancelOpen: () ->
  73. if @openTimeout
  74. clearTimeout @openTimeout
  75. @state = "closed"
  76. openMenu: () ->
  77. @openTimeout = setTimeout () =>
  78. @state = "open"
  79. $("#toolbar").animate({
  80. width: 180
  81. }, "fast")
  82. delete @openTimeout
  83. , 500
  84. closeMenu: () ->
  85. @state = "closed"
  86. $("#toolbar").animate({
  87. width: 40
  88. }, "fast")