Add initial project structure with essential files including .gitignore, application resources, and various model and view components for the application. Implemented asynchronous parsing support and database structure checks.

This commit is contained in:
2025-12-08 15:21:18 +03:00
parent 4f8c90c15b
commit 3467003721
110 changed files with 35406 additions and 0 deletions
+130
View File
@@ -0,0 +1,130 @@
#include "stickytableview_simple.h"
#include <QScrollBar>
#include <QHeaderView>
#include <QPainter>
#include <QApplication>
#include <QDebug>
StickyTableViewSimple::StickyTableViewSimple(QWidget *parent)
: QTableView(parent)
, m_stickyColumns(1)
, m_stickyColumnWidth(0)
{
// Настройка горизонтального скроллбара
setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
}
void StickyTableViewSimple::setStickyColumns(int count)
{
if (m_stickyColumns != count) {
m_stickyColumns = count;
updateStickyColumnGeometry();
viewport()->update();
}
}
void StickyTableViewSimple::paintEvent(QPaintEvent *event)
{
// Сначала рисуем обычную таблицу
QTableView::paintEvent(event);
// Затем рисуем липкие столбцы поверх
if (m_stickyColumns > 0 && model()) {
QPainter painter(viewport());
paintStickyColumns(&painter);
}
}
void StickyTableViewSimple::scrollContentsBy(int dx, int dy)
{
QTableView::scrollContentsBy(dx, dy);
// Обновляем геометрию липких столбцов после скролла
updateStickyColumnGeometry();
}
void StickyTableViewSimple::resizeEvent(QResizeEvent *event)
{
QTableView::resizeEvent(event);
updateStickyColumnGeometry();
}
void StickyTableViewSimple::updateStickyColumnGeometry()
{
if (!model() || m_stickyColumns <= 0)
return;
// Вычисляем ширину липких столбцов
m_stickyColumnWidth = 0;
for (int i = 0; i < m_stickyColumns && i < model()->columnCount(); ++i) {
m_stickyColumnWidth += columnWidth(i);
}
// Устанавливаем отступ для основного контента
setViewportMargins(m_stickyColumnWidth, 0, 0, 0);
}
void StickyTableViewSimple::paintStickyColumns(QPainter *painter)
{
if (!model() || m_stickyColumns <= 0)
return;
// Сохраняем состояние painter
painter->save();
// Настраиваем clipping для липких столбцов
QRect stickyRect = QRect(0, 0, m_stickyColumnWidth, viewport()->height());
painter->setClipRect(stickyRect);
// Получаем видимые строки (упрощенный подход)
int visibleRows = model()->rowCount();
int startRow = 0;
int endRow = visibleRows - 1;
// Рисуем липкие столбцы
for (int row = startRow; row <= endRow && row < model()->rowCount(); ++row) {
int y = rowViewportPosition(row);
int currentRowHeight = rowHeight(row);
for (int col = 0; col < m_stickyColumns && col < model()->columnCount(); ++col) {
int x = 0;
for (int i = 0; i < col; ++i) {
x += columnWidth(i);
}
QRect cellRect(x, y, columnWidth(col), currentRowHeight);
// Рисуем фон ячейки
QModelIndex index = model()->index(row, col);
QStyleOptionViewItem option;
option.initFrom(this);
option.rect = cellRect;
option.state = QStyle::State_Enabled;
if (selectionModel() && selectionModel()->isSelected(index)) {
option.state |= QStyle::State_Selected;
}
if (index == currentIndex()) {
option.state |= QStyle::State_HasFocus;
}
style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter);
// Рисуем текст ячейки
QVariant data = model()->data(index, Qt::DisplayRole);
if (data.isValid()) {
painter->drawText(cellRect.adjusted(4, 0, -4, 0),
Qt::AlignVCenter | Qt::AlignLeft,
data.toString());
}
}
}
// Рисуем границы липких столбцов
painter->setPen(QPen(Qt::black, 1));
painter->drawLine(m_stickyColumnWidth - 1, 0, m_stickyColumnWidth - 1, viewport()->height());
// Восстанавливаем состояние painter
painter->restore();
}