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 ( import (
"context" "context"
"encoding/json"
"fmt" "fmt"
"image/color"
"io" "io"
"os" "os"
"strings" "strings"
@@ -12,6 +14,7 @@ import (
fyneapp "fyne.io/fyne/v2/app" fyneapp "fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"updata_hfb/internal/hfb" "updata_hfb/internal/hfb"
@@ -66,13 +69,13 @@ func Run() {
dataEntry.SetMinRowsVisible(14) dataEntry.SetMinRowsVisible(14)
dataEntry.SetPlaceHolder(sampleText) dataEntry.SetPlaceHolder(sampleText)
resultView := widget.NewRichTextWithText("") resultView := newResultPanel(420)
resultView.Wrapping = fyne.TextWrapWord resultView.SetText("```text\n暂无结果\n点击“预览 JSON”或“上传”后,这里会显示多行结果。\n```")
statusLabel := widget.NewLabel("准备就绪") statusLabel := widget.NewLabel("准备就绪")
setResult := func(text string) { 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) { setBusy := func(uploadBtn *widget.Button, previewBtn *widget.Button, busy bool) {
if busy { if busy {
@@ -195,7 +198,7 @@ func Run() {
widget.NewLabel("账号数据"), widget.NewLabel("账号数据"),
dataEntry, dataEntry,
widget.NewLabel("结果"), widget.NewLabel("结果"),
newMinHeightScroll(resultView, 420), resultView,
)), )),
) )
@@ -240,29 +243,76 @@ func prefStringWithFallback(prefs fyne.Preferences, key, fallback string) string
return fallback 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 widget.BaseWidget
scroll fyne.CanvasObject scroll *container.Scroll
content *widget.RichText
minHeight float32 minHeight float32
} }
func newMinHeightScroll(content fyne.CanvasObject, minHeight float32) *minHeightScroll { func newResultPanel(minHeight float32) *resultPanel {
panel := &minHeightScroll{ panel := &resultPanel{
scroll: container.NewVScroll(content), content: widget.NewRichTextFromMarkdown(""),
minHeight: minHeight, minHeight: minHeight,
} }
panel.scroll = container.NewVScroll(panel.content)
panel.ExtendBaseWidget(panel) panel.ExtendBaseWidget(panel)
return panel return panel
} }
func (p *minHeightScroll) CreateRenderer() fyne.WidgetRenderer { func (p *resultPanel) SetText(text string) {
return widget.NewSimpleRenderer(p.scroll) p.content.ParseMarkdown(text)
p.Refresh()
} }
func (p *minHeightScroll) MinSize() fyne.Size { func (p *resultPanel) CreateRenderer() fyne.WidgetRenderer {
size := p.scroll.MinSize() return &resultPanelRenderer{panel: p}
if size.Height < p.minHeight { }
size.Height = p.minHeight
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 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() {}