WIP components (as built)
This commit is contained in:
70 files changed
+2610
-235
No files matched your search
+16
-15
@@ -2,13 +2,14 @@ package mujica
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
|
||||
"github.com/egoist/mygo/ui"
|
||||
|
||||
"mujicaui/theme"
|
||||
)
|
||||
|
||||
// OpenResult is a list's element and the 1-based item the user opened this frame.
|
||||
// OpenResult carries the list and opened 1-based source number.
|
||||
type OpenResult struct {
|
||||
Element *ui.Element
|
||||
opened int
|
||||
@@ -17,7 +18,7 @@ type OpenResult struct {
|
||||
// Opened returns the number of the source opened.
|
||||
func (r OpenResult) Opened() (int, bool) { return r.opened, r.opened > 0 }
|
||||
|
||||
// SourcesPanel lists sources in citation order, numbered from 1; the Active one scrolls into view.
|
||||
// SourcesPanel lists citations and scrolls to activated sources.
|
||||
// It grows to fill its container, which needs a height.
|
||||
func SourcesPanel(c *ui.Context, sources []Source, st *CitationState) OpenResult {
|
||||
if st == nil || st.Active < 0 || st.Active > len(sources) {
|
||||
@@ -28,6 +29,12 @@ func SourcesPanel(c *ui.Context, sources []Source, st *CitationState) OpenResult
|
||||
var r OpenResult
|
||||
r.Element = ui.Column(c).Gap(u * 2).Grow(1).MinHeight(0).Role(ui.RoleList).Label(msg(c, "sources_panel.label"))
|
||||
shown := ui.Local(r.Element, "active", func() int { return 0 })
|
||||
located := ui.Local(r.Element, "locate", func() uint64 { return 0 })
|
||||
list := ui.Local(r.Element, "list", func() ui.ListState { return ui.ListState{} })
|
||||
if st.Active > 0 && (*shown != st.Active || *located != st.locate) {
|
||||
list.ScrollIntoView(st.Active - 1)
|
||||
slog.Debug("mujica: sources_panel locate", "source", st.Active)
|
||||
}
|
||||
r.Element.Children(func() {
|
||||
ui.Text(c, fmt.Sprintf("%s (%d)", msg(c, "sources_panel.label"), len(sources))).Font(theme.SerifFont).
|
||||
FontSize(FontSize(c, theme.H3Size)).FontWeight(600)
|
||||
@@ -35,20 +42,14 @@ func SourcesPanel(c *ui.Context, sources []Source, st *CitationState) OpenResult
|
||||
ui.Text(c, msg(c, "sources_panel.empty")).TextColor(k.TextMuted)
|
||||
return
|
||||
}
|
||||
ui.Scroll(c).Grow(1).MinHeight(0).Children(func() {
|
||||
ui.Column(c).Gap(u * 2).Children(func() {
|
||||
for i, src := range sources {
|
||||
card := SourceCard(c, i+1, src, st).Role(ui.RoleListItem)
|
||||
if card.Clicked() && !card.IsDisabled() {
|
||||
r.opened = i + 1
|
||||
}
|
||||
if st.Active == i+1 && *shown != st.Active {
|
||||
card.ScrollIntoView()
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
ui.List(c, list, len(sources), func(i int) {
|
||||
card := SourceCard(c, i+1, sources[i], st).MinHeight(Density(c).ControlHeight()).Role(ui.RoleListItem)
|
||||
if card.Clicked() && !card.IsDisabled() {
|
||||
r.opened = i + 1
|
||||
}
|
||||
}).Grow(1).MinHeight(0).Gap(u * 2)
|
||||
})
|
||||
*shown = st.Active
|
||||
*located = st.locate
|
||||
return r
|
||||
}
|
||||
Reference in new issue
Block a user