Files
cinema-ticket-management-sy…/ui/widgets/directories_management_widget.cpp
T
2026-07-12 14:34:52 +04:00

161 lines
5.0 KiB
C++

#include "directories_management_widget.h"
// Genre
#include "create_genre_request.h"
#include "genres_model.h"
#include "genres_repository.h"
// Hall
#include "create_hall_request.h"
#include "halls_model.h"
#include "halls_repository.h"
// Movie
#include "create_movie_request.h"
#include "movies_model.h"
#include "movies_repository.h"
// Common
#include "error_dialog.h"
#include "model_manager.h"
#include "repository_manager.h"
#include "repository_result.h"
#include "schema_metadata.h"
#include <QMessageBox>
DirectoriesManagementWidget::DirectoriesManagementWidget(QWidget *parent)
: QWidget(parent), selectedGenreId_(-1), selectedHallId_(-1),
selectedMovieId_(-1) {
setupUi(this);
initializeRepositories(); // First of second
initializeModels(); // First of second
setupTableViews(); // After initialization of models
setupGenreFinder();
setupConnections();
}
void DirectoriesManagementWidget::initializeRepositories() {
RepositoryManager &repositoryManager = RepositoryManager::instance();
SchemaMetadata metadata = SchemaMetadata::defaultSchema();
genresRepository_ = repositoryManager.getRepositoryAs<GenresRepository>(
metadata.repositoryTableName("genres"));
hallsRepository_ = repositoryManager.getRepositoryAs<HallsRepository>(
metadata.repositoryTableName("halls"));
moviesRepository_ = repositoryManager.getRepositoryAs<MoviesRepository>(
metadata.repositoryTableName("movies"));
if (!bool(genresRepository_ && hallsRepository_ && moviesRepository_)) {
qFatal()
<< "DirectoriesManagementWidget::initializeRepositories: Failed to "
"initialize repositories";
}
}
void DirectoriesManagementWidget::initializeModels() {
ModelManager &modelManager = ModelManager::instance();
SchemaMetadata metadata = SchemaMetadata::defaultSchema();
genresModel_ =
modelManager.getModelAs<GenresModel>(metadata.modelTableName("genres"));
hallsModel_ =
modelManager.getModelAs<HallsModel>(metadata.modelTableName("halls"));
moviesModel_ =
modelManager.getModelAs<MoviesModel>(metadata.modelTableName("movies"));
if (!bool(genresModel_ && hallsModel_ && moviesModel_)) {
qFatal() << "DirectoriesManagementWidget::initializeModels: Failed to "
"initialize models";
}
}
void DirectoriesManagementWidget::setupGenreFinder() {
SchemaMetadata metadata = SchemaMetadata::defaultSchema();
genreFinder->setDefaultRelation("genres");
genreFinder->setLabelText(EntityFinderWidget::tr("Select genre"));
genreFinder->setLineEditPlaceholder(
EntityFinderWidget::tr("Here will be information about selected genre"));
}
void DirectoriesManagementWidget::setupTableViews() {
tableHalls->setModel(hallsModel_);
tableMovies->setModel(moviesModel_);
tableGenres->setModel(genresModel_);
}
void DirectoriesManagementWidget::setupConnections() {
connect(btnAddHall, &QPushButton::clicked, this,
&DirectoriesManagementWidget::onPushButtonAddHallClicked);
connect(btnAddMovie, &QPushButton::clicked, this,
&DirectoriesManagementWidget::onPushButtonAddMovieClicked);
connect(btnAddGenre, &QPushButton::clicked, this,
&DirectoriesManagementWidget::onPushButtonAddGenreClicked);
connect(genreFinder, &EntityFinderWidget::fieldRetrieved, this,
&DirectoriesManagementWidget::onGenreFieldRetrieved);
}
void DirectoriesManagementWidget::onPushButtonAddMovieClicked() {
if (selectedGenreId_ == -1) {
QMessageBox::warning(this, QMessageBox::tr("Error"),
QMessageBox::tr("No genre selected"));
}
QString title = lineEditMovieName->text();
int duration = spinBoxMovieDuration->value();
CreateMovieRequest request;
request.setTitle(title);
request.setDuration(duration);
request.setGenreId(selectedGenreId_);
RepositoryResult result = moviesRepository_->createMovie(request);
if (!result.success) {
qWarning() << "Failed to create movie:" << result.errorMessage;
ErrorDialog::displayError(this, result.errorMessage);
}
}
void DirectoriesManagementWidget::onPushButtonAddHallClicked() {
QString name = lineEditHallName->text();
int capacity = spinBoxNumberOfSeats->value();
CreateHallRequest request;
request.setHallName(name);
request.setCapacity(capacity);
RepositoryResult result = hallsRepository_->createHall(request);
if (!result.success) {
qWarning() << "Failed to create hall:" << result.errorMessage;
ErrorDialog::displayError(this, result.errorMessage);
}
}
void DirectoriesManagementWidget::onGenreFieldRetrieved(
const QSqlField &field) {
selectedGenreId_ = field.value().toInt();
}
void DirectoriesManagementWidget::onPushButtonAddGenreClicked() {
QString name = lineEditGenreName->text();
CreateGenreRequest request;
request.setGenreName(name);
RepositoryResult result = genresRepository_->createGenre(request);
if (!result.success) {
qWarning() << "Failed to create genre:" << result.errorMessage;
ErrorDialog::displayError(this, result.errorMessage);
}
}