7 #include "flagmanager.h"
9 #include "config-kstars.h"
12 #include "ksnotification.h"
14 #include "kstars_debug.h"
15 #include "kstarsdata.h"
18 #include "skycomponents/flagcomponent.h"
19 #include "skycomponents/skymapcomposite.h"
22 #include <basedevice.h>
23 #include "indi/indilistener.h"
24 #include "indi/indistd.h"
25 #include "indi/indimount.h"
26 #include "indi/driverinfo.h"
29 #include <KMessageBox>
31 #include <QStandardItemModel>
32 #include <QSortFilterProxyModel>
49 ui =
new FlagManagerUI(
this);
51 setWindowTitle(
i18nc(
"@title:window",
"Flag Manager"));
55 setLayout(mainLayout);
59 connect(buttonBox, SIGNAL(rejected()),
this, SLOT(reject()));
63 ui->hintLabel->setText(
i18n(
"To add custom icons, just add images in %1. File names must begin with flag. "
64 "For example, the file <i>flagSmall_red_cross.png</i> will be shown as <b>Small red "
65 "cross</b> in the combo box.",
69 m_Model->setHorizontalHeaderLabels(
QStringList() <<
i18nc(
"Right Ascension",
"RA") <<
i18nc(
"Declination",
"Dec")
72 m_SortModel->setSourceModel(m_Model);
73 m_SortModel->setDynamicSortFilter(
true);
74 ui->flagList->setModel(m_SortModel);
75 ui->flagList->horizontalHeader()->setStretchLastSection(
true);
79 ui->saveButton->setEnabled(
false);
82 imageList = m_Ks->data()->skyComposite()->flags()->imageList();
83 flagNames = m_Ks->data()->skyComposite()->flags()->getNames();
88 for (i = 0; i < m_Ks->data()->skyComposite()->flags()->
size(); ++i)
93 itemList <<
new QStandardItem(flags->pointList().
at(i)->ra0().toHMSString())
108 connect(ui->addButton, SIGNAL(clicked()),
this, SLOT(slotAddFlag()));
109 connect(ui->delButton, SIGNAL(clicked()),
this, SLOT(slotDeleteFlag()));
110 connect(ui->CenterButton, SIGNAL(clicked()),
this, SLOT(slotCenterFlag()));
111 connect(ui->ScopeButton, SIGNAL(clicked()),
this, SLOT(slotCenterTelescope()));
113 connect(ui->flagList, SIGNAL(doubleClicked(
QModelIndex)),
this, SLOT(slotCenterFlag()));
115 connect(ui->saveButton, SIGNAL(clicked()),
this, SLOT(slotSaveChanges()));
118 void FlagManager::setRaDec(
const dms &ra,
const dms &dec)
121 ui->decBox->show(dec);
124 void FlagManager::clearFields()
129 ui->epochBox->setText(
"2000.0");
130 ui->flagLabel->clear();
131 ui->flagLabel->setFocus();
134 ui->saveButton->setEnabled(
false);
137 ui->flagList->clearSelection();
140 void FlagManager::showFlag(
int flagIdx)
142 if (flagIdx < 0 || flagIdx >= m_Model->rowCount())
149 ui->raBox->setText(m_Model->data(m_Model->index(flagIdx, 0)).toString());
150 ui->decBox->setText(m_Model->data(m_Model->index(flagIdx, 1)).toString());
151 ui->epochBox->setText(m_Model->data(m_Model->index(flagIdx, 2)).toString());
154 ui->flagCombobox->setCurrentText(m_Model->data(m_Model->index(flagIdx, 3)).toString());
155 ui->flagLabel->setText(m_Model->data(m_Model->index(flagIdx, 4)).toString());
157 QColor labelColor = m_Model->item(flagIdx, 4)->foreground().color();
158 ui->labelColorcombo->setColor(labelColor);
161 ui->flagList->selectRow(flagIdx);
162 ui->saveButton->setEnabled(
true);
165 bool FlagManager::validatePoint()
167 bool raOk(
false), decOk(
false);
168 dms ra(ui->raBox->createDms(&raOk));
169 dms dec(ui->decBox->createDms(&decOk));
176 KSNotification::error(
i18n(
"Invalid coordinates."));
182 message =
i18n(
"The Right Ascension value must be between 0.0 and 24.0.");
183 if (
dec.Degrees() < -90.0 ||
dec.Degrees() > 90.0)
184 message +=
'\n' +
i18n(
"The Declination value must be between -90.0 and 90.0.");
187 KSNotification::sorry(
message,
i18n(
"Invalid Coordinate Data"));
195 void FlagManager::deleteFlagItem(
int flagIdx)
197 if (flagIdx < m_Model->rowCount())
199 m_Model->removeRow(flagIdx);
205 if (validatePoint() ==
false)
208 dms ra(ui->raBox->createDms());
209 dms dec(ui->decBox->createDms());
213 FlagComponent *flags = m_Ks->data()->skyComposite()->flags();
216 flags->
add(flagPoint, ui->epochBox->text(), ui->flagCombobox->currentText(), ui->flagLabel->text(),
217 ui->labelColorcombo->color());
219 ui->flagList->selectRow(m_Model->rowCount() - 1);
220 ui->saveButton->setEnabled(
true);
225 m_Ks->map()->forceUpdate(
false);
230 int flag = ui->flagList->currentIndex().row();
233 m_Ks->data()->skyComposite()->flags()->remove(flag);
236 m_Model->removeRow(flag);
242 m_Ks->data()->skyComposite()->flags()->saveToFile();
245 m_Ks->map()->forceUpdate(
false);
250 if (ui->flagList->currentIndex().isValid())
252 m_Ks->map()->setClickedObject(
nullptr);
253 m_Ks->map()->setClickedPoint(
254 m_Ks->data()->skyComposite()->flags()->pointList().at(ui->flagList->currentIndex().row()).get());
255 m_Ks->map()->slotCenter();
263 if (INDIListener::Instance()->size() == 0)
265 KSNotification::sorry(
i18n(
"No connected mounts found."));
269 for (
auto oneDevice : INDIListener::Instance()->getDevices())
271 if (!(oneDevice->getDriverInterface() & INDI::BaseDevice::TELESCOPE_INTERFACE))
274 if (oneDevice->isConnected() ==
false)
276 KSNotification::error(
277 i18n(
"Telescope %1 is offline. Please connect and retry again.", oneDevice->getDeviceName()));
281 auto mount =
dynamic_cast<ISD::Mount *
>(oneDevice->getConcreteDevice(INDI::BaseDevice::TELESCOPE_INTERFACE));
285 mount->Slew(m_Ks->data()->skyComposite()->flags()->pointList().at(ui->flagList->currentIndex().row()).get());
290 KSNotification::sorry(
i18n(
"No connected mounts found."));
295 void FlagManager::slotSaveChanges()
297 int row = ui->flagList->currentIndex().row();
299 if (validatePoint() ==
false)
302 insertFlag(
false, row);
304 m_Ks->map()->forceUpdate();
306 dms ra(ui->raBox->createDms());
307 dms dec(ui->decBox->createDms());
312 m_Ks->data()->skyComposite()->flags()->updateFlag(row, flagPoint, ui->epochBox->text(),
313 ui->flagCombobox->currentText(), ui->flagLabel->text(),
314 ui->labelColorcombo->color());
317 m_Ks->data()->skyComposite()->flags()->saveToFile();
319 ui->flagList->selectRow(row);
322 void FlagManager::slotSetShownFlag(
QModelIndex idx)
327 void FlagManager::insertFlag(
bool isNew,
int row)
329 dms ra(ui->raBox->createDms());
330 dms dec(ui->decBox->createDms());
339 FlagComponent *flags = m_Ks->data()->skyComposite()->flags();
345 ui->flagCombobox->currentText())
355 for (
int i = 0; i < m_Model->columnCount(); i++)
357 m_Model->setItem(row, i, itemList.
at(i));