ебанутые настройки честнео слово

This commit is contained in:
Lain Iwakura 2025-08-06 00:17:35 +03:00
parent d82a294c27
commit d321069a5f
No known key found for this signature in database
GPG Key ID: C7C18257F2ADC6F8
3 changed files with 244 additions and 33 deletions

107
ui/add_comment_screen.go Normal file
View File

@ -0,0 +1,107 @@
package ui
import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
type AddCommentScreen struct {
uiManager *UIManager
content *fyne.Container
boardCode string
threadID int
}
func NewAddCommentScreen(uiManager *UIManager, boardCode string, threadID int) *AddCommentScreen {
acs := &AddCommentScreen{
uiManager: uiManager,
boardCode: boardCode,
threadID: threadID,
content: container.NewVBox(),
}
acs.setupContent()
return acs
}
func (acs *AddCommentScreen) setupContent() {
acs.content.Objects = nil
titleLabel := widget.NewLabel(fmt.Sprintf("Добавить комментарий в тред %d /%s/", acs.threadID, acs.boardCode))
titleLabel.TextStyle = fyne.TextStyle{Bold: true}
acs.content.Add(titleLabel)
textEntry := widget.NewMultiLineEntry()
textEntry.SetPlaceHolder("Текст комментария")
textEntry.Resize(fyne.NewSize(300, 200))
acs.content.Add(textEntry)
passcode := acs.uiManager.GetPasscode()
if passcode != "" {
passcodeLabel := widget.NewLabel("Passcode настроен")
passcodeLabel.TextStyle = fyne.TextStyle{Bold: true}
acs.content.Add(passcodeLabel)
} else {
passcodeLabel := widget.NewLabel("Passcode не настроен - постинг может быть\nограничен и могут быть неожиданные ПРОБЛЕЕМЫ\n(подробнее в настройках)")
passcodeLabel.TextStyle = fyne.TextStyle{Bold: true}
acs.content.Add(passcodeLabel)
}
buttonsContainer := container.NewHBox()
addButton := widget.NewButton("Добавить комментарий", func() {
text := textEntry.Text
if text == "" {
acs.uiManager.ShowError("Ошибка", "Текст не может быть пустым")
return
}
acs.uiManager.ShowInfo("Добавление комментария", "Отправляем комментарий...")
passcode := acs.uiManager.GetPasscode()
err := acs.uiManager.GetAPIClient().AddComment(acs.boardCode, acs.threadID, text, passcode)
if err != nil {
acs.uiManager.ShowError("Ошибка", fmt.Sprintf("Не удалось добавить комментарий: %v", err))
return
}
acs.uiManager.ClearCacheForThread(acs.threadID)
acs.uiManager.ShowInfo("Успех", "Комментарий добавлен успешно!")
acs.uiManager.GoBack()
if threadDetailScreen, ok := acs.uiManager.GetCurrentScreen().(*ThreadDetailScreen); ok {
threadDetailScreen.RefreshThread()
}
})
cancelButton := widget.NewButton("Отмена", func() {
acs.uiManager.GoBack()
})
buttonsContainer.Add(addButton)
buttonsContainer.Add(cancelButton)
acs.content.Add(buttonsContainer)
acs.content.Refresh()
}
func (acs *AddCommentScreen) GetContent() fyne.CanvasObject {
return acs.content
}
func (acs *AddCommentScreen) GetTitle() string {
return fmt.Sprintf("Комментарий в тред %d", acs.threadID)
}
func (acs *AddCommentScreen) OnShow() {
acs.setupContent()
}
func (acs *AddCommentScreen) OnHide() {
// Ничего не делаем при скрытии
}

107
ui/create_thread_screen.go Normal file
View File

