161 lines
6.1 KiB
C++
161 lines
6.1 KiB
C++
#include "routeswidget.h"
|
||
#include "../../services/database.h"
|
||
#include <QTableWidget>
|
||
#include <QHeaderView>
|
||
#include <QMessageBox>
|
||
#include <QInputDialog>
|
||
|
||
RoutesWidget::RoutesWidget(QWidget* parent) : QWidget(parent) {
|
||
QVBoxLayout* mainLayout = new QVBoxLayout(this);
|
||
|
||
QLabel* title = new QLabel("Управление рейсами", this);
|
||
title->setStyleSheet("font-size: 20px; font-weight: bold;");
|
||
mainLayout->addWidget(title);
|
||
|
||
m_table = new QTableWidget(this);
|
||
m_table->setColumnCount(6);
|
||
m_table->setHorizontalHeaderLabels({"ID", "Маршрут", "Время отправления", "Цена", "Всего мест", "Свободно"});
|
||
m_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
||
m_table->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||
m_table->setSelectionMode(QAbstractItemView::SingleSelection);
|
||
m_table->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||
mainLayout->addWidget(m_table);
|
||
|
||
QHBoxLayout* btnLayout = new QHBoxLayout();
|
||
m_addBtn = new QPushButton("Добавить", this);
|
||
m_editBtn = new QPushButton("Редактировать", this);
|
||
m_deleteBtn = new QPushButton("Удалить", this);
|
||
btnLayout->addWidget(m_addBtn);
|
||
btnLayout->addWidget(m_editBtn);
|
||
btnLayout->addWidget(m_deleteBtn);
|
||
btnLayout->addStretch();
|
||
mainLayout->addLayout(btnLayout);
|
||
|
||
connect(m_addBtn, &QPushButton::clicked, this, &RoutesWidget::onAddClicked);
|
||
connect(m_editBtn, &QPushButton::clicked, this, &RoutesWidget::onEditClicked);
|
||
connect(m_deleteBtn, &QPushButton::clicked, this, &RoutesWidget::onDeleteClicked);
|
||
|
||
loadRoutes();
|
||
}
|
||
|
||
void RoutesWidget::loadRoutes() {
|
||
QVector<Route> routes = Database::instance().getAllRoutes();
|
||
m_table->setRowCount(routes.size());
|
||
|
||
for (int i = 0; i < routes.size(); ++i) {
|
||
const Route& route = routes[i];
|
||
m_table->setItem(i, 0, new QTableWidgetItem(QString::number(route.id)));
|
||
m_table->setItem(i, 1, new QTableWidgetItem(route.routeName));
|
||
m_table->setItem(i, 2, new QTableWidgetItem(route.departureTime));
|
||
m_table->setItem(i, 3, new QTableWidgetItem(QString::number(route.price, 'f', 2)));
|
||
m_table->setItem(i, 4, new QTableWidgetItem(QString::number(route.totalSeats)));
|
||
m_table->setItem(i, 5, new QTableWidgetItem(QString::number(route.availableSeats)));
|
||
}
|
||
}
|
||
|
||
void RoutesWidget::onAddClicked() {
|
||
RouteDialog dialog;
|
||
if (dialog.exec() == QDialog::Accepted) {
|
||
if (Database::instance().addRoute(
|
||
dialog.getRouteName(),
|
||
dialog.getDepartureTime(),
|
||
dialog.getPrice(),
|
||
dialog.getTotalSeats())) {
|
||
loadRoutes();
|
||
QMessageBox::information(this, "Успех", "Рейс добавлен!");
|
||
}
|
||
}
|
||
}
|
||
|
||
void RoutesWidget::onEditClicked() {
|
||
int row = m_table->currentRow();
|
||
if (row < 0) {
|
||
QMessageBox::warning(this, "Ошибка", "Выберите рейс для редактирования!");
|
||
return;
|
||
}
|
||
|
||
int id = m_table->item(row, 0)->text().toInt();
|
||
Route route = Database::instance().getRoute(id);
|
||
|
||
RouteDialog dialog(&route, this);
|
||
if (dialog.exec() == QDialog::Accepted) {
|
||
route.routeName = dialog.getRouteName();
|
||
route.departureTime = dialog.getDepartureTime();
|
||
route.price = dialog.getPrice();
|
||
|
||
if (route.totalSeats != dialog.getTotalSeats()) {
|
||
int diff = dialog.getTotalSeats() - route.totalSeats;
|
||
route.totalSeats = dialog.getTotalSeats();
|
||
route.availableSeats += diff;
|
||
if (route.availableSeats < 0) route.availableSeats = 0;
|
||
}
|
||
|
||
if (Database::instance().updateRoute(route)) {
|
||
loadRoutes();
|
||
QMessageBox::information(this, "Успех", "Рейс обновлен!");
|
||
}
|
||
}
|
||
}
|
||
|
||
void RoutesWidget::onDeleteClicked() {
|
||
int row = m_table->currentRow();
|
||
if (row < 0) {
|
||
QMessageBox::warning(this, "Ошибка", "Выберите рейс для удаления!");
|
||
return;
|
||
}
|
||
|
||
int id = m_table->item(row, 0)->text().toInt();
|
||
|
||
QMessageBox::StandardButton reply = QMessageBox::question(
|
||
this, "Подтверждение", "Удалить выбранный рейс?",
|
||
QMessageBox::Yes | QMessageBox::No);
|
||
|
||
if (reply == QMessageBox::Yes) {
|
||
if (Database::instance().deleteRoute(id)) {
|
||
loadRoutes();
|
||
QMessageBox::information(this, "Успех", "Рейс удален!");
|
||
}
|
||
}
|
||
}
|
||
|
||
RouteDialog::RouteDialog(Route* route, QWidget* parent)
|
||
: QDialog(parent)
|
||
{
|
||
setWindowTitle(route ? "Редактирование рейса" : "Добавление рейса");
|
||
setFixedSize(400, 250);
|
||
|
||
QFormLayout* form = new QFormLayout(this);
|
||
|
||
m_nameEdit = new QLineEdit(this);
|
||
m_dateTimeEdit = new QDateTimeEdit(this);
|
||
m_dateTimeEdit->setCalendarPopup(true);
|
||
m_dateTimeEdit->setDateTime(QDateTime::currentDateTime().addDays(1));
|
||
m_priceEdit = new QLineEdit(this);
|
||
m_priceEdit->setPlaceholderText("0.00");
|
||
m_seatsEdit = new QLineEdit(this);
|
||
m_seatsEdit->setPlaceholderText("100");
|
||
|
||
if (route) {
|
||
m_nameEdit->setText(route->routeName);
|
||
m_dateTimeEdit->setDateTime(QDateTime::fromString(route->departureTime, "yyyy-MM-dd HH:mm:ss"));
|
||
m_priceEdit->setText(QString::number(route->price, 'f', 2));
|
||
m_seatsEdit->setText(QString::number(route->totalSeats));
|
||
}
|
||
|
||
form->addRow("Маршрут:", m_nameEdit);
|
||
form->addRow("Время отправления:", m_dateTimeEdit);
|
||
form->addRow("Цена билета:", m_priceEdit);
|
||
form->addRow("Всего мест:", m_seatsEdit);
|
||
|
||
QHBoxLayout* btnLayout = new QHBoxLayout();
|
||
QPushButton* okBtn = new QPushButton("ОК", this);
|
||
QPushButton* cancelBtn = new QPushButton("Отмена", this);
|
||
btnLayout->addStretch();
|
||
btnLayout->addWidget(okBtn);
|
||
btnLayout->addWidget(cancelBtn);
|
||
form->addRow(btnLayout);
|
||
|
||
connect(okBtn, &QPushButton::clicked, this, &QDialog::accept);
|
||
connect(cancelBtn, &QPushButton::clicked, this, &QDialog::reject);
|
||
}
|