MobileMkch/ui/settings_screen.go

262 lines
8.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package ui
import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
"MobileMkch/cache"
)
type SettingsScreen struct {
uiManager *UIManager
content *fyne.Container
}
func NewSettingsScreen(uiManager *UIManager) *SettingsScreen {
screen := &SettingsScreen{
uiManager: uiManager,
content: container.NewVBox(),
}
screen.setupContent()
return screen
}
func (ss *SettingsScreen) setupContent() {
ss.content.RemoveAll()
contentContainer := container.NewVBox()
header := widget.NewLabel("Настройки")
header.TextStyle = fyne.TextStyle{Bold: true}
contentContainer.Add(header)
themeLabel := widget.NewLabel("Тема:")
themeSelect := widget.NewSelect([]string{"Темная", "Светлая"}, func(theme string) {
if theme == "Темная" {
ss.uiManager.GetSettings().Theme = "dark"
} else {
ss.uiManager.GetSettings().Theme = "light"
}
ss.uiManager.SaveSettings()
})
if ss.uiManager.GetSettings().Theme == "dark" {
themeSelect.SetSelected("Темная")
} else {
themeSelect.SetSelected("Светлая")
}
themeContainer := container.NewHBox(themeLabel, themeSelect)
contentContainer.Add(themeContainer)
autoRefreshCheck := widget.NewCheck("Авторефреш", func(checked bool) {
ss.uiManager.GetSettings().AutoRefresh = checked
ss.uiManager.SaveSettings()
})
autoRefreshCheck.SetChecked(ss.uiManager.GetSettings().AutoRefresh)
contentContainer.Add(autoRefreshCheck)
showFilesCheck := widget.NewCheck("Показывать файлы", func(checked bool) {
ss.uiManager.GetSettings().ShowFiles = checked
ss.uiManager.SaveSettings()
})
showFilesCheck.SetChecked(ss.uiManager.GetSettings().ShowFiles)
contentContainer.Add(showFilesCheck)
compactModeCheck := widget.NewCheck("Компактный режим", func(checked bool) {
ss.uiManager.GetSettings().CompactMode = checked
ss.uiManager.SaveSettings()
})
compactModeCheck.SetChecked(ss.uiManager.GetSettings().CompactMode)
contentContainer.Add(compactModeCheck)
pageSizeLabel := widget.NewLabel("Размер страницы:")
pageSizeSelect := widget.NewSelect([]string{"5", "10", "15", "20"}, func(size string) {
switch size {
case "5":
ss.uiManager.GetSettings().PageSize = 5
case "10":
ss.uiManager.GetSettings().PageSize = 10
case "15":
ss.uiManager.GetSettings().PageSize = 15
case "20":
ss.uiManager.GetSettings().PageSize = 20
}
ss.uiManager.SaveSettings()
})
currentSize := ss.uiManager.GetSettings().PageSize
switch currentSize {
case 5:
pageSizeSelect.SetSelected("5")
case 10:
pageSizeSelect.SetSelected("10")
case 15:
pageSizeSelect.SetSelected("15")
case 20:
pageSizeSelect.SetSelected("20")
default:
pageSizeSelect.SetSelected("10")
}
pageSizeContainer := container.NewHBox(pageSizeLabel, pageSizeSelect)
contentContainer.Add(pageSizeContainer)
lastBoardLabel := widget.NewLabel("Последняя доска:")
lastBoardValue := widget.NewLabel(ss.uiManager.GetLastBoard())
if lastBoardValue.Text == "" {
lastBoardValue.SetText("Не выбрана")
}
lastBoardContainer := container.NewHBox(lastBoardLabel, lastBoardValue)
contentContainer.Add(lastBoardContainer)
contentContainer.Add(widget.NewSeparator())
passcodeHeader := widget.NewLabel("Passcode")
passcodeHeader.TextStyle = fyne.TextStyle{Bold: true}
contentContainer.Add(passcodeHeader)
passcodeEntry := widget.NewEntry()
passcodeEntry.SetPlaceHolder("Введите passcode для постинга")
passcodeEntry.Text = ss.uiManager.GetSettings().Passcode
passcodeEntry.OnChanged = func(text string) {
ss.uiManager.GetSettings().Passcode = text
ss.uiManager.SaveSettings()
}
contentContainer.Add(passcodeEntry)
keyHeader := widget.NewLabel("Ключ аутентификации")
keyHeader.TextStyle = fyne.TextStyle{Bold: true}
contentContainer.Add(keyHeader)
keyEntry := widget.NewEntry()
keyEntry.SetPlaceHolder("Введите ключ для аутентификации")
keyEntry.Text = ss.uiManager.GetSettings().Key
keyEntry.OnChanged = func(text string) {
ss.uiManager.GetSettings().Key = text
ss.uiManager.SaveSettings()
}
contentContainer.Add(keyEntry)
authButtonsContainer := container.NewHBox()
testKeyButton := widget.NewButton("Тест ключа", func() {
key := ss.uiManager.GetSettings().Key
if key == "" {
ss.uiManager.ShowError("Ошибка", "Ключ не введен")
return
}
err := ss.uiManager.GetAPIClient().Authenticate(key)
if err != nil {
ss.uiManager.ShowError("Ошибка аутентификации", fmt.Sprintf("Не удалось аутентифицироваться: %v", err))
} else {
ss.uiManager.ShowInfo("Успех", "Аутентификация по ключу прошла успешно")
}
})
testPasscodeButton := widget.NewButton("Тест passcode", func() {
passcode := ss.uiManager.GetSettings().Passcode
if passcode == "" {
ss.uiManager.ShowError("Ошибка", "Passcode не введен")
return
}
err := ss.uiManager.GetAPIClient().LoginWithPasscode(passcode)
if err != nil {
ss.uiManager.ShowError("Ошибка passcode", fmt.Sprintf("Не удалось войти с passcode: %v", err))
} else {
ss.uiManager.ShowInfo("Успех", "Вход с passcode прошел успешно")
}
})
authButtonsContainer.Add(testKeyButton)
authButtonsContainer.Add(testPasscodeButton)
contentContainer.Add(authButtonsContainer)
contentContainer.Add(widget.NewSeparator())
cacheHeader := widget.NewLabel("Управление кэшем")
cacheHeader.TextStyle = fyne.TextStyle{Bold: true}
contentContainer.Add(cacheHeader)
clearBoardsCacheBtn := widget.NewButton("Очистить кэш досок", func() {
cache.GetCache().Delete("boards")
ss.uiManager.ShowInfo("Кэш очищен", "Кэш досок очищен")
})
contentContainer.Add(clearBoardsCacheBtn)
clearThreadsCacheBtn := widget.NewButton("Очистить кэш тредов", func() {
boards, err := ss.uiManager.GetAPIClient().GetBoards()
if err == nil {
for _, board := range boards {
cache.GetCache().Delete("threads_" + board.Code)
}
}
ss.uiManager.ShowInfo("Кэш очищен", "Кэш тредов для всех досок очищен")
})
contentContainer.Add(clearThreadsCacheBtn)
clearThreadDetailsCacheBtn := widget.NewButton("Очистить кэш деталей тредов", func() {
// Удаляем кэш деталей тредов и комментариев
// Это более сложно, так как нужно знать ID тредов
// Пока просто очищаем весь кэш
cache.GetCache().Clear()
ss.uiManager.ShowInfo("Кэш очищен", "Кэш деталей тредов очищен")
})
contentContainer.Add(clearThreadDetailsCacheBtn)
clearAllCacheBtn := widget.NewButton("Очистить весь кэш", func() {
cache.GetCache().Clear()
ss.uiManager.ShowInfo("Кэш очищен", "Весь кэш очищен")
})
contentContainer.Add(clearAllCacheBtn)
contentContainer.Add(widget.NewSeparator())
resetHeader := widget.NewLabel("Сброс настроек")
resetHeader.TextStyle = fyne.TextStyle{Bold: true}
contentContainer.Add(resetHeader)
resetButton := widget.NewButton("Сбросить настройки", func() {
ss.uiManager.GetSettings().Theme = "dark"
ss.uiManager.GetSettings().AutoRefresh = true
ss.uiManager.GetSettings().ShowFiles = true
ss.uiManager.GetSettings().CompactMode = false
ss.uiManager.GetSettings().LastBoard = ""
ss.uiManager.GetSettings().PageSize = 10
ss.uiManager.SaveSettings()
ss.setupContent() // Перезагружаем интерфейс
})
contentContainer.Add(resetButton)
contentContainer.Add(widget.NewSeparator())
aboutButton := widget.NewButton("Об аппке", func() {
ss.uiManager.ShowAbout()
})
contentContainer.Add(aboutButton)
contentContainer.Add(widget.NewSeparator())
infoButton := widget.NewButton("Я думаю тебя направили сюда)", func() {
ss.uiManager.ShowInfoDialog()
})
contentContainer.Add(infoButton)
ss.content.Add(contentContainer)
ss.content.Refresh()
}
func (ss *SettingsScreen) GetContent() fyne.CanvasObject {
return container.NewScroll(ss.content)
}
func (ss *SettingsScreen) GetTitle() string {
return "Настройки"
}
func (ss *SettingsScreen) OnShow() {
ss.setupContent()
}
func (ss *SettingsScreen) OnHide() {
ss.uiManager.SaveSettings()
}