FemaLocalSoftware/paginationbar.cpp
Lopata PC 9e459078e1 SensorTab all Done
paginationBar Done
2024-12-16 11:38:04 +03:00

210 lines
6.0 KiB
C++

#include "PaginationBar.h"
#include <QStyle>
#include <QIntValidator>
#include <QDebug>
PaginationBar::PaginationBar(int totalPages, QWidget *parent)
: QWidget(parent), totalPages(totalPages), currentPage(1) {
layout = new QHBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(5);
leftArrow = new QPushButton(this);
leftArrow->setFixedSize(40, 40);
leftArrow->setStyleSheet(R"(
QPushButton {
background: transparent;
border: none;
border-radius: 5px;
padding: 0;
background-image: url(:/png/res/png/arrowLeft.png);
background-position: center;
background-repeat: no-repeat;
}
QPushButton:hover {
background-color: #e5e5e5;
}
)");
connect(leftArrow, &QPushButton::clicked, this, &PaginationBar::goToPreviousPage);
rightArrow = new QPushButton(this);
rightArrow->setFixedSize(40, 40);
rightArrow->setStyleSheet(R"(
QPushButton {
background: transparent;
border: none;
border-radius: 5px;
padding: 0;
background-image: url(:/png/res/png/arrowRight.png);
background-position: center;
background-repeat: no-repeat;
}
QPushButton:hover {
background-color: #e5e5e5;
}
)");
connect(rightArrow, &QPushButton::clicked, this, &PaginationBar::goToNextPage);
layout->addWidget(leftArrow);
layout->addWidget(rightArrow);
updateButtons();
}
void PaginationBar::onPageButtonClicked(int page) {
currentPage = page;
emit pageChanged(currentPage);
updateButtons();
}
void PaginationBar::goToPreviousPage() {
if (currentPage > 1) {
currentPage--;
emit pageChanged(currentPage);
updateButtons();
}
}
void PaginationBar::goToNextPage() {
if (currentPage < totalPages) {
currentPage++;
emit pageChanged(currentPage);
updateButtons();
}
}
void PaginationBar::onEllipsisClicked(QPushButton *ellipsisButton) {
if (activeLineEdit) {
layout->replaceWidget(activeLineEdit, previousEllipsisButton);
activeLineEdit->deleteLater();
activeLineEdit = nullptr;
if (previousEllipsisButton) {
previousEllipsisButton->show();
}
}
auto *lineEdit = new QLineEdit(this);
lineEdit->setFixedSize(40, 40);
lineEdit->setStyleSheet(R"(
border: 2px solid #DCD174;
font-family: Inter;
font-size: 18px;
font-weight: 400;
line-height: 31.47px;
text-align: left;
background: #00000000;
color: #13385F;
)");
lineEdit->setAlignment(Qt::AlignCenter);
lineEdit->setValidator(new QIntValidator(1, totalPages, this));
layout->replaceWidget(ellipsisButton, lineEdit);
ellipsisButton->hide();
lineEdit->setFocus();
activeLineEdit = lineEdit;
previousEllipsisButton = ellipsisButton;
connect(lineEdit, &QLineEdit::editingFinished, [this, lineEdit, ellipsisButton]() {
bool ok;
int page = lineEdit->text().toInt(&ok);
if (ok && page >= 1 && page <= totalPages) {
currentPage = page;
emit pageChanged(currentPage);
}
layout->replaceWidget(lineEdit, ellipsisButton);
lineEdit->deleteLater();
activeLineEdit = nullptr;
ellipsisButton->show();
updateButtons();
});
}
void PaginationBar::updateButtons() {
if (activeLineEdit) {
for (auto *button : pageButtons) {
if (!button->isVisible()) {
layout->replaceWidget(activeLineEdit, button);
activeLineEdit->deleteLater();
activeLineEdit = nullptr;
button->show();
break;
}
}
}
for (auto *button : pageButtons) {
layout->removeWidget(button);
button->deleteLater();
}
pageButtons.clear();
if (totalPages <= 7) {
for (int i = 1; i <= totalPages; ++i) {
addPageButton(i);
}
} else {
if (currentPage <= 4) {
for (int i = 1; i <= 5; ++i) addPageButton(i);
addEllipsisButton();
addPageButton(totalPages);
} else if (currentPage >= totalPages - 3) {
addPageButton(1);
addEllipsisButton();
for (int i = totalPages - 4; i <= totalPages; ++i) addPageButton(i);
} else {
addPageButton(1);
addEllipsisButton();
for (int i = currentPage - 1; i <= currentPage + 1; ++i) addPageButton(i);
addEllipsisButton();
addPageButton(totalPages);
}
}
}
void PaginationBar::addPageButton(int page) {
auto *button = new QPushButton(QString::number(page), this);
button->setFixedSize(40, 40);
if (page == currentPage) {
button->setStyleSheet(R"(
QPushButton {
background: #13385f;
border: none;
border-radius: 5px;
color: white;
}
)");
} else {
button->setStyleSheet(R"(
QPushButton {
background: transparent;
border: none;
border-radius: 5px;
color: #13385f;
}
QPushButton:hover {
background-color: #e5e5e5;
}
)");
}
connect(button, &QPushButton::clicked, [this, page]() { onPageButtonClicked(page); });
pageButtons.append(button);
layout->insertWidget(layout->count() - 1, button);
}
void PaginationBar::addEllipsisButton() {
auto *button = new QPushButton("...", this);
button->setFixedSize(40, 40);
button->setStyleSheet(R"(
QPushButton {
background: transparent;
border: none;
color: #13385f;
}
)");
connect(button, &QPushButton::clicked, [this, button]() { onEllipsisClicked(button); });
pageButtons.append(button);
layout->insertWidget(layout->count() - 1, button);
}