优化2
This commit is contained in:
+65
-15
@@ -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() {}
|
||||
|
||||
Reference in New Issue
Block a user