162 lines
3.2 KiB
Go
162 lines
3.2 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/widget"
|
|
|
|
"MobileMkch/models"
|
|
)
|
|
|
|
type BoardsScreen struct {
|
|
uiManager *UIManager
|
|
content *fyne.Container
|
|
boards []models.Board
|
|
loading bool
|
|
}
|
|
|
|
func NewBoardsScreen(uiManager *UIManager) *BoardsScreen {
|
|
screen := &BoardsScreen{
|
|
uiManager: uiManager,
|
|
loading: false,
|
|
}
|
|
|
|
screen.setupContent()
|
|
return screen
|
|
}
|
|
|
|
func (bs *BoardsScreen) setupContent() {
|
|
bs.content = container.NewVBox()
|
|
|
|
header := widget.NewLabel("Выберите доску:")
|
|
header.TextStyle = fyne.TextStyle{Bold: true}
|
|
bs.content.Add(header)
|
|
|
|
bs.content.Add(widget.NewLabel("Загрузка досок..."))
|
|
|
|
}
|
|
|
|
func (bs *BoardsScreen) GetContent() fyne.CanvasObject {
|
|
return bs.content
|
|
}
|
|
|
|
func (bs *BoardsScreen) GetTitle() string {
|
|
return "MobileMkch - Доски"
|
|
}
|
|
|
|
func (bs *BoardsScreen) OnShow() {
|
|
if !bs.loading {
|
|
bs.loadBoards()
|
|
}
|
|
}
|
|
|
|
func (bs *BoardsScreen) OnHide() {
|
|
// Ничего не делаем
|
|
}
|
|
|
|
func (bs *BoardsScreen) loadBoards() {
|
|
bs.loading = true
|
|
bs.showLoading()
|
|
go func() {
|
|
defer func() {
|
|
bs.loading = false
|
|
}()
|
|
|
|
boards, err := bs.uiManager.GetAPIClient().GetBoards()
|
|
if err != nil {
|
|
log.Printf("Ошибка загрузки досок: %v", err)
|
|
fyne.Do(func() {
|
|
bs.showError(fmt.Sprintf("Ошибка загрузки досок:\n%v", err))
|
|
})
|
|
return
|
|
}
|
|
|
|
bs.boards = boards
|
|
|
|
fyne.Do(func() {
|
|
bs.displayBoards()
|
|
})
|
|
}()
|
|
}
|
|
|
|
func (bs *BoardsScreen) showLoading() {
|
|
bs.content.RemoveAll()
|
|
|
|
header := widget.NewLabel("Доски mkch")
|
|
header.TextStyle = fyne.TextStyle{Bold: true}
|
|
bs.content.Add(header)
|
|
|
|
progressBar := widget.NewProgressBarInfinite()
|
|
bs.content.Add(progressBar)
|
|
progressBar.Start()
|
|
|
|
bs.content.Add(widget.NewLabel("Загрузка досок..."))
|
|
|
|
bs.content.Refresh()
|
|
}
|
|
|
|
func (bs *BoardsScreen) showError(message string) {
|
|
bs.content.RemoveAll()
|
|
|
|
header := widget.NewLabel("Доски mkch")
|
|
header.TextStyle = fyne.TextStyle{Bold: true}
|
|
bs.content.Add(header)
|
|
|
|
errorLabel := widget.NewLabel("❌ " + message)
|
|
errorLabel.Wrapping = fyne.TextWrapWord
|
|
bs.content.Add(errorLabel)
|
|
|
|
retryButton := widget.NewButton("Повторить", func() {
|
|
bs.loadBoards()
|
|
})
|
|
bs.content.Add(retryButton)
|
|
|
|
bs.content.Refresh()
|
|
}
|
|
|
|
func (bs *BoardsScreen) displayBoards() {
|
|
bs.content.RemoveAll()
|
|
|
|
header := widget.NewLabel("Доски mkch")
|
|
header.TextStyle = fyne.TextStyle{Bold: true}
|
|
bs.content.Add(header)
|
|
|
|
if len(bs.boards) == 0 {
|
|
emptyLabel := widget.NewLabel("Досок не найдено")
|
|
bs.content.Add(emptyLabel)
|
|
bs.content.Refresh()
|
|
return
|
|
}
|
|
|
|
for i := range bs.boards {
|
|
board := bs.boards[i]
|
|
|
|
boardButton := bs.createBoardCard(&board)
|
|
bs.content.Add(boardButton)
|
|
}
|
|
|
|
bs.content.Refresh()
|
|
}
|
|
|
|
func (bs *BoardsScreen) createBoardCard(board *models.Board) fyne.CanvasObject {
|
|
title := fmt.Sprintf("/%s/", board.Code)
|
|
|
|
description := board.Description
|
|
if description == "" {
|
|
description = "Без описания"
|
|
}
|
|
|
|
button := widget.NewButton(fmt.Sprintf("%s\n%s", title, description), func() {
|
|
bs.uiManager.ShowBoardThreads(board)
|
|
})
|
|
|
|
return button
|
|
}
|
|
|
|
func (bs *BoardsScreen) RefreshBoards() {
|
|
bs.loadBoards()
|
|
}
|