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 }