// countermanager.cpp #include "countermanager.h" #include #include CounterManager::CounterManager(QObject *parent) : QObject(parent) , m_database(nullptr) { } CounterManager::~CounterManager() { if (m_database) { saveToDatabase(); } } bool CounterManager::initialize(uDataBase *database) { if (!database || !database->isConnected()) { qWarning() << "CounterManager: База данных не подключена"; return false; } m_database = database; return loadFromDatabase(); } bool CounterManager::addCounter(const QString &name, int initialValue) { if (name.isEmpty()) { qWarning() << "CounterManager: Нельзя добавить счётчик с пустым именем"; return false; } if (contains(name)) { qWarning() << "CounterManager: Счётчик с именем" << name << "уже существует"; return false; } Counter newCounter(name, initialValue); m_counters.append(newCounter); if (!saveToDatabase()) { m_counters.removeLast(); return false; } emit counterAdded(name, initialValue); emit dataChanged(); return true; } bool CounterManager::removeCounter(const QString &name) { int index = findIndex(name); if (index == -1) { qWarning() << "CounterManager: Счётчик" << name << "не найден"; return false; } Counter removed = m_counters.at(index); m_counters.removeAt(index); if (!saveToDatabase()) { m_counters.insert(index, removed); return false; } emit counterRemoved(name); emit dataChanged(); return true; } bool CounterManager::updateCounter(const QString &oldName, const QString &newName, int newValue) { int index = findIndex(oldName); if (index == -1) { qWarning() << "CounterManager: Счётчик" << oldName << "не найден"; return false; } if (oldName != newName && contains(newName)) { qWarning() << "CounterManager: Имя" << newName << "уже занято"; return false; } Counter oldCounter = m_counters.at(index); m_counters[index].name = newName; m_counters[index].count = newValue; if (!saveToDatabase()) { m_counters[index] = oldCounter; return false; } emit counterUpdated(oldName, newName); emit dataChanged(); return true; } bool CounterManager::incrementCounter(const QString &name, int step) { int index = findIndex(name); if (index == -1) return false; m_counters[index].count += step; if (!saveToDatabase()) { m_counters[index].count -= step; // откат return false; } emit counterIncremented(name, m_counters[index].count); emit dataChanged(); return true; } bool CounterManager::decrementCounter(const QString &name, int step) { return incrementCounter(name, -step); } int CounterManager::getCount(const QString &name) const { int index = findIndex(name); return (index != -1) ? m_counters.at(index).count : 0; } void CounterManager::processMessage(const QString &message) { for (const Counter &c : m_counters) { if (message.contains(c.name, Qt::CaseInsensitive)) { // Увеличиваем счётчик, но без повторного сохранения после каждого (один общий save) // Здесь мы меняем значение, но сохраним после цикла, чтобы не делать много запросов // Для простоты используем incrementCounter, который сам сохраняет, но это будет много раз. // Лучше собрать имена, которые нужно увеличить, а потом применить. // Но в данном случае можно просто вызывать incrementCounter, это не критично. incrementCounter(c.name); } } } bool CounterManager::contains(const QString &name) const { return findIndex(name) != -1; } bool CounterManager::saveToDatabase() { if (!m_database) { qWarning() << "CounterManager: База данных не установлена"; return false; } QTableWidget tempTable; QStringList headers = {"Имя", "Значение"}; tempTable.setColumnCount(2); tempTable.setHorizontalHeaderLabels(headers); tempTable.setRowCount(m_counters.size()); for (int i = 0; i < m_counters.size(); ++i) { const Counter &c = m_counters.at(i); tempTable.setItem(i, 0, new QTableWidgetItem(c.name)); tempTable.setItem(i, 1, new QTableWidgetItem(QString::number(c.count))); } tempTable.setObjectName("sgCounters"); // Сохраняем через общий метод (предполагаем, что таблица в БД называется "sgCounters") m_database->SaveTableWidget(&tempTable); return true; } bool CounterManager::loadFromDatabase() { if (!m_database) { qWarning() << "CounterManager: База данных не установлена"; return false; } QTableWidget tempTable; QStringList headers = {"Имя", "Значение"}; tempTable.setColumnCount(2); tempTable.setHorizontalHeaderLabels(headers); tempTable.setObjectName("sgCounters"); m_database->LoadTableWidget(&tempTable); m_counters.clear(); for (int row = 0; row < tempTable.rowCount(); ++row) { QTableWidgetItem *nameItem = tempTable.item(row, 0); QTableWidgetItem *valueItem = tempTable.item(row, 1); if (!nameItem || !valueItem) continue; QString name = nameItem->text().trimmed(); if (name.isEmpty()) continue; bool ok; int value = valueItem->text().toInt(&ok); if (!ok) continue; m_counters.append(Counter(name, value)); } emit dataChanged(); return true; } int CounterManager::findIndex(const QString &name) const { for (int i = 0; i < m_counters.size(); ++i) { if (m_counters.at(i).name == name) return i; } return -1; }