This commit is contained in:
yml2213
2026-07-23 13:28:14 +08:00
parent 08346a7d5c
commit d0efcedcc5
+65 -15
View File
@@ -2,7 +2,9 @@ package app
import (
"context"
"encoding/json"
"fmt"
"image/color"
"io"
"os"
"strings"
@@ -12,6 +14,7 @@ import (
fyneapp "fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"updata_hfb/internal/hfb"
@@ -66,13 +69,13 @@ func Run() {
dataEntry.SetMinRowsVisible(14)
dataEntry.SetPlaceHolder(sampleText)
resultView := widget.NewRichTextWithText("")
resultView.Wrapping = fyne.TextWrapWord
resultView := newResultPanel(420)
resultView.SetText("```text\n暂无结果\n点击“预览 JSON”或“上传”后,这里会显示多行结果。\n```")
statusLabel := widget.NewLabel("准备就绪")
setResult := func(text string) {
resultView.ParseMarkdown("```json\n" + strings.TrimSpace(text) + "\n```")
resultView.SetText(formatResultText(text))
}
setBusy := func(uploadBtn *widget.Button, previewBtn *widget.Button, busy bool) {
if busy {
@@ -195,7 +198,7 @@ func Run() {
widget.NewLabel("账号数据"),
dataEntry,
widget.NewLabel("结果"),
newMinHeightScroll(resultView, 420),
resultView,
)),
)
@@ -240,29 +243,76 @@ func prefStringWithFallback(prefs fyne.Preferences, key, fallback string) string
return fallback
}
type minHeightScroll struct {
func formatResultText(text string) string {
text = strings.TrimSpace(text)
if text == "" {
return "暂无结果"
}
var payload any
if err := json.Unmarshal([]byte(text), &payload); err == nil {
if pretty, err := json.MarshalIndent(payload, "", " "); err == nil {
return "```json\n" + string(pretty) + "\n```"
}
}
return "```text\n" + text + "\n```"
}
type resultPanel struct {
widget.BaseWidget
scroll fyne.CanvasObject
scroll *container.Scroll
content *widget.RichText
minHeight float32
}
func newMinHeightScroll(content fyne.CanvasObject, minHeight float32) *minHeightScroll {
panel := &minHeightScroll{
scroll: container.NewVScroll(content),
func newResultPanel(minHeight float32) *resultPanel {
panel := &resultPanel{
content: widget.NewRichTextFromMarkdown(""),
minHeight: minHeight,
}
panel.scroll = container.NewVScroll(panel.content)
panel.ExtendBaseWidget(panel)
return panel
}
func (p *minHeightScroll) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(p.scroll)
func (p *resultPanel) SetText(text string) {
p.content.ParseMarkdown(text)
p.Refresh()
}
func (p *minHeightScroll) MinSize() fyne.Size {
size := p.scroll.MinSize()
if size.Height < p.minHeight {
size.Height = p.minHeight
func (p *resultPanel) CreateRenderer() fyne.WidgetRenderer {
return &resultPanelRenderer{panel: p}
}
type resultPanelRenderer struct {
panel *resultPanel
}
func (r *resultPanelRenderer) Layout(size fyne.Size) {
r.panel.scroll.Resize(size)
r.panel.scroll.Move(fyne.NewPos(0, 0))
}
func (r *resultPanelRenderer) MinSize() fyne.Size {
size := r.panel.scroll.MinSize()
if size.Height < r.panel.minHeight {
size.Height = r.panel.minHeight
}
if size.Width < 1 {
size.Width = 1
}
return size
}
func (r *resultPanelRenderer) Refresh() {
r.panel.scroll.Refresh()
}
func (r *resultPanelRenderer) BackgroundColor() color.Color {
return theme.Color(theme.ColorNameBackground)
}
func (r *resultPanelRenderer) Objects() []fyne.CanvasObject {
return []fyne.CanvasObject{r.panel.scroll}
}
func (r *resultPanelRenderer) Destroy() {}