Files
StationManager/routeswidget.cpp
2026-04-05 16:14:54 +03:00

161 lines
6.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "routeswidget.h"
#include "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);
}