MobileMkch/ui/manager.go
2025-08-05 13:45:18 +03:00

211 lines
4.3 KiB
Go

package ui
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"MobileMkch/api"
"MobileMkch/models"
)
type UIManager struct {
app fyne.App
window fyne.Window
apiClient *api.Client
navigationStack []Screen
currentScreen Screen
mainContainer *fyne.Container
headerBar *fyne.Container
content *fyne.Container
isDarkTheme bool
}
type Screen interface {
GetContent() fyne.CanvasObject
GetTitle() string
OnShow()
OnHide()
}
func NewUIManager(app fyne.App, window fyne.Window, apiClient *api.Client) *UIManager {
manager := &UIManager{
app: app,
window: window,
apiClient: apiClient,
navigationStack: make([]Screen, 0),
content: container.NewMax(),
isDarkTheme: true, // По умолчанию темная тема
}
manager.setupHeader()
manager.setupMainContainer()
boardsScreen := NewBoardsScreen(manager)
manager.ShowScreen(boardsScreen)
return manager
}
func (ui *UIManager) setupHeader() {
titleLabel := widget.NewLabel("MobileMkch")
titleLabel.TextStyle = fyne.TextStyle{Bold: true}
backButton := widget.NewButton("← Назад", func() {
ui.GoBack()
})
backButton.Hide()
refreshButton := widget.NewButton("🔄", func() {
if ui.currentScreen != nil {
ui.currentScreen.OnShow()
}
})
themeButton := widget.NewButton("🌙", func() {
ui.toggleTheme()
})
rightButtons := container.NewHBox(refreshButton, themeButton)
ui.headerBar = container.NewHBox(
backButton,
titleLabel,
rightButtons,
)
}
func (ui *UIManager) setupMainContainer() {
ui.mainContainer = container.NewBorder(
ui.headerBar,
nil,
nil,
nil,
ui.content,
)
}
func (ui *UIManager) GetMainContent() fyne.CanvasObject {
return ui.mainContainer
}
func (ui *UIManager) ShowScreen(screen Screen) {
if ui.currentScreen != nil {
ui.currentScreen.OnHide()
}
ui.navigationStack = append(ui.navigationStack, screen)
ui.currentScreen = screen
ui.content.RemoveAll()
ui.content.Add(screen.GetContent())
ui.content.Refresh()
ui.updateHeader(screen.GetTitle())
screen.OnShow()
}
func (ui *UIManager) GoBack() {
if len(ui.navigationStack) <= 1 {
return
}
if ui.currentScreen != nil {
ui.currentScreen.OnHide()
}
ui.navigationStack = ui.navigationStack[:len(ui.navigationStack)-1]
ui.currentScreen = ui.navigationStack[len(ui.navigationStack)-1]
ui.content.RemoveAll()
ui.content.Add(ui.currentScreen.GetContent())
ui.content.Refresh()
ui.updateHeader(ui.currentScreen.GetTitle())
ui.currentScreen.OnShow()
}
func (ui *UIManager) toggleTheme() {
ui.isDarkTheme = !ui.isDarkTheme
if ui.isDarkTheme {
ui.app.Settings().SetTheme(theme.DarkTheme())
} else {
ui.app.Settings().SetTheme(theme.LightTheme())
}
ui.window.Canvas().Refresh(ui.window.Canvas().Content())
}
func (ui *UIManager) updateHeader(title string) {
ui.window.SetTitle(title)
if len(ui.headerBar.Objects) > 0 {
if backBtn, ok := ui.headerBar.Objects[0].(*widget.Button); ok {
if len(ui.navigationStack) > 1 {
backBtn.Show()
} else {
backBtn.Hide()
}
}
}
ui.headerBar.Refresh()
}
func (ui *UIManager) ShowBoardThreads(board *models.Board) {
threadsScreen := NewThreadsScreen(ui, board)
ui.ShowScreen(threadsScreen)
}
func (ui *UIManager) ShowThreadDetail(board *models.Board, thread *models.Thread) {
threadScreen := NewThreadDetailScreen(ui, board, thread)
ui.ShowScreen(threadScreen)
}
func (ui *UIManager) GetAPIClient() *api.Client {
return ui.apiClient
}
func (ui *UIManager) GetWindow() fyne.Window {
return ui.window
}
func (ui *UIManager) ShowError(title, message string) {
dialog := widget.NewModalPopUp(
container.NewVBox(
widget.NewLabel(title),
widget.NewLabel(""),
widget.NewLabel(message),
widget.NewLabel(""),
widget.NewButton("OK", func() {
// Закрыть диалог - пока что просто прячем popup
}),
),
ui.window.Canvas(),
)
dialog.Show()
}
func (ui *UIManager) ShowInfo(title, message string) {
dialog := widget.NewModalPopUp(
container.NewVBox(
widget.NewLabel(title),
widget.NewLabel(""),
widget.NewLabel(message),
widget.NewLabel(""),
widget.NewButton("OK", func() {
// Закрыть диалог
}),
),
ui.window.Canvas(),
)
dialog.Show()
}