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() }