Files
MujicaUI/examples/gallery/pages_messaging_people.go
T

137 lines
4.7 KiB
Go

package main
import (
"fmt"
"slices"
"github.com/egoist/mygo/ui"
mujica "mujicaui"
)
func channelListDemo(c *ui.Context, log func(string)) {
type state struct {
selected string
disabled bool
revision int
groups []mujica.ChannelGroup
}
s := ui.Local(c.Root(), "401", func() state {
return state{groups: []mujica.ChannelGroup{
{ID: "channels", Title: "Channels", Channels: []mujica.Channel{
{ID: "general", Name: "general", Unread: 3}, {ID: "rehearsal", Name: "rehearsal", Pinned: true},
{ID: "random", Name: "random", Unread: 120, Muted: true},
}},
{ID: "direct", Title: "Direct messages", Channels: []mujica.Channel{{ID: "uika", Name: "Uika", Direct: true, Presence: mujica.PresenceOnline}}},
}}
})
mediaCheck(c, log, &s.disabled, "Disabled")
before := s.groups[0].Channels[0]
mediaCheck(c, log, &s.groups[0].Channels[0].Muted, "Mute general")
mediaCheck(c, log, &s.groups[0].Channels[0].Pinned, "Pin general")
if before != s.groups[0].Channels[0] {
s.revision++
}
if mujica.ChannelList(c, &s.selected, s.groups, mujica.ChannelListOptions{Disabled: s.disabled, Revision: s.revision}).Changed() {
log("channel " + s.selected)
}
ui.Text(c, "Selected: "+s.selected)
}
func memberListDemo(c *ui.Context, log func(string)) {
type state struct {
list mujica.MemberListState
disabled, empty bool
members []mujica.Member
}
s := ui.Local(c.Root(), "405", func() state {
return state{members: []mujica.Member{
{ID: "1", Name: "Sakiko", Presence: mujica.PresenceOnline, Role: "Leader"},
{ID: "2", Name: "Uika", Presence: mujica.PresenceBusy, Role: "Vocal"},
{ID: "3", Name: "Mutsumi", Presence: mujica.PresenceAway}, {ID: "4", Name: "Umiri", Presence: mujica.PresenceOffline},
}}
})
mediaCheck(c, log, &s.disabled, "Disabled")
mediaCheck(c, log, &s.empty, "Empty")
if mujica.Button(c, "Toggle Uika presence", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() {
s.members = slices.Clone(s.members)
if s.members[1].Presence == mujica.PresenceOffline {
s.members[1].Presence = mujica.PresenceOnline
} else {
s.members[1].Presence = mujica.PresenceOffline
}
log("Uika presence changed")
}
members := s.members
if s.empty {
members = nil
}
r := mujica.MemberList(c, &s.list, members, mujica.MemberListOptions{Disabled: s.disabled, Height: 240})
if r.Changed() {
log("member " + s.list.Selected)
}
if r.Opened != "" {
log("profile " + r.Opened)
}
}
func userProfileCardDemo(c *ui.Context, log func(string)) {
type state struct {
presence mujica.Presence
actions, disabled bool
}
s := ui.Local(c.Root(), "406", func() state { return state{actions: true, presence: mujica.PresenceOnline} })
mediaCheck(c, log, &s.actions, "Actions")
mediaCheck(c, log, &s.disabled, "Disable actions")
messagingPresence(c, log, &s.presence)
opts := mujica.UserProfileCardOptions{}
if s.actions {
opts.Actions = func() {
for _, action := range []string{"Message", "Call"} {
if mujica.Button(c, action, mujica.ButtonOptions{Disabled: s.disabled}).Clicked() {
log(action)
}
}
}
}
mujica.UserProfileCard(c, mujica.UserProfile{Name: "Sakiko Togawa", Presence: s.presence, Role: "Keyboard", Status: "In rehearsal", About: "Founder of the masquerade."}, opts)
}
func onlineStatusDemo(c *ui.Context, log func(string)) {
type state struct {
presence mujica.Presence
hidden bool
}
s := ui.Local(c.Root(), "407", func() state { return state{presence: mujica.PresenceOnline} })
mediaCheck(c, log, &s.hidden, "Hide text")
messagingPresence(c, log, &s.presence)
mujica.OnlineStatus(c, s.presence, mujica.OnlineStatusOptions{HideText: s.hidden})
inputSection(c, "States", func() {
for p := mujica.PresenceOffline; p <= mujica.PresenceBusy; p++ {
mujica.OnlineStatus(c, p, mujica.OnlineStatusOptions{})
}
})
}
func statusSetterDemo(c *ui.Context, log func(string)) {
type state struct {
status mujica.CustomStatus
disabled bool
}
s := ui.Local(c.Root(), "408", func() state { return state{} })
mediaCheck(c, log, &s.disabled, "Disabled")
if mujica.StatusSetter(c, &s.status, mujica.StatusSetterOptions{Disabled: s.disabled}).Changed() {
log("status changed")
}
ui.Text(c, fmt.Sprintf("Text: %s; expires: %v", s.status.Text, s.status.Until))
}
func messagingPresence(c *ui.Context, log func(string), value *mujica.Presence) {
items := []mujica.SelectOption[mujica.Presence]{
{Value: mujica.PresenceOnline, Label: "Online"}, {Value: mujica.PresenceAway, Label: "Away"},
{Value: mujica.PresenceBusy, Label: "Busy"}, {Value: mujica.PresenceOffline, Label: "Offline"},
}
if mujica.Select(c, value, items, mujica.SelectOptions{Label: "Presence"}).Changed() {
log(fmt.Sprintf("presence %d", *value))
}
}