211 lines
4.3 KiB
Go
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()
|
|
}
|