util.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package ui
  2. import (
  3. "strings"
  4. "github.com/ayn2op/discordo/internal/config"
  5. "github.com/ayn2op/tview"
  6. "github.com/diamondburned/arikawa/v3/discord"
  7. )
  8. // ConfigureBox configures the provided box according to the provided theme.
  9. func ConfigureBox(box *tview.Box, cfg *config.Theme) *tview.Box {
  10. border := cfg.Border
  11. normalBorderStyle, activeBorderStyle := border.NormalStyle.Style, border.ActiveStyle.Style
  12. normalBorderSet, activeBorderSet := border.NormalSet.BorderSet, border.ActiveSet.BorderSet
  13. title := cfg.Title
  14. normalTitleStyle, activeTitleStyle := title.NormalStyle.Style, title.ActiveStyle.Style
  15. footer := cfg.Footer
  16. normalFooterStyle, activeFooterStyle := footer.NormalStyle.Style, footer.ActiveStyle.Style
  17. padding := border.Padding
  18. box.
  19. SetBorderStyle(normalBorderStyle).
  20. SetBorderSet(normalBorderSet).
  21. SetBorderPadding(padding[0], padding[1], padding[2], padding[3]).
  22. SetTitleStyle(normalTitleStyle).
  23. SetTitleAlignment(title.Alignment.Alignment).
  24. SetFooterStyle(normalFooterStyle).
  25. SetFooterAlignment(footer.Alignment.Alignment).
  26. SetBlurFunc(func() {
  27. box.
  28. SetBorderStyle(normalBorderStyle).
  29. SetBorderSet(normalBorderSet)
  30. box.SetTitleStyle(normalTitleStyle).SetFooterStyle(normalFooterStyle)
  31. }).
  32. SetFocusFunc(func() {
  33. box.
  34. SetBorderStyle(activeBorderStyle).
  35. SetBorderSet(activeBorderSet)
  36. box.SetTitleStyle(activeTitleStyle).SetFooterStyle(activeFooterStyle)
  37. })
  38. if border.Enabled {
  39. box.SetBorders(tview.BordersAll)
  40. }
  41. return box
  42. }
  43. // Centered creates a new grid with provided primitive aligned in the center.
  44. func Centered(p tview.Primitive, width, height int) tview.Primitive {
  45. return tview.NewGrid().
  46. SetColumns(0, width, 0).
  47. SetRows(0, height, 0).
  48. AddItem(p, 1, 1, 1, 1, 0, 0, true)
  49. }
  50. func ChannelToString(channel discord.Channel, icons config.Icons) string {
  51. var icon string
  52. switch channel.Type {
  53. case discord.DirectMessage, discord.GroupDM:
  54. if channel.Name != "" {
  55. return channel.Name
  56. }
  57. recipients := make([]string, len(channel.DMRecipients))
  58. for i, r := range channel.DMRecipients {
  59. recipients[i] = r.DisplayOrUsername()
  60. }
  61. return strings.Join(recipients, ", ")
  62. case discord.GuildCategory:
  63. icon = icons.GuildCategory
  64. case discord.GuildText:
  65. icon = icons.GuildText
  66. case discord.GuildVoice:
  67. icon = icons.GuildVoice
  68. case discord.GuildStageVoice:
  69. icon = icons.GuildStageVoice
  70. case discord.GuildAnnouncementThread:
  71. icon = icons.GuildAnnouncementThread
  72. case discord.GuildPublicThread:
  73. icon = icons.GuildPublicThread
  74. case discord.GuildPrivateThread:
  75. icon = icons.GuildPrivateThread
  76. case discord.GuildAnnouncement:
  77. icon = icons.GuildAnnouncement
  78. case discord.GuildForum:
  79. icon = icons.GuildForum
  80. case discord.GuildStore:
  81. icon = icons.GuildStore
  82. }
  83. return icon + channel.Name
  84. }