Files
2026-07-12 14:34:52 +04:00

180 lines
5.6 KiB
C++

#include "entity_deleter_widget.h"
#include "error_dialog.h"
#include "genres_repository_interface.h"
#include "halls_repository_interface.h"
#include "movies_repository_interface.h"
#include "refunds_repository_interface.h"
#include "repository_result.h"
#include "sessions_repository_interface.h"
#include "tickets_repository_interface.h"
#include <QMessageBox>
#include <QSqlTableModel>
EntityDeleterWidget::EntityDeleterWidget(QWidget *parent) : QWidget(parent) {
setupUi(this);
setupComboBoxCurrentTable();
setupEntityFinder();
setupConnections();
}
void EntityDeleterWidget::setupComboBoxCurrentTable() {
SchemaMetadata metadata = SchemaMetadata::defaultSchema();
QStringList databaseTableNames = {"genres", "halls", "movies",
"refunds", "sessions", "tickets"};
for (const QString currentDTN : databaseTableNames) {
comboBoxCurrentTable->addItem(metadata.translatedTableName(currentDTN),
currentDTN);
}
}
void EntityDeleterWidget::setupConnections() {
connect(comboBoxCurrentTable, &QComboBox::currentIndexChanged, this,
&EntityDeleterWidget::onComboBoxCurrentTableCurrentIndexChanged);
connect(entityFinder, &EntityFinderWidget::fieldRetrieved, this,
&EntityDeleterWidget::onFieldRetrieved);
connect(entityFinder, &EntityFinderWidget::recordRetrieved, this,
&EntityDeleterWidget::onRecordRetrieved);
connect(pushButtonDeleteEntity, &QPushButton::clicked, this,
&EntityDeleterWidget::onPushButtonDeleteEntityClicked);
}
void EntityDeleterWidget::setupEntityFinder() {
entityFinder->setLabelText(tr("Select record of current table to delete"));
refreshEntityFinder();
}
void EntityDeleterWidget::refreshEntityFinder() {
const QString &databaseTableName =
comboBoxCurrentTable->currentData().toString();
entityFinder->setDefaultRelation(databaseTableName);
}
void EntityDeleterWidget::onComboBoxCurrentTableCurrentIndexChanged(int index) {
refreshEntityFinder();
const QString &databaseTableName =
comboBoxCurrentTable->currentData().toString();
qInfo() << "Current table was changed:" << "CurrentComboBoxIndex:" << index
<< "databaseTableName:" << databaseTableName;
}
void EntityDeleterWidget::onFieldRetrieved(const QSqlField &field) {
retrievedField_ = field;
}
void EntityDeleterWidget::onRecordRetrieved(const QSqlRecord &record) {
// NOTE: It is possible to reduce the behavior of each of the tables if the
// removal is in different ways with other data
selectedRecord_ = record;
}
template <>
RepositoryResult
EntityDeleterWidget::deleteEntityById<GenresRepositoryInterface>() {
return currentRepository<GenresRepositoryInterface>()->deleteGenreById(
retrievedField_.value().toInt());
}
template <>
RepositoryResult
EntityDeleterWidget::deleteEntityById<HallsRepositoryInterface>() {
return currentRepository<HallsRepositoryInterface>()->deleteHallById(
retrievedField_.value().toInt());
}
template <>
RepositoryResult
EntityDeleterWidget::deleteEntityById<MoviesRepositoryInterface>() {
return currentRepository<MoviesRepositoryInterface>()->deleteMovieById(
retrievedField_.value().toInt());
}
template <>
RepositoryResult
EntityDeleterWidget::deleteEntityById<RefundsRepositoryInterface>() {
return currentRepository<RefundsRepositoryInterface>()->deleteRefundById(
retrievedField_.value().toInt());
}
template <>
RepositoryResult
EntityDeleterWidget::deleteEntityById<SessionsRepositoryInterface>() {
return currentRepository<SessionsRepositoryInterface>()->deleteSessionById(
retrievedField_.value().toInt());
}
template <>
RepositoryResult
EntityDeleterWidget::deleteEntityById<TicketsRepositoryInterface>() {
return currentRepository<TicketsRepositoryInterface>()->deleteTicketById(
retrievedField_.value().toInt());
}
void EntityDeleterWidget::onPushButtonDeleteEntityClicked() {
const QString &databaseTableName =
comboBoxCurrentTable->currentData().toString();
RepositoryResult result;
if (databaseTableName == "genres") {
result = deleteEntityById<GenresRepositoryInterface>();
showMessageDialog(result, tr("Genre deleted successfully"));
} else if (databaseTableName == "halls") {
result = deleteEntityById<HallsRepositoryInterface>();
showMessageDialog(result, tr("Hall deleted successfully"));
} else if (databaseTableName == "movies") {
result = deleteEntityById<MoviesRepositoryInterface>();
showMessageDialog(result, tr("Movie deleted successfully"));
} else if (databaseTableName == "refunds") {
result = deleteEntityById<RefundsRepositoryInterface>();
showMessageDialog(result, tr("Refund deleted successfully"));
} else if (databaseTableName == "sessions") {
result = deleteEntityById<SessionsRepositoryInterface>();
showMessageDialog(result, tr("Session deleted successfully"));
} else if (databaseTableName == "tickets") {
result = deleteEntityById<TicketsRepositoryInterface>();
showMessageDialog(result, tr("Ticket deleted successfully"));
} else {
qCritical() << "EntityDeleterWidget::onPressPushButtonDeleteEntity: "
"Unknown database table name:"
<< databaseTableName;
}
// NOTE: Application connector will reset entity finder
// if (result.success) {
// entityFinder->resetToDefault();
// }
}
void EntityDeleterWidget::showMessageDialog(const RepositoryResult &result,
const QString &successMessage) {
if (!result.success) {
ErrorDialog::displayError(this, result.errorMessage);
} else {
QMessageBox::information(this, QMessageBox::tr("Success"), successMessage);
}
}