#include "airportwidget.h"
#include "ui_airportwidget.h"
#include "src/gui/dialogues/newairportdialog.h"
#include "src/database/database.h"
AirportWidget::AirportWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::AirportWidget)
{
ui->setupUi(this);
setupModelAndeView();
setupSearch();
QObject::connect(DB, &OPL::Database::dataBaseUpdated,
this, &AirportWidget::refresh);
QObject::connect(view->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &AirportWidget::onSelectionChanged);
QObject::connect(view, &QTableView::doubleClicked,
this, &AirportWidget::on_editAirportPushButton_clicked);
}
AirportWidget::~AirportWidget()
{
delete ui;
}
void AirportWidget::setupModelAndeView()
{
model = new QSqlTableModel(this);
model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->setTable(TABLE_NAME);
model->select();
model->sort(1, Qt::AscendingOrder);
view = ui->tableView;
view->setModel(model);
view->horizontalHeader()->setStretchLastSection(QHeaderView::Stretch);
view->setSelectionBehavior(QAbstractItemView::SelectRows);
view->setSelectionMode(QAbstractItemView::ExtendedSelection);
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
view->hideColumn(0);
view->resizeColumnsToContents();
view->verticalHeader()->hide();
view->setAlternatingRowColors(true);
view->show();
}
void AirportWidget::setupSearch()
{
for (const auto &item : HEADER_MAP)
ui->searchComboBox->addItem(item);
}
void AirportWidget::on_searchLineEdit_textChanged(const QString &arg1)
{
if(arg1.length() == 0) {
model->setFilter("");
model->select();
return;
}
model->setFilter(FILTER_MAP.value(ui->searchComboBox->currentIndex())
+ arg1 + QLatin1String("%\""));
DEB << "Filter set: " << FILTER_MAP.value(ui->searchComboBox->currentIndex())
+ arg1 + QLatin1String("%\"");
}
void AirportWidget::on_searchComboBox_currentIndexChanged(int index)
{
ui->searchLineEdit->setText(QString());
}
void AirportWidget::on_newAirportPushButton_clicked()
{
auto ap_dialog = new NewAirportDialog(this);
if (ap_dialog->exec() == QDialog::Accepted) {
model->select();
emit DB->dataBaseUpdated(OPL::DbTable::Airports);
}
}
void AirportWidget::on_deletePushButton_clicked()
{
DEB << "Airports selected: " << selectedEntries.length();
if (selectedEntries.length() == 0) {
WARN(tr("
No Airport selected.
"));
return;
} else if (selectedEntries.length() > 0 && selectedEntries.length() <= 10) {
QStringList selected_airport_names;
for (const auto row_id : qAsConst(selectedEntries)) {
const auto data = DB->getRowData(OPL::DbTable::Airports, row_id);
selected_airport_names.append(data.value(OPL::AirportEntry::NAME).toString());
}
QString selected_airports_string;
for (auto &name : selected_airport_names) {
selected_airports_string.append(name);
selected_airports_string.append(QStringLiteral("
"));
}
QMessageBox confirm(this);
confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
confirm.setDefaultButton(QMessageBox::No);
confirm.setIcon(QMessageBox::Question);
confirm.setWindowTitle("Delete Airport");
confirm.setText(tr("The following airport(s) will be deleted:
"
"%1
"
"Deleting airports is irreversible.
Do you want to proceed?"
).arg(selected_airports_string));
if (confirm.exec() == QMessageBox::Yes) {
for (auto& row_id : selectedEntries) {
if(!DB->remove(OPL::Row(OPL::DbTable::Airports, row_id))) {
WARN(tr("
Unable to delete.
The following error has ocurred: %1"
).arg(DB->lastError.text()));
return;
}
}
INFO(tr("%1 Airports have been deleted successfully."
).arg(QString::number(selectedEntries.length())));
model->select();
}
} else if (selectedEntries.length() > 10) {
QMessageBox confirm;
confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
confirm.setDefaultButton(QMessageBox::No);
confirm.setIcon(QMessageBox::Warning);
confirm.setWindowTitle("Delete Airports");
confirm.setText(tr("You have selected %1 airports.
"
"Deleting airports is irreversible.
"
"Are you sure you want to proceed?"
).arg(QString::number(selectedEntries.length())));
if(confirm.exec() == QMessageBox::Yes) {
if (!DB->removeMany(OPL::DbTable::Airports, selectedEntries)) {
WARN(tr("Unable to delete. No changes have been made to the database. The following error has ocurred:
%1").arg(DB->lastError.text()));
return;
}
INFO(tr("%1 Airports have been deleted successfully."
).arg(QString::number(selectedEntries.length())));
model->select();
}
model->select();
}
}
void AirportWidget::on_editAirportPushButton_clicked()
{
if (selectedEntries.isEmpty()) {
WARN(tr("No airport selected."));
return;
}
auto apd = new NewAirportDialog(selectedEntries.first(), this);
apd->exec();
}
void AirportWidget::refresh()
{
model->select();
}
void AirportWidget::onSelectionChanged()
{
selectedEntries.clear();
for (const auto& row : view->selectionModel()->selectedRows()) {
selectedEntries.append(row.data().toInt());
DEB << "Selected Airport(s) with ID: " << selectedEntries;
}
}