@ -0,0 +1,107 @@
package ui
import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
type CreateThreadScreen struct {
uiManager *UIManager
content *fyne.Container
boardCode string
}
func NewCreateThreadScreen(uiManager *UIManager, boardCode string) *CreateThreadScreen {
cts := &CreateThreadScreen{
uiManager: uiManager,
boardCode: boardCode,
content: container.NewVBox(),
}
cts.setupContent()
return cts
}
func (cts *CreateThreadScreen) setupContent() {
cts.content.Objects = nil
titleLabel := widget.NewLabel(fmt.Sprintf("Создать тред в /%s/", cts.boardCode))
titleLabel.TextStyle = fyne.TextStyle{Bold: true}
cts.content.Add(titleLabel)
titleEntry := widget.NewEntry()
titleEntry.SetPlaceHolder("Заголовок треда")
cts.content.Add(titleEntry)
textEntry := widget.NewMultiLineEntry()
textEntry.SetPlaceHolder("Текст треда")
textEntry.Resize(fyne.NewSize(300, 200))
cts.content.Add(textEntry)
passcode := cts.uiManager.GetPasscode()
if passcode != "" {
passcodeLabel := widget.NewLabel("Passcode настроен ✓")
passcodeLabel.TextStyle = fyne.TextStyle{Bold: true}
cts.content.Add(passcodeLabel)
} else {
passcodeLabel := widget.NewLabel("Passcode не настроен - постинг может быть ограничен\nи могут быть неожиданные ПРОБЛЕЕМЫ\n(подробнее в настройках)")
passcodeLabel.TextStyle = fyne.TextStyle{Bold: true}
cts.content.Add(passcodeLabel)
}
buttonsContainer := container.NewHBox()
createButton := widget.NewButton("Создать тред", func() {
title := titleEntry.Text
text := textEntry.Text
if title == "" {
cts.uiManager.ShowError("Ошибка", "Заголовок не может быть пустым")
return
}
if text == "" {
cts.uiManager.ShowError("Ошибка", "Текст не может быть пустым")
return
}
cts.uiManager.ShowInfo("Создание треда", "Отправляем тред...")
passcode := cts.uiManager.GetPasscode()
err := cts.uiManager.GetAPIClient().CreateThread(cts.boardCode, title, text, passcode)
if err != nil {
cts.uiManager.ShowError("Ошибка", fmt.Sprintf("Не удалось создать тред: %v", err))
return
}
cts.uiManager.ClearCacheForBoard(cts.boardCode)
cts.uiManager.ShowInfo("Успех", "Тред создан успешно!")
cts.uiManager.GoBack()
cts.uiManager.RefreshCurrentScreen()
})
cancelButton := widget.NewButton("Отмена", func() {
cts.uiManager.GoBack()
})
buttonsContainer.Add(createButton)
buttonsContainer.Add(cancelButton)
cts.content.Add(buttonsContainer)
cts.content.Refresh()
}
func (cts *CreateThreadScreen) GetContent() fyne.CanvasObject {
return cts.content
}
func (cts *CreateThreadScreen) GetTitle() string {
return fmt.Sprintf("Создать тред /%s/", cts.boardCode)
}
func (cts *CreateThreadScreen) OnShow() {
cts.setupContent()
}
func (cts *CreateThreadScreen) OnHide() {
// Ничего не делаем при скрытии
}

View File

