package ctfc import ( "time" "gitlab.com/Syndamia/ctfc/go-src/csi" ctfcmath "gitlab.com/Syndamia/ctfc/go-src/ctfcMath" "gitlab.com/Syndamia/ctfc/go-src/ui" ) /* Pagination */ const pageSize = 15 func totalPages(messageAmount int) int { return ctfcmath.CeilDivInt(messageAmount, pageSize) } func paginate(page int, messages ...string) []string { return messages[ctfcmath.MaxInt(len(messages)-pageSize*page, 0) : len(messages)-pageSize*(page-1)] } // Must be run in a routine ( go routinePaginatedSubwindow(...) ) // There must be empty lines for the subwindow func routinePaginatedSubwindow(messages *[]string, updateMessages func(*[]string), lastLine *int, page int, customLinesBelow int, numbered bool) { for *lastLine > -2 { // Update messages, if we've already shown the last message if *lastLine == len(*messages)-1 { updateMessages(messages) continue } *lastLine = len(*messages) - 1 csi.SaveCursorPosition() csi.MoveCursorUpN(pageSize + 1 + customLinesBelow) csi.MoveCursorToBeginningOfLine() pageMessages := paginate(page, *messages...) // Leaves empty lines at the top, if there aren't enough messages to fill a full page // Works on the assumption that there are ui.EmptyLine(), where messages would be printed for i := 0; i < pageSize-len(pageMessages); i++ { csi.MoveCursorDown() } if numbered { ui.NumberedFields(pageMessages...) } else { ui.TextFields(pageMessages...) } ui.PageField(page, totalPages(len(*messages))) csi.RestoreCursorPosition() time.Sleep(500 * time.Millisecond) } }