Path: blob/main/internal/window/quickswitcher/items.go
366 views
package quickswitcher12import (3"context"45"github.com/diamondburned/arikawa/v3/discord"6"github.com/diamondburned/gotk4/pkg/gtk/v4"7"github.com/diamondburned/gotk4/pkg/pango"8"github.com/diamondburned/gotkit/components/onlineimage"9"github.com/diamondburned/gotkit/gtkutil/cssutil"10"github.com/diamondburned/gotkit/gtkutil/imgutil"11"libdb.so/dissent/internal/gtkcord"12"libdb.so/dissent/internal/sidebar/channels"13)1415type indexItem interface {16Row(context.Context) *gtk.ListBoxRow17String() string18}1920type indexItems []indexItem2122func (its indexItems) String(i int) string { return its[i].String() }23func (its indexItems) Len() int { return len(its) }2425type channelItem struct {26*discord.Channel27guild *discord.Guild28name string29search string30}3132// TODO: move this to gtkcord33var threadTypes = map[discord.ChannelType]bool{34discord.GuildAnnouncementThread: true,35discord.GuildPublicThread: true,36discord.GuildPrivateThread: true,37}3839var voiceTypes = map[discord.ChannelType]bool{40discord.GuildVoice: true,41discord.GuildStageVoice: true,42}4344func newChannelItem(state *gtkcord.State, guild *discord.Guild, ch *discord.Channel) channelItem {45item := channelItem{46Channel: ch,47guild: guild,48}4950if ch.Name != "" {51item.name = ch.Name52} else {53item.name = gtkcord.RecipientNames(ch)54}5556if threadTypes[ch.Type] {57parent, _ := state.Cabinet.Channel(ch.ParentID)58if parent != nil {59item.name = parent.Name + " › #" + item.name60}61}6263if item.guild != nil {64item.search = item.guild.Name + " " + item.name65} else {66item.search = item.name67}6869return item70}7172func (it channelItem) String() string { return it.search }7374var channelCSS = cssutil.Applier("quickswitcher-channel", `75.quickswitcher-channel-icon {76margin: 2px 8px;77min-width: {$inline_emoji_size};78min-height: {$inline_emoji_size};79}80.quickswitcher-channel-hash {81padding: 0px;82}83.quickswitcher-channel-image {84margin-right: 12px;85}86.quickswitcher-channel-guildname {87font-size: 0.85em;88color: alpha(@theme_fg_color, 0.75);89margin: 4px;90margin-left: 18px;91margin-bottom: calc(4px - 0.1em);92}93`)9495func (it channelItem) Row(ctx context.Context) *gtk.ListBoxRow {96tooltip := it.name97if it.guild != nil {98tooltip += " (" + it.guild.Name + ")"99}100101box := gtk.NewBox(gtk.OrientationHorizontal, 0)102103row := gtk.NewListBoxRow()104row.SetTooltipText(tooltip)105row.SetChild(box)106channelCSS(row)107108switch it.Type {109case discord.DirectMessage, discord.GroupDM:110icon := onlineimage.NewAvatar(ctx, imgutil.HTTPProvider, gtkcord.InlineEmojiSize)111icon.AddCSSClass("quickswitcher-channel-icon")112icon.AddCSSClass("quickswitcher-channel-image")113icon.SetHAlign(gtk.AlignCenter)114icon.SetText(it.name)115if len(it.DMRecipients) == 1 {116icon.SetFromURL(gtkcord.InjectAvatarSize(it.DMRecipients[0].AvatarURL()))117}118119anim := icon.EnableAnimation()120anim.ConnectMotion(row) // TODO: I wonder if this causes memory leaks.121122box.Append(icon)123default:124icon := channels.NewChannelIcon(it.Channel, func(t discord.ChannelType) (string, bool) {125_, isThread := threadTypes[t]126return "thread-branch-symbolic", isThread127})128129icon.AddCSSClass("quickswitcher-channel-icon")130icon.AddCSSClass("quickswitcher-channel-hash")131icon.SetHAlign(gtk.AlignCenter)132133box.Append(icon)134}135136name := gtk.NewLabel(it.name)137name.AddCSSClass("quickswitcher-channel-name")138name.SetHExpand(true)139name.SetXAlign(0)140name.SetEllipsize(pango.EllipsizeEnd)141142box.Append(name)143144if it.guild != nil {145guildName := gtk.NewLabel(it.guild.Name)146guildName.AddCSSClass("quickswitcher-channel-guildname")147guildName.SetEllipsize(pango.EllipsizeEnd)148149box.Append(guildName)150}151152return row153}154155type guildItem struct {156*discord.Guild157}158159func newGuildItem(guild *discord.Guild) guildItem {160return guildItem{161Guild: guild,162}163}164165func (it guildItem) String() string { return it.Name }166167var guildCSS = cssutil.Applier("quickswitcher-guild", `168.quickswitcher-guild-icon {169margin: 2px 8px;170min-width: {$inline_emoji_size};171min-height: {$inline_emoji_size};172}173`)174175func (it guildItem) Row(ctx context.Context) *gtk.ListBoxRow {176row := gtk.NewListBoxRow()177guildCSS(row)178179icon := onlineimage.NewAvatar(ctx, imgutil.HTTPProvider, gtkcord.InlineEmojiSize)180icon.AddCSSClass("quickswitcher-guild-icon")181icon.SetText(it.Name)182icon.SetFromURL(it.IconURL())183icon.SetHAlign(gtk.AlignCenter)184185anim := icon.EnableAnimation()186anim.ConnectMotion(row)187188name := gtk.NewLabel(it.Name)189name.AddCSSClass("quickswitcher-guild-name")190name.SetHExpand(true)191name.SetXAlign(0)192193box := gtk.NewBox(gtk.OrientationHorizontal, 0)194box.Append(icon)195box.Append(name)196197row.SetChild(box)198return row199}200201202