File indexing completed on 2024-04-14 14:11:45

0001 /*
0002     SPDX-FileCopyrightText: 2014 Utkarsh Simha <utkarshsimha@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "starhopperdialog.h"
0008 
0009 #include "kstars.h"
0010 #include "ksutils.h"
0011 #include "skymap.h"
0012 #include "ksnotification.h"
0013 #include "skymapcomposite.h"
0014 #include "starhopper.h"
0015 #include "targetlistcomponent.h"
0016 #include "dialogs/detaildialog.h"
0017 
0018 StarHopperDialog::StarHopperDialog(QWidget *parent) : QDialog(parent), ui(new Ui::StarHopperDialog)
0019 {
0020     ui->setupUi(this);
0021     m_lw       = ui->listWidget;
0022     m_Metadata = new QStringList();
0023     ui->directionsLabel->setWordWrap(true);
0024     m_sh.reset(new StarHopper());
0025     connect(ui->NextButton, SIGNAL(clicked()), this, SLOT(slotNext()));
0026     connect(ui->GotoButton, SIGNAL(clicked()), this, SLOT(slotGoto()));
0027     connect(ui->DetailsButton, SIGNAL(clicked()), this, SLOT(slotDetails()));
0028     connect(m_lw, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotGoto()));
0029     connect(m_lw, SIGNAL(itemSelectionChanged()), this, SLOT(slotRefreshMetadata()));
0030     connect(this, SIGNAL(finished(int)), this, SLOT(deleteLater()));
0031 }
0032 
0033 StarHopperDialog::~StarHopperDialog()
0034 {
0035     TargetListComponent *t = getTargetListComponent();
0036 
0037     if (t->list)
0038         t->list->clear();
0039     SkyMap::Instance()->forceUpdate(true);
0040     delete ui;
0041 }
0042 
0043 void StarHopperDialog::starHop(const SkyPoint &startHop, const SkyPoint &stopHop, float fov, float maglim)
0044 {
0045     QList<StarObject *> *starList = m_sh->computePath(startHop, stopHop, fov, maglim, m_Metadata);
0046 
0047     if (!starList->empty())
0048     {
0049         foreach (StarObject *so, *starList)
0050         {
0051             setData(so);
0052         }
0053         slotRefreshMetadata();
0054         m_skyObjList = KSUtils::castStarObjListToSkyObjList(starList);
0055         starList->clear();
0056         delete starList;
0057         TargetListComponent *t = getTargetListComponent();
0058         t->list.reset(m_skyObjList);
0059         SkyMap::Instance()->forceUpdate(true);
0060     }
0061     else
0062     {
0063         delete starList;
0064         KSNotification::error(i18n("Star-hopper algorithm failed. If you're trying a large star hop, try using a "
0065                                    "smaller FOV or changing the source point"));
0066         this->done(QDialog::Rejected);
0067     }
0068 }
0069 
0070 void StarHopperDialog::setData(StarObject *sobj)
0071 {
0072     QListWidgetItem *item = new QListWidgetItem();
0073     QString starName;
0074 
0075     if (sobj->name() != "star")
0076     {
0077         starName = sobj->translatedLongName();
0078     }
0079     else if (sobj->getHDIndex())
0080     {
0081         starName = QString("HD%1").arg(QString::number(sobj->getHDIndex()));
0082     }
0083     else
0084     {
0085         starName = "";
0086         starName += sobj->spchar();
0087         starName += QString(" Star of mag %2").arg(QString::number(sobj->mag()));
0088     }
0089     item->setText(starName);
0090     QVariant qv;
0091 
0092     qv.setValue(sobj);
0093     item->setData(Qt::UserRole, qv);
0094     m_lw->addItem(item);
0095 }
0096 
0097 void StarHopperDialog::slotNext()
0098 {
0099     m_lw->setCurrentRow(m_lw->currentRow() + 1);
0100     slotGoto();
0101 }
0102 
0103 void StarHopperDialog::slotGoto()
0104 {
0105     slotRefreshMetadata();
0106     SkyObject *skyobj = getStarData(m_lw->currentItem());
0107 
0108     if (skyobj != nullptr)
0109     {
0110         KStars *ks = KStars::Instance();
0111         ks->map()->setClickedObject(skyobj);
0112         ks->map()->setClickedPoint(skyobj);
0113         ks->map()->slotCenter();
0114     }
0115 }
0116 
0117 void StarHopperDialog::slotDetails()
0118 {
0119     SkyObject *skyobj = getStarData(m_lw->currentItem());
0120 
0121     if (skyobj != nullptr)
0122     {
0123         DetailDialog *detailDialog =
0124             new DetailDialog(skyobj, KStarsData::Instance()->ut(), KStarsData::Instance()->geo(), KStars::Instance());
0125         detailDialog->exec();
0126         delete detailDialog;
0127     }
0128 }
0129 
0130 SkyObject *StarHopperDialog::getStarData(QListWidgetItem *item)
0131 {
0132     if (!item)
0133         return nullptr;
0134     else
0135     {
0136         QVariant v          = item->data(Qt::UserRole);
0137         StarObject *starobj = v.value<StarObject *>();
0138         return starobj;
0139     }
0140 }
0141 
0142 inline TargetListComponent *StarHopperDialog::getTargetListComponent()
0143 {
0144     return KStarsData::Instance()->skyComposite()->getStarHopRouteList();
0145 }
0146 
0147 void StarHopperDialog::slotRefreshMetadata()
0148 {
0149     int row = m_lw->currentRow();
0150 
0151     qDebug() << Q_FUNC_INFO << "Slot RefreshMetadata";
0152     if (row >= 0)
0153     {
0154         ui->directionsLabel->setText(m_Metadata->at(row));
0155     }
0156     else
0157     {
0158         ui->directionsLabel->setText(m_Metadata->at(0));
0159     }
0160     qDebug() << Q_FUNC_INFO << "Slot RefreshMetadata";
0161 }