refactor
This commit is contained in:
@@ -96,3 +96,80 @@ func FormatPageInfo(currentPage, totalPages int) string {
|
||||
}
|
||||
return fmt.Sprintf(" <i>(стр. %d/%d)</i>", currentPage+1, totalPages)
|
||||
}
|
||||
|
||||
// ElementLayoutConfig конфигурация для автоматической раскладки элементов с пагинацией
|
||||
type ElementLayoutConfig struct {
|
||||
CurrentPage int // Текущая страница (0-indexed)
|
||||
ItemsPerPage int // Элементов на странице
|
||||
ItemsPerRow int // Элементов в одном ряду
|
||||
EmptyButton *echotron.InlineKeyboardButton // Кнопка-заполнитель (опционально, по умолчанию " ")
|
||||
}
|
||||
|
||||
// BuildElementRows автоматически раскладывает элементы с пагинацией.
|
||||
// Принимает все элементы, возвращает ряды для текущей страницы с правильной раскладкой.
|
||||
// Автоматически заполняет пустыми кнопками если страниц > 1 (для консистентности высоты).
|
||||
// Возвращает 2D массив кнопок готовый к добавлению в клавиатуру.
|
||||
//
|
||||
// Пример использования:
|
||||
//
|
||||
// config := ui.ElementLayoutConfig{
|
||||
// CurrentPage: 0,
|
||||
// ItemsPerPage: 6,
|
||||
// ItemsPerRow: 2,
|
||||
// }
|
||||
// rows := ui.BuildElementRows(config, allButtons)
|
||||
// keyboard = append(keyboard, rows...)
|
||||
func BuildElementRows(config ElementLayoutConfig, allItems []echotron.InlineKeyboardButton) [][]echotron.InlineKeyboardButton {
|
||||
if len(allItems) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Параметры по умолчанию
|
||||
if config.ItemsPerPage <= 0 {
|
||||
config.ItemsPerPage = 6
|
||||
}
|
||||
if config.ItemsPerRow <= 0 {
|
||||
config.ItemsPerRow = 2
|
||||
}
|
||||
|
||||
// Кнопка-заполнитель по умолчанию
|
||||
emptyButton := echotron.InlineKeyboardButton{Text: " ", CallbackData: "empty"}
|
||||
if config.EmptyButton != nil {
|
||||
emptyButton = *config.EmptyButton
|
||||
}
|
||||
|
||||
// Вычисляем границы страницы
|
||||
totalPages := CalculatePages(len(allItems), config.ItemsPerPage)
|
||||
start, end := GetPageBounds(config.CurrentPage, config.ItemsPerPage, len(allItems))
|
||||
|
||||
// Получаем элементы текущей страницы
|
||||
pageItems := allItems[start:end]
|
||||
|
||||
// Если страниц >= 2, заполняем до ItemsPerPage пустыми кнопками
|
||||
// Это обеспечивает одинаковую высоту клавиатуры на всех страницах
|
||||
if totalPages >= 2 {
|
||||
for len(pageItems) < config.ItemsPerPage {
|
||||
pageItems = append(pageItems, emptyButton)
|
||||
}
|
||||
}
|
||||
|
||||
// Раскладываем элементы по рядам
|
||||
var rows [][]echotron.InlineKeyboardButton
|
||||
for i := 0; i < len(pageItems); i += config.ItemsPerRow {
|
||||
var row []echotron.InlineKeyboardButton
|
||||
|
||||
// Добавляем элементы в ряд
|
||||
for j := 0; j < config.ItemsPerRow && i+j < len(pageItems); j++ {
|
||||
row = append(row, pageItems[i+j])
|
||||
}
|
||||
|
||||
// Если в ряду меньше элементов чем ItemsPerRow, заполняем пустыми
|
||||
for len(row) < config.ItemsPerRow {
|
||||
row = append(row, emptyButton)
|
||||
}
|
||||
|
||||
rows = append(rows, row)
|
||||
}
|
||||
|
||||
return rows
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user