216 lines
6.1 KiB
C++
216 lines
6.1 KiB
C++
// countermanager.cpp
|
||
#include "countermanager.h"
|
||
#include <QTableWidget>
|
||
#include <QDebug>
|
||
|
||
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;
|
||
}
|