#include "routeswidget.h" #include "database.h" #include #include #include #include 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 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); }