добавил обработку счетчиков
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user