From d0efcedcc5e995125e171bd5d7180f93549dea3f Mon Sep 17 00:00:00 2001 From: yml2213 Date: Thu, 23 Jul 2026 13:28:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=962?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/app/gui.go | 80 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/internal/app/gui.go b/internal/app/gui.go index 190529c..d026c83 100644 --- a/internal/app/gui.go +++ b/internal/app/gui.go @@ -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() {}