@ -26,9 +26,11 @@ func NewSettingsScreen(uiManager *UIManager) *SettingsScreen {
func (ss *SettingsScreen) setupContent() {
ss.content.RemoveAll()
contentContainer := container.NewVBox()
header := widget.NewLabel("Настройки")
header.TextStyle = fyne.TextStyle{Bold: true}
ss.content.Add(header)
contentContainer.Add(header)
themeLabel := widget.NewLabel("Тема:")
themeSelect := widget.NewSelect([]string{"Темная", "Светлая"}, func(theme string) {
@ -47,28 +49,28 @@ func (ss *SettingsScreen) setupContent() {
}
themeContainer := container.NewHBox(themeLabel, themeSelect)
ss.content.Add(themeContainer)
contentContainer.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)
contentContainer.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)
contentContainer.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)
contentContainer.Add(compactModeCheck)
pageSizeLabel := widget.NewLabel("Размер страницы:")
pageSizeSelect := widget.NewSelect([]string{"5", "10", "15", "20"}, func(size string) {
@ -100,7 +102,7 @@ func (ss *SettingsScreen) setupContent() {
}
pageSizeContainer := container.NewHBox(pageSizeLabel, pageSizeSelect)
ss.content.Add(pageSizeContainer)
contentContainer.Add(pageSizeContainer)
lastBoardLabel := widget.NewLabel("Последняя доска:")
lastBoardValue := widget.NewLabel(ss.uiManager.GetLastBoard())
@ -108,13 +110,13 @@ func (ss *SettingsScreen) setupContent() {
lastBoardValue.SetText("Не выбрана")
}
lastBoardContainer := container.NewHBox(lastBoardLabel, lastBoardValue)
ss.content.Add(lastBoardContainer)
contentContainer.Add(lastBoardContainer)
ss.content.Add(widget.NewSeparator())
contentContainer.Add(widget.NewSeparator())
passcodeHeader := widget.NewLabel("Passcode")
passcodeHeader.TextStyle = fyne.TextStyle{Bold: true}
ss.content.Add(passcodeHeader)
contentContainer.Add(passcodeHeader)
passcodeEntry := widget.NewEntry()
passcodeEntry.SetPlaceHolder("Введите passcode для постинга")
@ -123,11 +125,11 @@ func (ss *SettingsScreen) setupContent() {
ss.uiManager.GetSettings().Passcode = text
ss.uiManager.SaveSettings()
}
ss.content.Add(passcodeEntry)
contentContainer.Add(passcodeEntry)
keyHeader := widget.NewLabel("Ключ аутентификации")
keyHeader.TextStyle = fyne.TextStyle{Bold: true}
ss.content.Add(keyHeader)
contentContainer.Add(keyHeader)
keyEntry := widget.NewEntry()
keyEntry.SetPlaceHolder("Введите ключ для аутентификации")
@ -136,7 +138,7 @@ func (ss *SettingsScreen) setupContent() {
ss.uiManager.GetSettings().Key = text
ss.uiManager.SaveSettings()
}
ss.content.Add(keyEntry)
contentContainer.Add(keyEntry)
authButtonsContainer := container.NewHBox()
@ -172,23 +174,17 @@ func (ss *SettingsScreen) setupContent() {
authButtonsContainer.Add(testKeyButton)
authButtonsContainer.Add(testPasscodeButton)
ss.content.Add(authButtonsContainer)
contentContainer.Add(authButtonsContainer)
// Debug
debugCheck := widget.NewCheck("Debug режим", func(checked bool) {
ss.uiManager.GetAPIClient().EnableDebug(checked)
})
ss.content.Add(debugCheck)
ss.content.Add(widget.NewSeparator())
contentContainer.Add(widget.NewSeparator())
cacheHeader := widget.NewLabel("Управление кэшем")
cacheHeader.TextStyle = fyne.TextStyle{Bold: true}
ss.content.Add(cacheHeader)
contentContainer.Add(cacheHeader)
clearBoardsCacheBtn := widget.NewButton("Очистить кэш досок", func() {
cache.GetCache().Delete("boards")
ss.uiManager.ShowInfo("Кэш очищен", "Кэш досок очищен")
})
ss.content.Add(clearBoardsCacheBtn)
contentContainer.Add(clearBoardsCacheBtn)
clearThreadsCacheBtn := widget.NewButton("Очистить кэш тредов", func() {
boards, err := ss.uiManager.GetAPIClient().GetBoards()
if err == nil {
@ -198,7 +194,7 @@ func (ss *SettingsScreen) setupContent() {
}
ss.uiManager.ShowInfo("Кэш очищен", "Кэш тредов для всех досок очищен")
})
ss.content.Add(clearThreadsCacheBtn)
contentContainer.Add(clearThreadsCacheBtn)
clearThreadDetailsCacheBtn := widget.NewButton("Очистить кэш деталей тредов", func() {
// Удаляем кэш деталей тредов и комментариев
// Это более сложно, так как нужно знать ID тредов
@ -206,17 +202,17 @@ func (ss *SettingsScreen) setupContent() {
cache.GetCache().Clear()
ss.uiManager.ShowInfo("Кэш очищен", "Кэш деталей тредов очищен")
})
ss.content.Add(clearThreadDetailsCacheBtn)
contentContainer.Add(clearThreadDetailsCacheBtn)
clearAllCacheBtn := widget.NewButton("Очистить весь кэш", func() {
cache.GetCache().Clear()
ss.uiManager.ShowInfo("Кэш очищен", "Весь кэш очищен")
})
ss.content.Add(clearAllCacheBtn)
ss.content.Add(widget.NewSeparator())
contentContainer.Add(clearAllCacheBtn)
contentContainer.Add(widget.NewSeparator())
resetHeader := widget.NewLabel("Сброс настроек")
resetHeader.TextStyle = fyne.TextStyle{Bold: true}
ss.content.Add(resetHeader)
contentContainer.Add(resetHeader)
resetButton := widget.NewButton("Сбросить настройки", func() {
ss.uiManager.GetSettings().Theme = "dark"
@ -228,27 +224,28 @@ func (ss *SettingsScreen) setupContent() {
ss.uiManager.SaveSettings()
ss.setupContent() // Перезагружаем интерфейс
})
ss.content.Add(resetButton)
contentContainer.Add(resetButton)
ss.content.Add(widget.NewSeparator())
contentContainer.Add(widget.NewSeparator())
aboutButton := widget.NewButton("Об аппке", func() {
ss.uiManager.ShowAbout()
})
ss.content.Add(aboutButton)
contentContainer.Add(aboutButton)
ss.content.Add(widget.NewSeparator())
contentContainer.Add(widget.NewSeparator())
infoButton := widget.NewButton("Я думаю тебя направили сюда)", func() {
ss.uiManager.ShowInfoDialog()
})
ss.content.Add(infoButton)
contentContainer.Add(infoButton)
ss.content.Add(contentContainer)
ss.content.Refresh()
}
func (ss *SettingsScreen) GetContent() fyne.CanvasObject {
return ss.content
return container.NewScroll(ss.content)
}
func (ss *SettingsScreen) GetTitle() string {