202 lines
4.3 KiB
Go
202 lines
4.3 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"slices"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/gotk3/gotk3/gtk"
|
|
"varia.zone/hui/internal/bldr"
|
|
"varia.zone/hui/internal/conf"
|
|
"varia.zone/hui/internal/model"
|
|
)
|
|
|
|
// SetHeaderBarSubtitle sets the header bar subtitle.
|
|
func SetHeaderBarSubtitle(m *model.Model, siteName string) error {
|
|
headerBar, err := bldr.GetHeaderBar(m.Builder, conf.HeaderBar)
|
|
if err != nil {
|
|
return fmt.Errorf("SetHeaderBarSubtitle: unable to retrieve '%s': %s", conf.HeaderBar, err)
|
|
}
|
|
|
|
headerBar.SetSubtitle(siteName)
|
|
|
|
return nil
|
|
}
|
|
|
|
// getSiteButtons retrieves the site related header bar buttons.
|
|
func getSiteButtons(m *model.Model) (*gtk.Box, *gtk.Button, error) {
|
|
box, err := bldr.GetBox(m.Builder, conf.OpenSiteBox)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
btn, err := bldr.GetButton(m.Builder, conf.CreateSiteButton)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
return box, btn, nil
|
|
}
|
|
|
|
// ShowSiteButtons shows site related buttons.
|
|
func ShowSiteButtons(m *model.Model) error {
|
|
box, btn, err := getSiteButtons(m)
|
|
if err != nil {
|
|
return fmt.Errorf("ShowSiteButtons: %s", err)
|
|
}
|
|
|
|
box.Show()
|
|
btn.Show()
|
|
|
|
return nil
|
|
}
|
|
|
|
// HideSiteButtons shows site related buttons.
|
|
func HideSiteButtons(m *model.Model) error {
|
|
box, btn, err := getSiteButtons(m)
|
|
if err != nil {
|
|
return fmt.Errorf("HideSiteButtons: %s", err)
|
|
}
|
|
|
|
box.Hide()
|
|
btn.Hide()
|
|
|
|
return nil
|
|
}
|
|
|
|
func getContentButtons(m *model.Model) (*gtk.Separator, []*gtk.Button, error) {
|
|
sep, err := bldr.GetSeparator(m.Builder, conf.HeaderBarSeparator)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
var btns []*gtk.Button
|
|
for _, name := range []string{conf.CreatePostButton, conf.PreviewButton} {
|
|
btn, err := bldr.GetButton(m.Builder, name)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
btns = append(btns, btn)
|
|
}
|
|
|
|
return sep, btns, err
|
|
}
|
|
|
|
// ShowContentButtons shows content related buttons.
|
|
func ShowContentButtons(m *model.Model) error {
|
|
sep, btns, err := getContentButtons(m)
|
|
if err != nil {
|
|
return fmt.Errorf("HideContentButtons: %s", err)
|
|
}
|
|
|
|
sep.Show()
|
|
|
|
for _, btn := range btns {
|
|
btn.Show()
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// HideContentButtons shows content related buttons.
|
|
func HideContentButtons(m *model.Model) error {
|
|
sep, btns, err := getContentButtons(m)
|
|
if err != nil {
|
|
return fmt.Errorf("HideContentButtons: %s", err)
|
|
}
|
|
|
|
sep.Hide()
|
|
|
|
for _, btn := range btns {
|
|
btn.Hide()
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// OpenMenuChoice responds to a clicked "existing menu" selection.
|
|
func OpenMenuChoice(m *model.Model, menuItem *gtk.MenuItem) error {
|
|
label := menuItem.GetLabel()
|
|
splitLabel := strings.Split(label, " ")
|
|
siteName := strings.TrimSpace(splitLabel[len(splitLabel)-1])
|
|
|
|
m.CurrentSite = siteName
|
|
|
|
if err := SetHeaderBarSubtitle(m, m.CurrentSite); err != nil {
|
|
return fmt.Errorf("OpenMenuChoice: unable to set header bar subtitle: %s", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// gatherSiteNames gathers the site names from disk.
|
|
func gatherSiteNames(m *model.Model) error {
|
|
sitesDir := conf.SitesDir(m.User.HomeDir)
|
|
|
|
entries, err := os.ReadDir(sitesDir)
|
|
if err != nil {
|
|
return fmt.Errorf("gatherSiteNames: unable to read '%s'", sitesDir)
|
|
}
|
|
|
|
for _, entry := range entries {
|
|
siteName := entry.Name()
|
|
if !slices.Contains(m.SiteNames, siteName) {
|
|
m.SiteNames = append(m.SiteNames, siteName)
|
|
}
|
|
}
|
|
|
|
sort.Strings(m.SiteNames)
|
|
|
|
return err
|
|
}
|
|
|
|
// PopulateOpenSiteMenu populates the open site menu with site names.
|
|
func PopulateOpenSiteMenu(m *model.Model) error {
|
|
menu, err := bldr.GetMenu(m.Builder, conf.OpenSiteMenu)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var forEachErr error
|
|
menu.GetChildren().Foreach(func(o interface{}) {
|
|
menuItem, ok := o.(*gtk.Widget)
|
|
if !ok {
|
|
forEachErr = fmt.Errorf("PopulateOpenSiteMenu: unable to retrieve MenuItem")
|
|
return
|
|
}
|
|
menu.Remove(menuItem)
|
|
})
|
|
if forEachErr != nil {
|
|
return err
|
|
}
|
|
|
|
if err := gatherSiteNames(m); err != nil {
|
|
return err
|
|
}
|
|
|
|
for idx, siteName := range m.SiteNames {
|
|
menuItem, err := gtk.MenuItemNew()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
menuItem.SetLabel(fmt.Sprintf("%d. %s", idx, siteName))
|
|
menuItem.ShowAll()
|
|
|
|
menu.Append(menuItem)
|
|
|
|
menuItem.Connect("activate", func() {
|
|
if err := OpenMenuChoice(m, menuItem); err != nil {
|
|
if err := ShowErrDialog(m, err); err != nil {
|
|
log.Fatal(fmt.Errorf("PopulateOpenSiteMenu: unable to show error dialog: %s", err))
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
return nil
|
|
}
|