pagination behaviour fixes + shuffling

This commit is contained in:
jorenchik
2024-09-14 09:45:45 +03:00
parent cd1ef1bb44
commit a83d69aeb2
2 changed files with 228 additions and 52 deletions

View File

@@ -1,13 +1,21 @@
package main package main
// TODO: open flashcard with many answers and switch mdem file, // iter: 1
// it remains opens with the same options -> Rehide the answers. // [1] 2 3 4 5 6 7
// 2
// press 4
// 1 2 3 [4] 5 6 7
// 4 (page num) - 2
import ( import (
"fmt" "fmt"
"os" "os"
"strings" "strings"
"time" "time"
"strconv"
"math/rand"
"github.com/jorenchik/mdemory/src/compiler/api" "github.com/jorenchik/mdemory/src/compiler/api"
"github.com/jorenchik/mdemory/src/compiler/parser" "github.com/jorenchik/mdemory/src/compiler/parser"
@@ -15,10 +23,33 @@ import (
"github.com/therecipe/qt/widgets" "github.com/therecipe/qt/widgets"
) )
type Page struct {
start int;
end int;
}
type PaginationButton struct {
button *widgets.QToolButton;
pageIdx int;
}
var deckListLabel *widgets.QLabel
var hMdemScroll *widgets.QVBoxLayout var hMdemScroll *widgets.QVBoxLayout
var mdemSpacer *widgets.QSpacerItem var mdemSpacer *widgets.QSpacerItem
var spacerInitialized bool = false var spacerInitialized bool = false
var workingPath string = "/home/jorenchik/Code/mdemory/memorybase" var workingPath string = "/home/jorenchik/Code/mdemory/memorybase"
var questions [] parser.Question
var paginationButtons []*widgets.QToolButton
var paginationLabel *widgets.QLabel
// var currentPage = 0
var PER_PAGE = 10
var pages []Page
var currentPage = -1
var prevButton *widgets.QToolButton
var firstButton *widgets.QToolButton
var lastButton *widgets.QToolButton
var nextButton *widgets.QToolButton
type Mdem struct { type Mdem struct {
wMdem *widgets.QWidget; wMdem *widgets.QWidget;
@@ -147,6 +178,7 @@ func CreateMdems(questions *[]parser.Question) {
} }
} }
// destroy widgets
for i := range *questions { for i := range *questions {
question := (*questions)[i] question := (*questions)[i]
switch question.(type) { switch question.(type) {
@@ -157,7 +189,7 @@ func CreateMdems(questions *[]parser.Question) {
answer := strings.Trim( answer := strings.Trim(
question.(parser.SingleAnswerQuestion).Answer, " \t\n", question.(parser.SingleAnswerQuestion).Answer, " \t\n",
) )
mdems[i].backLabels[0].SetText(answer) mdems[i].backLabels[0].SetText(fmt.Sprintf("- %s", answer))
if mdems[i].wBack.IsVisible() { if mdems[i].wBack.IsVisible() {
mdems[i].wBack.Hide() mdems[i].wBack.Hide()
} }
@@ -172,7 +204,7 @@ func CreateMdems(questions *[]parser.Question) {
if k < len(mdems[i].backLabels) { if k < len(mdems[i].backLabels) {
mdems[i].backLabels[k].SetText(answer) mdems[i].backLabels[k].SetText(answer)
} else { } else {
label := widgets.NewQLabel2(answer, nil, 0) label := widgets.NewQLabel2(fmt.Sprintf("- %s", answer), nil, 0)
mdems[i].backLabels = append( mdems[i].backLabels = append(
mdems[i].backLabels, mdems[i].backLabels,
label, label,
@@ -199,6 +231,120 @@ func CreateMdems(questions *[]parser.Question) {
hMdemScroll.AddItem(mdemSpacer) hMdemScroll.AddItem(mdemSpacer)
} }
func MakePages() {
pages = nil
for i := 0; i < (len(questions) / PER_PAGE) + 1; i++ {
startingIndex := PER_PAGE * i
amount := PER_PAGE
if (i == len(questions) / PER_PAGE) {
amount = len(questions) % PER_PAGE
}
pages = append(
pages,
Page{startingIndex, startingIndex + amount},
)
}
}
var PAGINATION_COUNT int = 8
var DISTANCE int = PAGINATION_COUNT / 2 - 1
func SwitchPage(pageIdx int) {
currentPage = pageIdx
for i := range(paginationButtons) {
paginationButtons[i].Hide()
}
l := 0
paginationLabel.SetText(fmt.Sprintf("Page: %d", pageIdx + 1))
for i := range(mdems) {
if mdems[i].wBack.IsVisible() {
mdems[i].wBack.Hide()
mdems[i].showButton.SetText("Show")
}
}
for k := -DISTANCE; k <= DISTANCE; k = k + 1 {
if pageIdx + k >= 0 && pageIdx + k < len(pages) {
button := paginationButtons[l]
button.SetText(fmt.Sprintf("%d", pageIdx + k + 1))
if pageIdx + k != pageIdx {
button.Show()
} else {
button.Hide()
}
l++
}
}
if pageIdx > 0 && len(pages) > 1 {
firstButton.Show()
} else {
firstButton.Hide()
}
if pageIdx < len(pages) - 1 && len(pages) > 1 {
lastButton.Show()
} else {
lastButton.Hide()
}
if len(pages) > 0 &&
currentPage < len(pages) - 1 {
nextButton.Show()
} else {
nextButton.Hide()
}
if len(pages) > 0 &&
currentPage >= 1 {
prevButton.Show()
} else {
prevButton.Hide()
}
page := pages[pageIdx]
pageSlice := questions[page.start:page.end]
CreateMdems(&pageSlice)
}
func OpenModelFile(
model *widgets.QFileSystemModel,
index *core.QModelIndex,
) {
if model.IsDir(index) {
return
}
filePath := model.FilePath(index)
fileContents, err := os.ReadFile(filePath)
if err != nil {
widgets.QMessageBox_Critical(
nil,
"Compilation error",
err.Error(),
widgets.QMessageBox__Ok,
widgets.QMessageBox__Ok,
)
return
}
deckListLabel.SetText(fmt.Sprintf("Mdem: %s", filePath))
start := time.Now().UnixMicro()
questions, err = api.Compile(string(fileContents))
if err != nil {
widgets.QMessageBox_Critical(
nil,
"Compilation error",
err.Error(),
widgets.QMessageBox__Ok,
widgets.QMessageBox__Ok,
)
return
}
duration := float32(time.Now().UnixMicro()-start) / 1000
fmt.Printf("Compilation took %.3fms", duration)
MakePages()
SwitchPage(0)
}
func main() { func main() {
// InitApp // InitApp
app := widgets.NewQApplication(len(os.Args), os.Args) app := widgets.NewQApplication(len(os.Args), os.Args)
@@ -224,41 +370,11 @@ func main() {
mdemList.HideColumn(1) mdemList.HideColumn(1)
mdemList.HideColumn(2) mdemList.HideColumn(2)
mdemList.HideColumn(3) mdemList.HideColumn(3)
mdemList.ConnectDoubleClicked(func(index *core.QModelIndex) { mdemList.ConnectDoubleClicked(
if model.IsDir(index) { func(index *core.QModelIndex) {
return OpenModelFile(model, index)
} },
filePath := model.FilePath(index)
fileContents, err := os.ReadFile(filePath)
if err != nil {
widgets.QMessageBox_Critical(
nil,
"Compilation error",
err.Error(),
widgets.QMessageBox__Ok,
widgets.QMessageBox__Ok,
) )
return
}
start := time.Now().UnixMicro()
questions, err := api.Compile(string(fileContents))
if err != nil {
widgets.QMessageBox_Critical(
nil,
"Compilation error",
err.Error(),
widgets.QMessageBox__Ok,
widgets.QMessageBox__Ok,
)
return
}
duration := float32(time.Now().UnixMicro()-start) / 1000
fmt.Printf("Compilation took %.3fms", duration)
// Take a slice (mock pagination for now)
questions = questions[0:10]
CreateMdems(&questions)
})
deckLabel := widgets.NewQLabel2("Decks", nil, 0) deckLabel := widgets.NewQLabel2("Decks", nil, 0)
deckList := widgets.NewQListView(nil) deckList := widgets.NewQListView(nil)
@@ -272,7 +388,7 @@ func main() {
top := widgets.NewQWidget(nil, 0) top := widgets.NewQWidget(nil, 0)
hTop := widgets.NewQHBoxLayout() hTop := widgets.NewQHBoxLayout()
deckListLabel := widgets.NewQLabel2("Mdem: file.mdem", nil, 0) deckListLabel = widgets.NewQLabel(nil, 0)
top.SetLayout(hTop) top.SetLayout(hTop)
rightLayout.AddWidget(top, 0, 0) rightLayout.AddWidget(top, 0, 0)
@@ -286,6 +402,15 @@ func main() {
hTop.AddWidget(practice, 0, 0) hTop.AddWidget(practice, 0, 0)
refresh.SetText("Refresh") refresh.SetText("Refresh")
shuffle.SetText("Shuffle") shuffle.SetText("Shuffle")
shuffle.ConnectClicked(
func(checked bool) {
for i := range questions {
j := rand.Intn(i + 1)
questions[i], questions[j] = questions[j], questions[i]
}
SwitchPage(0)
},
)
practice.SetText("Practice") practice.SetText("Practice")
mdemScroll := widgets.NewQScrollArea(nil) mdemScroll := widgets.NewQScrollArea(nil)
@@ -304,26 +429,77 @@ func main() {
hMdemScroll.AddWidget(mdem.wMdem, 0, 0) hMdemScroll.AddWidget(mdem.wMdem, 0, 0)
} }
// CreateMdems
rightLayout.AddWidget(mdemScroll, 1, 0) rightLayout.AddWidget(mdemScroll, 1, 0)
// Pagination
// MakePagination
pagination := widgets.NewQWidget(nil, 0) pagination := widgets.NewQWidget(nil, 0)
hPagination := widgets.NewQHBoxLayout() hPagination := widgets.NewQHBoxLayout()
pagination.SetLayout(hPagination) pagination.SetLayout(hPagination)
// TEMP: mock pagination firstButton = widgets.NewQToolButton(nil)
prevButton := widgets.NewQToolButton(nil) firstButton.SetText("<<")
hPagination.AddWidget(firstButton, 0, 0)
firstButton.Hide()
firstButton.ConnectClicked(func(checked bool) {
if len(pages) > 0 {
SwitchPage(0)
}
})
prevButton = widgets.NewQToolButton(nil)
prevButton.SetText("<") prevButton.SetText("<")
hPagination.AddWidget(prevButton, 0, 0) hPagination.AddWidget(prevButton, 0, 0)
for i := 0; i < 5; i++ { prevButton.Hide()
button := widgets.NewQToolButton(nil) prevButton.ConnectClicked(func(checked bool) {
button.SetText(fmt.Sprintf("%d", i+1)) if len(pages) > 0 {
hPagination.AddWidget(button, 0, 0) SwitchPage(currentPage - 1)
} }
nextButton := widgets.NewQToolButton(nil) })
for i := 0; i < PAGINATION_COUNT; i++ {
elButton := widgets.NewQToolButton(nil)
elButton.SetText(fmt.Sprintf("%d", i+1))
hPagination.AddWidget(elButton, 0, 0)
elButton.Hide()
elButton.ConnectClicked(func(checked bool) {
pageNum, err := strconv.ParseInt(elButton.Text(), 10, 64)
_ = err
pageIdx := int(pageNum) - 1
if (pageIdx < len(pages)) {
SwitchPage(pageIdx)
}
})
paginationButtons = append(
paginationButtons,
elButton,
)
}
nextButton = widgets.NewQToolButton(nil)
nextButton.SetText(">") nextButton.SetText(">")
hPagination.AddWidget(nextButton, 0, 0) hPagination.AddWidget(nextButton, 0, 0)
nextButton.Hide()
nextButton.ConnectClicked(func(checked bool) {
if len(pages) > 0 {
SwitchPage(currentPage + 1)
}
})
lastButton = widgets.NewQToolButton(nil)
lastButton.SetText(">>")
hPagination.AddWidget(lastButton, 0, 0)
lastButton.Hide()
lastButton.ConnectClicked(func(checked bool) {
if len(pages) > 0 {
SwitchPage(len(pages) - 1)
}
})
hPagination.AddStretch(1) hPagination.AddStretch(1)
paginationLabel = widgets.NewQLabel(nil, 0)
hPagination.AddWidget(paginationLabel, 0, 0)
rightLayout.AddWidget(pagination, 0, 0) rightLayout.AddWidget(pagination, 0, 0)
hSplitter.AddWidget(leftWidget) hSplitter.AddWidget(leftWidget)

Binary file not shown.