File indexing completed on 2024-12-01 12:23:11
0001 /* 0002 SPDX-FileCopyrightText: 2021 Valentin Boettcher <hiro at protagon.space; @hiro98:tchncs.de> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include <QMessageBox> 0008 #include "catalogdetails.h" 0009 #include "detaildialog.h" 0010 #include "kstarsdata.h" 0011 #include "kstars.h" 0012 #include "ui_catalogdetails.h" 0013 #include "catalogeditform.h" 0014 #include "addcatalogobject.h" 0015 #include "catalogcsvimport.h" 0016 #include "skymapcomposite.h" 0017 #include "catalogscomponent.h" 0018 0019 constexpr int CatalogDetails::list_size; 0020 0021 CatalogDetails::CatalogDetails(QWidget *parent, const QString &db_path, 0022 const int catalog_id) 0023 : QDialog(parent), ui(new Ui::CatalogDetails), m_manager{ db_path }, 0024 m_catalog_id{ catalog_id }, m_timer{ new QTimer(this) } 0025 { 0026 ui->setupUi(this); 0027 reload_catalog(); 0028 reload_objects(); 0029 ui->name_filter->setPlaceholderText(i18n("Showing <= %1 entries. Enter a name (case " 0030 "sensitive) to narrow down the search.", 0031 list_size)); 0032 0033 m_timer->setInterval(200); 0034 connect(m_timer, &QTimer::timeout, this, &CatalogDetails::reload_objects); 0035 0036 connect(ui->name_filter, &QLineEdit::textChanged, this, 0037 [&](const auto) { m_timer->start(); }); 0038 0039 ui->object_table->setModel(&m_model); 0040 ui->object_table->setSelectionBehavior(QAbstractItemView::SelectRows); 0041 ui->object_table->adjustSize(); 0042 ui->object_table->horizontalHeader()->setSectionResizeMode( 0043 QHeaderView::ResizeMode::ResizeToContents); 0044 0045 connect(ui->object_table, &QTableView::doubleClicked, this, 0046 &CatalogDetails::show_object_details); 0047 0048 connect(ui->object_table, &QTableView::clicked, [&](const auto) { 0049 if (!m_catalog.mut) 0050 return; 0051 0052 ui->remove_object->setEnabled(true); 0053 ui->edit_object->setEnabled(true); 0054 ui->object_group->setEnabled(true); 0055 }); 0056 0057 connect(ui->edit, &QPushButton::clicked, this, &CatalogDetails::edit_catalog_meta); 0058 0059 connect(ui->add_object, &QPushButton::clicked, this, &CatalogDetails::add_object); 0060 0061 connect(ui->remove_object, &QPushButton::clicked, this, 0062 &CatalogDetails::remove_objects); 0063 0064 connect(ui->edit_object, &QPushButton::clicked, this, &CatalogDetails::edit_objects); 0065 0066 connect(ui->import_csv, &QPushButton::clicked, this, &CatalogDetails::import_csv); 0067 } 0068 0069 CatalogDetails::~CatalogDetails() 0070 { 0071 delete ui; 0072 } 0073 0074 void CatalogDetails::reload_catalog() 0075 { 0076 const auto &found = m_manager.get_catalog(m_catalog_id); 0077 if (!found.first) 0078 { 0079 QMessageBox::warning(this, i18n("Warning"), 0080 i18n("Could not load the catalog with id=%1", m_catalog_id)); 0081 reject(); 0082 } 0083 0084 m_catalog = found.second; 0085 0086 ui->catalogInfo->setTitle(m_catalog.name); 0087 ui->id->setText(QString::number(m_catalog.id)); 0088 ui->precedence->setText(QString::number(m_catalog.precedence)); 0089 ui->author->setText(m_catalog.author); 0090 ui->maintainer->setText(m_catalog.maintainer); 0091 ui->source->setText(m_catalog.source); 0092 ui->description->setText(m_catalog.description); 0093 ui->version->setText(QString::number(m_catalog.version)); 0094 ui->license->setText(m_catalog.license); 0095 0096 ui->edit->setEnabled(m_catalog.mut); 0097 ui->add_object->setEnabled(m_catalog.mut); 0098 ui->import_csv->setEnabled(m_catalog.mut); 0099 } 0100 0101 void CatalogDetails::reload_objects() 0102 { 0103 const auto objects = m_manager.find_objects_by_name( 0104 m_catalog.id, ui->name_filter->displayText(), list_size); 0105 0106 m_model.setObjects({ objects.cbegin(), objects.cend() }); 0107 m_timer->stop(); 0108 } 0109 0110 void CatalogDetails::show_object_details(const QModelIndex &index) 0111 { 0112 const auto &obj = m_model.getObject(index); 0113 auto &inserted_obj = 0114 KStarsData::Instance()->skyComposite()->catalogsComponent()->insertStaticObject( 0115 obj); 0116 0117 auto *dialog = new DetailDialog(&inserted_obj, KStarsData::Instance()->lt(), 0118 KStarsData::Instance()->geo(), this); 0119 connect(this, &QDialog::finished, dialog, &QDialog::done); 0120 dialog->show(); 0121 } 0122 0123 void CatalogDetails::edit_catalog_meta() 0124 { 0125 auto *dialog = new CatalogEditForm(this, m_catalog, 0, false); 0126 0127 if (dialog->exec() != QDialog::Accepted) 0128 return; 0129 0130 const auto &success = m_manager.update_catalog_meta(dialog->getCatalog()); 0131 if (!success.first) 0132 QMessageBox::warning(this, i18n("Warning"), 0133 i18n("Could not update the catalog.<br>%1", success.second)); 0134 0135 reload_catalog(); 0136 } 0137 0138 void CatalogDetails::add_object() 0139 { 0140 auto *dialog = new AddCatalogObject(this, {}); 0141 0142 if (dialog->exec() != QDialog::Accepted) 0143 return; 0144 0145 const auto &success = m_manager.add_object(m_catalog.id, dialog->get_object()); 0146 if (!success.first) 0147 QMessageBox::warning(this, i18n("Warning"), 0148 i18n("Could not add the object.<br>%1", success.second)); 0149 0150 reload_objects(); 0151 } 0152 0153 void CatalogDetails::remove_objects() 0154 { 0155 const auto &items = ui->object_table->selectionModel()->selectedRows(); 0156 0157 if (items.length() == 0 || !m_catalog.mut) 0158 return; 0159 0160 for (const auto &index : items) 0161 { 0162 const auto &success = 0163 m_manager.remove_object(m_catalog.id, m_model.getObject(index).getObjectId()); 0164 if (!success.first) 0165 QMessageBox::warning( 0166 this, i18n("Warning"), 0167 i18n("Could not remove the object.<br>%1", success.second)); 0168 } 0169 0170 reload_objects(); 0171 } 0172 0173 void CatalogDetails::edit_objects() 0174 { 0175 const auto &items = ui->object_table->selectionModel()->selectedRows(); 0176 0177 if (items.length() == 0 || !m_catalog.mut) 0178 return; 0179 0180 for (const auto &index : items) 0181 { 0182 const auto &obj = m_model.getObject(index); 0183 auto *dialog = new AddCatalogObject(this, obj); 0184 0185 if (dialog->exec() != QDialog::Accepted) 0186 continue; 0187 0188 const auto &success = m_manager.remove_object(m_catalog.id, obj.getObjectId()); 0189 if (!success.first) 0190 QMessageBox::warning(this, i18n("Warning"), 0191 i18n("Could not remove the object.<br>%1", success.second)); 0192 0193 const auto &success_add = 0194 m_manager.add_object(m_catalog.id, dialog->get_object()); 0195 if (!success_add.first) 0196 QMessageBox::warning(this, i18n("Warning"), 0197 i18n("Could not add the object.<br>%1", success_add.second)); 0198 } 0199 0200 reload_objects(); 0201 } 0202 0203 void CatalogDetails::import_csv() 0204 { 0205 CatalogCSVImport dialog{}; 0206 0207 if (dialog.exec() != QDialog::Accepted) 0208 return; 0209 0210 const auto &success_add = m_manager.add_objects(m_catalog.id, dialog.get_objects()); 0211 0212 if (!success_add.first) 0213 QMessageBox::warning(this, i18n("Warning"), 0214 i18n("Could not add the objects.<br>%1", success_add.second)); 0215 0216 reload_objects(); 0217 };