You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
5.5 KiB
C++
326 lines
5.5 KiB
C++
#include "cstorage.h"
|
|
|
|
#include <QSqlQuery>
|
|
#include <QSqlError>
|
|
|
|
#include <QStandardItem>
|
|
|
|
#include "common.h"
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
bool sortAsc(cStorage* &v1, cStorage* &v2)
|
|
{
|
|
return(v1->name() < v2->name());
|
|
}
|
|
|
|
|
|
cStorage::cStorage(cDatabase* db, qint32 id, QObject *parent) :
|
|
QObject(parent),
|
|
m_db(db),
|
|
m_changed(false),
|
|
m_id(id),
|
|
m_storageCategory(nullptr),
|
|
m_name(""),
|
|
m_description(""),
|
|
m_item(nullptr)
|
|
{
|
|
}
|
|
|
|
cStorage::cStorage(cStorage* storage)
|
|
{
|
|
set(storage);
|
|
}
|
|
|
|
void cStorage::set(cStorage* storage)
|
|
{
|
|
m_db = storage->db();
|
|
m_id = storage->id();
|
|
m_storageCategory = storage->storageCategory();
|
|
m_name = storage->name();
|
|
m_description = storage->description();
|
|
}
|
|
|
|
void cStorage::setID(const qint32& id)
|
|
{
|
|
m_id = id;
|
|
m_changed = true;
|
|
emit idChanged(id);
|
|
emit storageChanged(this);
|
|
}
|
|
|
|
qint32 cStorage::id()
|
|
{
|
|
return(m_id);
|
|
}
|
|
|
|
void cStorage::setStorageCategory(cStorageCategory* storageCategory)
|
|
{
|
|
m_storageCategory = storageCategory;
|
|
m_changed = true;
|
|
emit storageCategoryChanged(storageCategory);
|
|
emit storageChanged(this);
|
|
}
|
|
|
|
cStorageCategory* cStorage::storageCategory()
|
|
{
|
|
return(m_storageCategory);
|
|
}
|
|
|
|
void cStorage::setName(const QString& name)
|
|
{
|
|
m_name = name;
|
|
m_changed = true;
|
|
emit nameChanged(name);
|
|
emit storageChanged(this);
|
|
}
|
|
|
|
QString cStorage::name()
|
|
{
|
|
return(m_name);
|
|
}
|
|
|
|
void cStorage::setDescription(const QString& description)
|
|
{
|
|
m_description = description;
|
|
m_changed = true;
|
|
emit descriptionChanged(description);
|
|
emit storageChanged(this);
|
|
}
|
|
|
|
QString cStorage::description()
|
|
{
|
|
return(m_description);
|
|
}
|
|
|
|
void cStorage::setItem(QStandardItem* item)
|
|
{
|
|
m_item = item;
|
|
}
|
|
|
|
QStandardItem* cStorage::item()
|
|
{
|
|
return(m_item);
|
|
}
|
|
|
|
bool cStorage::save()
|
|
{
|
|
if(!m_changed)
|
|
return(true);
|
|
|
|
QSqlQuery query;
|
|
|
|
if(m_id == -1)
|
|
query.prepare("INSERT INTO storage (storageCategory, name, description) VALUES (:storageCategory, :name, :description);");
|
|
else
|
|
query.prepare("UPDATE storage SET storageCategory=:storageCategory, name=:name, description=:description WHERE id=:id;");
|
|
|
|
query.bindValue(":id", m_id);
|
|
query.bindValue(":storageCategory", m_storageCategory->id());
|
|
query.bindValue(":name", m_name);
|
|
query.bindValue(":description", m_description);
|
|
|
|
if(!query.exec())
|
|
{
|
|
myDebug << query.lastError().text();
|
|
return(false);
|
|
}
|
|
|
|
if(m_id == -1)
|
|
{
|
|
if(!query.exec("SELECT MAX(id) MAXID FROM storage;"))
|
|
{
|
|
myDebug << query.lastError().text();
|
|
return(false);
|
|
}
|
|
|
|
query.first();
|
|
m_id = query.value("MAXID").toInt();
|
|
}
|
|
m_changed = false;
|
|
return(true);
|
|
}
|
|
|
|
void cStorage::clearSave()
|
|
{
|
|
m_changed = false;
|
|
}
|
|
|
|
bool cStorage::remove()
|
|
{
|
|
QSqlQuery query;
|
|
|
|
query.prepare("DELETE FROM storage WHERE id=:id;");
|
|
query.bindValue(":id", m_id);
|
|
|
|
if(!query.exec())
|
|
{
|
|
myDebug << query.lastError().text();
|
|
return(false);
|
|
}
|
|
|
|
return(true);
|
|
}
|
|
|
|
cDatabase* cStorage::db()
|
|
{
|
|
return(m_db);
|
|
}
|
|
|
|
cStorageList::cStorageList(cDatabase* db, cStorageCategoryList* storageCategoryList, QObject* parent) :
|
|
QObject(parent),
|
|
m_db(db),
|
|
m_storageCategoryList(storageCategoryList)
|
|
{
|
|
}
|
|
|
|
bool cStorageList::load()
|
|
{
|
|
if(!m_db->db().isOpen())
|
|
return(false);
|
|
|
|
QString sql = QString("SELECT id, "
|
|
" storage_category_id, "
|
|
" name, "
|
|
" description "
|
|
"FROM storage "
|
|
"ORDER BY name, "
|
|
" id;");
|
|
QSqlQuery query(m_db->db());
|
|
|
|
query.prepare(sql);
|
|
|
|
if(!query.exec())
|
|
{
|
|
myDebug << query.lastError().text();
|
|
return(false);
|
|
}
|
|
|
|
while(query.next())
|
|
{
|
|
cStorage* lpStorage = new cStorage(m_db, query.value("id").toInt());
|
|
cStorageCategory* storageCatgegory = m_storageCategoryList->find(query.value("storage_category_id").toInt());
|
|
lpStorage->setStorageCategory(storageCatgegory);
|
|
lpStorage->setName(query.value("name").toString());
|
|
lpStorage->setDescription(query.value("description").toString());
|
|
storageCatgegory->addStorage(lpStorage);
|
|
|
|
add(lpStorage);
|
|
}
|
|
|
|
sort();
|
|
|
|
return(true);
|
|
}
|
|
|
|
cStorage* cStorageList::add(const qint32& id)
|
|
{
|
|
cStorage* lpNew = find(id);
|
|
|
|
if(!lpNew)
|
|
{
|
|
lpNew = new cStorage(m_db, id);
|
|
append(lpNew);
|
|
emit storageAdded(lpNew);
|
|
}
|
|
|
|
return(lpNew);
|
|
}
|
|
|
|
cStorage* cStorageList::add(const QString& name)
|
|
{
|
|
cStorage* lpNew = new cStorage(m_db);
|
|
lpNew->setName(name);
|
|
append(lpNew);
|
|
emit storageAdded(lpNew);
|
|
|
|
return(lpNew);
|
|
}
|
|
|
|
void cStorageList::add(cStorage* storage)
|
|
{
|
|
append(storage);
|
|
}
|
|
|
|
bool cStorageList::remove(const qint32& id)
|
|
{
|
|
cStorage* storage = find(id);
|
|
if(!storage)
|
|
return(false);
|
|
|
|
if(!storage->remove())
|
|
return(false);
|
|
|
|
if(!removeOne(storage))
|
|
return(false);
|
|
|
|
emit storageRemoved(storage);
|
|
|
|
return(true);
|
|
}
|
|
|
|
cStorage* cStorageList::find(const qint32& id)
|
|
{
|
|
for(int i = 0;i < count();i++)
|
|
{
|
|
if(at(i)->id() == id)
|
|
return(at(i));
|
|
}
|
|
|
|
return(nullptr);
|
|
}
|
|
|
|
cStorage* cStorageList::find(const QString& name)
|
|
{
|
|
for(int i = 0;i < count();i++)
|
|
{
|
|
if(at(i)->name() == name)
|
|
return(at(i));
|
|
}
|
|
|
|
return(nullptr);
|
|
}
|
|
|
|
void cStorageList::sort()
|
|
{
|
|
std::sort(begin(), end(), sortAsc);
|
|
}
|
|
|
|
bool cStorageList::fillList()
|
|
{
|
|
if(!count())
|
|
return(true);
|
|
|
|
QStandardItem i;
|
|
QFont font = i.font();
|
|
font.setItalic(true);
|
|
font.setBold(true);
|
|
|
|
for(int i = 0;i < count();i++)
|
|
{
|
|
QStandardItem* item = new QStandardItem;
|
|
at(i)->setItem(item);
|
|
item->setText(at(i)->name());
|
|
item->setData(QVariant::fromValue(at(i)), ITEM_STORAGE_DATA);
|
|
item->setFont(font);
|
|
|
|
at(i)->storageCategory()->item()->appendRow(item);
|
|
}
|
|
|
|
return(true);
|
|
}
|
|
|
|
bool cStorageList::save()
|
|
{
|
|
bool ret = true;
|
|
|
|
for(int i = 0;i < count();i++)
|
|
{
|
|
if(!at(i)->save())
|
|
ret = false;
|
|
}
|
|
|
|
return(ret);
|
|
}
|