wiview.cpp 12.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/***************************************************************************
                          wiview.cpp  -  K Desktop Planetarium
                             -------------------
    begin                : 2012/26/05
    copyright            : (C) 2012 by Samikshan Bairagya
    email                : samikshan@gmail.com
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

18

19 20 21 22
#include <QtQuick/QQuickView>
#include <QtQuick/QQuickItem>
#include <QStandardPaths>
#include <QGraphicsObject>
23
#include "wiview.h"
24
#include "skymap.h"
25
#include "dialogs/detaildialog.h"
26
#include <klocalizedcontext.h>
27
#include "kspaths.h"
28 29
#include "starobject.h"

30

31 32 33 34 35 36 37
#ifdef HAVE_INDI
#include <basedevice.h>
#include "indi/indilistener.h"
#include "indi/indistd.h"
#include "indi/driverinfo.h"
#endif

38

39
WIView::WIView(QWidget * parent, ObsConditions * obs) : QWidget(parent), m_Obs(obs), m_CurCategorySelected(-1)
40
{
41 42


43
    m_ModManager = new ModelManager(m_Obs);
44

45
    m_BaseView = new QQuickView();
46

47
    ///To use i18n() instead of qsTr() in qml/wiview.qml for translation
48
    //KDeclarative kd;
49
    // kd.setDeclarativeEngine(m_BaseView->engine());
50 51
    //kd.initialize();
    //kd.setupBindings();
52

53
    m_Ctxt = m_BaseView->rootContext();
54

55 56 57
    ///Use instead of KDeclarative
    m_Ctxt->setContextObject(new KLocalizedContext(m_BaseView));

58
    m_BaseView->setSource(QUrl::fromLocalFile(KSPaths::locate(QStandardPaths::AppDataLocation, "tools/whatsinteresting/qml/wiview.qml")));
59

60
    m_BaseObj = m_BaseView->rootObject();
61

62
    //soTypeTextObj = m_BaseObj->findChild<QObject *>("soTypeTextObj");
63

64
    m_ViewsRowObj = m_BaseObj->findChild<QQuickItem *>(QString("viewsRowObj"));
65
    connect(m_ViewsRowObj, SIGNAL(categorySelected(int)), this, SLOT(onCategorySelected(int)));
66

67
    m_SoListObj = m_BaseObj->findChild<QQuickItem *>("soListObj");
68
    connect(m_SoListObj, SIGNAL(soListItemClicked(int, QString, int)), this, SLOT(onSoListItemClicked(int, QString, int)));
69

70
    m_DetailsViewObj = m_BaseObj->findChild<QQuickItem *>("detailsViewObj");
71

72
    m_NextObj = m_BaseObj->findChild<QQuickItem *>("nextObj");
73
    connect(m_NextObj, SIGNAL(nextObjClicked()), this, SLOT(onNextObjClicked()));
74
    m_PrevObj = m_BaseObj->findChild<QQuickItem *>("prevObj");
75
    connect(m_PrevObj, SIGNAL(prevObjClicked()), this, SLOT(onPrevObjClicked()));
76

77
    m_SlewButtonObj = m_BaseObj->findChild<QQuickItem *>("slewButtonObj");
78 79
    connect(m_SlewButtonObj, SIGNAL(slewButtonClicked()), this, SLOT(onSlewButtonClicked()));

80 81 82
    m_SlewTelescopeButtonObj = m_BaseObj->findChild<QQuickItem *>("slewTelescopeButtonObj");
    connect(m_SlewTelescopeButtonObj, SIGNAL(slewTelescopeButtonClicked()), this, SLOT(onSlewTelescopeButtonClicked()));

83
    m_DetailsButtonObj = m_BaseObj->findChild<QQuickItem *>("detailsButtonObj");
84 85
    connect(m_DetailsButtonObj, SIGNAL(detailsButtonClicked()), this, SLOT(onDetailsButtonClicked()));

86
    QObject * settingsIconObj = m_BaseObj->findChild<QQuickItem *>("settingsIconObj");
87 88
    connect(settingsIconObj, SIGNAL(settingsIconClicked()), this, SLOT(onSettingsIconClicked()));

89
    QObject * reloadIconObj = m_BaseObj->findChild<QQuickItem *>("reloadIconObj");
90 91
    connect(reloadIconObj, SIGNAL(reloadIconClicked()), this, SLOT(onReloadIconClicked()));

92
    m_BaseView->setResizeMode(QQuickView::SizeRootObjectToView);
93
    m_BaseView->show();
94 95
}

Samikshan Bairagya's avatar
Samikshan Bairagya committed
96 97
WIView::~WIView()
{
98
    delete m_ModManager;
99
    delete m_CurSoItem;
Samikshan Bairagya's avatar
Samikshan Bairagya committed
100
}
101

102
void WIView::onCategorySelected(int type)
103
{
104
    m_CurCategorySelected = type;
105
    m_Ctxt->setContextProperty("soListModel", m_ModManager->returnModel(type));
106
}
107

108
void WIView::onSoListItemClicked(int type, QString typeName, int index)
109
{
Rafal Kulaga's avatar
Rafal Kulaga committed
110 111
    Q_UNUSED(typeName)

112
    SkyObjItem * soitem = m_ModManager->returnModel(type)->getSkyObjItem(index);
113

114 115
//    soTypeTextObj->setProperty("text", typeName);
//    soTypeTextObj->setProperty("visible", true);
116

117
//    soListObj->setProperty("visible", false);
118

119
    loadDetailsView(soitem, index);
120 121
}

122
void WIView::onNextObjClicked()
123
{
124
    int modelSize = m_ModManager->returnModel(m_CurSoItem->getType())->rowCount();
125
    SkyObjItem * nextItem = m_ModManager->returnModel(m_CurSoItem->getType())->getSkyObjItem((m_CurIndex+1)%modelSize);
126
    loadDetailsView(nextItem, (m_CurIndex+1)%modelSize);
Samikshan Bairagya's avatar
Samikshan Bairagya committed
127
}
128 129 130

void WIView::onPrevObjClicked()
{
131
    int modelSize = m_ModManager->returnModel(m_CurSoItem->getType())->rowCount();
132
    SkyObjItem * prevItem = m_ModManager->returnModel(m_CurSoItem->getType())->getSkyObjItem((m_CurIndex-1+modelSize)%modelSize);
133 134
    loadDetailsView(prevItem, (m_CurIndex-1+modelSize)%modelSize);
}
135 136 137 138

void WIView::onSlewButtonClicked()
{
    ///Slew map to selected sky-object
139 140
    SkyObject * so = m_CurSoItem->getSkyObject();
    KStars * kstars = KStars::Instance();
141 142
    if (so != 0)
    {
143 144 145
        kstars->map()->setFocusPoint(so);
        kstars->map()->setFocusObject(so);
        kstars->map()->setDestination(*kstars->map()->focusPoint());
146 147
    }
}
148

149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
void WIView::onSlewTelescopeButtonClicked()
{

    if(KMessageBox::Continue==KMessageBox::warningContinueCancel(NULL, "Are you sure you want your telescope to slew to this object?",
            i18n("Continue Slew"),  KStandardGuiItem::cont(), KStandardGuiItem::cancel(), "continue_wi_slew_warning"))
    {

#ifdef HAVE_INDI

    if (INDIListener::Instance()->size() == 0)
    {
        KMessageBox::sorry(0, i18n("KStars did not find any active telescopes."));
        return;
    }

    foreach(ISD::GDInterface * gd, INDIListener::Instance()->getDevices())
    {
        INDI::BaseDevice * bd = gd->getBaseDevice();

        if (gd->getType() != KSTARS_TELESCOPE)
            continue;

        if (bd == NULL)
            continue;

        if (bd->isConnected() == false)
        {
            KMessageBox::error(0, i18n("Telescope %1 is offline. Please connect and retry again.", gd->getDeviceName()));
            return;
        }


        ISD::GDSetCommand SlewCMD(INDI_SWITCH, "ON_COORD_SET", "TRACK", ISS_ON, this);

        gd->setProperty(&SlewCMD);
        gd->runCommand(INDI_SEND_COORDS, m_CurSoItem->getSkyObject());

        ///Slew map to selected sky-object
        onSlewButtonClicked();

        return;

    }

    KMessageBox::sorry(0, i18n("KStars did not find any active telescopes."));

#endif
    }


}

201 202 203
void WIView::onDetailsButtonClicked()
{
    ///Code taken from WUTDialog::slotDetails()
204 205 206
    KStars * kstars = KStars::Instance();
    SkyObject * so = m_CurSoItem->getSkyObject();
    DetailDialog * detail = new DetailDialog(so, kstars->data()->lt(), kstars->data()->geo(), kstars);
207 208 209
    detail->exec();
    delete detail;
}
210 211 212

void WIView::onSettingsIconClicked()
{
213
    KStars * kstars = KStars::Instance();
214
    kstars->showWISettingsUI();
215
}
216

217 218 219 220 221
void WIView::onReloadIconClicked()
{
    updateModels(m_Obs);
}

222
void WIView::updateModels(ObsConditions * obs)
223 224 225 226 227 228 229 230 231
{
    m_Obs = obs;
    m_ModManager->updateModels(m_Obs);
    m_Ctxt->setContextProperty("soListModel", m_ModManager->returnModel(0));
    m_Ctxt->setContextProperty("soListModel", m_ModManager->returnModel(1));
    m_Ctxt->setContextProperty("soListModel", m_ModManager->returnModel(2));
    m_Ctxt->setContextProperty("soListModel", m_ModManager->returnModel(3));
    m_Ctxt->setContextProperty("soListModel", m_ModManager->returnModel(4));
    m_Ctxt->setContextProperty("soListModel", m_ModManager->returnModel(5));
232 233 234

    if (m_CurCategorySelected >=0 && m_CurCategorySelected <= 5)
        m_Ctxt->setContextProperty("soListModel", m_ModManager->returnModel(m_CurCategorySelected));
235 236
}

237
void WIView::loadDetailsView(SkyObjItem * soitem, int index)
238 239 240 241 242
{
    m_CurSoItem = soitem;
    m_CurIndex = index;

    int modelSize = m_ModManager->returnModel(m_CurSoItem->getType())->rowCount();
243 244
    SkyObjItem * nextItem = m_ModManager->returnModel(m_CurSoItem->getType())->getSkyObjItem((m_CurIndex+1)%modelSize);
    SkyObjItem * prevItem = m_ModManager->returnModel(m_CurSoItem->getType())->getSkyObjItem((m_CurIndex-1+modelSize)%modelSize);
245

Vijay Dhameliya's avatar
Vijay Dhameliya committed
246 247 248 249 250 251 252 253 254
    if(modelSize <= 1)
    {
        m_NextObj->setProperty("visible", "false");
        m_PrevObj->setProperty("visible", "false");
    }
    else
    {
        m_NextObj->setProperty("visible", "true");
        m_PrevObj->setProperty("visible", "true");
255
        QObject * nextTextObj = m_NextObj->findChild<QObject *>("nextTextObj");
Vijay Dhameliya's avatar
Vijay Dhameliya committed
256
        nextTextObj->setProperty("text", nextItem->getName());
257
        QObject * prevTextObj = m_PrevObj->findChild<QObject *>("prevTextObj");
Vijay Dhameliya's avatar
Vijay Dhameliya committed
258 259
        prevTextObj->setProperty("text", prevItem->getName());
    }
260

261 262
    QObject * sonameObj = m_DetailsViewObj->findChild<QObject *>("sonameObj");
    QObject * posTextObj = m_DetailsViewObj->findChild<QObject *>("posTextObj");
263
    QObject * detailImage = m_DetailsViewObj->findChild<QObject *>("detailImage");
264 265
    QObject * descTextObj = m_DetailsViewObj->findChild<QObject *>("descTextObj");
    QObject * descSrcTextObj = m_DetailsViewObj->findChild<QObject *>("descSrcTextObj");
266
    QObject * detailsTextObj = m_DetailsViewObj->findChild<QObject *>("detailsTextObj");
267 268 269

    sonameObj->setProperty("text", soitem->getLongName());
    posTextObj->setProperty("text", soitem->getPosition());
270
    detailImage->setProperty("refreshableSource", soitem->getImageURL());
271
    descTextObj->setProperty("text", soitem->getDesc());
272 273
    if(soitem->getType() != SkyObjItem::Planet)
        tryToLoadFromWikipedia(descTextObj, descSrcTextObj, soitem);
274 275
    descSrcTextObj->setProperty("text", soitem->getDescSource());

276 277
    QString summary=soitem->getSummary();

278 279
    QString magText;
    if (soitem->getType() == SkyObjItem::Constellation)
Jasem Mutlaq's avatar
Jasem Mutlaq committed
280
        magText = xi18n("Magnitude:  --");
281
    else
282
        magText = xi18n("Magnitude: %1", QLocale().toString(soitem->getMagnitude(),'f', 2));
283

Jasem Mutlaq's avatar
Jasem Mutlaq committed
284
    QString sbText = xi18n("Surface Brightness: %1", soitem->getSurfaceBrightness());
285

Jasem Mutlaq's avatar
Jasem Mutlaq committed
286
    QString sizeText = xi18n("Size: %1", soitem->getSize());
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338

    QString details = summary + "\n" + sbText + "\n" + magText + "\n" + sizeText;
    detailsTextObj->setProperty("text", details);

}


void WIView::tryToLoadFromWikipedia(QObject * descTextObj, QObject * descSrcTextObj, SkyObjItem * soitem)
{
    QString name;
    if(soitem->getName().startsWith("M "))
        name = soitem->getName().replace("M ","messier_").toLower().remove( ' ' );
    else if(soitem->getType() == SkyObjItem::Constellation)
        name = soitem->getName().toLower().remove( ' ' ) + "_constellation";
    else if(soitem->getType() == SkyObjItem::Star){
        StarObject *star=dynamic_cast<StarObject*>(soitem->getSkyObject());
        if(star)
            name = star->gname().toLower().remove( ' ' ); //the greek name seems to give the most consistent search results.
        else
            name = soitem->getName().toLower().remove( ' ' );
    }else
        name = soitem->getName().toLower().remove( ' ' );

    QUrl url("https://en.wikipedia.org/w/api.php?action=opensearch&search=" + name + "&format=xml");

    QNetworkAccessManager * manager = new QNetworkAccessManager();
    QNetworkReply * response = manager->get(QNetworkRequest(url));
    connect(manager, &QNetworkAccessManager::finished, this, [descTextObj, descSrcTextObj, manager, response]{
      response->deleteLater();
      manager->deleteLater();
      if (response->error() != QNetworkReply::NoError) return;
      QString contentType =
        response->header(QNetworkRequest::ContentTypeHeader).toString();
      if (!contentType.contains("charset=utf-8")) {
        qWarning() << "Content charsets other than utf-8 are not implemented yet.";
        return;
      }
    QString result = QString::fromUtf8(response->readAll());
    int leftPos=result.indexOf("<Description")+34;
    if(leftPos<34)
        return;
    int rightPos=result.indexOf("</Description>")-leftPos;

    int leftURL=result.indexOf("<Url xml:space=\"preserve\">")+26;
    int rightURL=result.indexOf("</Url>")-leftURL;

    QString html="<HTML>" + result.mid(leftPos,rightPos) + "</HTML>";
    QString srchtml="<HTML>Source: Wikipedia (<a href='" + result.mid(leftURL,rightURL) + "'>" + result.mid(leftURL,rightURL) + "</a>)</HTML>";

      descTextObj->setProperty("text", html);
      descSrcTextObj->setProperty("text", srchtml);
    });
339
}