#include "FileLogWindow.h" #include #include #include #include "dao/GeneralLogDAO.h" static constexpr int COL_ID = 0; static constexpr int COL_TIME = 1; static constexpr int COL_LEVEL = 2; static constexpr int COL_SOURCE = 3; static constexpr int COL_MESSAGE = 4; FileLogWindow::FileLogWindow(QWidget *parent) : QDialog(parent) { setWindowTitle("Логи"); resize(1100, 600); m_table = new QTableWidget(this); m_table->setColumnCount(5); m_table->setHorizontalHeaderLabels({"#", "Время", "Уровень", "Источник", "Сообщение"}); m_table->setEditTriggers(QAbstractItemView::NoEditTriggers); m_table->setSelectionBehavior(QAbstractItemView::SelectRows); m_table->setSelectionMode(QAbstractItemView::SingleSelection); m_table->verticalHeader()->hide(); m_table->horizontalHeader()->setStretchLastSection(true); m_table->setColumnWidth(COL_ID, 45); m_table->setColumnWidth(COL_TIME, 145); m_table->setColumnWidth(COL_LEVEL, 80); m_table->setColumnWidth(COL_SOURCE, 250); m_showAllCheck = new QCheckBox("Показать все (включая DEBUG/INFO)", this); m_prevBtn = new QPushButton("←", this); m_nextBtn = new QPushButton("→", this); m_pageLabel = new QLabel(this); m_pageLabel->setAlignment(Qt::AlignCenter); m_pageLabel->setMinimumWidth(140); auto *refreshBtn = new QPushButton("Обновить", this); auto *paginationLayout = new QHBoxLayout; paginationLayout->addWidget(m_prevBtn); paginationLayout->addWidget(m_pageLabel); paginationLayout->addWidget(m_nextBtn); paginationLayout->addStretch(); paginationLayout->addWidget(m_showAllCheck); paginationLayout->addWidget(refreshBtn); auto *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(m_table, 1); mainLayout->addLayout(paginationLayout); connect(m_prevBtn, &QPushButton::clicked, this, [this]() { if (m_page > 0) { --m_page; loadPage(); } }); connect(m_nextBtn, &QPushButton::clicked, this, [this]() { if (m_page < m_totalPages - 1) { ++m_page; loadPage(); } }); connect(refreshBtn, &QPushButton::clicked, this, [this]() { m_page = 0; loadPage(); }); connect(m_showAllCheck, &QCheckBox::toggled, this, [this]() { m_page = 0; loadPage(); }); loadPage(); } QStringList FileLogWindow::currentLevelFilter() const { if (m_showAllCheck->isChecked()) return {}; return {"WARNING", "CRITICAL", "FATAL"}; } void FileLogWindow::loadPage() { const QStringList levels = currentLevelFilter(); const int total = GeneralLogDAO::getTotalCount(levels); m_totalPages = qMax(1, (total + m_pageSize - 1) / m_pageSize); m_page = qBound(0, m_page, m_totalPages - 1); const QList entries = GeneralLogDAO::getLogs(m_page, m_pageSize, levels); m_table->setRowCount(static_cast(entries.size())); for (int i = 0; i < entries.size(); ++i) { const auto &e = entries[i]; m_table->setItem(i, COL_ID, new QTableWidgetItem(QString::number(e.id))); m_table->setItem(i, COL_TIME, new QTableWidgetItem( e.timestamp.toLocalTime().toString("dd.MM.yy HH:mm:ss"))); m_table->setItem(i, COL_LEVEL, new QTableWidgetItem(e.level)); m_table->setItem(i, COL_SOURCE, new QTableWidgetItem(e.source)); m_table->setItem(i, COL_MESSAGE, new QTableWidgetItem(e.message)); } updatePagination(); } void FileLogWindow::updatePagination() { m_pageLabel->setText(QString("Страница %1 из %2").arg(m_page + 1).arg(m_totalPages)); m_prevBtn->setEnabled(m_page > 0); m_nextBtn->setEnabled(m_page < m_totalPages - 1); }