265 lines
8.3 KiB
Go
265 lines
8.3 KiB
Go
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()
|
||
|
||
header := widget.NewLabel("Настройки")
|
||
header.TextStyle = fyne.TextStyle{Bold: true}
|
||
ss.content.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)
|
||
ss.content.Add(themeContainer)
|
||
|
||
autoRefreshCheck := widget.NewCheck("Авторефреш", func(checked bool) {
|
||
ss.uiManager.GetSettings().AutoRefresh = checked
|
||
ss.uiManager.SaveSettings()
|
||
})
|
||
autoRefreshCheck.SetChecked(ss.uiManager.GetSettings().AutoRefresh)
|
||
ss.content.Add(autoRefreshCheck)
|
||
|
||
showFilesCheck := widget.NewCheck("Показывать файлы", func(checked bool) {
|
||
ss.uiManager.GetSettings().ShowFiles = checked
|
||
ss.uiManager.SaveSettings()
|
||
})
|
||
showFilesCheck.SetChecked(ss.uiManager.GetSettings().ShowFiles)
|
||
ss.content.Add(showFilesCheck)
|
||
|
||
compactModeCheck := widget.NewCheck("Компактный режим", func(checked bool) {
|
||
ss.uiManager.GetSettings().CompactMode = checked
|
||
ss.uiManager.SaveSettings()
|
||
})
|
||
compactModeCheck.SetChecked(ss.uiManager.GetSettings().CompactMode)
|
||
ss.content.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)
|
||
ss.content.Add(pageSizeContainer)
|
||
|
||
lastBoardLabel := widget.NewLabel("Последняя доска:")
|
||
lastBoardValue := widget.NewLabel(ss.uiManager.GetLastBoard())
|
||
if lastBoardValue.Text == "" {
|
||
lastBoardValue.SetText("Не выбрана")
|
||
}
|
||
lastBoardContainer := container.NewHBox(lastBoardLabel, lastBoardValue)
|
||
ss.content.Add(lastBoardContainer)
|
||
|
||
ss.content.Add(widget.NewSeparator())
|
||
|
||
passcodeHeader := widget.NewLabel("Passcode")
|
||
passcodeHeader.TextStyle = fyne.TextStyle{Bold: true}
|
||
ss.content.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()
|
||
}
|
||
ss.content.Add(passcodeEntry)
|
||
|
||
keyHeader := widget.NewLabel("Ключ аутентификации")
|
||
keyHeader.TextStyle = fyne.TextStyle{Bold: true}
|
||
ss.content.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()
|
||
}
|
||
ss.content.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)
|
||
ss.content.Add(authButtonsContainer)
|
||
|
||
// Debug
|
||
debugCheck := widget.NewCheck("Debug режим", func(checked bool) {
|
||
ss.uiManager.GetAPIClient().EnableDebug(checked)
|
||
})
|
||
ss.content.Add(debugCheck)
|
||
|
||
ss.content.Add(widget.NewSeparator())
|
||
cacheHeader := widget.NewLabel("Управление кэшем")
|
||
cacheHeader.TextStyle = fyne.TextStyle{Bold: true}
|
||
ss.content.Add(cacheHeader)
|
||
clearBoardsCacheBtn := widget.NewButton("Очистить кэш досок", func() {
|
||
cache.GetCache().Delete("boards")
|
||
ss.uiManager.ShowInfo("Кэш очищен", "Кэш досок очищен")
|
||
})
|
||
ss.content.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("Кэш очищен", "Кэш тредов для всех досок очищен")
|
||
})
|
||
ss.content.Add(clearThreadsCacheBtn)
|
||
clearThreadDetailsCacheBtn := widget.NewButton("Очистить кэш деталей тредов", func() {
|
||
// Удаляем кэш деталей тредов и комментариев
|
||
// Это более сложно, так как нужно знать ID тредов
|
||
// Пока просто очищаем весь кэш
|
||
cache.GetCache().Clear()
|
||
ss.uiManager.ShowInfo("Кэш очищен", "Кэш деталей тредов очищен")
|
||
})
|
||
ss.content.Add(clearThreadDetailsCacheBtn)
|
||
|
||
clearAllCacheBtn := widget.NewButton("Очистить весь кэш", func() {
|
||
cache.GetCache().Clear()
|
||
ss.uiManager.ShowInfo("Кэш очищен", "Весь кэш очищен")
|
||
})
|
||
ss.content.Add(clearAllCacheBtn)
|
||
ss.content.Add(widget.NewSeparator())
|
||
resetHeader := widget.NewLabel("Сброс настроек")
|
||
resetHeader.TextStyle = fyne.TextStyle{Bold: true}
|
||
ss.content.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() // Перезагружаем интерфейс
|
||
})
|
||
ss.content.Add(resetButton)
|
||
|
||
ss.content.Add(widget.NewSeparator())
|
||
|
||
aboutButton := widget.NewButton("Об аппке", func() {
|
||
ss.uiManager.ShowAbout()
|
||
})
|
||
ss.content.Add(aboutButton)
|
||
|
||
ss.content.Add(widget.NewSeparator())
|
||
|
||
infoButton := widget.NewButton("Я думаю тебя направили сюда)", func() {
|
||
ss.uiManager.ShowInfoDialog()
|
||
})
|
||
ss.content.Add(infoButton)
|
||
|
||
ss.content.Refresh()
|
||
}
|
||
|
||
func (ss *SettingsScreen) GetContent() fyne.CanvasObject {
|
||
return ss.content
|
||
}
|
||
|
||
func (ss *SettingsScreen) GetTitle() string {
|
||
return "Настройки"
|
||
}
|
||
|
||
func (ss *SettingsScreen) OnShow() {
|
||
ss.setupContent()
|
||
}
|
||
|
||
func (ss *SettingsScreen) OnHide() {
|
||
ss.uiManager.SaveSettings()
|
||
}
|